diff --git a/.cargo/config.toml b/.cargo/config.toml index 440c785d471..7f5642cf5e4 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,7 +1,7 @@ [alias] stacks-node = "run --package stacks-node --" fmt-stacks = "fmt -- --config group_imports=StdExternalCrate,imports_granularity=Module" -clippy-stacks = "clippy -p stx-genesis -p libstackerdb -p stacks-signer -p pox-locking -p clarity-types -p clarity -p libsigner -p stacks-common -p clarity-cli -p stacks-cli -p stacks-inspect --no-deps --tests --all-features -- -D warnings" +clippy-stacks = "clippy -p stx-genesis -p libstackerdb -p stacks-signer -p pox-locking -p clarity-types -p clarity -p libsigner -p stacks-common -p clarity-cli -p stacks-cli -p stacks-inspect --no-deps --tests --all-features -- -D warnings -Aclippy::unnecessary_lazy_evaluations" clippy-stackslib = "clippy -p stackslib --no-deps -- -Aclippy::all -Wclippy::indexing_slicing -Wclippy::nonminimal_bool -Wclippy::clone_on_copy" # Uncomment to improve performance slightly, at the cost of portability diff --git a/.vscode/launch.json b/.vscode/launch.json index f645a6c87db..985a6243db8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -27,7 +27,7 @@ "args": [ "build", "--bin=clarity-cli", - "--package=stackslib" + "--package=clarity-cli" ], "filter": { "name": "clarity-cli", diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c611c0724b..519533012ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to the versioning scheme outlined in the [README.md](README.md). +## [3.3.0.0.4] + +### Added + +- New `/v3/tenures/tip_metadata` endpoint for returning some metadata along with the normal tenure tip information. + + +## [3.3.0.0.3] + +### Added + +- In the `/v3/transaction/{txid}` RPC endpoint, added `block_height` and `is_canonical` to the response. + +### Fixed + +- When mining, do not try to extend (or initiate) a tenure that did not commit to the ongoing chain tip (see #6744) +- When mock-mining, retry when hitting the `ParentNotFound` error. This can happen at the beginning of a new tenure, but should resolve with retries. + ## [3.3.0.0.2] ### Added diff --git a/Cargo.lock b/Cargo.lock index 42ad15007e7..756c1f1388b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -498,6 +498,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +[[package]] +name = "c-enum" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd17eb909a8c6a894926bfcc3400a4bb0e732f5a57d37b1f14e8b29e329bace8" + [[package]] name = "cc" version = "1.0.83" @@ -541,9 +547,9 @@ checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" [[package]] name = "clap" -version = "4.5.0" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -551,9 +557,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.0" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -563,9 +569,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", @@ -575,9 +581,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clarity" @@ -625,6 +631,7 @@ dependencies = [ name = "clarity-cli" version = "0.1.0" dependencies = [ + "clap", "clarity 0.0.1", "lazy_static", "rand 0.8.5", @@ -1391,9 +1398,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1977,6 +1984,15 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -1986,6 +2002,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -2122,7 +2147,7 @@ dependencies = [ "cc", "cfg-if 1.0.0", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -2244,6 +2269,41 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "perf-event-data" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575828d9d7d205188048eb1508560607a03d21eafdbba47b8cade1736c1c28e1" +dependencies = [ + "bitflags 2.4.2", + "c-enum", + "perf-event-open-sys2", +] + +[[package]] +name = "perf-event-open-sys2" +version = "5.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c25955321465255e437600b54296983fab1feac2cd0c38958adeb26dbae49e" +dependencies = [ + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "perf-event2" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0939b8fad77dfaeb29ebbd35faaeaadbf833167f30975f1b8993bbba09ea0a0f" +dependencies = [ + "bitflags 2.4.2", + "c-enum", + "libc", + "memmap2", + "perf-event-data", + "perf-event-open-sys2", +] + [[package]] name = "pico-args" version = "0.5.0" @@ -3474,6 +3534,7 @@ dependencies = [ "mutants", "nix", "percent-encoding", + "perf-event2", "pox-locking 2.4.0", "prometheus", "proptest", diff --git a/clarity-types/src/errors/analysis.rs b/clarity-types/src/errors/analysis.rs index f98348f6077..29bdb3bcb23 100644 --- a/clarity-types/src/errors/analysis.rs +++ b/clarity-types/src/errors/analysis.rs @@ -136,16 +136,443 @@ impl SyntaxBindingError { } } -impl From for CheckErrorKind { +/// Converts a [`SyntaxBindingError`] into a [`StaticCheckErrorKind`]. +/// Used for propagating binding errors from +/// [`crate::vm::analysis::read_only_checker::ReadOnlyChecker::check_each_expression_is_read_only`] +impl From for StaticCheckErrorKind { fn from(e: SyntaxBindingError) -> Self { Self::BadSyntaxBinding(e) } } -/// Errors encountered during type-checking and analysis of Clarity contract code, ensuring -/// type safety, correct function signatures, and adherence to resource constraints. -/// These errors prevent invalid contracts from being deployed or executed, -/// halting analysis and failing the transaction or contract deployment. +/// Converts a [`SyntaxBindingError`] into a [`CommonCheckErrorKind`]. +/// Used for propagating binding errors from [`crate::vm::functions::handle_binding_list`], +/// which is utilized in both static and runtime analysis to ensure consistent error handling. +impl From for CommonCheckErrorKind { + fn from(e: SyntaxBindingError) -> Self { + CommonCheckErrorKind::BadSyntaxBinding(e) + } +} + +/// Shared set of error variants that are between static analysis (during contract deployment) +/// and runtime checking (during contract execution), specifically for validation logic that +/// is implemented in common code paths used by both. +/// +/// All these variants represent errors that can arise only from code executed in both analysis and +/// execution contexts—such as argument count checks, type size limits, or shared cost tracking logic. +/// If an error may be triggered by either context via common logic, it lives here. +/// +/// Importantly, this enum does not cover all errors common to both analysis and execution. +/// There are other error shared error variants, but those are generated specifically by logic +/// that is unique to static analysis or unique to execution. These errors are defined separately +/// and do not pass through this enum. Only error cases that can possibly arise from a shared +/// validation flow will appear here. +#[derive(Debug, PartialEq)] +pub enum CommonCheckErrorKind { + // Cost checker errors + /// Arithmetic overflow in cost computation during type-checking, exceeding the maximum threshold. + CostOverflow, + /// Cumulative type-checking cost exceeds the allocated budget, indicating budget depletion. + /// The first `ExecutionCost` represents the total consumed cost, and the second represents the budget limit. + CostBalanceExceeded(ExecutionCost, ExecutionCost), + /// Memory usage during type-checking exceeds the allocated budget. + /// The first `u64` represents the total consumed memory, and the second represents the memory limit. + MemoryBalanceExceeded(u64, u64), + /// Failure in cost-tracking due to an unexpected condition or invalid state. + /// The `String` wraps the specific reason for the failure. + CostComputationFailed(String), + // Time checker errors + /// Type-checking time exceeds the allowed budget, halting analysis to ensure responsiveness. + ExecutionTimeExpired, + + /// Value exceeds the maximum allowed size for type-checking or serialization. + ValueTooLarge, + /// Value is outside the acceptable range for its type (e.g., integer bounds). + ValueOutOfBounds, + /// Type signature nesting depth exceeds the allowed limit during analysis. + TypeSignatureTooDeep, + /// Expected a name (e.g., variable, function) but found an invalid or missing token. + ExpectedName, + /// Supertype (e.g., trait or union) exceeds the maximum allowed size or complexity. + /// This error indicates a transaction would invalidate a block if included. + SupertypeTooLarge, + + // Unexpected interpreter behavior + /// Unexpected condition or failure in the type-checker, indicating a bug or invalid state. + /// This error indicates a transaction would invalidate a block if included. + Expects(String), + + // Type mismatch errors + /// Expected type does not match the actual type during analysis. + /// The first `Box` wraps the expected type, and the second wraps the actual type. + TypeError(Box, Box), + + /// Type description is invalid or malformed, preventing proper type-checking. + InvalidTypeDescription, + /// Referenced type name does not exist or is undefined. + /// The `String` wraps the non-existent type name. + UnknownTypeName(String), + + /// Could not determine the type of an expression during analysis. + CouldNotDetermineType, + + /// Empty tuple is not allowed in Clarity. + EmptyTuplesNotAllowed, + + /// Invalid or malformed signature in a function definition. + DefineFunctionBadSignature, + + /// Name (e.g., variable, function) is already in use within the same scope. + /// The `String` wraps the conflicting name. + NameAlreadyUsed(String), + + /// Invalid binding syntax in a generic construct (e.g., `let`, `match`). + /// The `SyntaxBindingError` wraps the specific binding error. + BadSyntaxBinding(SyntaxBindingError), + + // Argument counts + /// Function requires at least the specified number of arguments, but fewer were provided. + /// The first `usize` represents the minimum required, and the second represents the actual count. + RequiresAtLeastArguments(usize, usize), + /// Function requires at most the specified number of arguments, but more were provided. + /// The first `usize` represents the maximum allowed, and the second represents the actual count. + RequiresAtMostArguments(usize, usize), + /// Incorrect number of arguments provided to a function. + /// The first `usize` represents the expected count, and the second represents the actual count. + IncorrectArgumentCount(usize, usize), + /// Too many function parameters specified. + /// The first `usize` represents the number of parameters found, the second represents the maximum allowed. + TooManyFunctionParameters(usize, usize), + + /// Expected a trait identifier (e.g., `.trait-name`) but found an invalid token. + ExpectedTraitIdentifier, + /// Invalid or malformed signature in a `(define-trait ...)` expression. + DefineTraitBadSignature, + /// Trait definition contains duplicate method names. + /// The `String` wraps the duplicate method name. + DefineTraitDuplicateMethod(String), + /// Too many trait methods specified. + /// The first `usize` represents the number of methods found, the second the maximum allowed. + TraitTooManyMethods(usize, usize), +} + +/// An error detected during the static analysis of a smart contract at deployment time. +/// +/// These checks are performed once, before any contract execution occurs, to find issues +/// like type mismatches, invalid function signatures, or incorrect control flow. +#[derive(Debug, PartialEq)] +pub enum StaticCheckErrorKind { + // Cost checker errors + /// Arithmetic overflow in cost computation during type-checking, exceeding the maximum threshold. + CostOverflow, + /// Cumulative type-checking cost exceeds the allocated budget, indicating budget depletion. + /// The first `ExecutionCost` represents the total consumed cost, and the second represents the budget limit. + CostBalanceExceeded(ExecutionCost, ExecutionCost), + /// Memory usage during type-checking exceeds the allocated budget. + /// The first `u64` represents the total consumed memory, and the second represents the memory limit. + MemoryBalanceExceeded(u64, u64), + /// Failure in cost-tracking due to an unexpected condition or invalid state. + /// The `String` wraps the specific reason for the failure. + CostComputationFailed(String), + // Time checker errors + /// Type-checking time exceeds the allowed budget, halting analysis to ensure responsiveness. + ExecutionTimeExpired, + + /// Value exceeds the maximum allowed size for type-checking or serialization. + ValueTooLarge, + /// Value is outside the acceptable range for its type (e.g., integer bounds). + ValueOutOfBounds, + /// Type signature nesting depth exceeds the allowed limit during analysis. + TypeSignatureTooDeep, + /// Expected a name (e.g., variable, function) but found an invalid or missing token. + ExpectedName, + /// Supertype (e.g., trait or union) exceeds the maximum allowed size or complexity. + /// This error indicates a transaction would invalidate a block if included. + SupertypeTooLarge, + + // Unexpected interpreter behavior + /// Unexpected condition or failure in the type-checker, indicating a bug or invalid state. + /// This error indicates a transaction would invalidate a block if included. + Expects(String), + + // Match expression errors + /// Invalid syntax in an `option` match expression. + /// The `Box` wraps the underlying error causing the syntax issue. + BadMatchOptionSyntax(Box), + /// Invalid syntax in a `response` match expression. + /// The `Box` wraps the underlying error causing the syntax issue. + BadMatchResponseSyntax(Box), + /// Input to a `match` expression does not conform to the expected type (e.g., `Option` or `Response`). + /// The `Box` wraps the actual type of the provided input. + BadMatchInput(Box), + + /// Constructed list exceeds the maximum allowed length during type-checking. + ConstructedListTooLarge, + + // Type mismatch errors + /// Expected type does not match the actual type during analysis. + /// The first `Box` wraps the expected type, and the second wraps the actual type. + TypeError(Box, Box), + + /// Type description is invalid or malformed, preventing proper type-checking. + InvalidTypeDescription, + /// Referenced type name does not exist or is undefined. + /// The `String` wraps the non-existent type name. + UnknownTypeName(String), + + // Union type mismatch + /// Type does not belong to the expected union of types during analysis. + /// The `Vec` represents the expected types, and the `Box` wraps the actual type. + UnionTypeError(Vec, Box), + /// Expected an optional type but found a different type. + /// The `Box` wraps the actual type provided. + ExpectedOptionalType(Box), + /// Expected a response type but found a different type. + /// The `Box` wraps the actual type provided. + ExpectedResponseType(Box), + /// Expected an optional or response type but found a different type. + /// The `Box` wraps the actual type provided. + ExpectedOptionalOrResponseType(Box), + /// Could not determine the type of the `ok` branch in a response type. + CouldNotDetermineResponseOkType, + /// Could not determine the type of the `err` branch in a response type. + CouldNotDetermineResponseErrType, + /// Could not determine the serialization type for a value during analysis. + CouldNotDetermineSerializationType, + /// Intermediary response types were not properly checked, risking type safety. + UncheckedIntermediaryResponses, + + // Match type errors + /// Could not determine the types for a match expression’s branches. + CouldNotDetermineMatchTypes, + /// Could not determine the type of an expression during analysis. + CouldNotDetermineType, + + // Checker runtime failures + /// Attempt to re-annotate a type that was already annotated, indicating a bug. + TypeAlreadyAnnotatedFailure, + /// Unexpected failure in the type-checker implementation, indicating a bug. + CheckerImplementationFailure, + + // Assets + /// Expected a token name as an argument but found an invalid token. + BadTokenName, + /// Invalid or malformed signature in a `(define-non-fungible-token ...)` expression. + DefineNFTBadSignature, + /// Referenced non-fungible token (NFT) does not exist. + /// The `String` wraps the non-existent token name. + NoSuchNFT(String), + /// Referenced fungible token (FT) does not exist. + /// The `String` wraps the non-existent token name. + NoSuchFT(String), + + // Tuples + /// Tuple field name is invalid or violates naming rules. + BadTupleFieldName, + /// Expected a tuple type but found a different type. + /// The `Box` wraps the actual type provided. + ExpectedTuple(Box), + /// Referenced tuple field does not exist in the tuple type. + /// The `String` wraps the requested field name, and the `TupleTypeSignature` wraps the tuple’s type. + NoSuchTupleField(String, TupleTypeSignature), + /// Empty tuple is not allowed in Clarity. + EmptyTuplesNotAllowed, + /// Invalid tuple construction due to malformed syntax or type mismatch. + /// The `String` wraps the specific error description. + BadTupleConstruction(String), + + // Variables + /// Referenced data variable does not exist in scope. + /// The `String` wraps the non-existent variable name. + NoSuchDataVariable(String), + + // Data map + /// Map name is invalid or violates naming rules. + BadMapName, + /// Referenced data map does not exist in scope. + /// The `String` wraps the non-existent map name. + NoSuchMap(String), + + // Defines + /// Invalid or malformed signature in a function definition. + DefineFunctionBadSignature, + /// Function name is invalid or violates naming rules. + BadFunctionName, + /// Invalid or malformed map type definition in a `(define-map ...)` expression. + BadMapTypeDefinition, + /// Public function must return a response type, but found a different type. + /// The `Box` wraps the actual return type. + PublicFunctionMustReturnResponse(Box), + /// Invalid or malformed variable definition in a `(define-data-var ...)` expression. + DefineVariableBadSignature, + /// Return types of function branches do not match the expected type. + /// The first `Box` wraps the expected type, and the second wraps the actual type. + ReturnTypesMustMatch(Box, Box), + + // Contract-call errors + /// Referenced contract does not exist. + /// The `String` wraps the non-existent contract name. + NoSuchContract(String), + /// Referenced public function does not exist in the specified contract. + /// The first `String` wraps the contract name, and the second wraps the function name. + NoSuchPublicFunction(String, String), + /// Attempt to define a contract with a name that already exists. + /// The `String` wraps the conflicting contract name. + ContractAlreadyExists(String), + /// Expected a contract name in a `contract-call?` expression but found an invalid token. + ContractCallExpectName, + /// Expected a callable type (e.g., function or trait) but found a different type. + /// The `Box` wraps the actual type provided. + ExpectedCallableType(Box), + + // get-block-info? errors + /// Referenced block info property does not exist. + /// The `String` wraps the non-existent property name. + NoSuchBlockInfoProperty(String), + /// Referenced Stacks block info property does not exist. + /// The `String` wraps the non-existent property name. + NoSuchStacksBlockInfoProperty(String), + /// Referenced tenure info property does not exist. + /// The `String` wraps the non-existent property name. + NoSuchTenureInfoProperty(String), + /// Expected a block info property name but found an invalid token. + GetBlockInfoExpectPropertyName, + /// Expected a burn block info property name but found an invalid token. + GetBurnBlockInfoExpectPropertyName, + /// Expected a Stacks block info property name but found an invalid token. + GetStacksBlockInfoExpectPropertyName, + /// Expected a tenure info property name but found an invalid token. + GetTenureInfoExpectPropertyName, + + /// Name (e.g., variable, function) is already in use within the same scope. + /// The `String` wraps the conflicting name. + NameAlreadyUsed(String), + /// Name is a reserved word in Clarity and cannot be used. + /// The `String` wraps the reserved name. + ReservedWord(String), + + // Expect a function, or applying a function to a list + /// Attempt to apply a non-function value as a function. + NonFunctionApplication, + /// Expected a list application but found a different expression. + ExpectedListApplication, + /// Expected a sequence type (e.g., list, buffer) but found a different type. + /// The `Box` wraps the actual type provided. + ExpectedSequence(Box), + /// Sequence length exceeds the maximum allowed limit. + MaxLengthOverflow, + + // Let syntax + /// Invalid syntax in a `let` expression, violating binding or structure rules. + BadLetSyntax, + + // Generic binding syntax + /// Invalid binding syntax in a generic construct (e.g., `let`, `match`). + /// The `SyntaxBindingError` wraps the specific binding error. + BadSyntaxBinding(SyntaxBindingError), + + /// Maximum context depth for type-checking has been reached. + MaxContextDepthReached, + /// Referenced variable is not defined in the current scope. + /// The `String` wraps the non-existent variable name. + UndefinedVariable(String), + + // Argument counts + /// Function requires at least the specified number of arguments, but fewer were provided. + /// The first `usize` represents the minimum required, and the second represents the actual count. + RequiresAtLeastArguments(usize, usize), + /// Function requires at most the specified number of arguments, but more were provided. + /// The first `usize` represents the maximum allowed, and the second represents the actual count. + RequiresAtMostArguments(usize, usize), + /// Incorrect number of arguments provided to a function. + /// The first `usize` represents the expected count, and the second represents the actual count. + IncorrectArgumentCount(usize, usize), + /// `if` expression arms have mismatched return types. + /// The first `Box` wraps the type of one arm, and the second wraps the other. + IfArmsMustMatch(Box, Box), + /// `match` expression arms have mismatched return types. + /// The first `Box` wraps the type of one arm, and the second wraps the other. + MatchArmsMustMatch(Box, Box), + /// `default-to` expression types are mismatched. + /// The first `Box` wraps the expected type, and the second wraps the actual type. + DefaultTypesMustMatch(Box, Box), + /// Application of an illegal or unknown function. + /// The `String` wraps the function name. + IllegalOrUnknownFunctionApplication(String), + /// Referenced function is unknown or not defined. + /// The `String` wraps the non-existent function name. + UnknownFunction(String), + /// Too many function parameters specified. + /// The first `usize` represents the number of parameters found, the second represents the maximum allowed. + TooManyFunctionParameters(usize, usize), + + // Traits + /// Referenced trait does not exist in the specified contract. + /// The first `String` wraps the contract name, and the second wraps the trait name. + NoSuchTrait(String, String), + /// Referenced trait is not defined or cannot be found. + /// The `String` wraps the non-existent trait name. + TraitReferenceUnknown(String), + /// Referenced method does not exist in the specified trait. + /// The first `String` wraps the trait name, and the second wraps the method name. + TraitMethodUnknown(String, String), + /// Expected a trait identifier (e.g., `.trait-name`) but found an invalid token. + ExpectedTraitIdentifier, + /// Invalid implementation of a trait method. + /// The first `String` wraps the trait name, and the second wraps the method name. + BadTraitImplementation(String, String), + /// Invalid or malformed signature in a `(define-trait ...)` expression. + DefineTraitBadSignature, + /// Trait definition contains duplicate method names. + /// The `String` wraps the duplicate method name. + DefineTraitDuplicateMethod(String), + /// Unexpected use of a trait or field reference in a non-trait context. + UnexpectedTraitOrFieldReference, + /// `contract-of` expects a trait type but found a different type. + ContractOfExpectsTrait, + /// Trait implementation is incompatible with the expected trait definition. + /// The first `Box` wraps the expected trait, and the second wraps the actual trait. + IncompatibleTrait(Box, Box), + /// Too many trait methods specified. + /// The first `usize` represents the number of methods found, the second the maximum allowed. + TraitTooManyMethods(usize, usize), + + /// Attempt to write to contract state in a read-only function. + WriteAttemptedInReadOnly, + /// `at-block` closure must be read-only but contains write operations. + AtBlockClosureMustBeReadOnly, + + // contract post-conditions + /// Post-condition expects a list of asset allowances but received invalid input. + /// The first `String` wraps the function name, and the second `i32` wraps the argument number. + ExpectedListOfAllowances(String, i32), + /// Allowance expressions are only allowed in specific contexts (`restrict-assets?` or `as-contract?`). + AllowanceExprNotAllowed, + /// Expected an allowance expression but found invalid input. + /// The `String` wraps the unexpected input. + ExpectedAllowanceExpr(String), + /// `with-all-assets-unsafe` is not allowed in this context. + WithAllAllowanceNotAllowed, + /// `with-all-assets-unsafe` cannot be used alongside other allowances. + WithAllAllowanceNotAlone, + /// `with-nft` allowance requires a list of asset identifiers. + WithNftExpectedListOfIdentifiers, + /// `with-nft` allowance identifiers list exceeds the maximum allowed length. + /// The first `u32` represents the maximum length, and the second represents the actual length. + MaxIdentifierLengthExceeded(u32, u32), + /// Too many allowances specified in post-condition. + /// The first `usize` represents the maximum allowed, and the second represents the actual count. + TooManyAllowances(usize, usize), +} + +/// An error that occurs during the runtime analysis of a smart contract at runtime. Could be returnd by: +/// - a contract initialization execution +/// - a contract call execution +/// +/// These errors are found when a contract is executed. They represent dynamic conditions +/// that cannot be determined by static analysis, such as: +/// - Failures based on runtime arguments or state changes. +/// - Value-level type mismatches. #[derive(Debug, PartialEq)] pub enum CheckErrorKind { // Cost checker errors @@ -195,8 +622,6 @@ pub enum CheckErrorKind { // List typing errors /// List elements have mismatched types, violating type consistency. ListTypesMustMatch, - /// Constructed list exceeds the maximum allowed length during type-checking. - ConstructedListTooLarge, // Type mismatch errors /// Expected type does not match the actual type during analysis. @@ -220,15 +645,6 @@ pub enum CheckErrorKind { /// The `Vec` represents the expected types, and the `Box` wraps the invalid value. UnionTypeValueError(Vec, Box), - /// Expected an optional type but found a different type. - /// The `Box` wraps the actual type provided. - ExpectedOptionalType(Box), - /// Expected a response type but found a different type. - /// The `Box` wraps the actual type provided. - ExpectedResponseType(Box), - /// Expected an optional or response type but found a different type. - /// The `Box` wraps the actual type provided. - ExpectedOptionalOrResponseType(Box), /// Expected an optional value but found a different value. /// The `Box` wraps the actual value provided. ExpectedOptionalValue(Box), @@ -238,35 +654,17 @@ pub enum CheckErrorKind { /// Expected an optional or response value but found a different value. /// The `Box` wraps the actual value provided. ExpectedOptionalOrResponseValue(Box), - /// Could not determine the type of the `ok` branch in a response type. - CouldNotDetermineResponseOkType, - /// Could not determine the type of the `err` branch in a response type. - CouldNotDetermineResponseErrType, - /// Could not determine the serialization type for a value during analysis. - CouldNotDetermineSerializationType, - /// Intermediary response types were not properly checked, risking type safety. - UncheckedIntermediaryResponses, /// Expected a contract principal value but found a different value. /// The `Box` wraps the actual value provided. ExpectedContractPrincipalValue(Box), // Match type errors - /// Could not determine the types for a match expression’s branches. - CouldNotDetermineMatchTypes, /// Could not determine the type of an expression during analysis. CouldNotDetermineType, - // Checker runtime failures - /// Attempt to re-annotate a type that was already annotated, indicating a bug. - TypeAlreadyAnnotatedFailure, - /// Unexpected failure in the type-checker implementation, indicating a bug. - CheckerImplementationFailure, - // Assets /// Expected a token name as an argument but found an invalid token. BadTokenName, - /// Invalid or malformed signature in a `(define-non-fungible-token ...)` expression. - DefineNFTBadSignature, /// Referenced non-fungible token (NFT) does not exist. /// The `String` wraps the non-existent token name. NoSuchNFT(String), @@ -287,8 +685,6 @@ pub enum CheckErrorKind { BadBurnFTArguments, // Tuples - /// Tuple field name is invalid or violates naming rules. - BadTupleFieldName, /// Expected a tuple type but found a different type. /// The `Box` wraps the actual type provided. ExpectedTuple(Box), @@ -297,9 +693,6 @@ pub enum CheckErrorKind { NoSuchTupleField(String, TupleTypeSignature), /// Empty tuple is not allowed in Clarity. EmptyTuplesNotAllowed, - /// Invalid tuple construction due to malformed syntax or type mismatch. - /// The `String` wraps the specific error description. - BadTupleConstruction(String), // Variables /// Referenced data variable does not exist in scope. @@ -307,8 +700,6 @@ pub enum CheckErrorKind { NoSuchDataVariable(String), // Data map - /// Map name is invalid or violates naming rules. - BadMapName, /// Referenced data map does not exist in scope. /// The `String` wraps the non-existent map name. NoSuchMap(String), @@ -318,13 +709,9 @@ pub enum CheckErrorKind { DefineFunctionBadSignature, /// Function name is invalid or violates naming rules. BadFunctionName, - /// Invalid or malformed map type definition in a `(define-map ...)` expression. - BadMapTypeDefinition, /// Public function must return a response type, but found a different type. /// The `Box` wraps the actual return type. PublicFunctionMustReturnResponse(Box), - /// Invalid or malformed variable definition in a `(define-data-var ...)` expression. - DefineVariableBadSignature, /// Return types of function branches do not match the expected type. /// The first `Box` wraps the expected type, and the second wraps the actual type. ReturnTypesMustMatch(Box, Box), @@ -348,27 +735,16 @@ pub enum CheckErrorKind { ContractAlreadyExists(String), /// Expected a contract name in a `contract-call?` expression but found an invalid token. ContractCallExpectName, - /// Expected a callable type (e.g., function or trait) but found a different type. - /// The `Box` wraps the actual type provided. - ExpectedCallableType(Box), // get-block-info? errors - /// Referenced block info property does not exist. - /// The `String` wraps the non-existent property name. - NoSuchBlockInfoProperty(String), /// Referenced burn block info property does not exist. /// The `String` wraps the non-existent property name. NoSuchBurnBlockInfoProperty(String), /// Referenced Stacks block info property does not exist. /// The `String` wraps the non-existent property name. NoSuchStacksBlockInfoProperty(String), - /// Referenced tenure info property does not exist. - /// The `String` wraps the non-existent property name. - NoSuchTenureInfoProperty(String), /// Expected a block info property name but found an invalid token. GetBlockInfoExpectPropertyName, - /// Expected a burn block info property name but found an invalid token. - GetBurnBlockInfoExpectPropertyName, /// Expected a Stacks block info property name but found an invalid token. GetStacksBlockInfoExpectPropertyName, /// Expected a tenure info property name but found an invalid token. @@ -377,9 +753,6 @@ pub enum CheckErrorKind { /// Name (e.g., variable, function) is already in use within the same scope. /// The `String` wraps the conflicting name. NameAlreadyUsed(String), - /// Name is a reserved word in Clarity and cannot be used. - /// The `String` wraps the reserved name. - ReservedWord(String), // Expect a function, or applying a function to a list /// Attempt to apply a non-function value as a function. @@ -389,8 +762,6 @@ pub enum CheckErrorKind { /// Expected a sequence type (e.g., list, buffer) but found a different type. /// The `Box` wraps the actual type provided. ExpectedSequence(Box), - /// Sequence length exceeds the maximum allowed limit. - MaxLengthOverflow, // Let syntax /// Invalid syntax in a `let` expression, violating binding or structure rules. @@ -401,8 +772,6 @@ pub enum CheckErrorKind { /// The `SyntaxBindingError` wraps the specific binding error. BadSyntaxBinding(SyntaxBindingError), - /// Maximum context depth for type-checking has been reached. - MaxContextDepthReached, /// Referenced function is not defined in the current scope. /// The `String` wraps the non-existent function name. UndefinedFunction(String), @@ -420,29 +789,11 @@ pub enum CheckErrorKind { /// Incorrect number of arguments provided to a function. /// The first `usize` represents the expected count, and the second represents the actual count. IncorrectArgumentCount(usize, usize), - /// `if` expression arms have mismatched return types. - /// The first `Box` wraps the type of one arm, and the second wraps the other. - IfArmsMustMatch(Box, Box), - /// `match` expression arms have mismatched return types. - /// The first `Box` wraps the type of one arm, and the second wraps the other. - MatchArmsMustMatch(Box, Box), - /// `default-to` expression types are mismatched. - /// The first `Box` wraps the expected type, and the second wraps the actual type. - DefaultTypesMustMatch(Box, Box), - /// Application of an illegal or unknown function. - /// The `String` wraps the function name. - IllegalOrUnknownFunctionApplication(String), - /// Referenced function is unknown or not defined. - /// The `String` wraps the non-existent function name. - UnknownFunction(String), /// Too many function parameters specified. /// The first `usize` represents the number of parameters found, the second represents the maximum allowed. TooManyFunctionParameters(usize, usize), // Traits - /// Referenced trait does not exist in the specified contract. - /// The first `String` wraps the contract name, and the second wraps the trait name. - NoSuchTrait(String, String), /// Referenced trait is not defined or cannot be found. /// The `String` wraps the non-existent trait name. TraitReferenceUnknown(String), @@ -451,8 +802,6 @@ pub enum CheckErrorKind { TraitMethodUnknown(String, String), /// Expected a trait identifier (e.g., `.trait-name`) but found an invalid token. ExpectedTraitIdentifier, - /// Trait reference is not allowed in the current context (e.g., storage). - TraitReferenceNotAllowed, /// Invalid implementation of a trait method. /// The first `String` wraps the trait name, and the second wraps the method name. BadTraitImplementation(String, String), @@ -461,15 +810,11 @@ pub enum CheckErrorKind { /// Trait definition contains duplicate method names. /// The `String` wraps the duplicate method name. DefineTraitDuplicateMethod(String), - /// Unexpected use of a trait or field reference in a non-trait context. - UnexpectedTraitOrFieldReference, + /// Trait-based contract call used in a read-only context, which is prohibited. TraitBasedContractCallInReadOnly, /// `contract-of` expects a trait type but found a different type. ContractOfExpectsTrait, - /// Trait implementation is incompatible with the expected trait definition. - /// The first `Box` wraps the expected trait, and the second wraps the actual trait. - IncompatibleTrait(Box, Box), /// Too many trait methods specified. /// The first `usize` represents the number of methods found, the second the maximum allowed. TraitTooManyMethods(usize, usize), @@ -480,14 +825,8 @@ pub enum CheckErrorKind { /// String contains invalid UTF-8 encoding. InvalidUTF8Encoding, - // secp256k1 signature - /// Invalid secp256k1 signature provided in an expression. - InvalidSecp65k1Signature, - /// Attempt to write to contract state in a read-only function. WriteAttemptedInReadOnly, - /// `at-block` closure must be read-only but contains write operations. - AtBlockClosureMustBeReadOnly, // contract post-conditions /// Post-condition expects a list of asset allowances but received invalid input. @@ -498,27 +837,21 @@ pub enum CheckErrorKind { /// Expected an allowance expression but found invalid input. /// The `String` wraps the unexpected input. ExpectedAllowanceExpr(String), - /// `with-all-assets-unsafe` is not allowed in this context. - WithAllAllowanceNotAllowed, - /// `with-all-assets-unsafe` cannot be used alongside other allowances. - WithAllAllowanceNotAlone, - /// `with-nft` allowance requires a list of asset identifiers. - WithNftExpectedListOfIdentifiers, - /// `with-nft` allowance identifiers list exceeds the maximum allowed length. - /// The first `u32` represents the maximum length, and the second represents the actual length. - MaxIdentifierLengthExceeded(u32, u32), /// Too many allowances specified in post-condition. /// The first `usize` represents the maximum allowed, and the second represents the actual count. TooManyAllowances(usize, usize), } #[derive(Debug, PartialEq)] -/// Represents an error encountered during Clarity's type-checking and semantic analysis phase. -/// Wraps a `CheckErrorKind` variant, optionally includes the expressions causing the error, -/// and provides diagnostic information for debugging. +/// A complete static analysis error, combining the error with diagnostic information. +/// +/// This struct wraps a [`StaticCheckErrorKind`] variant with its source location +/// (like line and column numbers) and the code expression that caused the error. +/// It provides the full context needed to report a clear, actionable error to a +/// developer during contract deployment. pub struct StaticCheckError { /// The specific type-checking or semantic error that occurred. - pub err: Box, + pub err: Box, /// Optional vector of expressions related to the error, if available. pub expressions: Option>, /// Diagnostic details (e.g., line/column numbers, error message, suggestions) around the error. @@ -526,8 +859,7 @@ pub struct StaticCheckError { } impl CheckErrorKind { - /// Does this check error indicate that the transaction should be - /// rejected? + /// This check indicates that the transaction should be rejected. pub fn rejectable(&self) -> bool { matches!( self, @@ -536,8 +868,18 @@ impl CheckErrorKind { } } +impl StaticCheckErrorKind { + /// This check indicates that the transaction should be rejected. + pub fn rejectable(&self) -> bool { + matches!( + self, + StaticCheckErrorKind::SupertypeTooLarge | StaticCheckErrorKind::Expects(_) + ) + } +} + impl StaticCheckError { - pub fn new(err: CheckErrorKind) -> StaticCheckError { + pub fn new(err: StaticCheckErrorKind) -> StaticCheckError { let diagnostic = Diagnostic::err(&err); StaticCheckError { err: Box::new(err), @@ -560,30 +902,40 @@ impl StaticCheckError { self.expressions.replace(exprs.to_vec()); } - pub fn with_expression(err: CheckErrorKind, expr: &SymbolicExpression) -> Self { + pub fn with_expression(err: StaticCheckErrorKind, expr: &SymbolicExpression) -> Self { let mut r = Self::new(err); r.set_expression(expr); r } } +impl From<(CommonCheckErrorKind, &SymbolicExpression)> for StaticCheckError { + fn from(e: (CommonCheckErrorKind, &SymbolicExpression)) -> Self { + Self::with_expression(e.0.into(), e.1) + } +} + impl From<(SyntaxBindingError, &SymbolicExpression)> for StaticCheckError { fn from(e: (SyntaxBindingError, &SymbolicExpression)) -> Self { - Self::with_expression(CheckErrorKind::BadSyntaxBinding(e.0), e.1) + Self::with_expression(StaticCheckErrorKind::BadSyntaxBinding(e.0), e.1) } } -impl From<(CheckErrorKind, &SymbolicExpression)> for StaticCheckError { - fn from(e: (CheckErrorKind, &SymbolicExpression)) -> Self { - let mut ce = Self::new(e.0); - ce.set_expression(e.1); - ce +impl From<(CommonCheckErrorKind, &SymbolicExpression)> for CommonCheckErrorKind { + fn from(e: (CommonCheckErrorKind, &SymbolicExpression)) -> Self { + e.0 } } -impl From<(CheckErrorKind, &SymbolicExpression)> for CheckErrorKind { - fn from(e: (CheckErrorKind, &SymbolicExpression)) -> Self { - e.0 +impl From<(CommonCheckErrorKind, &SymbolicExpression)> for CheckErrorKind { + fn from(e: (CommonCheckErrorKind, &SymbolicExpression)) -> Self { + e.0.into() + } +} + +impl fmt::Display for CommonCheckErrorKind { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{self:?}") } } @@ -593,6 +945,12 @@ impl fmt::Display for CheckErrorKind { } } +impl fmt::Display for StaticCheckErrorKind { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{self:?}") + } +} + impl fmt::Display for StaticCheckError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.err)?; @@ -607,7 +965,30 @@ impl fmt::Display for StaticCheckError { impl From for StaticCheckError { fn from(err: CostErrors) -> Self { - StaticCheckError::from(CheckErrorKind::from(err)) + StaticCheckError::from(StaticCheckErrorKind::from(err)) + } +} + +impl From for StaticCheckErrorKind { + fn from(err: CostErrors) -> Self { + match err { + CostErrors::CostOverflow => StaticCheckErrorKind::CostOverflow, + CostErrors::CostBalanceExceeded(a, b) => { + StaticCheckErrorKind::CostBalanceExceeded(a, b) + } + CostErrors::MemoryBalanceExceeded(a, b) => { + StaticCheckErrorKind::MemoryBalanceExceeded(a, b) + } + CostErrors::CostComputationFailed(s) => StaticCheckErrorKind::CostComputationFailed(s), + CostErrors::CostContractLoadFailure => { + StaticCheckErrorKind::CostComputationFailed("Failed to load cost contract".into()) + } + CostErrors::InterpreterFailure => StaticCheckErrorKind::Expects( + "Unexpected interpreter failure in cost computation".into(), + ), + CostErrors::Expect(s) => StaticCheckErrorKind::Expects(s), + CostErrors::ExecutionTimeExpired => StaticCheckErrorKind::ExecutionTimeExpired, + } } } @@ -630,6 +1011,35 @@ impl From for CheckErrorKind { } } +impl From for CommonCheckErrorKind { + fn from(err: CostErrors) -> Self { + match err { + CostErrors::CostOverflow => CommonCheckErrorKind::CostOverflow, + CostErrors::CostBalanceExceeded(a, b) => { + CommonCheckErrorKind::CostBalanceExceeded(a, b) + } + CostErrors::MemoryBalanceExceeded(a, b) => { + CommonCheckErrorKind::MemoryBalanceExceeded(a, b) + } + CostErrors::CostComputationFailed(s) => CommonCheckErrorKind::CostComputationFailed(s), + CostErrors::CostContractLoadFailure => { + CommonCheckErrorKind::CostComputationFailed("Failed to load cost contract".into()) + } + CostErrors::InterpreterFailure => CommonCheckErrorKind::Expects( + "Unexpected interpreter failure in cost computation".into(), + ), + CostErrors::Expect(s) => CommonCheckErrorKind::Expects(s), + CostErrors::ExecutionTimeExpired => CommonCheckErrorKind::ExecutionTimeExpired, + } + } +} + +impl error::Error for CommonCheckErrorKind { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + None + } +} + impl error::Error for StaticCheckError { fn source(&self) -> Option<&(dyn error::Error + 'static)> { None @@ -642,30 +1052,174 @@ impl error::Error for CheckErrorKind { } } -impl From for StaticCheckError { - fn from(err: CheckErrorKind) -> Self { +impl From for StaticCheckError { + fn from(err: StaticCheckErrorKind) -> Self { StaticCheckError::new(err) } } +impl From for StaticCheckError { + fn from(err: CommonCheckErrorKind) -> Self { + StaticCheckError::new(StaticCheckErrorKind::from(err)) + } +} + +impl From for CheckErrorKind { + fn from(err: CommonCheckErrorKind) -> Self { + match err { + CommonCheckErrorKind::CostOverflow => CheckErrorKind::CostOverflow, + CommonCheckErrorKind::CostBalanceExceeded(a, b) => { + CheckErrorKind::CostBalanceExceeded(a, b) + } + CommonCheckErrorKind::MemoryBalanceExceeded(a, b) => { + CheckErrorKind::MemoryBalanceExceeded(a, b) + } + CommonCheckErrorKind::CostComputationFailed(s) => { + CheckErrorKind::CostComputationFailed(s) + } + CommonCheckErrorKind::ExecutionTimeExpired => CheckErrorKind::ExecutionTimeExpired, + CommonCheckErrorKind::IncorrectArgumentCount(expected, args) => { + CheckErrorKind::IncorrectArgumentCount(expected, args) + } + CommonCheckErrorKind::RequiresAtLeastArguments(expected, args) => { + CheckErrorKind::RequiresAtLeastArguments(expected, args) + } + CommonCheckErrorKind::RequiresAtMostArguments(expected, args) => { + CheckErrorKind::RequiresAtMostArguments(expected, args) + } + CommonCheckErrorKind::TooManyFunctionParameters(found, allowed) => { + CheckErrorKind::TooManyFunctionParameters(found, allowed) + } + CommonCheckErrorKind::ExpectedName => CheckErrorKind::ExpectedName, + CommonCheckErrorKind::DefineFunctionBadSignature => { + CheckErrorKind::DefineFunctionBadSignature + } + CommonCheckErrorKind::ExpectedTraitIdentifier => { + CheckErrorKind::ExpectedTraitIdentifier + } + CommonCheckErrorKind::Expects(s) => CheckErrorKind::Expects(s), + CommonCheckErrorKind::CouldNotDetermineType => CheckErrorKind::CouldNotDetermineType, + CommonCheckErrorKind::ValueTooLarge => CheckErrorKind::ValueTooLarge, + CommonCheckErrorKind::TypeSignatureTooDeep => CheckErrorKind::TypeSignatureTooDeep, + CommonCheckErrorKind::DefineTraitDuplicateMethod(s) => { + CheckErrorKind::DefineTraitDuplicateMethod(s) + } + CommonCheckErrorKind::TraitTooManyMethods(found, allowed) => { + CheckErrorKind::TraitTooManyMethods(found, allowed) + } + CommonCheckErrorKind::DefineTraitBadSignature => { + CheckErrorKind::DefineTraitBadSignature + } + CommonCheckErrorKind::InvalidTypeDescription => CheckErrorKind::InvalidTypeDescription, + CommonCheckErrorKind::SupertypeTooLarge => CheckErrorKind::SupertypeTooLarge, + CommonCheckErrorKind::TypeError(a, b) => CheckErrorKind::TypeError(a, b), + CommonCheckErrorKind::BadSyntaxBinding(e) => CheckErrorKind::BadSyntaxBinding(e), + CommonCheckErrorKind::ValueOutOfBounds => CheckErrorKind::ValueOutOfBounds, + CommonCheckErrorKind::EmptyTuplesNotAllowed => CheckErrorKind::EmptyTuplesNotAllowed, + CommonCheckErrorKind::NameAlreadyUsed(name) => CheckErrorKind::NameAlreadyUsed(name), + CommonCheckErrorKind::UnknownTypeName(name) => CheckErrorKind::UnknownTypeName(name), + } + } +} + +impl From for StaticCheckErrorKind { + fn from(err: CommonCheckErrorKind) -> Self { + match err { + CommonCheckErrorKind::CostOverflow => StaticCheckErrorKind::CostOverflow, + CommonCheckErrorKind::CostBalanceExceeded(a, b) => { + StaticCheckErrorKind::CostBalanceExceeded(a, b) + } + CommonCheckErrorKind::MemoryBalanceExceeded(a, b) => { + StaticCheckErrorKind::MemoryBalanceExceeded(a, b) + } + CommonCheckErrorKind::CostComputationFailed(s) => { + StaticCheckErrorKind::CostComputationFailed(s) + } + CommonCheckErrorKind::ExecutionTimeExpired => { + StaticCheckErrorKind::ExecutionTimeExpired + } + CommonCheckErrorKind::IncorrectArgumentCount(expected, args) => { + StaticCheckErrorKind::IncorrectArgumentCount(expected, args) + } + CommonCheckErrorKind::RequiresAtLeastArguments(expected, args) => { + StaticCheckErrorKind::RequiresAtLeastArguments(expected, args) + } + CommonCheckErrorKind::RequiresAtMostArguments(expected, args) => { + StaticCheckErrorKind::RequiresAtMostArguments(expected, args) + } + CommonCheckErrorKind::TooManyFunctionParameters(found, allowed) => { + StaticCheckErrorKind::TooManyFunctionParameters(found, allowed) + } + CommonCheckErrorKind::ExpectedName => StaticCheckErrorKind::ExpectedName, + CommonCheckErrorKind::DefineFunctionBadSignature => { + StaticCheckErrorKind::DefineFunctionBadSignature + } + CommonCheckErrorKind::ExpectedTraitIdentifier => { + StaticCheckErrorKind::ExpectedTraitIdentifier + } + CommonCheckErrorKind::Expects(s) => StaticCheckErrorKind::Expects(s), + CommonCheckErrorKind::CouldNotDetermineType => { + StaticCheckErrorKind::CouldNotDetermineType + } + CommonCheckErrorKind::ValueTooLarge => StaticCheckErrorKind::ValueTooLarge, + CommonCheckErrorKind::TypeSignatureTooDeep => { + StaticCheckErrorKind::TypeSignatureTooDeep + } + CommonCheckErrorKind::DefineTraitDuplicateMethod(s) => { + StaticCheckErrorKind::DefineTraitDuplicateMethod(s) + } + CommonCheckErrorKind::DefineTraitBadSignature => { + StaticCheckErrorKind::DefineTraitBadSignature + } + CommonCheckErrorKind::TraitTooManyMethods(found, allowed) => { + StaticCheckErrorKind::TraitTooManyMethods(found, allowed) + } + CommonCheckErrorKind::InvalidTypeDescription => { + StaticCheckErrorKind::InvalidTypeDescription + } + CommonCheckErrorKind::SupertypeTooLarge => StaticCheckErrorKind::SupertypeTooLarge, + CommonCheckErrorKind::TypeError(a, b) => StaticCheckErrorKind::TypeError(a, b), + CommonCheckErrorKind::BadSyntaxBinding(e) => StaticCheckErrorKind::BadSyntaxBinding(e), + CommonCheckErrorKind::ValueOutOfBounds => StaticCheckErrorKind::ValueOutOfBounds, + CommonCheckErrorKind::EmptyTuplesNotAllowed => { + StaticCheckErrorKind::EmptyTuplesNotAllowed + } + CommonCheckErrorKind::NameAlreadyUsed(name) => { + StaticCheckErrorKind::NameAlreadyUsed(name) + } + CommonCheckErrorKind::UnknownTypeName(name) => { + StaticCheckErrorKind::UnknownTypeName(name) + } + } + } +} + +/// This conversion is provided to support tests in +/// `clarity/src/vm/analysis/type_checker/v2_1/tests/contracts.rs`. #[cfg(any(test, feature = "testing"))] -impl From for String { - fn from(o: CheckErrorKind) -> Self { +impl From for String { + fn from(o: StaticCheckErrorKind) -> Self { o.to_string() } } -pub fn check_argument_count(expected: usize, args: &[T]) -> Result<(), CheckErrorKind> { +pub fn check_argument_count(expected: usize, args: &[T]) -> Result<(), CommonCheckErrorKind> { if args.len() != expected { - Err(CheckErrorKind::IncorrectArgumentCount(expected, args.len())) + Err(CommonCheckErrorKind::IncorrectArgumentCount( + expected, + args.len(), + )) } else { Ok(()) } } -pub fn check_arguments_at_least(expected: usize, args: &[T]) -> Result<(), CheckErrorKind> { +pub fn check_arguments_at_least( + expected: usize, + args: &[T], +) -> Result<(), CommonCheckErrorKind> { if args.len() < expected { - Err(CheckErrorKind::RequiresAtLeastArguments( + Err(CommonCheckErrorKind::RequiresAtLeastArguments( expected, args.len(), )) @@ -674,9 +1228,9 @@ pub fn check_arguments_at_least(expected: usize, args: &[T]) -> Result<(), Ch } } -pub fn check_arguments_at_most(expected: usize, args: &[T]) -> Result<(), CheckErrorKind> { +pub fn check_arguments_at_most(expected: usize, args: &[T]) -> Result<(), CommonCheckErrorKind> { if args.len() > expected { - Err(CheckErrorKind::RequiresAtMostArguments( + Err(CommonCheckErrorKind::RequiresAtMostArguments( expected, args.len(), )) @@ -700,149 +1254,128 @@ fn formatted_expected_types(expected_types: &[TypeSignature]) -> String { expected_types_joined } -impl DiagnosableError for CheckErrorKind { +impl DiagnosableError for StaticCheckErrorKind { fn message(&self) -> String { match &self { - CheckErrorKind::SupertypeTooLarge => "supertype of two types is too large".into(), - CheckErrorKind::Expects(s) => format!("unexpected interpreter behavior: {s}"), - CheckErrorKind::BadMatchOptionSyntax(source) => + StaticCheckErrorKind::SupertypeTooLarge => "supertype of two types is too large".into(), + StaticCheckErrorKind::Expects(s) => format!("unexpected interpreter behavior: {s}"), + StaticCheckErrorKind::BadMatchOptionSyntax(source) => format!("match on a optional type uses the following syntax: (match input some-name if-some-expression if-none-expression). Caused by: {}", source.message()), - CheckErrorKind::BadMatchResponseSyntax(source) => + StaticCheckErrorKind::BadMatchResponseSyntax(source) => format!("match on a result type uses the following syntax: (match input ok-name if-ok-expression err-name if-err-expression). Caused by: {}", source.message()), - CheckErrorKind::BadMatchInput(t) => + StaticCheckErrorKind::BadMatchInput(t) => format!("match requires an input of either a response or optional, found input: '{t}'"), - CheckErrorKind::CostOverflow => "contract execution cost overflowed cost counter".into(), - CheckErrorKind::CostBalanceExceeded(a, b) => format!("contract execution cost exceeded budget: {a:?} > {b:?}"), - CheckErrorKind::MemoryBalanceExceeded(a, b) => format!("contract execution cost exceeded memory budget: {a:?} > {b:?}"), - CheckErrorKind::InvalidTypeDescription => "supplied type description is invalid".into(), - CheckErrorKind::EmptyTuplesNotAllowed => "tuple types may not be empty".into(), - CheckErrorKind::UnknownTypeName(name) => format!("failed to parse type: '{name}'"), - CheckErrorKind::ValueTooLarge => "created a type which was greater than maximum allowed value size".into(), - CheckErrorKind::ValueOutOfBounds => "created a type which value size was out of defined bounds".into(), - CheckErrorKind::TypeSignatureTooDeep => "created a type which was deeper than maximum allowed type depth".into(), - CheckErrorKind::ExpectedName => "expected a name argument to this function".into(), - CheckErrorKind::ListTypesMustMatch => "expecting elements of same type in a list".into(), - CheckErrorKind::ConstructedListTooLarge => "reached limit of elements in a sequence".into(), - CheckErrorKind::TypeError(expected_type, found_type) => format!("expecting expression of type '{expected_type}', found '{found_type}'"), - CheckErrorKind::TypeValueError(expected_type, found_value) => format!("expecting expression of type '{expected_type}', found '{found_value}'"), - CheckErrorKind::UnionTypeError(expected_types, found_type) => format!("expecting expression of type {}, found '{}'", formatted_expected_types(expected_types), found_type), - CheckErrorKind::UnionTypeValueError(expected_types, found_type) => format!("expecting expression of type {}, found '{}'", formatted_expected_types(expected_types), found_type), - CheckErrorKind::ExpectedOptionalType(found_type) => format!("expecting expression of type 'optional', found '{found_type}'"), - CheckErrorKind::ExpectedOptionalOrResponseType(found_type) => format!("expecting expression of type 'optional' or 'response', found '{found_type}'"), - CheckErrorKind::ExpectedOptionalOrResponseValue(found_value) => format!("expecting expression of type 'optional' or 'response', found '{found_value}'"), - CheckErrorKind::ExpectedResponseType(found_type) => format!("expecting expression of type 'response', found '{found_type}'"), - CheckErrorKind::ExpectedOptionalValue(found_value) => format!("expecting expression of type 'optional', found '{found_value}'"), - CheckErrorKind::ExpectedResponseValue(found_value) => format!("expecting expression of type 'response', found '{found_value}'"), - CheckErrorKind::ExpectedContractPrincipalValue(found_value) => format!("expecting contract principal value, found '{found_value}'"), - CheckErrorKind::CouldNotDetermineResponseOkType => "attempted to obtain 'ok' value from response, but 'ok' type is indeterminate".into(), - CheckErrorKind::CouldNotDetermineResponseErrType => "attempted to obtain 'err' value from response, but 'err' type is indeterminate".into(), - CheckErrorKind::CouldNotDetermineMatchTypes => "attempted to match on an (optional) or (response) type where either the some, ok, or err type is indeterminate. you may wish to use unwrap-panic or unwrap-err-panic instead.".into(), - CheckErrorKind::CouldNotDetermineType => "type of expression cannot be determined".into(), - CheckErrorKind::BadTupleFieldName => "invalid tuple field name".into(), - CheckErrorKind::ExpectedTuple(type_signature) => format!("expecting tuple, found '{type_signature}'"), - CheckErrorKind::NoSuchTupleField(field_name, tuple_signature) => format!("cannot find field '{field_name}' in tuple '{tuple_signature}'"), - CheckErrorKind::BadTupleConstruction(message) => format!("invalid tuple syntax: {message}"), - CheckErrorKind::NoSuchDataVariable(var_name) => format!("use of unresolved persisted variable '{var_name}'"), - CheckErrorKind::BadTransferSTXArguments => "STX transfer expects an int amount, from principal, to principal".into(), - CheckErrorKind::BadTransferFTArguments => "transfer expects an int amount, from principal, to principal".into(), - CheckErrorKind::BadTransferNFTArguments => "transfer expects an asset, from principal, to principal".into(), - CheckErrorKind::BadMintFTArguments => "mint expects a uint amount and from principal".into(), - CheckErrorKind::BadBurnFTArguments => "burn expects a uint amount and from principal".into(), - CheckErrorKind::BadMapName => "invalid map name".into(), - CheckErrorKind::NoSuchMap(map_name) => format!("use of unresolved map '{map_name}'"), - CheckErrorKind::DefineFunctionBadSignature => "invalid function definition".into(), - CheckErrorKind::BadFunctionName => "invalid function name".into(), - CheckErrorKind::BadMapTypeDefinition => "invalid map definition".into(), - CheckErrorKind::PublicFunctionMustReturnResponse(found_type) => format!("public functions must return an expression of type 'response', found '{found_type}'"), - CheckErrorKind::DefineVariableBadSignature => "invalid variable definition".into(), - CheckErrorKind::ReturnTypesMustMatch(type_1, type_2) => format!("detected two execution paths, returning two different expression types (got '{type_1}' and '{type_2}')"), - CheckErrorKind::NoSuchContract(contract_identifier) => format!("use of unresolved contract '{contract_identifier}'"), - CheckErrorKind::NoSuchPublicFunction(contract_identifier, function_name) => format!("contract '{contract_identifier}' has no public function '{function_name}'"), - CheckErrorKind::PublicFunctionNotReadOnly(contract_identifier, function_name) => format!("function '{contract_identifier}' in '{function_name}' is not read-only"), - CheckErrorKind::ContractAlreadyExists(contract_identifier) => format!("contract name '{contract_identifier}' conflicts with existing contract"), - CheckErrorKind::ContractCallExpectName => "missing contract name for call".into(), - CheckErrorKind::ExpectedCallableType(found_type) => format!("expected a callable contract, found {found_type}"), - CheckErrorKind::NoSuchBlockInfoProperty(property_name) => format!("use of block unknown property '{property_name}'"), - CheckErrorKind::NoSuchBurnBlockInfoProperty(property_name) => format!("use of burn block unknown property '{property_name}'"), - CheckErrorKind::NoSuchStacksBlockInfoProperty(property_name) => format!("use of unknown stacks block property '{property_name}'"), - CheckErrorKind::NoSuchTenureInfoProperty(property_name) => format!("use of unknown tenure property '{property_name}'"), - CheckErrorKind::GetBlockInfoExpectPropertyName => "missing property name for block info introspection".into(), - CheckErrorKind::GetBurnBlockInfoExpectPropertyName => "missing property name for burn block info introspection".into(), - CheckErrorKind::GetStacksBlockInfoExpectPropertyName => "missing property name for stacks block info introspection".into(), - CheckErrorKind::GetTenureInfoExpectPropertyName => "missing property name for tenure info introspection".into(), - CheckErrorKind::NameAlreadyUsed(name) => format!("defining '{name}' conflicts with previous value"), - CheckErrorKind::ReservedWord(name) => format!("{name} is a reserved word"), - CheckErrorKind::NonFunctionApplication => "expecting expression of type function".into(), - CheckErrorKind::ExpectedListApplication => "expecting expression of type list".into(), - CheckErrorKind::ExpectedSequence(found_type) => format!("expecting expression of type 'list', 'buff', 'string-ascii' or 'string-utf8' - found '{found_type}'"), - CheckErrorKind::MaxLengthOverflow => format!("expecting a value <= {}", u32::MAX), - CheckErrorKind::BadLetSyntax => "invalid syntax of 'let'".into(), - CheckErrorKind::CircularReference(references) => format!("detected circular reference: ({})", references.join(", ")), - CheckErrorKind::BadSyntaxBinding(binding_error) => format!("invalid syntax binding: {}", &binding_error.message()), - CheckErrorKind::MaxContextDepthReached => "reached depth limit".into(), - CheckErrorKind::UndefinedVariable(var_name) => format!("use of unresolved variable '{var_name}'"), - CheckErrorKind::UndefinedFunction(var_name) => format!("use of unresolved function '{var_name}'"), - CheckErrorKind::RequiresAtLeastArguments(expected, found) => format!("expecting >= {expected} arguments, got {found}"), - CheckErrorKind::RequiresAtMostArguments(expected, found) => format!("expecting < {expected} arguments, got {found}"), - CheckErrorKind::IncorrectArgumentCount(expected_count, found_count) => format!("expecting {expected_count} arguments, got {found_count}"), - CheckErrorKind::IfArmsMustMatch(type_1, type_2) => format!("expression types returned by the arms of 'if' must match (got '{type_1}' and '{type_2}')"), - CheckErrorKind::MatchArmsMustMatch(type_1, type_2) => format!("expression types returned by the arms of 'match' must match (got '{type_1}' and '{type_2}')"), - CheckErrorKind::DefaultTypesMustMatch(type_1, type_2) => format!("expression types passed in 'default-to' must match (got '{type_1}' and '{type_2}')"), - CheckErrorKind::IllegalOrUnknownFunctionApplication(function_name) => format!("use of illegal / unresolved function '{function_name}"), - CheckErrorKind::UnknownFunction(function_name) => format!("use of unresolved function '{function_name}'"), - CheckErrorKind::TooManyFunctionParameters(found, allowed) => format!("too many function parameters specified: found {found}, the maximum is {allowed}"), - CheckErrorKind::TraitBasedContractCallInReadOnly => "use of trait based contract calls are not allowed in read-only context".into(), - CheckErrorKind::WriteAttemptedInReadOnly => "expecting read-only statements, detected a writing operation".into(), - CheckErrorKind::AtBlockClosureMustBeReadOnly => "(at-block ...) closures expect read-only statements, but detected a writing operation".into(), - CheckErrorKind::BadTokenName => "expecting an token name as an argument".into(), - CheckErrorKind::DefineNFTBadSignature => "(define-asset ...) expects an asset name and an asset identifier type signature as arguments".into(), - CheckErrorKind::NoSuchNFT(asset_name) => format!("tried to use asset function with a undefined asset ('{asset_name}')"), - CheckErrorKind::NoSuchFT(asset_name) => format!("tried to use token function with a undefined token ('{asset_name}')"), - CheckErrorKind::NoSuchTrait(contract_name, trait_name) => format!("use of unresolved trait {contract_name}.{trait_name}"), - CheckErrorKind::TraitReferenceUnknown(trait_name) => format!("use of undeclared trait <{trait_name}>"), - CheckErrorKind::TraitMethodUnknown(trait_name, func_name) => format!("method '{func_name}' unspecified in trait <{trait_name}>"), - CheckErrorKind::BadTraitImplementation(trait_name, func_name) => format!("invalid signature for method '{func_name}' regarding trait's specification <{trait_name}>"), - CheckErrorKind::ExpectedTraitIdentifier => "expecting expression of type trait identifier".into(), - CheckErrorKind::UnexpectedTraitOrFieldReference => "unexpected use of trait reference or field".into(), - CheckErrorKind::DefineTraitBadSignature => "invalid trait definition".into(), - CheckErrorKind::DefineTraitDuplicateMethod(method_name) => format!("duplicate method name '{method_name}' in trait definition"), - CheckErrorKind::TraitReferenceNotAllowed => "trait references can not be stored".into(), - CheckErrorKind::ContractOfExpectsTrait => "trait reference expected".into(), - CheckErrorKind::IncompatibleTrait(expected_trait, actual_trait) => format!("trait '{actual_trait}' is not a compatible with expected trait, '{expected_trait}'"), - CheckErrorKind::TraitTooManyMethods(found, allowed) => format!("too many trait methods specified: found {found}, the maximum is {allowed}"), - CheckErrorKind::InvalidCharactersDetected => "invalid characters detected".into(), - CheckErrorKind::InvalidUTF8Encoding => "invalid UTF8 encoding".into(), - CheckErrorKind::InvalidSecp65k1Signature => "invalid seckp256k1 signature".into(), - CheckErrorKind::TypeAlreadyAnnotatedFailure | CheckErrorKind::CheckerImplementationFailure => { + StaticCheckErrorKind::CostOverflow => "contract execution cost overflowed cost counter".into(), + StaticCheckErrorKind::CostBalanceExceeded(a, b) => format!("contract execution cost exceeded budget: {a:?} > {b:?}"), + StaticCheckErrorKind::MemoryBalanceExceeded(a, b) => format!("contract execution cost exceeded memory budget: {a:?} > {b:?}"), + StaticCheckErrorKind::CostComputationFailed(s) => format!("contract cost computation failed: {s}"), + StaticCheckErrorKind::ExecutionTimeExpired => "execution time expired".into(), + StaticCheckErrorKind::InvalidTypeDescription => "supplied type description is invalid".into(), + StaticCheckErrorKind::EmptyTuplesNotAllowed => "tuple types may not be empty".into(), + StaticCheckErrorKind::UnknownTypeName(name) => format!("failed to parse type: '{name}'"), + StaticCheckErrorKind::ValueTooLarge => "created a type which was greater than maximum allowed value size".into(), + StaticCheckErrorKind::ValueOutOfBounds => "created a type which value size was out of defined bounds".into(), + StaticCheckErrorKind::TypeSignatureTooDeep => "created a type which was deeper than maximum allowed type depth".into(), + StaticCheckErrorKind::ExpectedName => "expected a name argument to this function".into(), + StaticCheckErrorKind::ConstructedListTooLarge => "reached limit of elements in a sequence".into(), + StaticCheckErrorKind::TypeError(expected_type, found_type) => format!("expecting expression of type '{expected_type}', found '{found_type}'"), + StaticCheckErrorKind::UnionTypeError(expected_types, found_type) => format!("expecting expression of type {}, found '{}'", formatted_expected_types(expected_types), found_type), + StaticCheckErrorKind::ExpectedOptionalType(found_type) => format!("expecting expression of type 'optional', found '{found_type}'"), + StaticCheckErrorKind::ExpectedOptionalOrResponseType(found_type) => format!("expecting expression of type 'optional' or 'response', found '{found_type}'"), + StaticCheckErrorKind::ExpectedResponseType(found_type) => format!("expecting expression of type 'response', found '{found_type}'"), + StaticCheckErrorKind::CouldNotDetermineResponseOkType => "attempted to obtain 'ok' value from response, but 'ok' type is indeterminate".into(), + StaticCheckErrorKind::CouldNotDetermineResponseErrType => "attempted to obtain 'err' value from response, but 'err' type is indeterminate".into(), + StaticCheckErrorKind::CouldNotDetermineMatchTypes => "attempted to match on an (optional) or (response) type where either the some, ok, or err type is indeterminate. you may wish to use unwrap-panic or unwrap-err-panic instead.".into(), + StaticCheckErrorKind::CouldNotDetermineType => "type of expression cannot be determined".into(), + StaticCheckErrorKind::BadTupleFieldName => "invalid tuple field name".into(), + StaticCheckErrorKind::ExpectedTuple(type_signature) => format!("expecting tuple, found '{type_signature}'"), + StaticCheckErrorKind::NoSuchTupleField(field_name, tuple_signature) => format!("cannot find field '{field_name}' in tuple '{tuple_signature}'"), + StaticCheckErrorKind::BadTupleConstruction(message) => format!("invalid tuple syntax: {message}"), + StaticCheckErrorKind::NoSuchDataVariable(var_name) => format!("use of unresolved persisted variable '{var_name}'"), + StaticCheckErrorKind::BadMapName => "invalid map name".into(), + StaticCheckErrorKind::NoSuchMap(map_name) => format!("use of unresolved map '{map_name}'"), + StaticCheckErrorKind::DefineFunctionBadSignature => "invalid function definition".into(), + StaticCheckErrorKind::BadFunctionName => "invalid function name".into(), + StaticCheckErrorKind::BadMapTypeDefinition => "invalid map definition".into(), + StaticCheckErrorKind::PublicFunctionMustReturnResponse(found_type) => format!("public functions must return an expression of type 'response', found '{found_type}'"), + StaticCheckErrorKind::DefineVariableBadSignature => "invalid variable definition".into(), + StaticCheckErrorKind::ReturnTypesMustMatch(type_1, type_2) => format!("detected two execution paths, returning two different expression types (got '{type_1}' and '{type_2}')"), + StaticCheckErrorKind::NoSuchContract(contract_identifier) => format!("use of unresolved contract '{contract_identifier}'"), + StaticCheckErrorKind::NoSuchPublicFunction(contract_identifier, function_name) => format!("contract '{contract_identifier}' has no public function '{function_name}'"), + StaticCheckErrorKind::ContractAlreadyExists(contract_identifier) => format!("contract name '{contract_identifier}' conflicts with existing contract"), + StaticCheckErrorKind::ContractCallExpectName => "missing contract name for call".into(), + StaticCheckErrorKind::ExpectedCallableType(found_type) => format!("expected a callable contract, found {found_type}"), + StaticCheckErrorKind::NoSuchBlockInfoProperty(property_name) => format!("use of block unknown property '{property_name}'"), + StaticCheckErrorKind::NoSuchStacksBlockInfoProperty(property_name) => format!("use of unknown stacks block property '{property_name}'"), + StaticCheckErrorKind::NoSuchTenureInfoProperty(property_name) => format!("use of unknown tenure property '{property_name}'"), + StaticCheckErrorKind::GetBlockInfoExpectPropertyName => "missing property name for block info introspection".into(), + StaticCheckErrorKind::GetBurnBlockInfoExpectPropertyName => "missing property name for burn block info introspection".into(), + StaticCheckErrorKind::GetStacksBlockInfoExpectPropertyName => "missing property name for stacks block info introspection".into(), + StaticCheckErrorKind::GetTenureInfoExpectPropertyName => "missing property name for tenure info introspection".into(), + StaticCheckErrorKind::NameAlreadyUsed(name) => format!("defining '{name}' conflicts with previous value"), + StaticCheckErrorKind::ReservedWord(name) => format!("{name} is a reserved word"), + StaticCheckErrorKind::NonFunctionApplication => "expecting expression of type function".into(), + StaticCheckErrorKind::ExpectedListApplication => "expecting expression of type list".into(), + StaticCheckErrorKind::ExpectedSequence(found_type) => format!("expecting expression of type 'list', 'buff', 'string-ascii' or 'string-utf8' - found '{found_type}'"), + StaticCheckErrorKind::MaxLengthOverflow => format!("expecting a value <= {}", u32::MAX), + StaticCheckErrorKind::BadLetSyntax => "invalid syntax of 'let'".into(), + StaticCheckErrorKind::BadSyntaxBinding(binding_error) => format!("invalid syntax binding: {}", &binding_error.message()), + StaticCheckErrorKind::MaxContextDepthReached => "reached depth limit".into(), + StaticCheckErrorKind::UndefinedVariable(var_name) => format!("use of unresolved variable '{var_name}'"), + StaticCheckErrorKind::RequiresAtLeastArguments(expected, found) => format!("expecting >= {expected} arguments, got {found}"), + StaticCheckErrorKind::RequiresAtMostArguments(expected, found) => format!("expecting < {expected} arguments, got {found}"), + StaticCheckErrorKind::IncorrectArgumentCount(expected_count, found_count) => format!("expecting {expected_count} arguments, got {found_count}"), + StaticCheckErrorKind::IfArmsMustMatch(type_1, type_2) => format!("expression types returned by the arms of 'if' must match (got '{type_1}' and '{type_2}')"), + StaticCheckErrorKind::MatchArmsMustMatch(type_1, type_2) => format!("expression types returned by the arms of 'match' must match (got '{type_1}' and '{type_2}')"), + StaticCheckErrorKind::DefaultTypesMustMatch(type_1, type_2) => format!("expression types passed in 'default-to' must match (got '{type_1}' and '{type_2}')"), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication(function_name) => format!("use of illegal / unresolved function '{function_name}"), + StaticCheckErrorKind::UnknownFunction(function_name) => format!("use of unresolved function '{function_name}'"), + StaticCheckErrorKind::TooManyFunctionParameters(found, allowed) => format!("too many function parameters specified: found {found}, the maximum is {allowed}"), + StaticCheckErrorKind::WriteAttemptedInReadOnly => "expecting read-only statements, detected a writing operation".into(), + StaticCheckErrorKind::AtBlockClosureMustBeReadOnly => "(at-block ...) closures expect read-only statements, but detected a writing operation".into(), + StaticCheckErrorKind::BadTokenName => "expecting an token name as an argument".into(), + StaticCheckErrorKind::DefineNFTBadSignature => "(define-asset ...) expects an asset name and an asset identifier type signature as arguments".into(), + StaticCheckErrorKind::NoSuchNFT(asset_name) => format!("tried to use asset function with a undefined asset ('{asset_name}')"), + StaticCheckErrorKind::NoSuchFT(asset_name) => format!("tried to use token function with a undefined token ('{asset_name}')"), + StaticCheckErrorKind::NoSuchTrait(contract_name, trait_name) => format!("use of unresolved trait {contract_name}.{trait_name}"), + StaticCheckErrorKind::TraitReferenceUnknown(trait_name) => format!("use of undeclared trait <{trait_name}>"), + StaticCheckErrorKind::TraitMethodUnknown(trait_name, func_name) => format!("method '{func_name}' unspecified in trait <{trait_name}>"), + StaticCheckErrorKind::BadTraitImplementation(trait_name, func_name) => format!("invalid signature for method '{func_name}' regarding trait's specification <{trait_name}>"), + StaticCheckErrorKind::ExpectedTraitIdentifier => "expecting expression of type trait identifier".into(), + StaticCheckErrorKind::UnexpectedTraitOrFieldReference => "unexpected use of trait reference or field".into(), + StaticCheckErrorKind::DefineTraitBadSignature => "invalid trait definition".into(), + StaticCheckErrorKind::DefineTraitDuplicateMethod(method_name) => format!("duplicate method name '{method_name}' in trait definition"), + StaticCheckErrorKind::ContractOfExpectsTrait => "trait reference expected".into(), + StaticCheckErrorKind::IncompatibleTrait(expected_trait, actual_trait) => format!("trait '{actual_trait}' is not a compatible with expected trait, '{expected_trait}'"), + StaticCheckErrorKind::TraitTooManyMethods(found, allowed) => format!("too many trait methods specified: found {found}, the maximum is {allowed}"), + StaticCheckErrorKind::TypeAlreadyAnnotatedFailure | StaticCheckErrorKind::CheckerImplementationFailure => { "internal error - please file an issue on https://github.com/stacks-network/stacks-blockchain".into() }, - CheckErrorKind::UncheckedIntermediaryResponses => "intermediary responses in consecutive statements must be checked".into(), - CheckErrorKind::CostComputationFailed(s) => format!("contract cost computation failed: {s}"), - CheckErrorKind::CouldNotDetermineSerializationType => "could not determine the input type for the serialization function".into(), - CheckErrorKind::ExecutionTimeExpired => "execution time expired".into(), - CheckErrorKind::ExpectedListOfAllowances(fn_name, arg_num) => format!("{fn_name} expects a list of asset allowances as argument {arg_num}"), - CheckErrorKind::AllowanceExprNotAllowed => "allowance expressions are only allowed in the context of a `restrict-assets?` or `as-contract?`".into(), - CheckErrorKind::ExpectedAllowanceExpr(got_name) => format!("expected an allowance expression, got: {got_name}"), - CheckErrorKind::WithAllAllowanceNotAllowed => "with-all-assets-unsafe is not allowed here, only in the allowance list for `as-contract?`".into(), - CheckErrorKind::WithAllAllowanceNotAlone => "with-all-assets-unsafe must not be used along with other allowances".into(), - CheckErrorKind::WithNftExpectedListOfIdentifiers => "with-nft allowance must include a list of asset identifiers".into(), - CheckErrorKind::MaxIdentifierLengthExceeded(max_len, len) => format!("with-nft allowance identifiers list must not exceed {max_len} elements, got {len}"), - CheckErrorKind::TooManyAllowances(max_allowed, found) => format!("too many allowances specified, the maximum is {max_allowed}, found {found}"), + StaticCheckErrorKind::UncheckedIntermediaryResponses => "intermediary responses in consecutive statements must be checked".into(), + StaticCheckErrorKind::CouldNotDetermineSerializationType => "could not determine the input type for the serialization function".into(), + StaticCheckErrorKind::ExpectedListOfAllowances(fn_name, arg_num) => format!("{fn_name} expects a list of asset allowances as argument {arg_num}"), + StaticCheckErrorKind::AllowanceExprNotAllowed => "allowance expressions are only allowed in the context of a `restrict-assets?` or `as-contract?`".into(), + StaticCheckErrorKind::ExpectedAllowanceExpr(got_name) => format!("expected an allowance expression, got: {got_name}"), + StaticCheckErrorKind::WithAllAllowanceNotAllowed => "with-all-assets-unsafe is not allowed here, only in the allowance list for `as-contract?`".into(), + StaticCheckErrorKind::WithAllAllowanceNotAlone => "with-all-assets-unsafe must not be used along with other allowances".into(), + StaticCheckErrorKind::WithNftExpectedListOfIdentifiers => "with-nft allowance must include a list of asset identifiers".into(), + StaticCheckErrorKind::MaxIdentifierLengthExceeded(max_len, len) => format!("with-nft allowance identifiers list must not exceed {max_len} elements, got {len}"), + StaticCheckErrorKind::TooManyAllowances(max_allowed, found) => format!("too many allowances specified, the maximum is {max_allowed}, found {found}"), } } fn suggestion(&self) -> Option { match &self { - CheckErrorKind::BadLetSyntax => Some( + StaticCheckErrorKind::BadLetSyntax => Some( "'let' syntax example: (let ((supply 1000) (ttl 60)) )".into(), ), - CheckErrorKind::TraitReferenceUnknown(_) => Some( + StaticCheckErrorKind::TraitReferenceUnknown(_) => Some( "traits should be either defined, with define-trait, or imported, with use-trait." .into(), ), - CheckErrorKind::NoSuchBlockInfoProperty(_) => Some( + StaticCheckErrorKind::NoSuchBlockInfoProperty(_) => Some( "properties available: time, header-hash, burnchain-header-hash, vrf-seed".into(), ), _ => None, diff --git a/clarity-types/src/errors/mod.rs b/clarity-types/src/errors/mod.rs index 34f03a549cb..668f7d01043 100644 --- a/clarity-types/src/errors/mod.rs +++ b/clarity-types/src/errors/mod.rs @@ -20,7 +20,7 @@ pub mod lexer; use std::{error, fmt}; -pub use analysis::{CheckErrorKind, StaticCheckError}; +pub use analysis::{CheckErrorKind, CommonCheckErrorKind, StaticCheckError, StaticCheckErrorKind}; pub use ast::{ParseError, ParseErrorKind, ParseResult}; pub use cost::CostErrors; pub use lexer::LexerError; @@ -190,6 +190,8 @@ pub enum RuntimeError { PoxAlreadyLocked, /// Block time unavailable during execution. BlockTimeNotAvailable, + /// A Clarity string used as a token name for a post-condition is not a valid Clarity name. + BadTokenName(String), } #[derive(Debug, PartialEq)] @@ -292,15 +294,21 @@ impl From for VmExecutionError { } } +impl From for VmExecutionError { + fn from(err: CommonCheckErrorKind) -> Self { + VmExecutionError::Unchecked(err.into()) + } +} + impl From for VmExecutionError { fn from(err: CheckErrorKind) -> Self { VmExecutionError::Unchecked(err) } } -impl From<(CheckErrorKind, &SymbolicExpression)> for VmExecutionError { - fn from(err: (CheckErrorKind, &SymbolicExpression)) -> Self { - VmExecutionError::Unchecked(err.0) +impl From<(CommonCheckErrorKind, &SymbolicExpression)> for VmExecutionError { + fn from(err: (CommonCheckErrorKind, &SymbolicExpression)) -> Self { + VmExecutionError::Unchecked(err.0.into()) } } diff --git a/clarity-types/src/tests/types/mod.rs b/clarity-types/src/tests/types/mod.rs index ef0a023a60b..1028d443a2c 100644 --- a/clarity-types/src/tests/types/mod.rs +++ b/clarity-types/src/tests/types/mod.rs @@ -19,6 +19,7 @@ use rstest::rstest; use stacks_common::types::StacksEpochId; use crate::VmExecutionError; +use crate::errors::analysis::CommonCheckErrorKind; use crate::errors::{CheckErrorKind, RuntimeError, VmInternalError}; use crate::types::{ ASCIIData, BuffData, CharType, ListTypeData, MAX_VALUE_SIZE, PrincipalData, @@ -38,7 +39,7 @@ fn test_constructors() { ); assert_eq!( ListTypeData::new_list(TypeSignature::IntType, MAX_VALUE_SIZE), - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) ); assert_eq!( @@ -585,3 +586,46 @@ fn test_utf8_data_len_returns_vm_internal_error() { err ); } + +#[test] +fn invalid_utf8_encoding_from_oob_unicode_escape() { + // This is a syntactically valid escape: \u{HEX} + // BUT 110000 > 10FFFF (max Unicode scalar) + // So oob Unicode → char::from_u32(None) → InvalidUTF8Encoding + let bad_utf8_literal = "\\u{110000}".to_string(); + + let err = Value::string_utf8_from_string_utf8_literal(bad_utf8_literal).unwrap_err(); + assert!(matches!( + err, + VmExecutionError::Unchecked(CheckErrorKind::InvalidUTF8Encoding) + )); +} + +#[test] +fn invalid_string_ascii_from_bytes() { + // 0xFF is NOT: + // - ASCII alphanumeric + // - ASCII punctuation + // - ASCII whitespace + let bad_bytes = vec![0xFF]; + + let err = Value::string_ascii_from_bytes(bad_bytes).unwrap_err(); + + assert!(matches!( + err, + VmExecutionError::Unchecked(CheckErrorKind::InvalidCharactersDetected) + )); +} + +#[test] +fn invalid_utf8_string_from_bytes() { + // 0x80 is an invalid standalone UTF-8 continuation byte + let bad_bytes = vec![0x80]; + + let err = Value::string_utf8_from_bytes(bad_bytes).unwrap_err(); + + assert!(matches!( + err, + VmExecutionError::Unchecked(CheckErrorKind::InvalidCharactersDetected) + )); +} diff --git a/clarity-types/src/tests/types/signatures.rs b/clarity-types/src/tests/types/signatures.rs index 6fecdd77767..ba64e1ff17a 100644 --- a/clarity-types/src/tests/types/signatures.rs +++ b/clarity-types/src/tests/types/signatures.rs @@ -12,9 +12,9 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use std::collections::HashSet; +use std::collections::BTreeSet; -use crate::errors::CheckErrorKind; +use crate::errors::analysis::CommonCheckErrorKind; use crate::representations::CONTRACT_MAX_NAME_LENGTH; use crate::types::TypeSignature::{BoolType, IntType, ListUnionType, UIntType}; use crate::types::signatures::{CallableSubtype, TypeSignature}; @@ -43,7 +43,7 @@ fn test_buffer_length_try_from_u32_trait() { assert_eq!(MAX_VALUE_SIZE, buffer.get_value()); let err = BufferLength::try_from(MAX_VALUE_SIZE + 1).unwrap_err(); - assert_eq!(CheckErrorKind::ValueTooLarge, err); + assert_eq!(CommonCheckErrorKind::ValueTooLarge, err); } #[test] @@ -55,7 +55,7 @@ fn test_buffer_length_try_from_usize_trait() { assert_eq!(MAX_VALUE_SIZE, buffer.get_value()); let err = BufferLength::try_from(MAX_VALUE_SIZE as usize + 1).unwrap_err(); - assert_eq!(CheckErrorKind::ValueTooLarge, err); + assert_eq!(CommonCheckErrorKind::ValueTooLarge, err); } #[test] @@ -67,10 +67,10 @@ fn test_buffer_length_try_from_i128_trait() { assert_eq!(MAX_VALUE_SIZE, buffer.get_value()); let err = BufferLength::try_from(MAX_VALUE_SIZE as i128 + 1).unwrap_err(); - assert_eq!(CheckErrorKind::ValueTooLarge, err); + assert_eq!(CommonCheckErrorKind::ValueTooLarge, err); let err = BufferLength::try_from(-1_i128).unwrap_err(); - assert_eq!(CheckErrorKind::ValueOutOfBounds, err); + assert_eq!(CommonCheckErrorKind::ValueOutOfBounds, err); } #[test] @@ -229,7 +229,7 @@ fn test_string_utf8_length_try_from_u32_trait() { assert_eq!(MAX_UTF8_VALUE_SIZE, string.get_value()); let err = StringUTF8Length::try_from(MAX_UTF8_VALUE_SIZE + 1).unwrap_err(); - assert_eq!(CheckErrorKind::ValueTooLarge, err); + assert_eq!(CommonCheckErrorKind::ValueTooLarge, err); } #[test] @@ -244,7 +244,7 @@ fn test_string_utf8_length_try_from_usize_trait() { assert_eq!(MAX_UTF8_VALUE_SIZE, string.get_value()); let err = StringUTF8Length::try_from(MAX_UTF8_VALUE_SIZE as usize + 1).unwrap_err(); - assert_eq!(CheckErrorKind::ValueTooLarge, err); + assert_eq!(CommonCheckErrorKind::ValueTooLarge, err); } #[test] @@ -259,10 +259,10 @@ fn test_string_utf8_length_try_from_i128_trait() { assert_eq!(MAX_UTF8_VALUE_SIZE, string.get_value()); let err = StringUTF8Length::try_from(MAX_UTF8_VALUE_SIZE as i128 + 1).unwrap_err(); - assert_eq!(CheckErrorKind::ValueTooLarge, err); + assert_eq!(CommonCheckErrorKind::ValueTooLarge, err); let err = StringUTF8Length::try_from(-1_i128).unwrap_err(); - assert_eq!(CheckErrorKind::ValueOutOfBounds, err); + assert_eq!(CommonCheckErrorKind::ValueOutOfBounds, err); } #[test] @@ -370,7 +370,7 @@ fn test_least_supertype() { }), ]; let list_union2 = ListUnionType(callables2.clone().into()); - let list_union_merged = ListUnionType(HashSet::from_iter( + let list_union_merged = ListUnionType(BTreeSet::from_iter( [callables, callables2].concat().iter().cloned(), )); let callable_principals = [ @@ -826,11 +826,11 @@ fn test_least_supertype() { for pair in bad_pairs { matches!( TypeSignature::least_supertype_v2_1(&pair.0, &pair.1).unwrap_err(), - CheckErrorKind::TypeError(..) + CommonCheckErrorKind::TypeError(..) ); matches!( TypeSignature::least_supertype_v2_1(&pair.1, &pair.0).unwrap_err(), - CheckErrorKind::TypeError(..) + CommonCheckErrorKind::TypeError(..) ); } } diff --git a/clarity-types/src/types/mod.rs b/clarity-types/src/types/mod.rs index d6581a3523f..1ee7e2dfbb0 100644 --- a/clarity-types/src/types/mod.rs +++ b/clarity-types/src/types/mod.rs @@ -36,6 +36,7 @@ pub use self::signatures::{ AssetIdentifier, BufferLength, ListTypeData, SequenceSubtype, StringSubtype, StringUTF8Length, TupleTypeSignature, TypeSignature, }; +use crate::errors::analysis::CommonCheckErrorKind; use crate::errors::{CheckErrorKind, RuntimeError, VmExecutionError, VmInternalError}; use crate::representations::{ClarityName, ContractName, SymbolicExpression}; @@ -711,7 +712,7 @@ impl fmt::Display for UTF8Data { } pub trait SequencedValue { - fn type_signature(&self) -> std::result::Result; + fn type_signature(&self) -> std::result::Result; fn items(&self) -> &Vec; @@ -736,7 +737,7 @@ impl SequencedValue for ListData { self.data.drain(..).collect() } - fn type_signature(&self) -> std::result::Result { + fn type_signature(&self) -> std::result::Result { Ok(TypeSignature::SequenceType(SequenceSubtype::ListType( self.type_signature.clone(), ))) @@ -756,9 +757,11 @@ impl SequencedValue for BuffData { self.data.drain(..).collect() } - fn type_signature(&self) -> std::result::Result { + fn type_signature(&self) -> std::result::Result { let buff_length = BufferLength::try_from(self.data.len()).map_err(|_| { - CheckErrorKind::Expects("ERROR: Too large of a buffer successfully constructed.".into()) + CommonCheckErrorKind::Expects( + "ERROR: Too large of a buffer successfully constructed.".into(), + ) })?; Ok(TypeSignature::SequenceType(SequenceSubtype::BufferType( buff_length, @@ -779,9 +782,11 @@ impl SequencedValue for ASCIIData { self.data.drain(..).collect() } - fn type_signature(&self) -> std::result::Result { + fn type_signature(&self) -> std::result::Result { let buff_length = BufferLength::try_from(self.data.len()).map_err(|_| { - CheckErrorKind::Expects("ERROR: Too large of a buffer successfully constructed.".into()) + CommonCheckErrorKind::Expects( + "ERROR: Too large of a buffer successfully constructed.".into(), + ) })?; Ok(TypeSignature::SequenceType(SequenceSubtype::StringType( StringSubtype::ASCII(buff_length), @@ -805,9 +810,11 @@ impl SequencedValue> for UTF8Data { self.data.drain(..).collect() } - fn type_signature(&self) -> std::result::Result { + fn type_signature(&self) -> std::result::Result { let str_len = StringUTF8Length::try_from(self.data.len()).map_err(|_| { - CheckErrorKind::Expects("ERROR: Too large of a buffer successfully constructed.".into()) + CommonCheckErrorKind::Expects( + "ERROR: Too large of a buffer successfully constructed.".into(), + ) })?; Ok(TypeSignature::SequenceType(SequenceSubtype::StringType( StringSubtype::UTF8(str_len), @@ -823,19 +830,19 @@ impl SequencedValue> for UTF8Data { } impl OptionalData { - pub fn type_signature(&self) -> std::result::Result { + pub fn type_signature(&self) -> std::result::Result { let type_result = match self.data { Some(ref v) => TypeSignature::new_option(TypeSignature::type_of(v)?), None => TypeSignature::new_option(TypeSignature::NoType), }; type_result.map_err(|_| { - CheckErrorKind::Expects("Should not have constructed too large of a type.".into()) + CommonCheckErrorKind::Expects("Should not have constructed too large of a type.".into()) }) } } impl ResponseData { - pub fn type_signature(&self) -> std::result::Result { + pub fn type_signature(&self) -> std::result::Result { let type_result = match self.committed { true => TypeSignature::new_response( TypeSignature::type_of(&self.data)?, @@ -847,7 +854,7 @@ impl ResponseData { ), }; type_result.map_err(|_| { - CheckErrorKind::Expects("Should not have constructed too large of a type.".into()) + CommonCheckErrorKind::Expects("Should not have constructed too large of a type.".into()) }) } } @@ -1052,6 +1059,8 @@ impl Value { .ok_or_else(|| VmInternalError::Expect("Expected capture".into()))?; let scalar_value = window[matched.start()..matched.end()].to_string(); let unicode_char = { + // This first InvalidUTF8Encoding is logically unreachable: the escape regex rejects non-hex digits, + // so from_str_radix only sees valid hex and never errors here. let u = u32::from_str_radix(&scalar_value, 16) .map_err(|_| CheckErrorKind::InvalidUTF8Encoding)?; let c = char::from_u32(u).ok_or_else(|| CheckErrorKind::InvalidUTF8Encoding)?; @@ -1445,6 +1454,10 @@ impl PrincipalData { literal: &str, ) -> Result { let (version, data) = c32::c32_address_decode(literal).map_err(|x| { + // This `TypeParseFailure` is unreachable in normal Clarity execution. + // - All principal literals are validated by the Clarity lexer *before* reaching `parse_standard_principal`. + // - The lexer rejects any literal containing characters outside the C32 alphabet. + // Therefore, only malformed input fed directly into low-level VM entry points can cause this branch to execute. RuntimeError::TypeParseFailure(format!("Invalid principal literal: {x}")) })?; if data.len() != 20 { @@ -1638,10 +1651,7 @@ impl TupleData { }) } - pub fn shallow_merge( - mut base: TupleData, - updates: TupleData, - ) -> Result { + pub fn shallow_merge(mut base: TupleData, updates: TupleData) -> TupleData { let TupleData { data_map, mut type_signature, @@ -1650,7 +1660,7 @@ impl TupleData { base.data_map.insert(name, value); } base.type_signature.shallow_merge(&mut type_signature); - Ok(base) + base } } diff --git a/clarity-types/src/types/serialization.rs b/clarity-types/src/types/serialization.rs index 929b2e43136..9747aca13de 100644 --- a/clarity-types/src/types/serialization.rs +++ b/clarity-types/src/types/serialization.rs @@ -23,6 +23,7 @@ use stacks_common::util::hash::{hex_bytes, to_hex}; use stacks_common::util::retry::BoundReader; use super::{ListTypeData, TupleTypeSignature}; +use crate::errors::analysis::StaticCheckErrorKind; use crate::errors::{CheckErrorKind, IncomparableError, VmInternalError}; use crate::representations::{ClarityName, ContractName, MAX_STRING_LEN}; use crate::types::{ @@ -394,7 +395,7 @@ impl TypeSignature { /// size of a `(buff 1024*1024)` is `1+1024*1024` because of the /// type prefix byte. However, that is 1 byte larger than the maximum /// buffer size in Clarity. - pub fn max_serialized_size(&self) -> Result { + pub fn max_serialized_size(&self) -> Result { let type_prefix_size = 1; let max_output_size = match self { @@ -405,7 +406,7 @@ impl TypeSignature { // `some` or similar with `result` types). So, when // serializing an object with a `NoType`, the other // branch should always be used. - return Err(CheckErrorKind::CouldNotDetermineSerializationType); + return Err(StaticCheckErrorKind::CouldNotDetermineSerializationType); } TypeSignature::IntType => 16, TypeSignature::UIntType => 16, @@ -417,14 +418,14 @@ impl TypeSignature { .get_max_len() .checked_mul(list_type.get_list_item_type().max_serialized_size()?) .and_then(|x| x.checked_add(list_length_encode)) - .ok_or_else(|| CheckErrorKind::ValueTooLarge)? + .ok_or_else(|| StaticCheckErrorKind::ValueTooLarge)? } TypeSignature::SequenceType(SequenceSubtype::BufferType(buff_length)) => { // u32 length as big-endian bytes let buff_length_encode = 4; u32::from(buff_length) .checked_add(buff_length_encode) - .ok_or_else(|| CheckErrorKind::ValueTooLarge)? + .ok_or_else(|| StaticCheckErrorKind::ValueTooLarge)? } TypeSignature::SequenceType(SequenceSubtype::StringType(StringSubtype::ASCII( length, @@ -434,7 +435,7 @@ impl TypeSignature { // ascii is 1-byte per character u32::from(length) .checked_add(str_length_encode) - .ok_or_else(|| CheckErrorKind::ValueTooLarge)? + .ok_or_else(|| StaticCheckErrorKind::ValueTooLarge)? } TypeSignature::SequenceType(SequenceSubtype::StringType(StringSubtype::UTF8( length, @@ -445,7 +446,7 @@ impl TypeSignature { u32::from(length) .checked_mul(4) .and_then(|x| x.checked_add(str_length_encode)) - .ok_or_else(|| CheckErrorKind::ValueTooLarge)? + .ok_or_else(|| StaticCheckErrorKind::ValueTooLarge)? } TypeSignature::PrincipalType | TypeSignature::CallableType(_) @@ -468,7 +469,7 @@ impl TypeSignature { .checked_add(1) // length of key-name .and_then(|x| x.checked_add(key.len() as u32)) // ClarityName is ascii-only, so 1 byte per length .and_then(|x| x.checked_add(value_size)) - .ok_or_else(|| CheckErrorKind::ValueTooLarge)?; + .ok_or_else(|| StaticCheckErrorKind::ValueTooLarge)?; } total_size } @@ -477,7 +478,7 @@ impl TypeSignature { Ok(size) => size, // if NoType, then this is just serializing a none // value, which is only the type prefix - Err(CheckErrorKind::CouldNotDetermineSerializationType) => 0, + Err(StaticCheckErrorKind::CouldNotDetermineSerializationType) => 0, Err(e) => return Err(e), } } @@ -485,17 +486,17 @@ impl TypeSignature { let (ok_type, err_type) = response_types.as_ref(); let (ok_type_max_size, no_ok_type) = match ok_type.max_serialized_size() { Ok(size) => (size, false), - Err(CheckErrorKind::CouldNotDetermineSerializationType) => (0, true), + Err(StaticCheckErrorKind::CouldNotDetermineSerializationType) => (0, true), Err(e) => return Err(e), }; let err_type_max_size = match err_type.max_serialized_size() { Ok(size) => size, - Err(CheckErrorKind::CouldNotDetermineSerializationType) => { + Err(StaticCheckErrorKind::CouldNotDetermineSerializationType) => { if no_ok_type { // if both the ok type and the error type are NoType, - // throw a CheckErrorKind. This should not be possible, but the check + // throw a StaticCheckErrorKind. This should not be possible, but the check // is done out of caution. - return Err(CheckErrorKind::CouldNotDetermineSerializationType); + return Err(StaticCheckErrorKind::CouldNotDetermineSerializationType); } else { 0 } @@ -505,13 +506,13 @@ impl TypeSignature { cmp::max(ok_type_max_size, err_type_max_size) } TypeSignature::ListUnionType(_) => { - return Err(CheckErrorKind::CouldNotDetermineSerializationType); + return Err(StaticCheckErrorKind::CouldNotDetermineSerializationType); } }; max_output_size .checked_add(type_prefix_size) - .ok_or_else(|| CheckErrorKind::ValueTooLarge) + .ok_or_else(|| StaticCheckErrorKind::ValueTooLarge) } } @@ -612,8 +613,8 @@ impl Value { TypePrefix::Buffer => { let mut buffer_len = [0; 4]; r.read_exact(&mut buffer_len)?; - let buffer_len = BufferLength::try_from(u32::from_be_bytes(buffer_len))?; - + let buffer_len = BufferLength::try_from(u32::from_be_bytes(buffer_len)) + .map_err(CheckErrorKind::from)?; if let Some(x) = &expected_type { let passed_test = match x { TypeSignature::SequenceType(SequenceSubtype::BufferType( @@ -844,7 +845,8 @@ impl Value { TypePrefix::StringASCII => { let mut buffer_len = [0; 4]; r.read_exact(&mut buffer_len)?; - let buffer_len = BufferLength::try_from(u32::from_be_bytes(buffer_len))?; + let buffer_len = BufferLength::try_from(u32::from_be_bytes(buffer_len)) + .map_err(CheckErrorKind::from)?; if let Some(x) = &expected_type { let passed_test = match x { @@ -869,7 +871,8 @@ impl Value { TypePrefix::StringUTF8 => { let mut total_len = [0; 4]; r.read_exact(&mut total_len)?; - let total_len = BufferLength::try_from(u32::from_be_bytes(total_len))?; + let total_len = BufferLength::try_from(u32::from_be_bytes(total_len)) + .map_err(CheckErrorKind::from)?; let mut data: Vec = vec![0; u32::from(total_len) as usize]; diff --git a/clarity-types/src/types/signatures.rs b/clarity-types/src/types/signatures.rs index dd68701210a..2afd7d5e495 100644 --- a/clarity-types/src/types/signatures.rs +++ b/clarity-types/src/types/signatures.rs @@ -14,7 +14,7 @@ // along with this program. If not, see . use std::collections::btree_map::Entry; -use std::collections::{BTreeMap, HashSet}; +use std::collections::{BTreeMap, BTreeSet}; use std::hash::Hash; use std::sync::Arc; use std::{cmp, fmt}; @@ -23,6 +23,7 @@ use serde::{Deserialize, Serialize}; use stacks_common::types::StacksEpochId; use crate::errors::CheckErrorKind; +use crate::errors::analysis::{CommonCheckErrorKind, StaticCheckErrorKind}; use crate::representations::{CONTRACT_MAX_NAME_LENGTH, ClarityName, ContractName}; use crate::types::{ CharType, MAX_TO_ASCII_BUFFER_LEN, MAX_TO_ASCII_RESULT_LEN, MAX_TYPE_DEPTH, @@ -121,11 +122,11 @@ impl BufferLength { /// /// This function is primarily intended for internal runtime use, /// and serves as the central place for all integer validation logic. - fn try_from_i128(data: i128) -> Result { + fn try_from_i128(data: i128) -> Result { if data > (MAX_VALUE_SIZE as i128) { - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) } else if data < 0 { - Err(CheckErrorKind::ValueOutOfBounds) + Err(CommonCheckErrorKind::ValueOutOfBounds) } else { Ok(BufferLength(data as u32)) } @@ -161,22 +162,22 @@ impl From for u32 { } impl TryFrom for BufferLength { - type Error = CheckErrorKind; - fn try_from(data: u32) -> Result { + type Error = CommonCheckErrorKind; + fn try_from(data: u32) -> Result { Self::try_from(data as i128) } } impl TryFrom for BufferLength { - type Error = CheckErrorKind; - fn try_from(data: usize) -> Result { + type Error = CommonCheckErrorKind; + fn try_from(data: usize) -> Result { Self::try_from(data as i128) } } impl TryFrom for BufferLength { - type Error = CheckErrorKind; - fn try_from(data: i128) -> Result { + type Error = CommonCheckErrorKind; + fn try_from(data: i128) -> Result { Self::try_from_i128(data) } } @@ -202,11 +203,11 @@ impl StringUTF8Length { /// /// This function is primarily intended for internal runtime use, /// and serves as the central place for all integer validation logic. - fn try_from_i128(value: i128) -> Result { + fn try_from_i128(value: i128) -> Result { if value > MAX_UTF8_VALUE_SIZE as i128 { - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) } else if value < 0 { - Err(CheckErrorKind::ValueOutOfBounds) + Err(CommonCheckErrorKind::ValueOutOfBounds) } else { Ok(StringUTF8Length(value as u32)) } @@ -242,22 +243,22 @@ impl From for u32 { } impl TryFrom for StringUTF8Length { - type Error = CheckErrorKind; - fn try_from(data: u32) -> Result { + type Error = CommonCheckErrorKind; + fn try_from(data: u32) -> Result { Self::try_from(data as i128) } } impl TryFrom for StringUTF8Length { - type Error = CheckErrorKind; - fn try_from(data: usize) -> Result { + type Error = CommonCheckErrorKind; + fn try_from(data: usize) -> Result { Self::try_from(data as i128) } } impl TryFrom for StringUTF8Length { - type Error = CheckErrorKind; - fn try_from(data: i128) -> Result { + type Error = CommonCheckErrorKind; + fn try_from(data: i128) -> Result { Self::try_from_i128(data) } } @@ -292,7 +293,7 @@ pub enum TypeSignature { // data structure to maintain the set of types in the list, so that when // we reach the place where the coercion needs to happen, we can perform // the check -- see `concretize` method. - ListUnionType(HashSet), + ListUnionType(BTreeSet), // This is used only below epoch 2.1. It has been replaced by CallableType. TraitReferenceType(TraitIdentifier), } @@ -325,7 +326,7 @@ pub enum StringSubtype { UTF8(StringUTF8Length), } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash, PartialOrd, Ord)] pub enum CallableSubtype { Principal(QualifiedContractIdentifier), Trait(TraitIdentifier), @@ -358,10 +359,10 @@ impl ListTypeData { pub fn new_list( entry_type: TypeSignature, max_len: u32, - ) -> Result { + ) -> Result { let would_be_depth = 1 + entry_type.depth(); if would_be_depth > MAX_TYPE_DEPTH { - return Err(CheckErrorKind::TypeSignatureTooDeep); + return Err(CommonCheckErrorKind::TypeSignatureTooDeep); } let list_data = ListTypeData { @@ -370,9 +371,9 @@ impl ListTypeData { }; let would_be_size = list_data .inner_size()? - .ok_or_else(|| CheckErrorKind::ValueTooLarge)?; + .ok_or_else(|| CommonCheckErrorKind::ValueTooLarge)?; if would_be_size > MAX_VALUE_SIZE { - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) } else { Ok(list_data) } @@ -400,13 +401,13 @@ impl ListTypeData { } impl TypeSignature { - pub fn new_option(inner_type: TypeSignature) -> Result { + pub fn new_option(inner_type: TypeSignature) -> Result { let new_size = WRAPPER_VALUE_SIZE + inner_type.size()?; let new_depth = 1 + inner_type.depth(); if new_size > MAX_VALUE_SIZE { - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) } else if new_depth > MAX_TYPE_DEPTH { - Err(CheckErrorKind::TypeSignatureTooDeep) + Err(CommonCheckErrorKind::TypeSignatureTooDeep) } else { Ok(OptionalType(Box::new(inner_type))) } @@ -415,14 +416,14 @@ impl TypeSignature { pub fn new_response( ok_type: TypeSignature, err_type: TypeSignature, - ) -> Result { + ) -> Result { let new_size = WRAPPER_VALUE_SIZE + cmp::max(ok_type.size()?, err_type.size()?); let new_depth = 1 + cmp::max(ok_type.depth(), err_type.depth()); if new_size > MAX_VALUE_SIZE { - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) } else if new_depth > MAX_TYPE_DEPTH { - Err(CheckErrorKind::TypeSignatureTooDeep) + Err(CommonCheckErrorKind::TypeSignatureTooDeep) } else { Ok(ResponseType(Box::new((ok_type, err_type)))) } @@ -436,7 +437,7 @@ impl TypeSignature { &TypeSignature::NoType == self } - pub fn admits(&self, epoch: &StacksEpochId, x: &Value) -> Result { + pub fn admits(&self, epoch: &StacksEpochId, x: &Value) -> Result { let x_type = TypeSignature::type_of(x)?; self.admits_type(epoch, &x_type) } @@ -445,7 +446,7 @@ impl TypeSignature { &self, epoch: &StacksEpochId, other: &TypeSignature, - ) -> Result { + ) -> Result { match epoch { StacksEpochId::Epoch20 | StacksEpochId::Epoch2_05 => self.admits_type_v2_0(other), StacksEpochId::Epoch21 @@ -457,13 +458,13 @@ impl TypeSignature { | StacksEpochId::Epoch31 | StacksEpochId::Epoch32 | StacksEpochId::Epoch33 => self.admits_type_v2_1(other), - StacksEpochId::Epoch10 => { - Err(CheckErrorKind::Expects("epoch 1.0 not supported".into())) - } + StacksEpochId::Epoch10 => Err(CommonCheckErrorKind::Expects( + "epoch 1.0 not supported".into(), + )), } } - pub fn admits_type_v2_0(&self, other: &TypeSignature) -> Result { + pub fn admits_type_v2_0(&self, other: &TypeSignature) -> Result { match self { SequenceType(SequenceSubtype::ListType(my_list_type)) => { if let SequenceType(SequenceSubtype::ListType(other_list_type)) = other { @@ -545,18 +546,18 @@ impl TypeSignature { Ok(false) } } - NoType => Err(CheckErrorKind::CouldNotDetermineType), - CallableType(_) => Err(CheckErrorKind::Expects( + NoType => Err(CommonCheckErrorKind::CouldNotDetermineType), + CallableType(_) => Err(CommonCheckErrorKind::Expects( "CallableType should not be used in epoch v2.0".into(), )), - ListUnionType(_) => Err(CheckErrorKind::Expects( + ListUnionType(_) => Err(CommonCheckErrorKind::Expects( "ListUnionType should not be used in epoch v2.0".into(), )), _ => Ok(other == self), } } - fn admits_type_v2_1(&self, other: &TypeSignature) -> Result { + fn admits_type_v2_1(&self, other: &TypeSignature) -> Result { let other = match other.concretize() { Ok(other) => other, Err(_) => { @@ -645,7 +646,7 @@ impl TypeSignature { Ok(false) } } - NoType => Err(CheckErrorKind::CouldNotDetermineType), + NoType => Err(CommonCheckErrorKind::CouldNotDetermineType), _ => Ok(&other == self), } } @@ -702,7 +703,7 @@ impl TypeSignature { /// Concretize the type. The input to this method may include /// `ListUnionType` and the `CallableType` variant for a `principal. /// This method turns these "temporary" types into actual types. - pub fn concretize(&self) -> Result { + pub fn concretize(&self) -> Result { match self { ListUnionType(types) => { let mut is_trait = None; @@ -711,7 +712,7 @@ impl TypeSignature { match partial { CallableSubtype::Principal(_) => { if is_trait.is_some() { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::CallableType(partial.clone())), Box::new(TypeSignature::PrincipalType), )); @@ -721,7 +722,7 @@ impl TypeSignature { } CallableSubtype::Trait(t) => { if is_principal { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::CallableType(partial.clone())), )); @@ -744,12 +745,12 @@ impl TypeSignature { } impl TryFrom> for TupleTypeSignature { - type Error = CheckErrorKind; + type Error = CommonCheckErrorKind; fn try_from( type_data: Vec<(ClarityName, TypeSignature)>, - ) -> Result { + ) -> Result { if type_data.is_empty() { - return Err(CheckErrorKind::EmptyTuplesNotAllowed); + return Err(CommonCheckErrorKind::EmptyTuplesNotAllowed); } let mut type_map = BTreeMap::new(); @@ -757,7 +758,7 @@ impl TryFrom> for TupleTypeSignature { if let Entry::Vacant(e) = type_map.entry(name.clone()) { e.insert(type_info); } else { - return Err(CheckErrorKind::NameAlreadyUsed(name.into())); + return Err(CommonCheckErrorKind::NameAlreadyUsed(name.into())); } } TupleTypeSignature::try_from(type_map) @@ -765,25 +766,25 @@ impl TryFrom> for TupleTypeSignature { } impl TryFrom> for TupleTypeSignature { - type Error = CheckErrorKind; + type Error = CommonCheckErrorKind; fn try_from( type_map: BTreeMap, - ) -> Result { + ) -> Result { if type_map.is_empty() { - return Err(CheckErrorKind::EmptyTuplesNotAllowed); + return Err(CommonCheckErrorKind::EmptyTuplesNotAllowed); } for child_sig in type_map.values() { if (1 + child_sig.depth()) > MAX_TYPE_DEPTH { - return Err(CheckErrorKind::TypeSignatureTooDeep); + return Err(CommonCheckErrorKind::TypeSignatureTooDeep); } } let type_map = Arc::new(type_map.into_iter().collect()); let result = TupleTypeSignature { type_map }; let would_be_size = result .inner_size()? - .ok_or_else(|| CheckErrorKind::ValueTooLarge)?; + .ok_or_else(|| CommonCheckErrorKind::ValueTooLarge)?; if would_be_size > MAX_VALUE_SIZE { - Err(CheckErrorKind::ValueTooLarge) + Err(CommonCheckErrorKind::ValueTooLarge) } else { Ok(result) } @@ -813,7 +814,7 @@ impl TupleTypeSignature { &self, epoch: &StacksEpochId, other: &TupleTypeSignature, - ) -> Result { + ) -> Result { if self.type_map.len() != other.type_map.len() { return Ok(false); } @@ -934,18 +935,18 @@ impl TypeSignature { /// Creates a string ASCII type with the specified length. /// Returns an error if the provided length is invalid. - pub fn new_ascii_type(len: i128) -> Result { + pub fn new_ascii_type(len: i128) -> Result { Ok(SequenceType(SequenceSubtype::StringType( StringSubtype::ASCII(BufferLength::try_from_i128(len)?), ))) } /// If one of the types is a NoType, return Ok(the other type), otherwise return least_supertype(a, b) - pub fn factor_out_no_type( + pub(crate) fn factor_out_no_type( epoch: &StacksEpochId, a: &TypeSignature, b: &TypeSignature, - ) -> Result { + ) -> Result { if a.is_no_type() { Ok(b.clone()) } else if b.is_no_type() { @@ -996,7 +997,7 @@ impl TypeSignature { epoch: &StacksEpochId, a: &TypeSignature, b: &TypeSignature, - ) -> Result { + ) -> Result { match epoch { StacksEpochId::Epoch20 | StacksEpochId::Epoch2_05 => Self::least_supertype_v2_0(a, b), StacksEpochId::Epoch21 @@ -1008,16 +1009,16 @@ impl TypeSignature { | StacksEpochId::Epoch31 | StacksEpochId::Epoch32 | StacksEpochId::Epoch33 => Self::least_supertype_v2_1(a, b), - StacksEpochId::Epoch10 => { - Err(CheckErrorKind::Expects("epoch 1.0 not supported".into())) - } + StacksEpochId::Epoch10 => Err(CommonCheckErrorKind::Expects( + "epoch 1.0 not supported".into(), + )), } } - pub fn least_supertype_v2_0( + fn least_supertype_v2_0( a: &TypeSignature, b: &TypeSignature, - ) -> Result { + ) -> Result { match (a, b) { ( TupleType(TupleTypeSignature { type_map: types_a }), @@ -1025,7 +1026,7 @@ impl TypeSignature { ) => { let mut type_map_out = BTreeMap::new(); for (name, entry_a) in types_a.iter() { - let entry_b = types_b.get(name).ok_or(CheckErrorKind::TypeError( + let entry_b = types_b.get(name).ok_or(CommonCheckErrorKind::TypeError( Box::new(a.clone()), Box::new(b.clone()), ))?; @@ -1034,7 +1035,7 @@ impl TypeSignature { } Ok(TupleTypeSignature::try_from(type_map_out) .map(|x| x.into()) - .map_err(|_| CheckErrorKind::SupertypeTooLarge)?) + .map_err(|_| CommonCheckErrorKind::SupertypeTooLarge)?) } ( SequenceType(SequenceSubtype::ListType(ListTypeData { @@ -1055,7 +1056,7 @@ impl TypeSignature { }; let max_len = cmp::max(len_a, len_b); Ok(Self::list_of(entry_type, *max_len) - .map_err(|_| CheckErrorKind::SupertypeTooLarge)?) + .map_err(|_| CommonCheckErrorKind::SupertypeTooLarge)?) } (ResponseType(resp_a), ResponseType(resp_b)) => { let ok_type = @@ -1114,7 +1115,7 @@ impl TypeSignature { if x == y { Ok(x.clone()) } else { - Err(CheckErrorKind::TypeError( + Err(CommonCheckErrorKind::TypeError( Box::new(a.clone()), Box::new(b.clone()), )) @@ -1123,10 +1124,10 @@ impl TypeSignature { } } - pub fn least_supertype_v2_1( + pub(crate) fn least_supertype_v2_1( a: &TypeSignature, b: &TypeSignature, - ) -> Result { + ) -> Result { match (a, b) { ( TupleType(TupleTypeSignature { type_map: types_a }), @@ -1134,7 +1135,7 @@ impl TypeSignature { ) => { let mut type_map_out = BTreeMap::new(); for (name, entry_a) in types_a.iter() { - let entry_b = types_b.get(name).ok_or(CheckErrorKind::TypeError( + let entry_b = types_b.get(name).ok_or(CommonCheckErrorKind::TypeError( Box::new(a.clone()), Box::new(b.clone()), ))?; @@ -1143,7 +1144,7 @@ impl TypeSignature { } Ok(TupleTypeSignature::try_from(type_map_out) .map(|x| x.into()) - .map_err(|_| CheckErrorKind::SupertypeTooLarge)?) + .map_err(|_| CommonCheckErrorKind::SupertypeTooLarge)?) } ( SequenceType(SequenceSubtype::ListType(ListTypeData { @@ -1164,7 +1165,7 @@ impl TypeSignature { }; let max_len = cmp::max(len_a, len_b); Ok(Self::list_of(entry_type, *max_len) - .map_err(|_| CheckErrorKind::SupertypeTooLarge)?) + .map_err(|_| CommonCheckErrorKind::SupertypeTooLarge)?) } (ResponseType(resp_a), ResponseType(resp_b)) => { let ok_type = @@ -1222,7 +1223,7 @@ impl TypeSignature { if x == y { Ok(a.clone()) } else { - Ok(ListUnionType(HashSet::from([x.clone(), y.clone()]))) + Ok(ListUnionType(BTreeSet::from([x.clone(), y.clone()]))) } } (ListUnionType(l), CallableType(c)) | (CallableType(c), ListUnionType(l)) => { @@ -1245,7 +1246,7 @@ impl TypeSignature { if all_principals { Ok(PrincipalType) } else { - Err(CheckErrorKind::TypeError( + Err(CommonCheckErrorKind::TypeError( Box::new(a.clone()), Box::new(b.clone()), )) @@ -1258,7 +1259,7 @@ impl TypeSignature { if x == y { Ok(x.clone()) } else { - Err(CheckErrorKind::TypeError( + Err(CommonCheckErrorKind::TypeError( Box::new(a.clone()), Box::new(b.clone()), )) @@ -1270,7 +1271,7 @@ impl TypeSignature { pub fn list_of( item_type: TypeSignature, max_len: u32, - ) -> Result { + ) -> Result { ListTypeData::new_list(item_type, max_len).map(|x| x.into()) } @@ -1281,7 +1282,7 @@ impl TypeSignature { } } - pub fn type_of(x: &Value) -> Result { + pub fn type_of(x: &Value) -> Result { let out = match x { Value::Principal(_) => PrincipalType, Value::Int(_v) => IntType, @@ -1310,29 +1311,31 @@ impl TypeSignature { Ok(out) } - pub fn literal_type_of(x: &Value) -> Result { + pub fn literal_type_of(x: &Value) -> Result { match x { Value::Principal(PrincipalData::Contract(contract_id)) => Ok(CallableType( CallableSubtype::Principal(contract_id.clone()), )), - _ => Self::type_of(x), + _ => Self::type_of(x).map_err(StaticCheckErrorKind::from), } } // Checks if resulting type signature is of valid size. pub fn construct_parent_list_type(args: &[Value]) -> Result { - let children_types: Result, CheckErrorKind> = - args.iter().map(TypeSignature::type_of).collect(); - TypeSignature::parent_list_type(&children_types?) + let children_types: Result, _> = args.iter().map(TypeSignature::type_of).collect(); + Ok(TypeSignature::parent_list_type(&children_types?)?) } - pub fn parent_list_type(children: &[TypeSignature]) -> Result { + pub fn parent_list_type( + children: &[TypeSignature], + ) -> Result { if let Some((first, rest)) = children.split_first() { let mut current_entry_type = first.clone(); for next_entry in rest.iter() { current_entry_type = Self::least_supertype_v2_1(¤t_entry_type, next_entry)?; } - let len = u32::try_from(children.len()).map_err(|_| CheckErrorKind::ValueTooLarge)?; + let len = + u32::try_from(children.len()).map_err(|_| CommonCheckErrorKind::ValueTooLarge)?; ListTypeData::new_list(current_entry_type, len) } else { Ok(TypeSignature::empty_list()) @@ -1372,16 +1375,16 @@ impl TypeSignature { } } - pub fn size(&self) -> Result { + pub fn size(&self) -> Result { self.inner_size()?.ok_or_else(|| { - CheckErrorKind::Expects( + CommonCheckErrorKind::Expects( "FAIL: .size() overflowed on too large of a type. construction should have failed!" .into(), ) }) } - fn inner_size(&self) -> Result, CheckErrorKind> { + fn inner_size(&self) -> Result, CommonCheckErrorKind> { let out = match self { // NoType's may be asked for their size at runtime -- // legal constructions like `(ok 1)` have NoType parts (if they have unknown error variant types). @@ -1414,9 +1417,9 @@ impl TypeSignature { Ok(out) } - pub fn type_size(&self) -> Result { + pub fn type_size(&self) -> Result { self.inner_type_size() - .ok_or_else(|| CheckErrorKind::ValueTooLarge) + .ok_or_else(|| CommonCheckErrorKind::ValueTooLarge) } /// Returns the size of the _type signature_ @@ -1446,7 +1449,7 @@ impl TypeSignature { impl ListTypeData { /// List Size: type_signature_size + max_len * entry_type.size() - fn inner_size(&self) -> Result, CheckErrorKind> { + fn inner_size(&self) -> Result, CommonCheckErrorKind> { let total_size = self .entry_type .size()? @@ -1512,7 +1515,7 @@ impl TupleTypeSignature { /// Tuple Size: /// size( btreemap ) + type_size /// size( btreemap ) = 2*map.len() + sum(names) + sum(values) - fn inner_size(&self) -> Result, CheckErrorKind> { + fn inner_size(&self) -> Result, CommonCheckErrorKind> { let Some(mut total_size) = u32::try_from(self.type_map.len()) .ok() .and_then(|x| x.checked_mul(2)) diff --git a/clarity/fuzz/fuzz_targets/fuzz_sanitize.rs b/clarity/fuzz/fuzz_targets/fuzz_sanitize.rs index 7b509750abe..298151e096f 100644 --- a/clarity/fuzz/fuzz_targets/fuzz_sanitize.rs +++ b/clarity/fuzz/fuzz_targets/fuzz_sanitize.rs @@ -16,24 +16,17 @@ #![no_main] use arbitrary::Arbitrary; -use clarity::vm::types::TypeSignature; -use clarity::vm::types::signatures::SequenceSubtype; -use clarity::vm::Value as ClarityValue; -use clarity::vm::types::SequenceData; -use clarity::vm::types::PrincipalData; -use clarity::vm::types::StandardPrincipalData; -use clarity::vm::types::QualifiedContractIdentifier; -use clarity::vm::types::TupleData; -use clarity::vm::types::CharType; -use clarity::vm::ClarityName; +use clarity::vm::analysis::CheckErrorKind; use clarity::vm::representations::ContractName; use clarity::vm::types::serialization::SerializationError; +use clarity::vm::types::signatures::SequenceSubtype; +use clarity::vm::types::{ + CharType, PrincipalData, QualifiedContractIdentifier, SequenceData, StandardPrincipalData, + StringSubtype, TupleData, TypeSignature, +}; +use clarity::vm::{ClarityName, Value as ClarityValue}; +use libfuzzer_sys::{arbitrary, fuzz_target}; use stacks_common::types::StacksEpochId; -use clarity::vm::analysis::CheckErrorKind; -use clarity::vm::types::StringSubtype; - -use libfuzzer_sys::arbitrary; -use libfuzzer_sys::fuzz_target; #[derive(Debug)] struct FuzzClarityValue(ClarityValue); @@ -92,11 +85,15 @@ impl arbitrary::Arbitrary<'_> for FuzzClarityValue { .map_err(|_| arbitrary::Error::IncorrectFormat)?, 6 => ClarityValue::error(FuzzClarityValue::arbitrary(u)?.0) .map_err(|_| arbitrary::Error::IncorrectFormat)?, - 7 => ClarityValue::Principal(PrincipalData::Standard(FuzzStandardPrincipal::arbitrary(u)?.0)), - 8 => ClarityValue::Principal(PrincipalData::Contract(QualifiedContractIdentifier::new( + 7 => ClarityValue::Principal(PrincipalData::Standard( FuzzStandardPrincipal::arbitrary(u)?.0, - FuzzContractName::arbitrary(u)?.0, - ))), + )), + 8 => { + ClarityValue::Principal(PrincipalData::Contract(QualifiedContractIdentifier::new( + FuzzStandardPrincipal::arbitrary(u)?.0, + FuzzContractName::arbitrary(u)?.0, + ))) + } // utf8 9 => ClarityValue::string_utf8_from_bytes(Arbitrary::arbitrary(u)?) .map_err(|_| arbitrary::Error::IncorrectFormat)?, @@ -111,7 +108,7 @@ impl arbitrary::Arbitrary<'_> for FuzzClarityValue { let value_vec: Vec = Arbitrary::arbitrary(u)?; ClarityValue::cons_list_unsanitized(value_vec.into_iter().map(|x| x.0).collect()) .map_err(|_| arbitrary::Error::IncorrectFormat)? - }, + } // tuple 13 => { let tuple_data: Vec<(FuzzClarityName, FuzzClarityValue)> = Arbitrary::arbitrary(u)?; @@ -119,11 +116,11 @@ impl arbitrary::Arbitrary<'_> for FuzzClarityValue { tuple_data .into_iter() .map(|(key, value)| (key.0, value.0)) - .collect() - ) - .map_err(|_| arbitrary::Error::IncorrectFormat)? - .into() - }, + .collect(), + ) + .map_err(|_| arbitrary::Error::IncorrectFormat)? + .into() + } _ => return Err(arbitrary::Error::IncorrectFormat), }; @@ -161,7 +158,7 @@ pub fn strict_admits(me: &TypeSignature, x: &ClarityValue) -> Result { let buff_data = match x { ClarityValue::Sequence(SequenceData::Buffer(ref buff_data)) => buff_data, @@ -171,37 +168,46 @@ pub fn strict_admits(me: &TypeSignature, x: &ClarityValue) -> Result { + } + TypeSignature::SequenceType(SequenceSubtype::StringType(StringSubtype::ASCII( + ref my_max_len, + ))) => { let ascii_data = match x { - ClarityValue::Sequence(SequenceData::String(CharType::ASCII(ref ascii_data))) => ascii_data, + ClarityValue::Sequence(SequenceData::String(CharType::ASCII(ref ascii_data))) => { + ascii_data + } _ => return Ok(false), }; if ascii_data.len().map_or(false, |n| &n > my_max_len) { return Ok(false); } return Ok(true); - }, - TypeSignature::SequenceType(SequenceSubtype::StringType(StringSubtype::UTF8(ref my_max_len))) => { + } + TypeSignature::SequenceType(SequenceSubtype::StringType(StringSubtype::UTF8( + ref my_max_len, + ))) => { let utf8_data = match x { - ClarityValue::Sequence(SequenceData::String(CharType::UTF8(ref utf8_data))) => utf8_data, + ClarityValue::Sequence(SequenceData::String(CharType::UTF8(ref utf8_data))) => { + utf8_data + } _ => return Ok(false), }; - if utf8_data.len().map_or(false, |n| u32::from(n) > u32::from(my_max_len.clone())) { + if utf8_data + .len() + .map_or(false, |n| u32::from(n) > u32::from(my_max_len.clone())) + { return Ok(false); } return Ok(true); - }, + } TypeSignature::PrincipalType => match x { ClarityValue::Principal(_) => Ok(true), _ => Ok(false), }, TypeSignature::OptionalType(ref ot) => match x { - ClarityValue::Optional(inner_value) => { - match &inner_value.data { - Some(some_value) => strict_admits(ot, some_value), - None => Ok(true), - } + ClarityValue::Optional(inner_value) => match &inner_value.data { + Some(some_value) => strict_admits(ot, some_value), + None => Ok(true), }, _ => Ok(false), }, @@ -216,29 +222,31 @@ pub fn strict_admits(me: &TypeSignature, x: &ClarityValue) -> Result { let tuple_data = match x { ClarityValue::Tuple(td) => td, _ => return Ok(false), }; if tt.len() != tuple_data.len() { - return Ok(false) + return Ok(false); } for (field, field_type) in tt.get_type_map().iter() { let field_value = match tuple_data.get(&field) { Ok(x) => x, - Err(_) => return Ok(false) + Err(_) => return Ok(false), }; if !strict_admits(field_type, field_value)? { return Ok(false); } } return Ok(true); - }, - TypeSignature::CallableType(_) | - TypeSignature::ListUnionType(_) | - TypeSignature::TraitReferenceType(_) => Err(CheckErrorKind::TraitReferenceNotAllowed), + } + TypeSignature::CallableType(_) + | TypeSignature::ListUnionType(_) + | TypeSignature::TraitReferenceType(_) => Err(CheckErrorKind::TraitReferenceUnknown( + "Unknown trait reference".into(), + )), } } @@ -250,11 +258,9 @@ fn fuzz_sanitize(input: ClarityValue) { let computed_type = TypeSignature::type_of(&input).unwrap(); let did_strict_admit = strict_admits(&computed_type, &input).unwrap(); - let (sanitized_value, did_sanitize) = ClarityValue::sanitize_value( - &StacksEpochId::Epoch24, - &computed_type, - input.clone() - ).unwrap(); + let (sanitized_value, did_sanitize) = + ClarityValue::sanitize_value(&StacksEpochId::Epoch24, &computed_type, input.clone()) + .unwrap(); if did_strict_admit { assert_eq!(input, sanitized_value); @@ -265,11 +271,8 @@ fn fuzz_sanitize(input: ClarityValue) { } let serialized = input.serialize_to_vec().expect("serialize input"); - let deserialize_unsanitized = ClarityValue::deserialize_read( - &mut serialized.as_slice(), - Some(&computed_type), - false - ); + let deserialize_unsanitized = + ClarityValue::deserialize_read(&mut serialized.as_slice(), Some(&computed_type), false); if !did_strict_admit { deserialize_unsanitized.unwrap_err(); } else { @@ -280,9 +283,10 @@ fn fuzz_sanitize(input: ClarityValue) { ClarityValue::deserialize_read( &mut serialized.as_slice(), Some(&computed_type), - true - ).unwrap() - }, + true, + ) + .unwrap() + } deser_result => deser_result.unwrap(), }; assert_eq!(deser_value, input); @@ -291,17 +295,19 @@ fn fuzz_sanitize(input: ClarityValue) { let deserialize_sanitized = match ClarityValue::deserialize_read( &mut serialized.as_slice(), Some(&computed_type), - true + true, ) { Ok(x) => x, Err(SerializationError::BadTypeError(CheckErrorKind::TypeSignatureTooDeep)) => { assert!(!did_strict_admit, "Unsanitized inputs may fail to deserialize, but they must have needed sanitization"); // check that the sanitized value *is* readable - let serialized = sanitized_value.serialize_to_vec().expect("serialize sanitized"); + let serialized = sanitized_value + .serialize_to_vec() + .expect("serialize sanitized"); let deserialize_unsanitized = match ClarityValue::deserialize_read( &mut serialized.as_slice(), Some(&computed_type), - false + false, ) { Err(SerializationError::BadTypeError(CheckErrorKind::TypeSignatureTooDeep)) => { // pre-2.4, deserializer could error on legal types deeper than a deserialization limit of 16. @@ -309,9 +315,10 @@ fn fuzz_sanitize(input: ClarityValue) { ClarityValue::deserialize_read( &mut serialized.as_slice(), Some(&computed_type), - true - ).unwrap() - }, + true, + ) + .unwrap() + } deser_result => deser_result.unwrap(), }; assert_eq!(deserialize_unsanitized, sanitized_value); @@ -319,13 +326,14 @@ fn fuzz_sanitize(input: ClarityValue) { let deserialize_sanitized = ClarityValue::deserialize_read( &mut serialized.as_slice(), Some(&computed_type), - true - ).unwrap(); + true, + ) + .unwrap(); assert_eq!(deserialize_sanitized, sanitized_value); assert!(strict_admits(&computed_type, &deserialize_sanitized).unwrap()); return; } - Err(e) => panic!("Unexpected error from deserialization: {}", e) + Err(e) => panic!("Unexpected error from deserialization: {}", e), }; assert!(strict_admits(&computed_type, &deserialize_sanitized).unwrap()); diff --git a/clarity/fuzz/fuzz_targets/fuzz_value_sanitize.rs b/clarity/fuzz/fuzz_targets/fuzz_value_sanitize.rs index 52c983daecb..79bad892823 100644 --- a/clarity/fuzz/fuzz_targets/fuzz_value_sanitize.rs +++ b/clarity/fuzz/fuzz_targets/fuzz_value_sanitize.rs @@ -251,7 +251,9 @@ pub fn strict_admits(me: &TypeSignature, x: &ClarityValue) -> Result Err(CheckErrorKind::TraitReferenceNotAllowed), + | TypeSignature::TraitReferenceType(_) => Err(CheckErrorKind::TraitReferenceUnknown( + "Unknown trait reference".into(), + )), } } diff --git a/clarity/src/vm/analysis/analysis_db.rs b/clarity/src/vm/analysis/analysis_db.rs index 62c28813ca0..ff7197249f6 100644 --- a/clarity/src/vm/analysis/analysis_db.rs +++ b/clarity/src/vm/analysis/analysis_db.rs @@ -20,7 +20,7 @@ use clarity_types::representations::ClarityName; use clarity_types::types::{QualifiedContractIdentifier, TraitIdentifier}; use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::analysis::type_checker::ContractAnalysis; use crate::vm::database::{ ClarityBackingStore, ClarityDeserializable, ClaritySerializable, RollbackWrapper, @@ -46,16 +46,16 @@ impl<'a> AnalysisDatabase<'a> { pub fn execute(&mut self, f: F) -> Result where F: FnOnce(&mut Self) -> Result, - E: From, + E: From, { self.begin(); let result = f(self).or_else(|e| { self.roll_back() - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")))?; + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")))?; Err(e) })?; self.commit() - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")))?; + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")))?; Ok(result) } @@ -66,13 +66,13 @@ impl<'a> AnalysisDatabase<'a> { pub fn commit(&mut self) -> Result<(), StaticCheckError> { self.store .commit() - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")).into()) + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")).into()) } pub fn roll_back(&mut self) -> Result<(), StaticCheckError> { self.store .rollback() - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")).into()) + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")).into()) } pub fn storage_key() -> &'static str { @@ -108,7 +108,7 @@ impl<'a> AnalysisDatabase<'a> { .flatten() .map(|x| { ContractAnalysis::deserialize(&x).map_err(|_| { - CheckErrorKind::Expects("Bad data deserialized from DB".into()).into() + StaticCheckErrorKind::Expects("Bad data deserialized from DB".into()).into() }) }) .transpose() @@ -127,8 +127,9 @@ impl<'a> AnalysisDatabase<'a> { .ok() .flatten() .map(|x| { - ContractAnalysis::deserialize(&x) - .map_err(|_| CheckErrorKind::Expects("Bad data deserialized from DB".into())) + ContractAnalysis::deserialize(&x).map_err(|_| { + StaticCheckErrorKind::Expects("Bad data deserialized from DB".into()) + }) }) .transpose()? .map(|mut x| { @@ -144,14 +145,15 @@ impl<'a> AnalysisDatabase<'a> { ) -> Result<(), StaticCheckError> { let key = AnalysisDatabase::storage_key(); if self.store.has_metadata_entry(contract_identifier, key) { - return Err( - CheckErrorKind::ContractAlreadyExists(contract_identifier.to_string()).into(), - ); + return Err(StaticCheckErrorKind::ContractAlreadyExists( + contract_identifier.to_string(), + ) + .into()); } self.store .insert_metadata(contract_identifier, key, &contract.serialize()) - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")))?; + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")))?; Ok(()) } @@ -165,7 +167,7 @@ impl<'a> AnalysisDatabase<'a> { // charges based on the function type size. let contract = self .load_contract_non_canonical(contract_identifier)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; Ok(contract.clarity_version) @@ -183,7 +185,7 @@ impl<'a> AnalysisDatabase<'a> { // charges based on the function type size. let contract = self .load_contract_non_canonical(contract_identifier)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; Ok(contract @@ -203,7 +205,7 @@ impl<'a> AnalysisDatabase<'a> { // charges based on the function type size. let contract = self .load_contract_non_canonical(contract_identifier)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; Ok(contract @@ -223,7 +225,7 @@ impl<'a> AnalysisDatabase<'a> { // charges based on the function type size. let contract = self .load_contract_non_canonical(contract_identifier)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; Ok(contract.get_defined_trait(trait_name).map(|trait_map| { @@ -240,7 +242,7 @@ impl<'a> AnalysisDatabase<'a> { ) -> Result, StaticCheckError> { let contract = self .load_contract_non_canonical(contract_identifier)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; Ok(contract.implemented_traits) diff --git a/clarity/src/vm/analysis/contract_interface_builder/mod.rs b/clarity/src/vm/analysis/contract_interface_builder/mod.rs index 5fc0169c5cb..54f1a161cf7 100644 --- a/clarity/src/vm/analysis/contract_interface_builder/mod.rs +++ b/clarity/src/vm/analysis/contract_interface_builder/mod.rs @@ -19,12 +19,12 @@ use std::collections::{BTreeMap, BTreeSet}; use stacks_common::types::StacksEpochId; use crate::vm::analysis::types::ContractAnalysis; -use crate::vm::analysis::StaticCheckError; +use crate::vm::analysis::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::types::signatures::CallableSubtype; use crate::vm::types::{ FixedFunction, FunctionArg, FunctionType, TupleTypeSignature, TypeSignature, }; -use crate::vm::{CheckErrorKind, ClarityName, ClarityVersion}; +use crate::vm::{ClarityName, ClarityVersion}; pub fn build_contract_interface( contract_analysis: &ContractAnalysis, @@ -278,7 +278,7 @@ impl ContractInterfaceFunction { FunctionType::Fixed(FixedFunction { returns, .. }) => { ContractInterfaceAtomType::from_type_signature(returns) } - _ => return Err(CheckErrorKind::Expects( + _ => return Err(StaticCheckErrorKind::Expects( "Contract functions should only have fixed function return types!" .into(), ) @@ -290,7 +290,7 @@ impl ContractInterfaceFunction { ContractInterfaceFunctionArg::from_function_args(args) } _ => { - return Err(CheckErrorKind::Expects( + return Err(StaticCheckErrorKind::Expects( "Contract functions should only have fixed function arguments!" .into(), ) @@ -402,7 +402,7 @@ impl ContractInterface { pub fn serialize(&self) -> Result { serde_json::to_string(self).map_err(|_| { - CheckErrorKind::Expects("Failed to serialize contract interface".into()).into() + StaticCheckErrorKind::Expects("Failed to serialize contract interface".into()).into() }) } } diff --git a/clarity/src/vm/analysis/errors.rs b/clarity/src/vm/analysis/errors.rs index 7bf7faabc13..15002f5a15d 100644 --- a/clarity/src/vm/analysis/errors.rs +++ b/clarity/src/vm/analysis/errors.rs @@ -16,5 +16,6 @@ pub use clarity_types::errors::analysis::{ check_argument_count, check_arguments_at_least, check_arguments_at_most, CheckErrorKind, - StaticCheckError, SyntaxBindingError, SyntaxBindingErrorType, + CommonCheckErrorKind, StaticCheckError, StaticCheckErrorKind, SyntaxBindingError, + SyntaxBindingErrorType, }; diff --git a/clarity/src/vm/analysis/mod.rs b/clarity/src/vm/analysis/mod.rs index 2ae4e1c79a8..fac0cce6e73 100644 --- a/clarity/src/vm/analysis/mod.rs +++ b/clarity/src/vm/analysis/mod.rs @@ -28,7 +28,9 @@ use stacks_common::types::StacksEpochId; pub use self::analysis_db::AnalysisDatabase; use self::arithmetic_checker::ArithmeticOnlyChecker; use self::contract_interface_builder::build_contract_interface; -pub use self::errors::{CheckErrorKind, StaticCheckError}; +pub use self::errors::{ + CheckErrorKind, CommonCheckErrorKind, StaticCheckError, StaticCheckErrorKind, +}; use self::read_only_checker::ReadOnlyChecker; use self::trait_checker::TraitChecker; use self::type_checker::v2_05::TypeChecker as TypeChecker2_05; @@ -55,7 +57,7 @@ pub fn mem_type_check( ) -> Result<(Option, ContractAnalysis), StaticCheckError> { let contract_identifier = QualifiedContractIdentifier::transient(); let contract = build_ast(&contract_identifier, snippet, &mut (), version, epoch) - .map_err(|e| CheckErrorKind::Expects(format!("Failed to build AST: {e}")))? + .map_err(|e| StaticCheckErrorKind::Expects(format!("Failed to build AST: {e}")))? .expressions; let mut marf = MemoryBackingStore::new(); @@ -73,16 +75,15 @@ pub fn mem_type_check( ) { Ok(x) => { // return the first type result of the type checker - let first_type = x - .type_map - .as_ref() - .ok_or_else(|| CheckErrorKind::Expects("Should be non-empty".into()))? - .get_type_expected( - x.expressions - .last() - .ok_or_else(|| CheckErrorKind::Expects("Should be non-empty".into()))?, - ) - .cloned(); + + let first_type = + x.type_map + .as_ref() + .ok_or_else(|| StaticCheckErrorKind::Expects("Should be non-empty".into()))? + .get_type_expected(x.expressions.last().ok_or_else(|| { + StaticCheckErrorKind::Expects("Should be non-empty".into()) + })?) + .cloned(); Ok((first_type, x)) } Err(e) => Err(e.0), @@ -151,7 +152,7 @@ pub fn run_analysis( TypeChecker2_1::run_pass(&epoch, &mut contract_analysis, db, build_type_map) } StacksEpochId::Epoch10 => { - return Err(CheckErrorKind::Expects( + return Err(StaticCheckErrorKind::Expects( "Epoch 1.0 is not a valid epoch for analysis".into(), ) .into()) diff --git a/clarity/src/vm/analysis/read_only_checker/mod.rs b/clarity/src/vm/analysis/read_only_checker/mod.rs index 0c62c80e4dd..dd486172527 100644 --- a/clarity/src/vm/analysis/read_only_checker/mod.rs +++ b/clarity/src/vm/analysis/read_only_checker/mod.rs @@ -22,7 +22,7 @@ use stacks_common::types::StacksEpochId; pub use super::errors::{ check_argument_count, check_arguments_at_least, CheckErrorKind, StaticCheckError, - SyntaxBindingError, + StaticCheckErrorKind, SyntaxBindingError, }; use super::AnalysisDatabase; use crate::vm::analysis::types::{AnalysisPass, ContractAnalysis}; @@ -82,7 +82,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { /// Returns successfully iff this function is read-only correct. /// /// # Errors - /// - `CheckErrorKind::WriteAttemptedInReadOnly` + /// - `StaticCheckErrorKind::WriteAttemptedInReadOnly` /// - Contract parsing errors pub fn run(&mut self, contract_analysis: &ContractAnalysis) -> Result<(), StaticCheckError> { // Iterate over all the top-level statements in a contract. @@ -106,7 +106,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { /// Returns successfully iff this function is read-only correct. /// /// # Errors - /// - CheckErrorKind::WriteAttemptedInReadOnly + /// - StaticCheckErrorKind::WriteAttemptedInReadOnly /// - Contract parsing errors fn check_top_level_expression( &mut self, @@ -136,7 +136,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { let (function_name, is_read_only) = self.check_define_function(signature, body)?; if !is_read_only { - return Err(CheckErrorKind::WriteAttemptedInReadOnly.into()); + return Err(StaticCheckErrorKind::WriteAttemptedInReadOnly.into()); } else { self.defined_functions.insert(function_name, is_read_only); } @@ -172,9 +172,9 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { ) -> Result<(ClarityName, bool), StaticCheckError> { let function_name = signature .first() - .ok_or(CheckErrorKind::DefineFunctionBadSignature)? + .ok_or(StaticCheckErrorKind::DefineFunctionBadSignature)? .match_atom() - .ok_or(CheckErrorKind::BadFunctionName)?; + .ok_or(StaticCheckErrorKind::BadFunctionName)?; let is_read_only = self.check_read_only(body)?; @@ -207,7 +207,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { ReadOnlyFunction { signature, body } => { let (f_name, is_read_only) = self.check_define_function(signature, body)?; if !is_read_only { - return Err(CheckErrorKind::WriteAttemptedInReadOnly.into()); + return Err(StaticCheckErrorKind::WriteAttemptedInReadOnly.into()); } else { self.defined_functions.insert(f_name, is_read_only); } @@ -396,7 +396,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { let is_block_arg_read_only = self.check_read_only(&args[0])?; let closure_read_only = self.check_read_only(&args[1])?; if !closure_read_only { - return Err(CheckErrorKind::AtBlockClosureMustBeReadOnly.into()); + return Err(StaticCheckErrorKind::AtBlockClosureMustBeReadOnly.into()); } Ok(is_block_arg_read_only) } @@ -413,7 +413,9 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { Let => { check_arguments_at_least(2, args)?; - let binding_list = args[0].match_list().ok_or(CheckErrorKind::BadLetSyntax)?; + let binding_list = args[0] + .match_list() + .ok_or(StaticCheckErrorKind::BadLetSyntax)?; for (i, pair) in binding_list.iter().enumerate() { let pair_expression = pair.match_list().ok_or_else(|| { @@ -488,7 +490,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { let function_name = args[1] .match_atom() - .ok_or(CheckErrorKind::ContractCallExpectName)?; + .ok_or(StaticCheckErrorKind::ContractCallExpectName)?; let is_function_read_only = match &args[0].expr { SymbolicExpressionType::LiteralValue(Value::Principal( @@ -509,7 +511,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { } _ => { return Err(StaticCheckError::new( - CheckErrorKind::ContractCallExpectName, + StaticCheckErrorKind::ContractCallExpectName, )) } }; @@ -527,7 +529,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { let allowances = args[1] .match_list() - .ok_or(CheckErrorKind::ExpectedListOfAllowances( + .ok_or(StaticCheckErrorKind::ExpectedListOfAllowances( "restrict-assets?".into(), 2, ))?; @@ -545,7 +547,7 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { let allowances = args[0] .match_list() - .ok_or(CheckErrorKind::ExpectedListOfAllowances( + .ok_or(StaticCheckErrorKind::ExpectedListOfAllowances( "as-contract?".into(), 1, ))?; @@ -575,11 +577,11 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { ) -> Result { let (function_name, args) = expressions .split_first() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; let function_name = function_name .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; if let Some(mut result) = self.try_check_native_function_is_read_only(function_name, args) { if let Err(ref mut check_err) = result { @@ -587,10 +589,9 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { } result } else { - let is_function_read_only = *self - .defined_functions - .get(function_name) - .ok_or(CheckErrorKind::UnknownFunction(function_name.to_string()))?; + let is_function_read_only = *self.defined_functions.get(function_name).ok_or( + StaticCheckErrorKind::UnknownFunction(function_name.to_string()), + )?; self.check_each_expression_is_read_only(args) .map(|args_read_only| args_read_only && is_function_read_only) } diff --git a/clarity/src/vm/analysis/read_only_checker/tests.rs b/clarity/src/vm/analysis/read_only_checker/tests.rs index 5b985b7b2f2..9e0f8b46aaa 100644 --- a/clarity/src/vm/analysis/read_only_checker/tests.rs +++ b/clarity/src/vm/analysis/read_only_checker/tests.rs @@ -20,10 +20,11 @@ use rstest::rstest; use rstest_reuse::{self, *}; use stacks_common::types::StacksEpochId; +use crate::vm::analysis::type_check; use crate::vm::analysis::type_checker::v2_1::tests::mem_type_check; -use crate::vm::analysis::{type_check, CheckErrorKind}; use crate::vm::ast::parse; use crate::vm::database::MemoryBackingStore; +use crate::vm::errors::StaticCheckErrorKind; use crate::vm::tests::test_clarity_versions; use crate::vm::types::QualifiedContractIdentifier; use crate::vm::ClarityVersion; @@ -34,11 +35,11 @@ fn test_argument_count_violations() { ( "(define-private (foo-bar) (at-block))", - CheckErrorKind::IncorrectArgumentCount(2, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 0), ), ( "(define-private (foo-bar) (map-get?))", - CheckErrorKind::IncorrectArgumentCount(2, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 0), ), ]; @@ -72,7 +73,7 @@ fn test_at_block_violations() { for contract in examples.iter() { let err = mem_type_check(contract).unwrap_err(); eprintln!("{err}"); - assert_eq!(*err.err, CheckErrorKind::AtBlockClosureMustBeReadOnly) + assert_eq!(*err.err, StaticCheckErrorKind::AtBlockClosureMustBeReadOnly) } } @@ -163,7 +164,7 @@ fn test_simple_read_only_violations() { for contract in bad_contracts.iter() { let err = mem_type_check(contract).unwrap_err(); - assert_eq!(*err.err, CheckErrorKind::WriteAttemptedInReadOnly) + assert_eq!(*err.err, StaticCheckErrorKind::WriteAttemptedInReadOnly) } } @@ -180,7 +181,7 @@ fn test_nested_writing_closure() { for contract in bad_contracts.iter() { let err = mem_type_check(contract).unwrap_err(); - assert_eq!(*err.err, CheckErrorKind::AtBlockClosureMustBeReadOnly) + assert_eq!(*err.err, StaticCheckErrorKind::AtBlockClosureMustBeReadOnly) } } @@ -231,7 +232,7 @@ fn test_contract_call_read_only_violations( ) }) .unwrap_err(); - assert_eq!(*err.err, CheckErrorKind::WriteAttemptedInReadOnly); + assert_eq!(*err.err, StaticCheckErrorKind::WriteAttemptedInReadOnly); db.execute(|db| { type_check( diff --git a/clarity/src/vm/analysis/trait_checker/mod.rs b/clarity/src/vm/analysis/trait_checker/mod.rs index a2563de2d47..01396a64e25 100644 --- a/clarity/src/vm/analysis/trait_checker/mod.rs +++ b/clarity/src/vm/analysis/trait_checker/mod.rs @@ -15,7 +15,7 @@ // along with this program. If not, see . use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::analysis::types::{AnalysisPass, ContractAnalysis}; use crate::vm::analysis::AnalysisDatabase; @@ -49,13 +49,13 @@ impl TraitChecker { let trait_name = trait_identifier.name.to_string(); let contract_defining_trait = analysis_db .load_contract(&trait_identifier.contract_identifier, &self.epoch)? - .ok_or(CheckErrorKind::TraitReferenceUnknown( + .ok_or(StaticCheckErrorKind::TraitReferenceUnknown( trait_identifier.name.to_string(), ))?; let trait_definition = contract_defining_trait .get_defined_trait(&trait_name) - .ok_or(CheckErrorKind::TraitReferenceUnknown( + .ok_or(StaticCheckErrorKind::TraitReferenceUnknown( trait_identifier.name.to_string(), ))?; diff --git a/clarity/src/vm/analysis/trait_checker/tests.rs b/clarity/src/vm/analysis/trait_checker/tests.rs index c103f7a6eaa..a04ad00d8c9 100644 --- a/clarity/src/vm/analysis/trait_checker/tests.rs +++ b/clarity/src/vm/analysis/trait_checker/tests.rs @@ -20,8 +20,7 @@ use rstest::rstest; use rstest_reuse::{self, *}; use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::CheckErrorKind; -use crate::vm::analysis::{type_check, StaticCheckError}; +use crate::vm::analysis::{type_check, StaticCheckError, StaticCheckErrorKind}; use crate::vm::ast::errors::ParseErrorKind; use crate::vm::ast::{build_ast, parse}; use crate::vm::database::MemoryBackingStore; @@ -98,7 +97,7 @@ fn test_incomplete_impl_trait_1(#[case] version: ClarityVersion, #[case] epoch: }) .unwrap_err(); match *err.err { - CheckErrorKind::BadTraitImplementation(_, _) => {} + StaticCheckErrorKind::BadTraitImplementation(_, _) => {} _ => panic!("{err:?}"), } } @@ -125,7 +124,7 @@ fn test_incomplete_impl_trait_2(#[case] version: ClarityVersion, #[case] epoch: }) .unwrap_err(); match *err.err { - CheckErrorKind::BadTraitImplementation(_, _) => {} + StaticCheckErrorKind::BadTraitImplementation(_, _) => {} _ => panic!("{err:?}"), } } @@ -149,7 +148,7 @@ fn test_impl_trait_arg_admission_1(#[case] version: ClarityVersion, #[case] epoc }) .unwrap_err(); match *err.err { - CheckErrorKind::BadTraitImplementation(_, _) => {} + StaticCheckErrorKind::BadTraitImplementation(_, _) => {} _ => panic!("{err:?}"), } } @@ -289,7 +288,7 @@ fn test_get_trait_reference_from_tuple( }) .unwrap_err(); match *err.err { - CheckErrorKind::ContractCallExpectName => {} + StaticCheckErrorKind::ContractCallExpectName => {} _ => panic!("{err:?}"), } } @@ -332,7 +331,7 @@ fn test_dynamic_dispatch_by_defining_and_impl_trait( }) .unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err:?}"), } } @@ -434,7 +433,7 @@ fn test_cycle_in_traits_2_contracts(#[case] version: ClarityVersion, #[case] epo }) .unwrap_err(); match *err.err { - CheckErrorKind::NoSuchContract(_) => {} + StaticCheckErrorKind::NoSuchContract(_) => {} _ => panic!("{err:?}"), } } @@ -487,7 +486,7 @@ fn test_dynamic_dispatch_unknown_method( }) .unwrap_err(); match *err.err { - CheckErrorKind::TraitMethodUnknown(_, _) => {} + StaticCheckErrorKind::TraitMethodUnknown(_, _) => {} _ => panic!("{err:?}"), } } @@ -812,7 +811,7 @@ fn test_dynamic_dispatch_importing_non_existant_trait( }) .unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err:?}"), } } @@ -1099,13 +1098,13 @@ fn test_dynamic_dispatch_including_wrong_nested_trait( .unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, actual) if epoch < StacksEpochId::Epoch21 => { + StaticCheckErrorKind::TypeError(expected, actual) if epoch < StacksEpochId::Epoch21 => { match (&*expected, &*actual) { (TypeSignature::TraitReferenceType(_), TypeSignature::TraitReferenceType(_)) => {} _ => panic!("unexpected TypeSignature: {expected:?} {actual:?}"), } } - CheckErrorKind::TypeError(expected, actual) + StaticCheckErrorKind::TypeError(expected, actual) if epoch >= StacksEpochId::Epoch21 && version < ClarityVersion::Clarity2 => { match (&*expected, &*actual) { @@ -1113,7 +1112,7 @@ fn test_dynamic_dispatch_including_wrong_nested_trait( _ => panic!("unexpected TypeSignature: {expected:?} {actual:?}"), } } - CheckErrorKind::TraitReferenceUnknown(name) => assert_eq!(name.as_str(), "trait-a"), + StaticCheckErrorKind::TraitReferenceUnknown(name) => assert_eq!(name.as_str(), "trait-a"), _ => panic!("{err:?}"), } } @@ -1167,7 +1166,7 @@ fn test_dynamic_dispatch_mismatched_args( }) .unwrap_err(); match *err.err { - CheckErrorKind::TypeError(_, _) => {} + StaticCheckErrorKind::TypeError(_, _) => {} _ => panic!("{err:?}"), } } @@ -1221,7 +1220,7 @@ fn test_dynamic_dispatch_mismatched_returns( }) .unwrap_err(); match *err.err { - CheckErrorKind::BadTraitImplementation(_, _) => {} + StaticCheckErrorKind::BadTraitImplementation(_, _) => {} _ => panic!("{err:?}"), } } @@ -1257,7 +1256,7 @@ fn test_bad_call_with_trait(#[case] version: ClarityVersion, #[case] epoch: Stac }) .unwrap_err(); match *err.err { - CheckErrorKind::TypeError(_, _) => {} + StaticCheckErrorKind::TypeError(_, _) => {} _ => panic!("{err:?}"), } } @@ -1466,7 +1465,7 @@ fn test_dynamic_dispatch_pass_bound_principal_as_trait_in_user_defined_functions match result { Err(err) if version == ClarityVersion::Clarity1 => { match *err.err { - CheckErrorKind::TypeError(_, _) => {} + StaticCheckErrorKind::TypeError(_, _) => {} _ => panic!("{err:?}"), }; } @@ -1560,7 +1559,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_principal.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_principal:?}"), } let err_int = db @@ -1570,7 +1569,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_int.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_int:?}"), } let err_uint = db @@ -1580,7 +1579,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_uint.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_uint:?}"), } let err_bool = db @@ -1590,7 +1589,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_bool.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_bool:?}"), } let err_list = db @@ -1600,7 +1599,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_list.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_list:?}"), } let err_buff = db @@ -1610,7 +1609,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_buff.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_buff:?}"), } let err_tuple = db @@ -1620,7 +1619,7 @@ fn test_contract_of_wrong_type(#[case] version: ClarityVersion, #[case] epoch: S }) .unwrap_err(); match *err_tuple.err { - CheckErrorKind::TraitReferenceUnknown(_) => {} + StaticCheckErrorKind::TraitReferenceUnknown(_) => {} _ => panic!("{err_tuple:?}"), } } @@ -1819,7 +1818,7 @@ fn test_trait_contract_not_found(#[case] version: ClarityVersion, #[case] epoch: ) }) { Err(StaticCheckError { err, .. }) if version < ClarityVersion::Clarity2 => match *err { - CheckErrorKind::NoSuchContract(contract) => { + StaticCheckErrorKind::NoSuchContract(contract) => { assert!(contract.ends_with(".trait-contract")) } _ => panic!("{version}: unexpected NoSuchContract error"), diff --git a/clarity/src/vm/analysis/type_checker/contexts.rs b/clarity/src/vm/analysis/type_checker/contexts.rs index 50f8cd16104..8a350431b35 100644 --- a/clarity/src/vm/analysis/type_checker/contexts.rs +++ b/clarity/src/vm/analysis/type_checker/contexts.rs @@ -18,7 +18,7 @@ use std::collections::{HashMap, HashSet}; use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::types::signatures::CallableSubtype; use crate::vm::types::{TraitIdentifier, TypeSignature}; use crate::vm::{ClarityName, ClarityVersion, SymbolicExpression, MAX_CONTEXT_DEPTH}; @@ -69,7 +69,7 @@ impl TypeMap { TypeMapDataType::Map(ref mut map) => { if map.insert(expr.id, type_sig).is_some() { Err(StaticCheckError::new( - CheckErrorKind::TypeAlreadyAnnotatedFailure, + StaticCheckErrorKind::TypeAlreadyAnnotatedFailure, )) } else { Ok(()) @@ -78,7 +78,7 @@ impl TypeMap { TypeMapDataType::Set(ref mut map) => { if !map.insert(expr.id) { Err(StaticCheckError::new( - CheckErrorKind::TypeAlreadyAnnotatedFailure, + StaticCheckErrorKind::TypeAlreadyAnnotatedFailure, )) } else { Ok(()) @@ -110,7 +110,7 @@ impl TypingContext<'_> { pub fn extend(&self) -> Result, StaticCheckError> { if self.depth >= MAX_CONTEXT_DEPTH { Err(StaticCheckError::new( - CheckErrorKind::MaxContextDepthReached, + StaticCheckErrorKind::MaxContextDepthReached, )) } else { Ok(TypingContext { diff --git a/clarity/src/vm/analysis/type_checker/mod.rs b/clarity/src/vm/analysis/type_checker/mod.rs index 7305d63d08e..30db2e931ff 100644 --- a/clarity/src/vm/analysis/type_checker/mod.rs +++ b/clarity/src/vm/analysis/type_checker/mod.rs @@ -20,7 +20,7 @@ pub mod v2_1; use stacks_common::types::StacksEpochId; -use super::errors::{CheckErrorKind, StaticCheckError}; +use super::errors::{StaticCheckError, StaticCheckErrorKind}; pub use super::types::{AnalysisPass, ContractAnalysis}; use super::AnalysisDatabase; use crate::vm::costs::CostTracker; @@ -49,7 +49,7 @@ impl FunctionType { | StacksEpochId::Epoch32 | StacksEpochId::Epoch33 => self.check_args_2_1(accounting, args, clarity_version), StacksEpochId::Epoch10 => { - Err(CheckErrorKind::Expects("Epoch10 is not supported".into()).into()) + Err(StaticCheckErrorKind::Expects("Epoch10 is not supported".into()).into()) } } } @@ -77,7 +77,7 @@ impl FunctionType { self.check_args_by_allowing_trait_cast_2_1(db, clarity_version, func_args) } StacksEpochId::Epoch10 => { - Err(CheckErrorKind::Expects("Epoch10 is not supported".into()).into()) + Err(StaticCheckErrorKind::Expects("Epoch10 is not supported".into()).into()) } } } diff --git a/clarity/src/vm/analysis/type_checker/v2_05/contexts.rs b/clarity/src/vm/analysis/type_checker/v2_05/contexts.rs index 684c7ff872b..ac08536c82b 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/contexts.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/contexts.rs @@ -16,7 +16,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::analysis::types::ContractAnalysis; use crate::vm::representations::ClarityName; use crate::vm::types::signatures::FunctionSignature; @@ -67,9 +67,9 @@ impl ContractContext { || self.traits.contains_key(name) || self.map_types.contains_key(name) { - Err(StaticCheckError::new(CheckErrorKind::NameAlreadyUsed( - name.to_string(), - ))) + Err(StaticCheckError::new( + StaticCheckErrorKind::NameAlreadyUsed(name.to_string()), + )) } else { Ok(()) } diff --git a/clarity/src/vm/analysis/type_checker/v2_05/mod.rs b/clarity/src/vm/analysis/type_checker/v2_05/mod.rs index da3872048d9..8ccd89410bf 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/mod.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/mod.rs @@ -27,7 +27,7 @@ pub use self::natives::{SimpleNativeFunction, TypedNativeFunction}; use super::contexts::{TypeMap, TypingContext}; use super::ContractAnalysis; pub use crate::vm::analysis::errors::{ - check_argument_count, check_arguments_at_least, CheckErrorKind, StaticCheckError, + check_argument_count, check_arguments_at_least, StaticCheckError, StaticCheckErrorKind, SyntaxBindingErrorType, }; use crate::vm::analysis::AnalysisDatabase; @@ -147,7 +147,7 @@ impl FunctionType { for found_type in args.iter() { analysis_typecheck_cost(accounting, expected_type, found_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch2_05, found_type)? { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(found_type.clone()), ) @@ -165,7 +165,7 @@ impl FunctionType { { analysis_typecheck_cost(accounting, expected_type, found_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch2_05, found_type)? { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(found_type.clone()), ) @@ -183,10 +183,11 @@ impl FunctionType { return Ok(return_type.clone()); } } - Err( - CheckErrorKind::UnionTypeError(arg_types.clone(), Box::new(found_type.clone())) - .into(), + Err(StaticCheckErrorKind::UnionTypeError( + arg_types.clone(), + Box::new(found_type.clone()), ) + .into()) } FunctionType::ArithmeticVariadic | FunctionType::ArithmeticBinary @@ -197,14 +198,17 @@ impl FunctionType { if self == &FunctionType::ArithmeticBinary { check_argument_count(2, args)?; } - let (first, rest) = args - .split_first() - .ok_or(CheckErrorKind::RequiresAtLeastArguments(1, args.len()))?; + let (first, rest) = + args.split_first() + .ok_or(StaticCheckErrorKind::RequiresAtLeastArguments( + 1, + args.len(), + ))?; analysis_typecheck_cost(accounting, &TypeSignature::IntType, first)?; let return_type = match first { TypeSignature::IntType => Ok(TypeSignature::IntType), TypeSignature::UIntType => Ok(TypeSignature::UIntType), - _ => Err(CheckErrorKind::UnionTypeError( + _ => Err(StaticCheckErrorKind::UnionTypeError( vec![TypeSignature::IntType, TypeSignature::UIntType], Box::new(first.clone()), )), @@ -212,7 +216,7 @@ impl FunctionType { for found_type in rest.iter() { analysis_typecheck_cost(accounting, &TypeSignature::IntType, found_type)?; if found_type != &return_type { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(return_type), Box::new(found_type.clone()), ) @@ -228,7 +232,7 @@ impl FunctionType { analysis_typecheck_cost(accounting, &TypeSignature::IntType, second)?; if first != &TypeSignature::IntType && first != &TypeSignature::UIntType { - return Err(CheckErrorKind::UnionTypeError( + return Err(StaticCheckErrorKind::UnionTypeError( vec![TypeSignature::IntType, TypeSignature::UIntType], Box::new(first.clone()), ) @@ -236,7 +240,7 @@ impl FunctionType { } if first != second { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(first.clone()), Box::new(second.clone()), ) @@ -245,7 +249,7 @@ impl FunctionType { Ok(TypeSignature::BoolType) } - FunctionType::Binary(_, _, _) => Err(CheckErrorKind::Expects( + FunctionType::Binary(_, _, _) => Err(StaticCheckErrorKind::Expects( "Binary type should not be reached in 2.05".into(), ) .into()), @@ -259,7 +263,9 @@ impl FunctionType { ) -> Result { let (expected_args, returns) = match self { FunctionType::Fixed(FixedFunction { args, returns }) => (args, returns), - _ => return Err(CheckErrorKind::Expects("Unexpected function type".into()).into()), + _ => { + return Err(StaticCheckErrorKind::Expects("Unexpected function type".into()).into()) + } }; check_argument_count(expected_args.len(), func_args)?; @@ -271,7 +277,9 @@ impl FunctionType { ) => { let contract_to_check = db .load_contract(contract, &StacksEpochId::Epoch2_05)? - .ok_or_else(|| CheckErrorKind::NoSuchContract(contract.name.to_string()))?; + .ok_or_else(|| { + StaticCheckErrorKind::NoSuchContract(contract.name.to_string()) + })?; let trait_definition = db .get_defined_trait( &trait_id.contract_identifier, @@ -279,9 +287,11 @@ impl FunctionType { &StacksEpochId::Epoch2_05, ) .map_err(|_| { - CheckErrorKind::NoSuchContract(trait_id.contract_identifier.to_string()) + StaticCheckErrorKind::NoSuchContract( + trait_id.contract_identifier.to_string(), + ) })? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( trait_id.contract_identifier.to_string(), ))?; contract_to_check.check_trait_compliance( @@ -293,7 +303,7 @@ impl FunctionType { (expected_type, value) => { if !expected_type.admits(&StacksEpochId::Epoch2_05, value)? { let actual_type = TypeSignature::type_of(value)?; - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type), ) @@ -327,13 +337,13 @@ fn type_reserved_variable(variable_name: &str) -> Result, BlockHeight => TypeSignature::UIntType, BurnBlockHeight => TypeSignature::UIntType, NativeNone => TypeSignature::new_option(no_type()) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, NativeTrue => TypeSignature::BoolType, NativeFalse => TypeSignature::BoolType, TotalLiquidMicroSTX => TypeSignature::UIntType, Regtest => TypeSignature::BoolType, TxSponsor | Mainnet | ChainId | StacksBlockHeight | TenureHeight | StacksBlockTime | CurrentContract => { - return Err(CheckErrorKind::Expects( + return Err(StaticCheckErrorKind::Expects( "tx-sponsor, mainnet, chain-id, stacks-block-height, tenure-height, stacks-block-time, and current-contract should not reach here in 2.05".into(), ) .into()) @@ -393,7 +403,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { &return_type, ) .map_err(|_| { - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new(expected_type), Box::new(return_type), ) @@ -424,7 +434,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { } Err(e) => Err(e), })? - .ok_or_else(|| CheckErrorKind::Expects("Expected a depth result".into()))?; + .ok_or_else(|| StaticCheckErrorKind::Expects("Expected a depth result".into()))?; } runtime_cost(ClarityCostFunction::AnalysisStorage, self, size)?; @@ -463,7 +473,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { let contract_to_check = self .db .load_contract(contract_identifier, &StacksEpochId::Epoch2_05)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; @@ -473,13 +483,13 @@ impl<'a, 'b> TypeChecker<'a, 'b> { &trait_identifier.contract_identifier, &StacksEpochId::Epoch2_05, )? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( trait_identifier.contract_identifier.to_string(), ))?; let trait_definition = contract_defining_trait .get_defined_trait(&trait_identifier.name) - .ok_or(CheckErrorKind::NoSuchTrait( + .ok_or(StaticCheckErrorKind::NoSuchTrait( trait_identifier.contract_identifier.to_string(), trait_identifier.name.to_string(), ))?; @@ -496,9 +506,11 @@ impl<'a, 'b> TypeChecker<'a, 'b> { analysis_typecheck_cost(self, expected_type, &actual_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch2_05, &actual_type)? { - let mut err: StaticCheckError = - CheckErrorKind::TypeError(Box::new(expected_type.clone()), Box::new(actual_type)) - .into(); + let mut err: StaticCheckError = StaticCheckErrorKind::TypeError( + Box::new(expected_type.clone()), + Box::new(actual_type), + ) + .into(); err.set_expression(expr); Err(err) } else { @@ -533,12 +545,12 @@ impl<'a, 'b> TypeChecker<'a, 'b> { let mut types_returned = self.type_check_all(args, context)?; let last_return = types_returned.pop().ok_or(StaticCheckError::new( - CheckErrorKind::CheckerImplementationFailure, + StaticCheckErrorKind::CheckerImplementationFailure, ))?; for type_return in types_returned.iter() { if type_return.is_response_type() { - return Err(CheckErrorKind::UncheckedIntermediaryResponses.into()); + return Err(StaticCheckErrorKind::UncheckedIntermediaryResponses.into()); } } Ok(last_return) @@ -581,10 +593,10 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result<(ClarityName, FixedFunction), StaticCheckError> { let (function_name, args) = signature .split_first() - .ok_or(CheckErrorKind::RequiresAtLeastArguments(1, 0))?; + .ok_or(StaticCheckErrorKind::RequiresAtLeastArguments(1, 0))?; let function_name = function_name .match_atom() - .ok_or(CheckErrorKind::BadFunctionName)?; + .ok_or(StaticCheckErrorKind::BadFunctionName)?; let args = parse_name_type_pairs::<(), StaticCheckError>( StacksEpochId::Epoch2_05, args, @@ -593,7 +605,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { )?; if self.function_return_tracker.is_some() { - return Err(CheckErrorKind::Expects( + return Err(StaticCheckErrorKind::Expects( "Interpreter error: Previous function define left dirty typecheck state.".into(), ) .into()); @@ -635,7 +647,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { &return_type, ) .map_err(|_| { - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new(expected.clone()), Box::new(return_type), ) @@ -674,10 +686,10 @@ impl<'a, 'b> TypeChecker<'a, 'b> { // should we set the type of the subexpressions of the signature to no-type as well? let key_type = TypeSignature::parse_type_repr(StacksEpochId::Epoch2_05, key_type, &mut ()) - .map_err(|_| CheckErrorKind::BadMapTypeDefinition)?; + .map_err(|_| StaticCheckErrorKind::BadMapTypeDefinition)?; let value_type = TypeSignature::parse_type_repr(StacksEpochId::Epoch2_05, value_type, &mut ()) - .map_err(|_| CheckErrorKind::BadMapTypeDefinition)?; + .map_err(|_| StaticCheckErrorKind::BadMapTypeDefinition)?; Ok((map_name.clone(), (key_type, value_type))) } @@ -709,19 +721,21 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result { let (function_name, args) = expression .split_first() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; self.type_map.set_type(function_name, no_type())?; let function_name = function_name .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; if let Some(type_result) = self.try_native_function_check(function_name, args, context) { type_result } else { let function = match self.get_function_type(function_name) { Some(FunctionType::Fixed(function)) => Ok(function), - _ => Err(CheckErrorKind::UnknownFunction(function_name.to_string())), + _ => Err(StaticCheckErrorKind::UnknownFunction( + function_name.to_string(), + )), }?; for (expected_type, found_type) in function.args.iter().map(|x| &x.signature).zip(args) @@ -751,7 +765,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { // be undefined. This early error prevents a cost function error // due to `context.depth` being 0. if context.depth == 0 { - return Err(CheckErrorKind::UndefinedVariable(name.to_string()).into()); + return Err(StaticCheckErrorKind::UndefinedVariable(name.to_string()).into()); } runtime_cost( @@ -763,7 +777,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { if let Some(type_result) = context.lookup_variable_type(name) { Ok(type_result.clone()) } else { - Err(CheckErrorKind::UndefinedVariable(name.to_string()).into()) + Err(StaticCheckErrorKind::UndefinedVariable(name.to_string()).into()) } } } @@ -778,7 +792,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { Atom(ref name) => self.lookup_variable(name, context)?, List(ref expression) => self.type_check_function_application(expression, context)?, TraitReference(_, _) | Field(_) => { - return Err(CheckErrorKind::UnexpectedTraitOrFieldReference.into()); + return Err(StaticCheckErrorKind::UnexpectedTraitOrFieldReference.into()); } }; @@ -810,7 +824,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result<(ClarityName, TypeSignature), StaticCheckError> { let expected_type = TypeSignature::parse_type_repr::<()>(StacksEpochId::Epoch2_05, var_type, &mut ()) - .map_err(|_e| CheckErrorKind::DefineVariableBadSignature)?; + .map_err(|_e| StaticCheckErrorKind::DefineVariableBadSignature)?; self.type_check_expects(initial, context, &expected_type)?; @@ -838,7 +852,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result<(ClarityName, TypeSignature), StaticCheckError> { let asset_type = TypeSignature::parse_type_repr::<()>(StacksEpochId::Epoch2_05, nft_type, &mut ()) - .map_err(|_| CheckErrorKind::DefineNFTBadSignature)?; + .map_err(|_| StaticCheckErrorKind::DefineNFTBadSignature)?; Ok((asset_name.clone(), asset_type)) } @@ -902,9 +916,9 @@ impl<'a, 'b> TypeChecker<'a, 'b> { .add_public_function_type(f_name, FunctionType::Fixed(f_type))?; return Ok(Some(())); } else { - return Err(CheckErrorKind::PublicFunctionMustReturnResponse(Box::new( - f_type.returns, - )) + return Err(StaticCheckErrorKind::PublicFunctionMustReturnResponse( + Box::new(f_type.returns), + ) .into()); } } @@ -1009,9 +1023,10 @@ impl<'a, 'b> TypeChecker<'a, 'b> { None => { // still had to do a db read, even if it didn't exist! runtime_cost(ClarityCostFunction::AnalysisUseTraitEntry, self, 1)?; - return Err( - CheckErrorKind::TraitReferenceUnknown(name.to_string()).into() - ); + return Err(StaticCheckErrorKind::TraitReferenceUnknown( + name.to_string(), + ) + .into()); } } } diff --git a/clarity/src/vm/analysis/type_checker/v2_05/natives/assets.rs b/clarity/src/vm/analysis/type_checker/v2_05/natives/assets.rs index 74680694340..d5a492d09a9 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/natives/assets.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/natives/assets.rs @@ -15,7 +15,7 @@ // along with this program. If not, see . use super::{TypeChecker, TypingContext}; -use crate::vm::analysis::errors::{check_argument_count, CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{check_argument_count, StaticCheckError, StaticCheckErrorKind}; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::runtime_cost; use crate::vm::representations::SymbolicExpression; @@ -28,13 +28,15 @@ pub fn check_special_get_owner( ) -> Result { check_argument_count(2, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_asset_type = checker .contract_context .get_nft_type(asset_name) .cloned() - .ok_or_else(|| CheckErrorKind::NoSuchNFT(asset_name.to_string()))?; + .ok_or_else(|| StaticCheckErrorKind::NoSuchNFT(asset_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -56,10 +58,12 @@ pub fn check_special_get_balance( ) -> Result { check_argument_count(2, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 1)?; @@ -77,13 +81,15 @@ pub fn check_special_mint_asset( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; let expected_asset_type = checker .contract_context .get_nft_type(asset_name) - .ok_or(CheckErrorKind::NoSuchNFT(asset_name.to_string()))? + .ok_or(StaticCheckErrorKind::NoSuchNFT(asset_name.to_string()))? .clone(); // this clone shouldn't be strictly necessary, but to use `type_check_expects` with this, it would have to be. runtime_cost( @@ -108,7 +114,9 @@ pub fn check_special_mint_token( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_amount: TypeSignature = TypeSignature::UIntType; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; @@ -119,7 +127,7 @@ pub fn check_special_mint_token( checker.type_check_expects(&args[2], context, &expected_owner_type)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } Ok(TypeSignature::ResponseType(Box::new(( @@ -135,13 +143,15 @@ pub fn check_special_transfer_asset( ) -> Result { check_argument_count(4, args)?; - let token_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let token_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; let expected_asset_type = checker .contract_context .get_nft_type(token_name) - .ok_or(CheckErrorKind::NoSuchNFT(token_name.to_string()))? + .ok_or(StaticCheckErrorKind::NoSuchNFT(token_name.to_string()))? .clone(); runtime_cost( @@ -167,7 +177,9 @@ pub fn check_special_transfer_token( ) -> Result { check_argument_count(4, args)?; - let token_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let token_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_amount: TypeSignature = TypeSignature::UIntType; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; @@ -179,7 +191,7 @@ pub fn check_special_transfer_token( checker.type_check_expects(&args[3], context, &expected_owner_type)?; // recipient if !checker.contract_context.ft_exists(token_name) { - return Err(CheckErrorKind::NoSuchFT(token_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(token_name.to_string()).into()); } Ok(TypeSignature::ResponseType(Box::new(( @@ -195,10 +207,12 @@ pub fn check_special_get_token_supply( ) -> Result { check_argument_count(1, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 1)?; @@ -213,13 +227,15 @@ pub fn check_special_burn_asset( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; let expected_asset_type = checker .contract_context .get_nft_type(asset_name) - .ok_or(CheckErrorKind::NoSuchNFT(asset_name.to_string()))? + .ok_or(StaticCheckErrorKind::NoSuchNFT(asset_name.to_string()))? .clone(); // this clone shouldn't be strictly necessary, but to use `type_check_expects` with this, it would have to be. runtime_cost( @@ -244,7 +260,9 @@ pub fn check_special_burn_token( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_amount: TypeSignature = TypeSignature::UIntType; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; @@ -255,7 +273,7 @@ pub fn check_special_burn_token( checker.type_check_expects(&args[2], context, &expected_owner_type)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } Ok(TypeSignature::ResponseType(Box::new(( diff --git a/clarity/src/vm/analysis/type_checker/v2_05/natives/maps.rs b/clarity/src/vm/analysis/type_checker/v2_05/natives/maps.rs index e454e424f10..b9cb0122af1 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/natives/maps.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/natives/maps.rs @@ -17,7 +17,7 @@ use stacks_common::types::StacksEpochId; use crate::vm::analysis::type_checker::v2_05::{ - check_arguments_at_least, CheckErrorKind, StaticCheckError, TypeChecker, TypingContext, + check_arguments_at_least, StaticCheckError, StaticCheckErrorKind, TypeChecker, TypingContext, }; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost}; @@ -31,14 +31,16 @@ pub fn check_special_fetch_entry( ) -> Result { check_arguments_at_least(2, args)?; - let map_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let map_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let key_type = checker.type_check(&args[1], context)?; let (expected_key_type, value_type) = checker .contract_context .get_map_type(map_name) - .ok_or(CheckErrorKind::NoSuchMap(map_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchMap(map_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -55,7 +57,7 @@ pub fn check_special_fetch_entry( let option_type = TypeSignature::new_option(value_type.clone())?; if !expected_key_type.admits_type(&StacksEpochId::Epoch2_05, &key_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_key_type.clone()), Box::new(key_type), ))) @@ -71,14 +73,16 @@ pub fn check_special_delete_entry( ) -> Result { check_arguments_at_least(2, args)?; - let map_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let map_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let key_type = checker.type_check(&args[1], context)?; let (expected_key_type, _) = checker .contract_context .get_map_type(map_name) - .ok_or(CheckErrorKind::NoSuchMap(map_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchMap(map_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -88,7 +92,7 @@ pub fn check_special_delete_entry( analysis_typecheck_cost(&mut checker.cost_track, expected_key_type, &key_type)?; if !expected_key_type.admits_type(&StacksEpochId::Epoch2_05, &key_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_key_type.clone()), Box::new(key_type), ))) @@ -104,7 +108,9 @@ fn check_set_or_insert_entry( ) -> Result { check_arguments_at_least(3, args)?; - let map_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let map_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let key_type = checker.type_check(&args[1], context)?; let value_type = checker.type_check(&args[2], context)?; @@ -112,7 +118,7 @@ fn check_set_or_insert_entry( let (expected_key_type, expected_value_type) = checker .contract_context .get_map_type(map_name) - .ok_or(CheckErrorKind::NoSuchMap(map_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchMap(map_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -129,12 +135,12 @@ fn check_set_or_insert_entry( analysis_typecheck_cost(&mut checker.cost_track, expected_value_type, &value_type)?; if !expected_key_type.admits_type(&StacksEpochId::Epoch2_05, &key_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_key_type.clone()), Box::new(key_type), ))) } else if !expected_value_type.admits_type(&StacksEpochId::Epoch2_05, &value_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_value_type.clone()), Box::new(value_type), ))) diff --git a/clarity/src/vm/analysis/type_checker/v2_05/natives/mod.rs b/clarity/src/vm/analysis/type_checker/v2_05/natives/mod.rs index 3cbe844478e..1cc33db4554 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/natives/mod.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/natives/mod.rs @@ -17,7 +17,7 @@ use stacks_common::types::StacksEpochId; use super::{check_argument_count, check_arguments_at_least, no_type, TypeChecker, TypingContext}; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError, SyntaxBindingErrorType}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind, SyntaxBindingErrorType}; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost}; use crate::vm::diagnostic::DiagnosableError; @@ -117,10 +117,12 @@ fn inner_handle_tuple_get( let return_type = tuple_type_sig .field_type(field_to_get) - .ok_or(StaticCheckError::new(CheckErrorKind::NoSuchTupleField( - field_to_get.to_string(), - tuple_type_sig.clone(), - )))? + .ok_or(StaticCheckError::new( + StaticCheckErrorKind::NoSuchTupleField( + field_to_get.to_string(), + tuple_type_sig.clone(), + ), + ))? .clone(); Ok(return_type) } @@ -134,7 +136,7 @@ fn check_special_get( let field_to_get = args[0] .match_atom() - .ok_or(CheckErrorKind::BadTupleFieldName)?; + .ok_or(StaticCheckErrorKind::BadTupleFieldName)?; let argument_type = checker.type_check(&args[1], context)?; @@ -146,10 +148,10 @@ fn check_special_get( let option_type = TypeSignature::new_option(inner_type)?; Ok(option_type) } else { - Err(CheckErrorKind::ExpectedTuple(value_type_sig).into()) + Err(StaticCheckErrorKind::ExpectedTuple(value_type_sig).into()) } } else { - Err(CheckErrorKind::ExpectedTuple(Box::new(argument_type)).into()) + Err(StaticCheckErrorKind::ExpectedTuple(Box::new(argument_type)).into()) } } @@ -163,13 +165,13 @@ fn check_special_merge( let res = checker.type_check(&args[0], context)?; let mut base = match res { TypeSignature::TupleType(tuple_sig) => Ok(tuple_sig), - _ => Err(CheckErrorKind::ExpectedTuple(Box::new(res.clone()))), + _ => Err(StaticCheckErrorKind::ExpectedTuple(Box::new(res.clone()))), }?; let res = checker.type_check(&args[1], context)?; let mut update = match res { TypeSignature::TupleType(tuple_sig) => Ok(tuple_sig), - _ => Err(CheckErrorKind::ExpectedTuple(Box::new(res.clone()))), + _ => Err(StaticCheckErrorKind::ExpectedTuple(Box::new(res.clone()))), }?; runtime_cost( ClarityCostFunction::AnalysisCheckTupleMerge, @@ -209,8 +211,9 @@ pub fn check_special_tuple_cons( }, )?; - let tuple_signature = TupleTypeSignature::try_from(tuple_type_data) - .map_err(|e| CheckErrorKind::BadTupleConstruction(e.message()))?; + let tuple_signature = TupleTypeSignature::try_from(tuple_type_data).map_err(|e| { + StaticCheckErrorKind::BadTupleConstruction(StaticCheckErrorKind::from(e).message()) + })?; Ok(TypeSignature::TupleType(tuple_signature)) } @@ -224,7 +227,7 @@ fn check_special_let( let binding_list = args[0] .match_list() - .ok_or(StaticCheckError::new(CheckErrorKind::BadLetSyntax))?; + .ok_or(StaticCheckError::new(StaticCheckErrorKind::BadLetSyntax))?; let mut out_context = context.extend()?; @@ -236,9 +239,9 @@ fn check_special_let( |var_name, var_sexp| { checker.contract_context.check_name_used(var_name)?; if out_context.lookup_variable_type(var_name).is_some() { - return Err(StaticCheckError::new(CheckErrorKind::NameAlreadyUsed( - var_name.to_string(), - ))); + return Err(StaticCheckError::new( + StaticCheckErrorKind::NameAlreadyUsed(var_name.to_string()), + )); } let typed_result = checker.type_check(var_sexp, &out_context)?; @@ -267,14 +270,14 @@ fn check_special_fetch_var( let var_name = args[0] .match_atom() - .ok_or(StaticCheckError::new(CheckErrorKind::BadMapName))?; + .ok_or(StaticCheckError::new(StaticCheckErrorKind::BadMapName))?; let value_type = checker .contract_context .get_persisted_variable_type(var_name) - .ok_or(StaticCheckError::new(CheckErrorKind::NoSuchDataVariable( - var_name.to_string(), - )))?; + .ok_or(StaticCheckError::new( + StaticCheckErrorKind::NoSuchDataVariable(var_name.to_string()), + ))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -292,14 +295,18 @@ fn check_special_set_var( ) -> Result { check_arguments_at_least(2, args)?; - let var_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let var_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let value_type = checker.type_check(&args[1], context)?; let expected_value_type = checker .contract_context .get_persisted_variable_type(var_name) - .ok_or(CheckErrorKind::NoSuchDataVariable(var_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchDataVariable( + var_name.to_string(), + ))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -309,7 +316,7 @@ fn check_special_set_var( analysis_typecheck_cost(&mut checker.cost_track, &value_type, expected_value_type)?; if !expected_value_type.admits_type(&StacksEpochId::Epoch2_05, &value_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_value_type.clone()), Box::new(value_type), ))) @@ -331,7 +338,7 @@ fn check_special_equals( for x_type in arg_types.into_iter() { analysis_typecheck_cost(checker, &x_type, &arg_type)?; arg_type = TypeSignature::least_supertype(&StacksEpochId::Epoch2_05, &x_type, &arg_type) - .map_err(|_| CheckErrorKind::TypeError(Box::new(x_type), Box::new(arg_type)))?; + .map_err(|_| StaticCheckErrorKind::TypeError(Box::new(x_type), Box::new(arg_type)))?; } Ok(TypeSignature::BoolType) @@ -354,7 +361,8 @@ fn check_special_if( analysis_typecheck_cost(checker, expr1, expr2)?; TypeSignature::least_supertype(&StacksEpochId::Epoch2_05, expr1, expr2).map_err(|_| { - CheckErrorKind::IfArmsMustMatch(Box::new(expr1.clone()), Box::new(expr2.clone())).into() + StaticCheckErrorKind::IfArmsMustMatch(Box::new(expr1.clone()), Box::new(expr2.clone())) + .into() }) } @@ -366,7 +374,7 @@ fn check_contract_call( check_arguments_at_least(2, args)?; let func_name = args[1].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::ContractCallExpectName, + StaticCheckErrorKind::ContractCallExpectName, ))?; checker.type_map.set_type(&args[1], no_type())?; @@ -391,10 +399,12 @@ fn check_contract_call( { Ok(function) } else { - Err(StaticCheckError::new(CheckErrorKind::NoSuchPublicFunction( - contract_identifier.to_string(), - func_name.to_string(), - ))) + Err(StaticCheckError::new( + StaticCheckErrorKind::NoSuchPublicFunction( + contract_identifier.to_string(), + func_name.to_string(), + ), + )) } }?; @@ -413,21 +423,22 @@ fn check_contract_call( let trait_id = match context.lookup_trait_reference_type(trait_instance) { Some(trait_id) => trait_id, _ => { - return Err( - CheckErrorKind::TraitReferenceUnknown(trait_instance.to_string()).into(), - ); + return Err(StaticCheckErrorKind::TraitReferenceUnknown( + trait_instance.to_string(), + ) + .into()); } }; runtime_cost(ClarityCostFunction::AnalysisLookupFunction, checker, 0)?; let trait_signature = checker.contract_context.get_trait(&trait_id.name).ok_or( - CheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()), + StaticCheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()), )?; let func_signature = trait_signature .get(func_name) - .ok_or(CheckErrorKind::TraitMethodUnknown( + .ok_or(StaticCheckErrorKind::TraitMethodUnknown( trait_id.name.to_string(), func_name.to_string(), ))?; @@ -442,7 +453,7 @@ fn check_contract_call( } _ => { return Err(StaticCheckError::new( - CheckErrorKind::ContractCallExpectName, + StaticCheckErrorKind::ContractCallExpectName, )) } }; @@ -466,14 +477,18 @@ fn check_contract_of( SymbolicExpressionType::Atom(trait_instance) => trait_instance, _ => { return Err(StaticCheckError::new( - CheckErrorKind::ContractOfExpectsTrait, + StaticCheckErrorKind::ContractOfExpectsTrait, )) } }; let trait_id = match context.lookup_trait_reference_type(trait_instance) { Some(trait_id) => trait_id, - _ => return Err(CheckErrorKind::TraitReferenceUnknown(trait_instance.to_string()).into()), + _ => { + return Err( + StaticCheckErrorKind::TraitReferenceUnknown(trait_instance.to_string()).into(), + ) + } }; runtime_cost(ClarityCostFunction::ContractOf, checker, 1)?; @@ -481,7 +496,7 @@ fn check_contract_of( checker .contract_context .get_trait(&trait_id.name) - .ok_or_else(|| CheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()))?; + .ok_or_else(|| StaticCheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()))?; Ok(TypeSignature::PrincipalType) } @@ -495,7 +510,7 @@ fn check_principal_of( checker.type_check_expects(&args[0], context, &TypeSignature::BUFFER_33)?; Ok( TypeSignature::new_response(TypeSignature::PrincipalType, TypeSignature::UIntType) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, ) } @@ -509,7 +524,7 @@ fn check_secp256k1_recover( checker.type_check_expects(&args[1], context, &TypeSignature::BUFFER_65)?; Ok( TypeSignature::new_response(TypeSignature::BUFFER_33, TypeSignature::UIntType) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, ) } @@ -533,7 +548,7 @@ fn check_get_block_info( check_arguments_at_least(2, args)?; let block_info_prop_str = args[0].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::GetBlockInfoExpectPropertyName, + StaticCheckErrorKind::GetBlockInfoExpectPropertyName, ))?; let block_info_prop = BlockInfoProperty::lookup_by_name_at_version( @@ -541,7 +556,7 @@ fn check_get_block_info( &ClarityVersion::Clarity1, ) .ok_or(StaticCheckError::new( - CheckErrorKind::NoSuchBlockInfoProperty(block_info_prop_str.to_string()), + StaticCheckErrorKind::NoSuchBlockInfoProperty(block_info_prop_str.to_string()), ))?; checker.type_check_expects(&args[1], context, &TypeSignature::UIntType)?; @@ -567,7 +582,7 @@ impl TypedNativeFunction { pub fn type_native_function( function: &NativeFunctions, - ) -> Result { + ) -> Result { use self::TypedNativeFunction::{Simple, Special}; use crate::vm::functions::NativeFunctions::*; let out = match function { @@ -589,7 +604,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::IntType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -600,7 +615,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::UIntType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -611,7 +626,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::BoolType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -664,7 +679,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("owner".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -676,7 +691,7 @@ impl TypedNativeFunction { FunctionArg::new( TypeSignature::UIntType, ClarityName::try_from("amount".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -684,7 +699,7 @@ impl TypedNativeFunction { FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("sender".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -692,7 +707,7 @@ impl TypedNativeFunction { FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("recipient".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -702,14 +717,14 @@ impl TypedNativeFunction { TypeSignature::BoolType, TypeSignature::UIntType, ) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, }))), StxBurn => Simple(SimpleNativeFunction(FunctionType::Fixed(FixedFunction { args: vec![ FunctionArg::new( TypeSignature::UIntType, ClarityName::try_from("amount".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -717,7 +732,7 @@ impl TypedNativeFunction { FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("sender".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -727,7 +742,7 @@ impl TypedNativeFunction { TypeSignature::BoolType, TypeSignature::UIntType, ) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, }))), GetTokenBalance => Special(SpecialNativeFunction(&assets::check_special_get_balance)), GetAssetOwner => Special(SpecialNativeFunction(&assets::check_special_get_owner)), @@ -825,7 +840,7 @@ impl TypedNativeFunction { | AllowanceWithStacking | AllowanceAll | Secp256r1Verify => { - return Err(CheckErrorKind::Expects( + return Err(StaticCheckErrorKind::Expects( "Clarity 2+ keywords should not show up in 2.05".into(), )); } diff --git a/clarity/src/vm/analysis/type_checker/v2_05/natives/options.rs b/clarity/src/vm/analysis/type_checker/v2_05/natives/options.rs index 73a4d87f649..75c931428c3 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/natives/options.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/natives/options.rs @@ -19,8 +19,8 @@ use clarity_types::types::TypeSignature; use stacks_common::types::StacksEpochId; use crate::vm::analysis::type_checker::v2_05::{ - check_argument_count, check_arguments_at_least, no_type, CheckErrorKind, StaticCheckError, - TypeChecker, TypingContext, + check_argument_count, check_arguments_at_least, no_type, StaticCheckError, + StaticCheckErrorKind, TypeChecker, TypingContext, }; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost}; @@ -82,7 +82,7 @@ pub fn check_special_is_response( if let TypeSignature::ResponseType(_types) = input { Ok(TypeSignature::BoolType) } else { - Err(CheckErrorKind::ExpectedResponseType(Box::new(input)).into()) + Err(StaticCheckErrorKind::ExpectedResponseType(Box::new(input)).into()) } } @@ -100,7 +100,7 @@ pub fn check_special_is_optional( if let TypeSignature::OptionalType(_type) = input { Ok(TypeSignature::BoolType) } else { - Err(CheckErrorKind::ExpectedOptionalType(Box::new(input)).into()) + Err(StaticCheckErrorKind::ExpectedOptionalType(Box::new(input)).into()) } } @@ -120,11 +120,14 @@ pub fn check_special_default_to( let contained_type = *input_type; TypeSignature::least_supertype(&StacksEpochId::Epoch2_05, &default, &contained_type) .map_err(|_| { - CheckErrorKind::DefaultTypesMustMatch(Box::new(default), Box::new(contained_type)) - .into() + StaticCheckErrorKind::DefaultTypesMustMatch( + Box::new(default), + Box::new(contained_type), + ) + .into() }) } else { - Err(CheckErrorKind::ExpectedOptionalType(Box::new(input)).into()) + Err(StaticCheckErrorKind::ExpectedOptionalType(Box::new(input)).into()) } } @@ -152,7 +155,7 @@ fn inner_unwrap( match input { TypeSignature::OptionalType(input_type) => { if input_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else { Ok(*input_type) } @@ -160,12 +163,12 @@ fn inner_unwrap( TypeSignature::ResponseType(response_type) => { let ok_type = response_type.0; if ok_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else { Ok(ok_type) } } - _ => Err(CheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), + _ => Err(StaticCheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), } } @@ -178,12 +181,12 @@ fn inner_unwrap_err( if let TypeSignature::ResponseType(response_type) = input { let err_type = response_type.1; if err_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseErrType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseErrType.into()) } else { Ok(err_type) } } else { - Err(CheckErrorKind::ExpectedResponseType(Box::new(input)).into()) + Err(StaticCheckErrorKind::ExpectedResponseType(Box::new(input)).into()) } } @@ -231,7 +234,7 @@ pub fn check_special_try_ret( match input { TypeSignature::OptionalType(input_type) => { if input_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else { checker.track_return_type(TypeSignature::new_option(TypeSignature::NoType)?)?; Ok(*input_type) @@ -240,9 +243,9 @@ pub fn check_special_try_ret( TypeSignature::ResponseType(response_type) => { let (ok_type, err_type) = *response_type; if ok_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else if err_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseErrType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseErrType.into()) } else { checker.track_return_type(TypeSignature::new_response( TypeSignature::NoType, @@ -251,7 +254,7 @@ pub fn check_special_try_ret( Ok(ok_type) } } - _ => Err(CheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), + _ => Err(StaticCheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), } } @@ -297,7 +300,7 @@ fn eval_with_new_binding( checker.contract_context.check_name_used(&bind_name)?; if inner_context.lookup_variable_type(&bind_name).is_some() { - return Err(CheckErrorKind::NameAlreadyUsed(bind_name.into()).into()); + return Err(StaticCheckErrorKind::NameAlreadyUsed(bind_name.into()).into()); } inner_context.variable_types.insert(bind_name, bind_type); @@ -312,22 +315,22 @@ fn check_special_match_opt( context: &TypingContext, ) -> Result { if args.len() != 3 { - Err(CheckErrorKind::BadMatchOptionSyntax(Box::new( - CheckErrorKind::IncorrectArgumentCount(4, args.len() + 1), + Err(StaticCheckErrorKind::BadMatchOptionSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(4, args.len() + 1), )))?; } let bind_name = args[0] .match_atom() .ok_or_else(|| { - CheckErrorKind::BadMatchOptionSyntax(Box::new(CheckErrorKind::ExpectedName)) + StaticCheckErrorKind::BadMatchOptionSyntax(Box::new(StaticCheckErrorKind::ExpectedName)) })? .clone(); let some_branch = &args[1]; let none_branch = &args[2]; if option_type.is_no_type() { - return Err(CheckErrorKind::CouldNotDetermineMatchTypes.into()); + return Err(StaticCheckErrorKind::CouldNotDetermineMatchTypes.into()); } let some_branch_type = @@ -342,8 +345,11 @@ fn check_special_match_opt( &none_branch_type, ) .map_err(|_| { - CheckErrorKind::MatchArmsMustMatch(Box::new(some_branch_type), Box::new(none_branch_type)) - .into() + StaticCheckErrorKind::MatchArmsMustMatch( + Box::new(some_branch_type), + Box::new(none_branch_type), + ) + .into() }) } @@ -354,22 +360,26 @@ fn check_special_match_resp( context: &TypingContext, ) -> Result { if args.len() != 4 { - Err(CheckErrorKind::BadMatchResponseSyntax(Box::new( - CheckErrorKind::IncorrectArgumentCount(5, args.len() + 1), + Err(StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(5, args.len() + 1), )))?; } let ok_bind_name = args[0] .match_atom() .ok_or_else(|| { - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)) + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )) })? .clone(); let ok_branch = &args[1]; let err_bind_name = args[2] .match_atom() .ok_or_else(|| { - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)) + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )) })? .clone(); let err_branch = &args[3]; @@ -377,7 +387,7 @@ fn check_special_match_resp( let (ok_type, err_type) = resp_type; if ok_type.is_no_type() || err_type.is_no_type() { - return Err(CheckErrorKind::CouldNotDetermineMatchTypes.into()); + return Err(StaticCheckErrorKind::CouldNotDetermineMatchTypes.into()); } let ok_branch_type = eval_with_new_binding(ok_branch, ok_bind_name, ok_type, checker, context)?; @@ -388,8 +398,11 @@ fn check_special_match_resp( TypeSignature::least_supertype(&StacksEpochId::Epoch2_05, &ok_branch_type, &err_branch_type) .map_err(|_| { - CheckErrorKind::MatchArmsMustMatch(Box::new(ok_branch_type), Box::new(err_branch_type)) - .into() + StaticCheckErrorKind::MatchArmsMustMatch( + Box::new(ok_branch_type), + Box::new(err_branch_type), + ) + .into() }) } @@ -409,6 +422,6 @@ pub fn check_special_match( TypeSignature::ResponseType(resp_type) => { check_special_match_resp(*resp_type, checker, &args[1..], context) } - _ => Err(CheckErrorKind::BadMatchInput(Box::new(input)).into()), + _ => Err(StaticCheckErrorKind::BadMatchInput(Box::new(input)).into()), } } diff --git a/clarity/src/vm/analysis/type_checker/v2_05/natives/sequences.rs b/clarity/src/vm/analysis/type_checker/v2_05/natives/sequences.rs index 8b03807c7a9..37f3d83b837 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/natives/sequences.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/natives/sequences.rs @@ -18,8 +18,8 @@ use stacks_common::types::StacksEpochId; use super::{SimpleNativeFunction, TypedNativeFunction}; use crate::vm::analysis::type_checker::v2_05::{ - check_argument_count, check_arguments_at_least, CheckErrorKind, StaticCheckError, TypeChecker, - TypingContext, + check_argument_count, check_arguments_at_least, StaticCheckError, StaticCheckErrorKind, + TypeChecker, TypingContext, }; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost}; @@ -44,14 +44,15 @@ fn get_simple_native_or_user_define( { Ok(function_type) } else { - Err( - CheckErrorKind::IllegalOrUnknownFunctionApplication(function_name.to_string()) - .into(), + Err(StaticCheckErrorKind::IllegalOrUnknownFunctionApplication( + function_name.to_string(), ) + .into()) } } else { checker.get_function_type(function_name).ok_or( - CheckErrorKind::IllegalOrUnknownFunctionApplication(function_name.to_string()).into(), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication(function_name.to_string()) + .into(), ) } } @@ -65,7 +66,7 @@ pub fn check_special_map( let function_name = args[0] .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; // we will only lookup native or defined functions here. // you _cannot_ map a special function. let function_type = get_simple_native_or_user_define(function_name, checker)?; @@ -101,7 +102,7 @@ pub fn check_special_map( // However that could lead to confusions when combining certain types: // ex: (map concat (list "hello " "hi ") "world") would fail, because // strings are handled as sequences. - return Err(CheckErrorKind::ExpectedSequence(Box::new(argument_type)).into()); + return Err(StaticCheckErrorKind::ExpectedSequence(Box::new(argument_type)).into()); } }; func_args.push(entry_type); @@ -110,7 +111,7 @@ pub fn check_special_map( let mapped_type = function_type.check_args(checker, &func_args, context.epoch, context.clarity_version)?; TypeSignature::list_of(mapped_type, min_args) - .map_err(|_| CheckErrorKind::ConstructedListTooLarge.into()) + .map_err(|_| StaticCheckErrorKind::ConstructedListTooLarge.into()) } pub fn check_special_filter( @@ -122,7 +123,7 @@ pub fn check_special_filter( let function_name = args[0] .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; // we will only lookup native or defined functions here. // you _cannot_ map a special function. let function_type = get_simple_native_or_user_define(function_name, checker)?; @@ -133,7 +134,7 @@ pub fn check_special_filter( { let input_type = match argument_type { TypeSignature::SequenceType(ref sequence_type) => Ok(sequence_type.unit_type()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new( + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new( argument_type.clone(), ))), }?; @@ -146,7 +147,7 @@ pub fn check_special_filter( )?; if TypeSignature::BoolType != filter_type { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BoolType), Box::new(filter_type), ) @@ -166,7 +167,7 @@ pub fn check_special_fold( let function_name = args[0] .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; // we will only lookup native or defined functions here. // you _cannot_ fold a special function. let function_type = get_simple_native_or_user_define(function_name, checker)?; @@ -176,7 +177,9 @@ pub fn check_special_fold( let input_type = match argument_type { TypeSignature::SequenceType(sequence_type) => Ok(sequence_type.unit_type()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(argument_type))), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new( + argument_type, + ))), }?; let initial_value_type = checker.type_check(&args[2], context)?; @@ -234,29 +237,29 @@ pub fn check_special_concat( )?; let new_len = lhs_max_len .checked_add(rhs_max_len) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::list_of(list_entry_type, new_len)? } (BufferType(lhs_len), BufferType(rhs_len)) => { let size: u32 = u32::from(lhs_len) .checked_add(u32::from(rhs_len)) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::SequenceType(BufferType(size.try_into()?)) } (StringType(ASCII(lhs_len)), StringType(ASCII(rhs_len))) => { let size: u32 = u32::from(lhs_len) .checked_add(u32::from(rhs_len)) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::SequenceType(StringType(ASCII(size.try_into()?))) } (StringType(UTF8(lhs_len)), StringType(UTF8(rhs_len))) => { let size: u32 = u32::from(lhs_len) .checked_add(u32::from(rhs_len)) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::SequenceType(StringType(UTF8(size.try_into()?))) } (_, _) => { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(lhs_type.clone()), Box::new(rhs_type.clone()), ) @@ -264,7 +267,7 @@ pub fn check_special_concat( } } } - _ => return Err(CheckErrorKind::ExpectedSequence(Box::new(lhs_type.clone())).into()), + _ => return Err(StaticCheckErrorKind::ExpectedSequence(Box::new(lhs_type.clone())).into()), }; Ok(res) } @@ -293,11 +296,11 @@ pub fn check_special_append( )?; let new_len = lhs_max_len .checked_add(1) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; let return_type = TypeSignature::list_of(list_entry_type, new_len)?; Ok(return_type) } - _ => Err(CheckErrorKind::ExpectedListApplication.into()), + _ => Err(StaticCheckErrorKind::ExpectedListApplication.into()), } } @@ -312,7 +315,7 @@ pub fn check_special_as_max_len( SymbolicExpressionType::LiteralValue(Value::UInt(expected_len)) => expected_len, _ => { let expected_len_type = checker.type_check(&args[1], context)?; - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(expected_len_type), ) @@ -329,7 +332,7 @@ pub fn check_special_as_max_len( .set_type(&args[1], TypeSignature::UIntType)?; let expected_len = - u32::try_from(expected_len).map_err(|_e| CheckErrorKind::MaxLengthOverflow)?; + u32::try_from(expected_len).map_err(|_e| StaticCheckErrorKind::MaxLengthOverflow)?; let sequence = checker.type_check(&args[0], context)?; runtime_cost(ClarityCostFunction::AnalysisIterableFunc, checker, 0)?; @@ -355,7 +358,7 @@ pub fn check_special_as_max_len( StringUTF8Length::try_from(expected_len)?, )))), )), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(sequence)).into()), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new(sequence)).into()), } } @@ -371,7 +374,9 @@ pub fn check_special_len( match collection_type { TypeSignature::SequenceType(_) => Ok(()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(collection_type))), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new( + collection_type, + ))), }?; Ok(TypeSignature::UIntType) @@ -400,16 +405,16 @@ pub fn check_special_element_at( TypeSignature::SequenceType(StringType(ASCII(_))) => Ok(TypeSignature::OptionalType( Box::new(TypeSignature::SequenceType(StringType(ASCII( BufferLength::try_from(1u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, )))), )), TypeSignature::SequenceType(StringType(UTF8(_))) => Ok(TypeSignature::OptionalType( Box::new(TypeSignature::SequenceType(StringType(UTF8( StringUTF8Length::try_from(1u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, )))), )), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(collection_type)).into()), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new(collection_type)).into()), } } @@ -425,7 +430,7 @@ pub fn check_special_index_of( let expected_input_type = match list_type { TypeSignature::SequenceType(ref sequence_type) => Ok(sequence_type.unit_type()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(list_type))), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new(list_type))), }?; checker.type_check_expects(&args[1], context, &expected_input_type)?; diff --git a/clarity/src/vm/analysis/type_checker/v2_05/tests/assets.rs b/clarity/src/vm/analysis/type_checker/v2_05/tests/assets.rs index 39e52b274d2..22272d7e435 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/tests/assets.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/tests/assets.rs @@ -16,7 +16,7 @@ use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::CheckErrorKind; +use crate::vm::analysis::errors::StaticCheckErrorKind; use crate::vm::ast::parse; use crate::vm::database::MemoryBackingStore; use crate::vm::tooling::mem_type_check; @@ -193,108 +193,108 @@ fn test_bad_asset_usage() { ]; let expected = [ - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::BadTokenName, - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::NoSuchNFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::NoSuchNFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(string_ascii_type(15)), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::NoSuchNFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::NoSuchNFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(string_ascii_type(15)), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::BoolType), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::NoSuchNFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::NoSuchNFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::BoolType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::BoolType), ), - CheckErrorKind::DefineNFTBadSignature, - CheckErrorKind::TypeError( + StaticCheckErrorKind::DefineNFTBadSignature, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::IntType), ), diff --git a/clarity/src/vm/analysis/type_checker/v2_05/tests/contracts.rs b/clarity/src/vm/analysis/type_checker/v2_05/tests/contracts.rs index 6b6c5137276..3ff400d42ee 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/tests/contracts.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/tests/contracts.rs @@ -19,10 +19,10 @@ use stacks_common::types::StacksEpochId; use {assert_json_diff, serde_json}; use crate::vm::analysis::contract_interface_builder::build_contract_interface; -use crate::vm::analysis::errors::CheckErrorKind; use crate::vm::analysis::{mem_type_check, type_check}; use crate::vm::ast::parse; use crate::vm::database::MemoryBackingStore; +use crate::vm::errors::StaticCheckErrorKind; use crate::vm::types::QualifiedContractIdentifier; use crate::vm::ClarityVersion; @@ -492,7 +492,7 @@ fn test_names_tokens_contracts_bad() { ) }) .unwrap_err(); - assert!(matches!(*err.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*err.err, StaticCheckErrorKind::TypeError(_, _))); } #[test] @@ -534,7 +534,7 @@ fn test_bad_map_usage() { for contract in tests.iter() { let err = mem_type_check(contract, ClarityVersion::Clarity1, StacksEpochId::Epoch2_05) .unwrap_err(); - assert!(matches!(*err.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*err.err, StaticCheckErrorKind::TypeError(_, _))); } assert!(matches!( @@ -545,7 +545,7 @@ fn test_bad_map_usage() { ) .unwrap_err() .err, - CheckErrorKind::UnionTypeError(_, _) + StaticCheckErrorKind::UnionTypeError(_, _) )); } @@ -665,7 +665,7 @@ fn test_expects() { eprintln!("unmatched_return_types returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::ReturnTypesMustMatch(_, _) + StaticCheckErrorKind::ReturnTypesMustMatch(_, _) )); } @@ -678,7 +678,7 @@ fn test_expects() { eprintln!("bad_default_types returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::DefaultTypesMustMatch(_, _) + StaticCheckErrorKind::DefaultTypesMustMatch(_, _) )); let err = mem_type_check( @@ -690,7 +690,7 @@ fn test_expects() { eprintln!("notype_response_type returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::CouldNotDetermineResponseErrType + StaticCheckErrorKind::CouldNotDetermineResponseErrType )); let err = mem_type_check( @@ -702,6 +702,6 @@ fn test_expects() { eprintln!("notype_response_type_2 returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::CouldNotDetermineResponseOkType + StaticCheckErrorKind::CouldNotDetermineResponseOkType )); } diff --git a/clarity/src/vm/analysis/type_checker/v2_05/tests/mod.rs b/clarity/src/vm/analysis/type_checker/v2_05/tests/mod.rs index db7cdf7810f..6a130dd6537 100644 --- a/clarity/src/vm/analysis/type_checker/v2_05/tests/mod.rs +++ b/clarity/src/vm/analysis/type_checker/v2_05/tests/mod.rs @@ -16,7 +16,7 @@ use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError, SyntaxBindingError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind, SyntaxBindingError}; use crate::vm::analysis::mem_type_check; use crate::vm::ast::build_ast; use crate::vm::ast::errors::ParseErrorKind; @@ -69,10 +69,10 @@ fn test_get_block_info() { "(get-block-info? time)", ]; let bad_expected = [ - CheckErrorKind::NoSuchBlockInfoProperty("none".to_string()), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::RequiresAtLeastArguments(2, 1), + StaticCheckErrorKind::NoSuchBlockInfoProperty("none".to_string()), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::RequiresAtLeastArguments(2, 1), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -113,10 +113,10 @@ fn test_define_trait() { "(define-trait)", ]; let bad_expected = [ - CheckErrorKind::InvalidTypeDescription, - CheckErrorKind::DefineTraitBadSignature, - CheckErrorKind::DefineTraitBadSignature, - CheckErrorKind::InvalidTypeDescription, + StaticCheckErrorKind::InvalidTypeDescription, + StaticCheckErrorKind::DefineTraitBadSignature, + StaticCheckErrorKind::DefineTraitBadSignature, + StaticCheckErrorKind::InvalidTypeDescription, ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { @@ -216,16 +216,16 @@ fn test_stx_ops() { "(stx-get-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)" ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(3, 2), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -291,7 +291,7 @@ fn test_destructuring_opts() { let bad = [ ( "(unwrap-err! (some 2) 2)", - CheckErrorKind::ExpectedResponseType(Box::new(TypeSignature::from_string( + StaticCheckErrorKind::ExpectedResponseType(Box::new(TypeSignature::from_string( "(optional int)", ClarityVersion::Clarity1, StacksEpochId::Epoch2_05, @@ -299,90 +299,99 @@ fn test_destructuring_opts() { ), ( "(unwrap! (err 3) 2)", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(unwrap-err-panic (ok 3))", - CheckErrorKind::CouldNotDetermineResponseErrType, + StaticCheckErrorKind::CouldNotDetermineResponseErrType, ), ( "(unwrap-panic none)", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(define-private (foo) (if (> 1 0) none none)) (unwrap-panic (foo))", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(unwrap-panic (err 3))", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(match none inner-value (/ 1 0) (+ 1 8))", - CheckErrorKind::CouldNotDetermineMatchTypes, + StaticCheckErrorKind::CouldNotDetermineMatchTypes, ), ( "(match (ok 1) ok-val (/ ok-val 0) err-val (+ err-val 7))", - CheckErrorKind::CouldNotDetermineMatchTypes, + StaticCheckErrorKind::CouldNotDetermineMatchTypes, ), ( "(match (err 1) ok-val (/ ok-val 0) err-val (+ err-val 7))", - CheckErrorKind::CouldNotDetermineMatchTypes, + StaticCheckErrorKind::CouldNotDetermineMatchTypes, ), ( "(define-private (foo) (if (> 1 0) (ok 1) (err u8))) (match (foo) ok-val (+ 1 ok-val) err-val (/ err-val u0))", - CheckErrorKind::MatchArmsMustMatch( + StaticCheckErrorKind::MatchArmsMustMatch( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), ), ( "(match (some 1) inner-value (+ 1 inner-value) (> 1 28))", - CheckErrorKind::MatchArmsMustMatch( + StaticCheckErrorKind::MatchArmsMustMatch( Box::new(TypeSignature::IntType), Box::new(TypeSignature::BoolType), ), ), ( "(match (some 1) inner-value (+ 1 inner-value))", - CheckErrorKind::BadMatchOptionSyntax(Box::new(CheckErrorKind::IncorrectArgumentCount( - 4, 3, - ))), + StaticCheckErrorKind::BadMatchOptionSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(4, 3), + )), ), ( "(match (ok 1) inner-value (+ 1 inner-value))", - CheckErrorKind::BadMatchResponseSyntax(Box::new( - CheckErrorKind::IncorrectArgumentCount(5, 3), + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(5, 3), )), ), ( "(match (ok 1) 1 (+ 1 1) err-val (+ 2 err-val))", - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)), + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )), ), ( "(match (ok 1) ok-val (+ 1 1) (+ 3 4) (+ 2 err-val))", - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)), + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )), ), ( "(match (some 1) 2 (+ 1 1) (+ 3 4))", - CheckErrorKind::BadMatchOptionSyntax(Box::new(CheckErrorKind::ExpectedName)), + StaticCheckErrorKind::BadMatchOptionSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )), + ), + ( + "(match)", + StaticCheckErrorKind::RequiresAtLeastArguments(1, 0), ), - ("(match)", CheckErrorKind::RequiresAtLeastArguments(1, 0)), ( "(match 1 ok-val (/ ok-val 0) err-val (+ err-val 7))", - CheckErrorKind::BadMatchInput(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::BadMatchInput(Box::new(TypeSignature::IntType)), ), ( "(default-to 3 5)", - CheckErrorKind::ExpectedOptionalType(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::ExpectedOptionalType(Box::new(TypeSignature::IntType)), ), ( "(define-private (foo (x int)) (match (some 3) x (+ x 2) 5))", - CheckErrorKind::NameAlreadyUsed("x".to_string()), + StaticCheckErrorKind::NameAlreadyUsed("x".to_string()), ), ( "(define-private (t1 (x uint)) (if (> x u1) (ok x) (err false))) @@ -390,7 +399,7 @@ fn test_destructuring_opts() { (if (> x u4) (err u3) (ok (+ u2 (try! (t1 x))))))", - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new( TypeSignature::new_response(TypeSignature::NoType, TypeSignature::BoolType) .unwrap(), @@ -405,7 +414,7 @@ fn test_destructuring_opts() { "(define-private (t1 (x uint)) (if (> x u1) (ok x) (err false))) (define-private (t2 (x uint)) (> u2 (try! (t1 x))))", - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new( TypeSignature::new_response(TypeSignature::NoType, TypeSignature::BoolType) .unwrap(), @@ -415,23 +424,23 @@ fn test_destructuring_opts() { ), ( "(try! (ok 3))", - CheckErrorKind::CouldNotDetermineResponseErrType, + StaticCheckErrorKind::CouldNotDetermineResponseErrType, ), ( "(try! none)", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(try! (err 3))", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(try! 3)", - CheckErrorKind::ExpectedOptionalOrResponseType(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::ExpectedOptionalOrResponseType(Box::new(TypeSignature::IntType)), ), ( "(try! (ok 3) 4)", - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ), ]; @@ -459,14 +468,14 @@ fn test_at_block() { let bad = [ ( "(at-block (sha512 u0) u1)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_32), Box::new(TypeSignature::BUFFER_64), ), ), ( "(at-block (sha256 u0) u1 u2)", - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ), ]; @@ -507,7 +516,7 @@ fn test_trait_reference_unknown() { fn test_unexpected_use_of_field_or_trait_reference() { let bad = [( "(+ 1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.contract.field)", - CheckErrorKind::UnexpectedTraitOrFieldReference, + StaticCheckErrorKind::UnexpectedTraitOrFieldReference, )]; for (bad_test, expected) in bad.iter() { @@ -532,12 +541,12 @@ fn test_simple_arithmetic_checks() { "(and (or true false) (+ 1 2 3))", ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::RequiresAtLeastArguments(1, 0), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UndefinedVariable("x".to_string()), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::RequiresAtLeastArguments(1, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UndefinedVariable("x".to_string()), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -598,14 +607,14 @@ fn test_simple_hash_checks() { for bad_test in bad_types.iter() { assert!(matches!( *type_check_helper(bad_test).unwrap_err().err, - CheckErrorKind::UnionTypeError(_, _) + StaticCheckErrorKind::UnionTypeError(_, _) )); } for bad_test in invalid_args.iter() { assert!(matches!( *type_check_helper(bad_test).unwrap_err().err, - CheckErrorKind::IncorrectArgumentCount(_, _) + StaticCheckErrorKind::IncorrectArgumentCount(_, _) )); } } @@ -628,10 +637,10 @@ fn test_simple_ifs() { ]; let bad_expected = [ - CheckErrorKind::IfArmsMustMatch(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IfArmsMustMatch(Box::new(ascii_type(1)), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(3, 0), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IfArmsMustMatch(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IfArmsMustMatch(Box::new(ascii_type(1)), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 0), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -664,9 +673,9 @@ fn test_simple_lets() { ]; let bad_expected = [ - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_invalid_length(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_atom(0)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_invalid_length(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_atom(0)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), @@ -721,26 +730,26 @@ fn test_index_of() { ]; let bad_expected = [ - CheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_MIN), Box::new(TypeSignature::STRING_ASCII_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::STRING_UTF8_MIN), Box::new(TypeSignature::STRING_ASCII_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::STRING_ASCII_MIN), Box::new(TypeSignature::STRING_UTF8_MIN), ), - CheckErrorKind::CouldNotDetermineType, - CheckErrorKind::CouldNotDetermineType, - CheckErrorKind::CouldNotDetermineType, + StaticCheckErrorKind::CouldNotDetermineType, + StaticCheckErrorKind::CouldNotDetermineType, + StaticCheckErrorKind::CouldNotDetermineType, ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { @@ -769,11 +778,11 @@ fn test_element_at() { let bad = ["(element-at (list 1 2 3 4 5) 100)", "(element-at 3 u100)"]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -805,12 +814,12 @@ fn test_eqs() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(IntType, 1).unwrap()), Box::new(IntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::from_string( "(optional bool)", ClarityVersion::Clarity1, @@ -852,9 +861,9 @@ fn test_asserts() { ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -918,23 +927,23 @@ fn test_lists() { "(map + (list 1 2 3 4 5) (list true true true true true))", ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), - CheckErrorKind::UnknownFunction("ynot".to_string()), - CheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), - CheckErrorKind::ExpectedSequence(Box::new(UIntType)), - CheckErrorKind::ExpectedSequence(Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::UnknownFunction("ynot".to_string()), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(UIntType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -975,20 +984,20 @@ fn test_buff() { "(len 1)", ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), - CheckErrorKind::UnknownFunction("ynot".to_string()), - CheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), - CheckErrorKind::ExpectedSequence(Box::new(UIntType)), - CheckErrorKind::ExpectedSequence(Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::UnknownFunction("ynot".to_string()), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(UIntType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1063,9 +1072,9 @@ fn test_native_as_max_len() { "(as-max-len? 0x01 u1048577)", ]; let bad_expected = [ - CheckErrorKind::ValueTooLarge, - CheckErrorKind::ValueTooLarge, - CheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1109,9 +1118,9 @@ fn test_native_append() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1137,9 +1146,9 @@ fn test_native_concat() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1235,8 +1244,8 @@ fn test_tuples() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1266,7 +1275,7 @@ fn test_empty_tuple_should_fail() { ) .unwrap_err() .err, - CheckErrorKind::EmptyTuplesNotAllowed + StaticCheckErrorKind::EmptyTuplesNotAllowed ); } @@ -1362,9 +1371,9 @@ fn test_simple_uints() { let bad = ["(> u1 1)", "(to-uint true)", "(to-int false)"]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1425,7 +1434,7 @@ fn test_response_inference() { ]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::from_string( "(response bool int)", ClarityVersion::Clarity1, @@ -1433,8 +1442,8 @@ fn test_response_inference() { )), Box::new(BoolType), ), - CheckErrorKind::ReturnTypesMustMatch(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::ReturnTypesMustMatch(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1572,7 +1581,7 @@ fn test_options() { .unwrap_err() .err { - CheckErrorKind::TypeError(t1, t2) => { + StaticCheckErrorKind::TypeError(t1, t2) => { *t1 == TypeSignature::from_string( "(optional bool)", ClarityVersion::Clarity1, @@ -1724,7 +1733,7 @@ fn test_missing_value_on_declaration_should_fail() { .unwrap_err(); assert!(matches!( *res.err, - CheckErrorKind::IncorrectArgumentCount(_, _) + StaticCheckErrorKind::IncorrectArgumentCount(_, _) )); } @@ -1740,7 +1749,7 @@ fn test_mismatching_type_on_declaration_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } #[test] @@ -1761,7 +1770,7 @@ fn test_mismatching_type_on_update_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } #[test] @@ -1778,7 +1787,10 @@ fn test_direct_access_to_persisted_var_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } #[test] @@ -1798,7 +1810,7 @@ fn test_data_var_shadowed_by_let_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -1816,7 +1828,10 @@ fn test_mutating_unknown_data_var_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NoSuchDataVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::NoSuchDataVariable(_) + )); } #[test] @@ -1832,7 +1847,10 @@ fn test_accessing_unknown_data_var_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NoSuchDataVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::NoSuchDataVariable(_) + )); } #[test] @@ -1848,7 +1866,7 @@ fn test_let_shadowed_by_let_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -1865,7 +1883,7 @@ fn test_let_shadowed_by_nested_let_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -1883,7 +1901,7 @@ fn test_define_constant_shadowed_by_let_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -1900,7 +1918,7 @@ fn test_define_constant_shadowed_by_argument_should_fail() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -2122,7 +2140,7 @@ fn test_fetch_entry_mismatching_type_signatures() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -2142,7 +2160,10 @@ fn test_fetch_entry_unbound_variables() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -2194,7 +2215,7 @@ fn test_insert_entry_mismatching_type_signatures() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -2217,7 +2238,10 @@ fn test_insert_entry_unbound_variables() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -2267,7 +2291,7 @@ fn test_delete_entry_mismatching_type_signatures() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -2287,7 +2311,10 @@ fn test_delete_entry_unbound_variables() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -2341,7 +2368,7 @@ fn test_set_entry_mismatching_type_signatures() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -2364,7 +2391,10 @@ fn test_set_entry_unbound_variables() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -2499,7 +2529,7 @@ fn test_buff_negative_len() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert_eq!(*res.err, CheckErrorKind::ValueOutOfBounds); + assert_eq!(*res.err, StaticCheckErrorKind::ValueOutOfBounds); } #[test] @@ -2513,7 +2543,7 @@ fn test_string_ascii_negative_len() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert_eq!(*res.err, CheckErrorKind::ValueOutOfBounds); + assert_eq!(*res.err, StaticCheckErrorKind::ValueOutOfBounds); } #[test] @@ -2527,5 +2557,5 @@ fn test_string_utf8_negative_len() { StacksEpochId::Epoch2_05, ) .unwrap_err(); - assert_eq!(*res.err, CheckErrorKind::ValueOutOfBounds); + assert_eq!(*res.err, StaticCheckErrorKind::ValueOutOfBounds); } diff --git a/clarity/src/vm/analysis/type_checker/v2_1/contexts.rs b/clarity/src/vm/analysis/type_checker/v2_1/contexts.rs index 7632ea305bb..c8998b90190 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/contexts.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/contexts.rs @@ -16,7 +16,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::analysis::type_checker::is_reserved_word; use crate::vm::analysis::types::ContractAnalysis; use crate::vm::representations::ClarityName; @@ -169,7 +169,7 @@ impl ContractContext { pub fn check_name_used(&self, name: &str) -> Result<(), StaticCheckError> { if is_reserved_word(name, self.clarity_version) { - return Err(StaticCheckError::new(CheckErrorKind::ReservedWord( + return Err(StaticCheckError::new(StaticCheckErrorKind::ReservedWord( name.to_string(), ))); } @@ -183,9 +183,9 @@ impl ContractContext { || self.traits.is_name_used(name) || self.map_types.contains_key(name) { - Err(StaticCheckError::new(CheckErrorKind::NameAlreadyUsed( - name.to_string(), - ))) + Err(StaticCheckError::new( + StaticCheckErrorKind::NameAlreadyUsed(name.to_string()), + )) } else { Ok(()) } diff --git a/clarity/src/vm/analysis/type_checker/v2_1/mod.rs b/clarity/src/vm/analysis/type_checker/v2_1/mod.rs index 66d7e4a6c8c..fbbbc8fb572 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/mod.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/mod.rs @@ -26,8 +26,8 @@ pub use self::natives::{SimpleNativeFunction, TypedNativeFunction}; use super::contexts::{TypeMap, TypingContext}; use super::ContractAnalysis; pub use crate::vm::analysis::errors::{ - check_argument_count, check_arguments_at_least, check_arguments_at_most, CheckErrorKind, - StaticCheckError, SyntaxBindingErrorType, + check_argument_count, check_arguments_at_least, check_arguments_at_most, StaticCheckError, + StaticCheckErrorKind, SyntaxBindingErrorType, }; use crate::vm::analysis::AnalysisDatabase; use crate::vm::costs::cost_functions::ClarityCostFunction; @@ -168,14 +168,6 @@ pub fn compute_typecheck_cost( ) } -pub fn check_argument_len(expected: usize, args_len: usize) -> Result<(), CheckErrorKind> { - if args_len != expected { - Err(CheckErrorKind::IncorrectArgumentCount(expected, args_len)) - } else { - Ok(()) - } -} - impl FunctionType { #[allow(clippy::type_complexity)] pub fn check_args_visitor_2_1( @@ -199,7 +191,7 @@ impl FunctionType { if !admitted { return ( cost, - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(arg_type.clone()), ) @@ -218,7 +210,7 @@ impl FunctionType { let return_type = match arg_type { TypeSignature::IntType => Ok(Some(TypeSignature::IntType)), TypeSignature::UIntType => Ok(Some(TypeSignature::UIntType)), - _ => Err(CheckErrorKind::UnionTypeError( + _ => Err(StaticCheckErrorKind::UnionTypeError( vec![TypeSignature::IntType, TypeSignature::UIntType], Box::new(arg_type.clone()), ) @@ -227,10 +219,10 @@ impl FunctionType { (cost, return_type) } else { let return_type = accumulated_type - .ok_or_else(|| CheckErrorKind::Expects("Failed to set accumulated type for arg indices >= 1 in variadic arithmetic".into()).into()); + .ok_or_else(|| StaticCheckErrorKind::Expects("Failed to set accumulated type for arg indices >= 1 in variadic arithmetic".into()).into()); let check_result = return_type.and_then(|return_type| { if arg_type != return_type { - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(return_type.clone()), Box::new(arg_type.clone()), ) @@ -253,10 +245,11 @@ impl FunctionType { // note: argument count will be wrong? return ( None, - Err( - CheckErrorKind::IncorrectArgumentCount(arg_types.len(), arg_index) - .into(), - ), + Err(StaticCheckErrorKind::IncorrectArgumentCount( + arg_types.len(), + arg_index, + ) + .into()), ); } (None, Ok(None)) @@ -269,7 +262,7 @@ impl FunctionType { if arg_index >= 1 { return ( None, - Err(CheckErrorKind::IncorrectArgumentCount(1, arg_index).into()), + Err(StaticCheckErrorKind::IncorrectArgumentCount(1, arg_index).into()), ); } (None, Ok(None)) @@ -280,7 +273,7 @@ impl FunctionType { if arg_index >= 2 { return ( None, - Err(CheckErrorKind::IncorrectArgumentCount(2, arg_index).into()), + Err(StaticCheckErrorKind::IncorrectArgumentCount(2, arg_index).into()), ); } (None, Ok(None)) @@ -300,7 +293,7 @@ impl FunctionType { for found_type in args.iter() { analysis_typecheck_cost(accounting, expected_type, found_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch21, found_type)? { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(found_type.clone()), ) @@ -318,7 +311,7 @@ impl FunctionType { { analysis_typecheck_cost(accounting, expected_type, found_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch21, found_type)? { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(found_type.clone()), ) @@ -336,10 +329,11 @@ impl FunctionType { return Ok(return_type.clone()); } } - Err( - CheckErrorKind::UnionTypeError(arg_types.clone(), Box::new(found_type.clone())) - .into(), + Err(StaticCheckErrorKind::UnionTypeError( + arg_types.clone(), + Box::new(found_type.clone()), ) + .into()) } FunctionType::Binary(left_arg_sig, right_arg_sig, return_sig) => { check_argument_count(2, args)?; @@ -364,14 +358,17 @@ impl FunctionType { if self == &FunctionType::ArithmeticBinary { check_argument_count(2, args)?; } - let (first, rest) = args - .split_first() - .ok_or(CheckErrorKind::RequiresAtLeastArguments(1, args.len()))?; + let (first, rest) = + args.split_first() + .ok_or(StaticCheckErrorKind::RequiresAtLeastArguments( + 1, + args.len(), + ))?; analysis_typecheck_cost(accounting, &TypeSignature::IntType, first)?; let return_type = match first { TypeSignature::IntType => Ok(TypeSignature::IntType), TypeSignature::UIntType => Ok(TypeSignature::UIntType), - _ => Err(CheckErrorKind::UnionTypeError( + _ => Err(StaticCheckErrorKind::UnionTypeError( vec![TypeSignature::IntType, TypeSignature::UIntType], Box::new(first.clone()), )), @@ -379,7 +376,7 @@ impl FunctionType { for found_type in rest.iter() { analysis_typecheck_cost(accounting, &TypeSignature::IntType, found_type)?; if found_type != &return_type { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(return_type.clone()), Box::new(found_type.clone()), ) @@ -413,7 +410,7 @@ impl FunctionType { }; if !first_type_supported { - return Err(CheckErrorKind::UnionTypeError( + return Err(StaticCheckErrorKind::UnionTypeError( vec![ TypeSignature::IntType, TypeSignature::UIntType, @@ -455,7 +452,7 @@ impl FunctionType { }; if !pair_of_types_matches { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(first.clone()), Box::new(second.clone()), ) @@ -500,7 +497,7 @@ impl FunctionType { depth: u8, ) -> Result { if depth > MAX_TYPE_DEPTH { - return Err(CheckErrorKind::TypeSignatureTooDeep.into()); + return Err(StaticCheckErrorKind::TypeSignatureTooDeep.into()); } Ok(match value { @@ -570,7 +567,9 @@ impl FunctionType { ) -> Result { let (expected_args, returns) = match self { FunctionType::Fixed(FixedFunction { args, returns }) => (args, returns), - _ => return Err(CheckErrorKind::Expects("Unexpected function type".into()).into()), + _ => { + return Err(StaticCheckErrorKind::Expects("Unexpected function type".into()).into()) + } }; check_argument_count(expected_args.len(), func_args)?; @@ -584,7 +583,7 @@ impl FunctionType { let contract_to_check = db .load_contract(contract, &StacksEpochId::Epoch21)? .ok_or_else(|| { - CheckErrorKind::NoSuchContract(contract.name.to_string()) + StaticCheckErrorKind::NoSuchContract(contract.name.to_string()) })?; let trait_definition = db .get_defined_trait( @@ -592,8 +591,10 @@ impl FunctionType { &trait_id.name, &StacksEpochId::Epoch21, ) - .map_err(|_| CheckErrorKind::Expects("Failed to get trait".into()))? - .ok_or(CheckErrorKind::NoSuchContract( + .map_err(|_| { + StaticCheckErrorKind::Expects("Failed to get trait".into()) + })? + .ok_or(StaticCheckErrorKind::NoSuchContract( trait_id.contract_identifier.to_string(), ))?; contract_to_check.check_trait_compliance( @@ -605,7 +606,7 @@ impl FunctionType { (expected_type, value) => { if !expected_type.admits(&StacksEpochId::Epoch21, value)? { let actual_type = TypeSignature::type_of(value)?; - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -644,7 +645,7 @@ fn check_function_arg_signature( FunctionArgSignature::Single(expected_type) => { analysis_typecheck_cost(cost_tracker, expected_type, actual_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch21, actual_type)? { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -661,7 +662,7 @@ fn check_function_arg_signature( } } if !admitted { - return Err(CheckErrorKind::UnionTypeError( + return Err(StaticCheckErrorKind::UnionTypeError( expected_types.clone(), Box::new(actual_type.clone()), ) @@ -742,14 +743,14 @@ pub fn clarity2_trait_check_trait_compliance( func, tracker, ) { - return Err(CheckErrorKind::IncompatibleTrait( + return Err(StaticCheckErrorKind::IncompatibleTrait( Box::new(expected_trait_identifier.clone()), Box::new(actual_trait_identifier.clone()), ) .into()); } } else { - return Err(CheckErrorKind::IncompatibleTrait( + return Err(StaticCheckErrorKind::IncompatibleTrait( Box::new(expected_trait_identifier.clone()), Box::new(actual_trait_identifier.clone()), ) @@ -770,7 +771,7 @@ fn clarity2_inner_type_check_type( tracker: &mut T, ) -> Result { if depth > MAX_TYPE_DEPTH { - return Err(CheckErrorKind::TypeSignatureTooDeep.into()); + return Err(StaticCheckErrorKind::TypeSignatureTooDeep.into()); } // Recurse into values to check embedded traits properly @@ -823,7 +824,7 @@ fn clarity2_inner_type_check_type( tracker, )?; } else { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -835,7 +836,7 @@ fn clarity2_inner_type_check_type( TypeSignature::TupleType(expected_tuple_type), ) => { if expected_tuple_type.get_type_map().len() != atom_tuple_type.get_type_map().len() { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -855,7 +856,7 @@ fn clarity2_inner_type_check_type( )?; } None => { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -888,24 +889,24 @@ fn clarity2_inner_type_check_type( TypeSignature::CallableType(CallableSubtype::Principal(contract_identifier)), TypeSignature::CallableType(CallableSubtype::Trait(expected_trait_id)), ) => { - let contract_to_check = match db - .load_contract(contract_identifier, &StacksEpochId::Epoch21)? - { - Some(contract) => { - runtime_cost( - ClarityCostFunction::AnalysisFetchContractEntry, - tracker, - contract_analysis_size(&contract)?, - )?; - contract - } - None => { - runtime_cost(ClarityCostFunction::AnalysisFetchContractEntry, tracker, 1)?; - return Err( - CheckErrorKind::NoSuchContract(contract_identifier.to_string()).into(), - ); - } - }; + let contract_to_check = + match db.load_contract(contract_identifier, &StacksEpochId::Epoch21)? { + Some(contract) => { + runtime_cost( + ClarityCostFunction::AnalysisFetchContractEntry, + tracker, + contract_analysis_size(&contract)?, + )?; + contract + } + None => { + runtime_cost(ClarityCostFunction::AnalysisFetchContractEntry, tracker, 1)?; + return Err(StaticCheckErrorKind::NoSuchContract( + contract_identifier.to_string(), + ) + .into()); + } + }; let expected_trait = clarity2_lookup_trait(db, contract_context, expected_trait_id, tracker)?; contract_to_check.check_trait_compliance( @@ -933,7 +934,7 @@ fn clarity2_inner_type_check_type( (TypeSignature::NoType, _) => (), (_, _) => { if !expected_type.admits_type(&StacksEpochId::Epoch21, actual_type)? { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -955,7 +956,7 @@ fn clarity2_lookup_trait( if contract_context.is_contract(&trait_id.contract_identifier) { return Ok(contract_context .get_trait(trait_id) - .ok_or(CheckErrorKind::NoSuchTrait( + .ok_or(StaticCheckErrorKind::NoSuchTrait( trait_id.contract_identifier.to_string(), trait_id.name.to_string(), ))? @@ -982,7 +983,7 @@ fn clarity2_lookup_trait( } Ok(None) => { runtime_cost(ClarityCostFunction::AnalysisUseTraitEntry, tracker, 1)?; - Err(CheckErrorKind::NoSuchTrait( + Err(StaticCheckErrorKind::NoSuchTrait( trait_id.contract_identifier.to_string(), trait_id.name.to_string(), ) @@ -1020,14 +1021,14 @@ fn type_reserved_variable( let var_type = match variable { TxSender => TypeSignature::PrincipalType, TxSponsor => TypeSignature::new_option(TypeSignature::PrincipalType) - .map_err(|_| CheckErrorKind::Expects("Bad construction".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad construction".into()))?, ContractCaller => TypeSignature::PrincipalType, BlockHeight => TypeSignature::UIntType, StacksBlockHeight => TypeSignature::UIntType, TenureHeight => TypeSignature::UIntType, BurnBlockHeight => TypeSignature::UIntType, NativeNone => TypeSignature::new_option(no_type()) - .map_err(|_| CheckErrorKind::Expects("Bad construction".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad construction".into()))?, NativeTrue => TypeSignature::BoolType, NativeFalse => TypeSignature::BoolType, TotalLiquidMicroSTX => TypeSignature::UIntType, @@ -1096,7 +1097,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { &return_type, ) .map_err(|_| { - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new(expected_type), Box::new(return_type), ) @@ -1127,7 +1128,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { } Err(e) => Err(e), })? - .ok_or_else(|| CheckErrorKind::Expects("Expected a depth result".into()))?; + .ok_or_else(|| StaticCheckErrorKind::Expects("Expected a depth result".into()))?; } runtime_cost(ClarityCostFunction::AnalysisStorage, self, size)?; @@ -1204,15 +1205,16 @@ impl<'a, 'b> TypeChecker<'a, 'b> { let type_return = self.type_check(&args[ix], context)?; if ix + 1 < args.len() { if type_return.is_response_type() { - return_failure = Err(CheckErrorKind::UncheckedIntermediaryResponses); + return_failure = Err(StaticCheckErrorKind::UncheckedIntermediaryResponses); } } else { last_return = Some(type_return); } } - let last_return = last_return - .ok_or_else(|| StaticCheckError::new(CheckErrorKind::CheckerImplementationFailure))?; + let last_return = last_return.ok_or_else(|| { + StaticCheckError::new(StaticCheckErrorKind::CheckerImplementationFailure) + })?; return_failure?; Ok(last_return) @@ -1275,9 +1277,13 @@ impl<'a, 'b> TypeChecker<'a, 'b> { } } if let Err(mut check_error) = check_result { - if let CheckErrorKind::IncorrectArgumentCount(expected, _actual) = *check_error.err { - check_error.err = - Box::new(CheckErrorKind::IncorrectArgumentCount(expected, args.len())); + if let StaticCheckErrorKind::IncorrectArgumentCount(expected, _actual) = + *check_error.err + { + check_error.err = Box::new(StaticCheckErrorKind::IncorrectArgumentCount( + expected, + args.len(), + )); check_error.diagnostic = Diagnostic::err(check_error.err.as_ref()); } // accumulate the checking costs @@ -1307,10 +1313,10 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result<(ClarityName, FixedFunction), StaticCheckError> { let (function_name, args) = signature .split_first() - .ok_or(CheckErrorKind::RequiresAtLeastArguments(1, 0))?; + .ok_or(StaticCheckErrorKind::RequiresAtLeastArguments(1, 0))?; if self.epoch.limits_parameter_and_method_count() && args.len() > MAX_FUNCTION_PARAMETERS { - return Err(CheckErrorKind::TooManyFunctionParameters( + return Err(StaticCheckErrorKind::TooManyFunctionParameters( args.len(), MAX_FUNCTION_PARAMETERS, ) @@ -1319,7 +1325,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { let function_name = function_name .match_atom() - .ok_or(CheckErrorKind::BadFunctionName)?; + .ok_or(StaticCheckErrorKind::BadFunctionName)?; let args = parse_name_type_pairs::<(), StaticCheckError>( StacksEpochId::Epoch21, args, @@ -1328,7 +1334,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { )?; if self.function_return_tracker.is_some() { - return Err(CheckErrorKind::Expects( + return Err(StaticCheckErrorKind::Expects( "Interpreter error: Previous function define left dirty typecheck state.".into(), ) .into()); @@ -1384,7 +1390,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { &return_type, ) .map_err(|_| { - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new(expected.clone()), Box::new(return_type), ) @@ -1424,10 +1430,10 @@ impl<'a, 'b> TypeChecker<'a, 'b> { // should we set the type of the subexpressions of the signature to no-type as well? let key_type = TypeSignature::parse_type_repr(StacksEpochId::Epoch21, key_type, &mut ()) - .map_err(|_| CheckErrorKind::BadMapTypeDefinition)?; + .map_err(|_| StaticCheckErrorKind::BadMapTypeDefinition)?; let value_type = TypeSignature::parse_type_repr(StacksEpochId::Epoch21, value_type, &mut ()) - .map_err(|_| CheckErrorKind::BadMapTypeDefinition)?; + .map_err(|_| StaticCheckErrorKind::BadMapTypeDefinition)?; Ok((map_name.clone(), (key_type, value_type))) } @@ -1459,19 +1465,21 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result { let (function_name, args) = expression .split_first() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; self.type_map.set_type(function_name, no_type())?; let function_name = function_name .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; if let Some(type_result) = self.try_native_function_check(function_name, args, context) { type_result } else { let function = match self.get_function_type(function_name) { Some(FunctionType::Fixed(function)) => Ok(function), - _ => Err(CheckErrorKind::UnknownFunction(function_name.to_string())), + _ => Err(StaticCheckErrorKind::UnknownFunction( + function_name.to_string(), + )), }?; for (expected_type, found_type) in function.args.iter().map(|x| &x.signature).zip(args) @@ -1503,7 +1511,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { // be undefined. This early error prevents a cost function error // due to `context.depth` being 0. if context.depth == 0 { - return Err(CheckErrorKind::UndefinedVariable(name.to_string()).into()); + return Err(StaticCheckErrorKind::UndefinedVariable(name.to_string()).into()); } runtime_cost( @@ -1515,7 +1523,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { if let Some(type_result) = context.lookup_variable_type(name) { Ok(type_result.clone()) } else { - Err(CheckErrorKind::UndefinedVariable(name.to_string()).into()) + Err(StaticCheckErrorKind::UndefinedVariable(name.to_string()).into()) } } } @@ -1534,7 +1542,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { let contract_to_check = self .db .load_contract(contract_identifier, &StacksEpochId::Epoch21)? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( contract_identifier.to_string(), ))?; @@ -1544,13 +1552,13 @@ impl<'a, 'b> TypeChecker<'a, 'b> { &trait_identifier.contract_identifier, &StacksEpochId::Epoch21, )? - .ok_or(CheckErrorKind::NoSuchContract( + .ok_or(StaticCheckErrorKind::NoSuchContract( trait_identifier.contract_identifier.to_string(), ))?; let trait_definition = contract_defining_trait .get_defined_trait(&trait_identifier.name) - .ok_or(CheckErrorKind::NoSuchTrait( + .ok_or(StaticCheckErrorKind::NoSuchTrait( trait_identifier.contract_identifier.to_string(), trait_identifier.name.to_string(), ))?; @@ -1567,7 +1575,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { analysis_typecheck_cost(self, expected_type, &actual_type)?; if !expected_type.admits_type(&StacksEpochId::Epoch21, &actual_type)? { - let mut err: StaticCheckError = CheckErrorKind::TypeError( + let mut err: StaticCheckError = StaticCheckErrorKind::TypeError( Box::new(expected_type.clone()), Box::new(actual_type.clone()), ) @@ -1591,7 +1599,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { Atom(ref name) => self.lookup_variable(name, context)?, List(ref expression) => self.type_check_function_application(expression, context)?, TraitReference(_, _) | Field(_) => { - return Err(CheckErrorKind::UnexpectedTraitOrFieldReference.into()); + return Err(StaticCheckErrorKind::UnexpectedTraitOrFieldReference.into()); } }; @@ -1629,7 +1637,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { Atom(ref name) => self.lookup_variable(name, context)?, List(ref expression) => self.type_check_function_application(expression, context)?, TraitReference(_, _) | Field(_) => { - return Err(CheckErrorKind::UnexpectedTraitOrFieldReference.into()); + return Err(StaticCheckErrorKind::UnexpectedTraitOrFieldReference.into()); } }; @@ -1661,7 +1669,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result<(ClarityName, TypeSignature), StaticCheckError> { let expected_type = TypeSignature::parse_type_repr::<()>(StacksEpochId::Epoch21, var_type, &mut ()) - .map_err(|_e| CheckErrorKind::DefineVariableBadSignature)?; + .map_err(|_e| StaticCheckErrorKind::DefineVariableBadSignature)?; self.type_check_expects(initial, context, &expected_type)?; @@ -1689,7 +1697,7 @@ impl<'a, 'b> TypeChecker<'a, 'b> { ) -> Result<(ClarityName, TypeSignature), StaticCheckError> { let asset_type = TypeSignature::parse_type_repr::<()>(StacksEpochId::Epoch21, nft_type, &mut ()) - .map_err(|_| CheckErrorKind::DefineNFTBadSignature)?; + .map_err(|_| StaticCheckErrorKind::DefineNFTBadSignature)?; Ok((asset_name.clone(), asset_type)) } @@ -1764,9 +1772,9 @@ impl<'a, 'b> TypeChecker<'a, 'b> { .add_public_function_type(f_name, FunctionType::Fixed(f_type))?; return Ok(Some(())); } else { - return Err(CheckErrorKind::PublicFunctionMustReturnResponse(Box::new( - f_type.returns, - )) + return Err(StaticCheckErrorKind::PublicFunctionMustReturnResponse( + Box::new(f_type.returns), + ) .into()); } } @@ -1907,9 +1915,10 @@ impl<'a, 'b> TypeChecker<'a, 'b> { None => { // still had to do a db read, even if it didn't exist! runtime_cost(ClarityCostFunction::AnalysisUseTraitEntry, self, 1)?; - return Err( - CheckErrorKind::TraitReferenceUnknown(name.to_string()).into() - ); + return Err(StaticCheckErrorKind::TraitReferenceUnknown( + name.to_string(), + ) + .into()); } } } diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/assets.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/assets.rs index 098300af775..c00c7aaeeaf 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/assets.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/assets.rs @@ -17,7 +17,7 @@ use stacks_common::consts::TOKEN_TRANSFER_MEMO_LENGTH; use super::{TypeChecker, TypingContext}; -use crate::vm::analysis::errors::{check_argument_count, CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{check_argument_count, StaticCheckError, StaticCheckErrorKind}; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::runtime_cost; use crate::vm::representations::SymbolicExpression; @@ -30,13 +30,15 @@ pub fn check_special_get_owner( ) -> Result { check_argument_count(2, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_asset_type = checker .contract_context .get_nft_type(asset_name) .cloned() - .ok_or_else(|| CheckErrorKind::NoSuchNFT(asset_name.to_string()))?; + .ok_or_else(|| StaticCheckErrorKind::NoSuchNFT(asset_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -58,10 +60,12 @@ pub fn check_special_get_balance( ) -> Result { check_argument_count(2, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 1)?; @@ -79,13 +83,15 @@ pub fn check_special_mint_asset( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; let expected_asset_type = checker .contract_context .get_nft_type(asset_name) - .ok_or(CheckErrorKind::NoSuchNFT(asset_name.to_string()))? + .ok_or(StaticCheckErrorKind::NoSuchNFT(asset_name.to_string()))? .clone(); // this clone shouldn't be strictly necessary, but to use `type_check_expects` with this, it would have to be. runtime_cost( @@ -110,7 +116,9 @@ pub fn check_special_mint_token( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_amount: TypeSignature = TypeSignature::UIntType; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; @@ -121,7 +129,7 @@ pub fn check_special_mint_token( checker.type_check_expects(&args[2], context, &expected_owner_type)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } Ok(TypeSignature::ResponseType(Box::new(( @@ -137,13 +145,15 @@ pub fn check_special_transfer_asset( ) -> Result { check_argument_count(4, args)?; - let token_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let token_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; let expected_asset_type = checker .contract_context .get_nft_type(token_name) - .ok_or(CheckErrorKind::NoSuchNFT(token_name.to_string()))? + .ok_or(StaticCheckErrorKind::NoSuchNFT(token_name.to_string()))? .clone(); runtime_cost( @@ -169,7 +179,9 @@ pub fn check_special_transfer_token( ) -> Result { check_argument_count(4, args)?; - let token_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let token_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_amount: TypeSignature = TypeSignature::UIntType; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; @@ -181,7 +193,7 @@ pub fn check_special_transfer_token( checker.type_check_expects(&args[3], context, &expected_owner_type)?; // recipient if !checker.contract_context.ft_exists(token_name) { - return Err(CheckErrorKind::NoSuchFT(token_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(token_name.to_string()).into()); } Ok(TypeSignature::ResponseType(Box::new(( @@ -225,7 +237,7 @@ pub fn check_special_stx_transfer_memo( let to_type: TypeSignature = TypeSignature::PrincipalType; let memo_type: TypeSignature = TypeSignature::SequenceType(SequenceSubtype::BufferType( BufferLength::try_from(TOKEN_TRANSFER_MEMO_LENGTH as u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, )); runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 0)?; @@ -248,10 +260,12 @@ pub fn check_special_get_token_supply( ) -> Result { check_argument_count(1, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 1)?; @@ -266,13 +280,15 @@ pub fn check_special_burn_asset( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; let expected_asset_type = checker .contract_context .get_nft_type(asset_name) - .ok_or(CheckErrorKind::NoSuchNFT(asset_name.to_string()))? + .ok_or(StaticCheckErrorKind::NoSuchNFT(asset_name.to_string()))? .clone(); // this clone shouldn't be strictly necessary, but to use `type_check_expects` with this, it would have to be. runtime_cost( @@ -297,7 +313,9 @@ pub fn check_special_burn_token( ) -> Result { check_argument_count(3, args)?; - let asset_name = args[0].match_atom().ok_or(CheckErrorKind::BadTokenName)?; + let asset_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadTokenName)?; let expected_amount: TypeSignature = TypeSignature::UIntType; let expected_owner_type: TypeSignature = TypeSignature::PrincipalType; @@ -308,7 +326,7 @@ pub fn check_special_burn_token( checker.type_check_expects(&args[2], context, &expected_owner_type)?; if !checker.contract_context.ft_exists(asset_name) { - return Err(CheckErrorKind::NoSuchFT(asset_name.to_string()).into()); + return Err(StaticCheckErrorKind::NoSuchFT(asset_name.to_string()).into()); } Ok(TypeSignature::ResponseType(Box::new(( diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/conversions.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/conversions.rs index 874084f16f6..3ad5fc72b59 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/conversions.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/conversions.rs @@ -1,4 +1,4 @@ -use clarity_types::errors::CheckErrorKind; +use clarity_types::errors::analysis::StaticCheckErrorKind; use clarity_types::types::{StringSubtype, MAX_TO_ASCII_BUFFER_LEN}; use stacks_common::types::StacksEpochId; @@ -62,7 +62,7 @@ pub fn check_special_to_ascii( check_argument_count(1, args)?; let input_type = checker.type_check( args.first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, )?; @@ -92,12 +92,14 @@ pub fn check_special_to_ascii( TypeSignature::TO_ASCII_BUFFER_MAX, TypeSignature::STRING_UTF8_MAX, ]; - return Err(CheckErrorKind::UnionTypeError(types, input_type.into()).into()); + return Err(StaticCheckErrorKind::UnionTypeError(types, input_type.into()).into()); } }; Ok( TypeSignature::new_response(result_type, TypeSignature::UIntType).map_err(|_| { - CheckErrorKind::Expects("FATAL: Legal Clarity response type marked invalid".into()) + StaticCheckErrorKind::Expects( + "FATAL: Legal Clarity response type marked invalid".into(), + ) })?, ) } diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/maps.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/maps.rs index 0b95c44f86c..26e44b9aea5 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/maps.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/maps.rs @@ -17,7 +17,7 @@ use stacks_common::types::StacksEpochId; use crate::vm::analysis::type_checker::v2_1::{ - check_arguments_at_least, CheckErrorKind, StaticCheckError, TypeChecker, TypingContext, + check_arguments_at_least, StaticCheckError, StaticCheckErrorKind, TypeChecker, TypingContext, }; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost}; @@ -31,14 +31,16 @@ pub fn check_special_fetch_entry( ) -> Result { check_arguments_at_least(2, args)?; - let map_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let map_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let key_type = checker.type_check(&args[1], context)?; let (expected_key_type, value_type) = checker .contract_context .get_map_type(map_name) - .ok_or(CheckErrorKind::NoSuchMap(map_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchMap(map_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -55,7 +57,7 @@ pub fn check_special_fetch_entry( let option_type = TypeSignature::new_option(value_type.clone())?; if !expected_key_type.admits_type(&StacksEpochId::Epoch21, &key_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_key_type.clone()), Box::new(key_type), ))) @@ -71,14 +73,16 @@ pub fn check_special_delete_entry( ) -> Result { check_arguments_at_least(2, args)?; - let map_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let map_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let key_type = checker.type_check(&args[1], context)?; let (expected_key_type, _) = checker .contract_context .get_map_type(map_name) - .ok_or(CheckErrorKind::NoSuchMap(map_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchMap(map_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -88,7 +92,7 @@ pub fn check_special_delete_entry( analysis_typecheck_cost(&mut checker.cost_track, expected_key_type, &key_type)?; if !expected_key_type.admits_type(&StacksEpochId::Epoch21, &key_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_key_type.clone()), Box::new(key_type), ))) @@ -104,7 +108,9 @@ fn check_set_or_insert_entry( ) -> Result { check_arguments_at_least(3, args)?; - let map_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let map_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let key_type = checker.type_check(&args[1], context)?; let value_type = checker.type_check(&args[2], context)?; @@ -112,7 +118,7 @@ fn check_set_or_insert_entry( let (expected_key_type, expected_value_type) = checker .contract_context .get_map_type(map_name) - .ok_or(CheckErrorKind::NoSuchMap(map_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchMap(map_name.to_string()))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -129,12 +135,12 @@ fn check_set_or_insert_entry( analysis_typecheck_cost(&mut checker.cost_track, expected_value_type, &value_type)?; if !expected_key_type.admits_type(&StacksEpochId::Epoch21, &key_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_key_type.clone()), Box::new(key_type), ))) } else if !expected_value_type.admits_type(&StacksEpochId::Epoch21, &value_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_value_type.clone()), Box::new(value_type), ))) diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/mod.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/mod.rs index 267be5c9cb3..2496897dac3 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/mod.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/mod.rs @@ -20,7 +20,7 @@ use super::{ check_argument_count, check_arguments_at_least, check_arguments_at_most, compute_typecheck_cost, no_type, TypeChecker, TypingContext, }; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError, SyntaxBindingErrorType}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind, SyntaxBindingErrorType}; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost, CostErrors, CostTracker}; use crate::vm::diagnostic::DiagnosableError; @@ -70,14 +70,17 @@ fn check_special_list_cons( for arg in args.iter() { // don't use map here, since type_check has side-effects. let checked = checker.type_check(arg, context)?; - let cost = checked.type_size().and_then(|ty_size| { - checker - .compute_cost( - ClarityCostFunction::AnalysisListItemsCheck, - &[ty_size.into()], - ) - .map_err(CheckErrorKind::from) - }); + let cost = checked + .type_size() + .map_err(StaticCheckErrorKind::from) + .and_then(|ty_size| { + checker + .compute_cost( + ClarityCostFunction::AnalysisListItemsCheck, + &[ty_size.into()], + ) + .map_err(StaticCheckErrorKind::from) + }); costs.push(cost); if let Some(cur_size) = entries_size { @@ -97,7 +100,7 @@ fn check_special_list_cons( checker.add_cost(cost?)?; } if entries_size.is_none() { - return Err(CheckErrorKind::ValueTooLarge.into()); + return Err(StaticCheckErrorKind::ValueTooLarge.into()); } let typed_args = result; TypeSignature::parent_list_type(&typed_args) @@ -156,10 +159,12 @@ fn inner_handle_tuple_get( let return_type = tuple_type_sig .field_type(field_to_get) - .ok_or(StaticCheckError::new(CheckErrorKind::NoSuchTupleField( - field_to_get.to_string(), - tuple_type_sig.clone(), - )))? + .ok_or(StaticCheckError::new( + StaticCheckErrorKind::NoSuchTupleField( + field_to_get.to_string(), + tuple_type_sig.clone(), + ), + ))? .clone(); Ok(return_type) } @@ -173,7 +178,7 @@ fn check_special_get( let field_to_get = args[0] .match_atom() - .ok_or(CheckErrorKind::BadTupleFieldName)?; + .ok_or(StaticCheckErrorKind::BadTupleFieldName)?; let argument_type = checker.type_check(&args[1], context)?; @@ -185,10 +190,10 @@ fn check_special_get( let option_type = TypeSignature::new_option(inner_type)?; Ok(option_type) } else { - Err(CheckErrorKind::ExpectedTuple(value_type_sig).into()) + Err(StaticCheckErrorKind::ExpectedTuple(value_type_sig).into()) } } else { - Err(CheckErrorKind::ExpectedTuple(Box::new(argument_type)).into()) + Err(StaticCheckErrorKind::ExpectedTuple(Box::new(argument_type)).into()) } } @@ -202,13 +207,13 @@ fn check_special_merge( let res = checker.type_check(&args[0], context)?; let mut base = match res { TypeSignature::TupleType(tuple_sig) => Ok(tuple_sig), - _ => Err(CheckErrorKind::ExpectedTuple(Box::new(res.clone()))), + _ => Err(StaticCheckErrorKind::ExpectedTuple(Box::new(res.clone()))), }?; let res = checker.type_check(&args[1], context)?; let mut update = match res { TypeSignature::TupleType(tuple_sig) => Ok(tuple_sig), - _ => Err(CheckErrorKind::ExpectedTuple(Box::new(res.clone()))), + _ => Err(StaticCheckErrorKind::ExpectedTuple(Box::new(res.clone()))), }?; runtime_cost( ClarityCostFunction::AnalysisCheckTupleMerge, @@ -256,7 +261,7 @@ pub fn check_special_tuple_cons( .saturating_add(var_type.size()?); tuple_type_data.push((var_name.clone(), var_type)); } else { - cons_error = Err(CheckErrorKind::BadTupleConstruction(format!( + cons_error = Err(StaticCheckErrorKind::BadTupleConstruction(format!( "type size of {type_size} bytes exceeds maximum of {MAX_VALUE_SIZE} bytes" ))); } @@ -266,8 +271,9 @@ pub fn check_special_tuple_cons( )?; cons_error?; - let tuple_signature = TupleTypeSignature::try_from(tuple_type_data) - .map_err(|e| CheckErrorKind::BadTupleConstruction(e.message()))?; + let tuple_signature = TupleTypeSignature::try_from(tuple_type_data).map_err(|e| { + StaticCheckErrorKind::BadTupleConstruction(StaticCheckErrorKind::from(e).message()) + })?; Ok(TypeSignature::TupleType(tuple_signature)) } @@ -282,7 +288,7 @@ fn check_special_let( let binding_list = args[0] .match_list() - .ok_or(StaticCheckError::new(CheckErrorKind::BadLetSyntax))?; + .ok_or(StaticCheckError::new(StaticCheckErrorKind::BadLetSyntax))?; let mut out_context = context.extend()?; @@ -295,9 +301,9 @@ fn check_special_let( |var_name, var_sexp| { checker.contract_context.check_name_used(var_name)?; if out_context.lookup_variable_type(var_name).is_some() { - return Err(StaticCheckError::new(CheckErrorKind::NameAlreadyUsed( - var_name.to_string(), - ))); + return Err(StaticCheckError::new( + StaticCheckErrorKind::NameAlreadyUsed(var_name.to_string()), + )); } let typed_result = checker.type_check(var_sexp, &out_context)?; @@ -337,14 +343,14 @@ fn check_special_fetch_var( let var_name = args[0] .match_atom() - .ok_or(StaticCheckError::new(CheckErrorKind::BadMapName))?; + .ok_or(StaticCheckError::new(StaticCheckErrorKind::BadMapName))?; let value_type = checker .contract_context .get_persisted_variable_type(var_name) - .ok_or(StaticCheckError::new(CheckErrorKind::NoSuchDataVariable( - var_name.to_string(), - )))?; + .ok_or(StaticCheckError::new( + StaticCheckErrorKind::NoSuchDataVariable(var_name.to_string()), + ))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -362,14 +368,18 @@ fn check_special_set_var( ) -> Result { check_arguments_at_least(2, args)?; - let var_name = args[0].match_atom().ok_or(CheckErrorKind::BadMapName)?; + let var_name = args[0] + .match_atom() + .ok_or(StaticCheckErrorKind::BadMapName)?; let value_type = checker.type_check(&args[1], context)?; let expected_value_type = checker .contract_context .get_persisted_variable_type(var_name) - .ok_or(CheckErrorKind::NoSuchDataVariable(var_name.to_string()))?; + .ok_or(StaticCheckErrorKind::NoSuchDataVariable( + var_name.to_string(), + ))?; runtime_cost( ClarityCostFunction::AnalysisTypeLookup, @@ -379,7 +389,7 @@ fn check_special_set_var( analysis_typecheck_cost(&mut checker.cost_track, &value_type, expected_value_type)?; if !expected_value_type.admits_type(&StacksEpochId::Epoch21, &value_type)? { - Err(StaticCheckError::new(CheckErrorKind::TypeError( + Err(StaticCheckError::new(StaticCheckErrorKind::TypeError( Box::new(expected_value_type.clone()), Box::new(value_type), ))) @@ -408,7 +418,9 @@ fn check_special_equals( costs.push(cost); arg_type = Some( TypeSignature::least_supertype(&StacksEpochId::Epoch21, &x_type, &cur_type) - .map_err(|_| CheckErrorKind::TypeError(Box::new(x_type), Box::new(cur_type))), + .map_err(|_| { + StaticCheckErrorKind::TypeError(Box::new(x_type), Box::new(cur_type)) + }), ); } } @@ -419,7 +431,9 @@ fn check_special_equals( // check if there was a least supertype failure. arg_type.ok_or_else(|| { - CheckErrorKind::Expects("Arg type should be set because arguments checked for >= 1".into()) + StaticCheckErrorKind::Expects( + "Arg type should be set because arguments checked for >= 1".into(), + ) })??; Ok(TypeSignature::BoolType) @@ -442,9 +456,11 @@ fn check_special_if( analysis_typecheck_cost(checker, expr1, expr2)?; TypeSignature::least_supertype(&StacksEpochId::Epoch21, expr1, expr2) + .map_err(StaticCheckErrorKind::from) .and_then(|t| t.concretize()) .map_err(|_| { - CheckErrorKind::IfArmsMustMatch(Box::new(expr1.clone()), Box::new(expr2.clone())).into() + StaticCheckErrorKind::IfArmsMustMatch(Box::new(expr1.clone()), Box::new(expr2.clone())) + .into() }) } @@ -456,7 +472,7 @@ fn check_contract_call( check_arguments_at_least(2, args)?; let func_name = args[1].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::ContractCallExpectName, + StaticCheckErrorKind::ContractCallExpectName, ))?; checker.type_map.set_type(&args[1], no_type())?; @@ -481,10 +497,12 @@ fn check_contract_call( { Ok(function) } else { - Err(StaticCheckError::new(CheckErrorKind::NoSuchPublicFunction( - contract_identifier.to_string(), - func_name.to_string(), - ))) + Err(StaticCheckError::new( + StaticCheckErrorKind::NoSuchPublicFunction( + contract_identifier.to_string(), + func_name.to_string(), + ), + )) } }?; @@ -504,7 +522,7 @@ fn check_contract_call( let trait_id = match context.lookup_trait_reference_type(trait_instance) { Some(trait_id) => trait_id, _ => { - return Err(CheckErrorKind::TraitReferenceUnknown( + return Err(StaticCheckErrorKind::TraitReferenceUnknown( trait_instance.to_string(), ) .into()); @@ -514,15 +532,14 @@ fn check_contract_call( runtime_cost(ClarityCostFunction::AnalysisLookupFunction, checker, 0)?; let trait_signature = checker.contract_context.get_trait(trait_id).ok_or( - CheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()), + StaticCheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()), + )?; + let func_signature = trait_signature.get(func_name).ok_or( + StaticCheckErrorKind::TraitMethodUnknown( + trait_id.name.to_string(), + func_name.to_string(), + ), )?; - let func_signature = - trait_signature - .get(func_name) - .ok_or(CheckErrorKind::TraitMethodUnknown( - trait_id.name.to_string(), - func_name.to_string(), - ))?; runtime_cost( ClarityCostFunction::AnalysisLookupFunctionTypes, @@ -556,10 +573,12 @@ fn check_contract_call( { Ok(function) } else { - Err(StaticCheckError::new(CheckErrorKind::NoSuchPublicFunction( - contract_identifier.to_string(), - func_name.to_string(), - ))) + Err(StaticCheckError::new( + StaticCheckErrorKind::NoSuchPublicFunction( + contract_identifier.to_string(), + func_name.to_string(), + ), + )) } }?; @@ -575,7 +594,7 @@ fn check_contract_call( } Some(var_type) => { // Any other typed constant is an error - return Err(CheckErrorKind::ExpectedCallableType(Box::new( + return Err(StaticCheckErrorKind::ExpectedCallableType(Box::new( var_type.clone(), )) .into()); @@ -585,7 +604,7 @@ fn check_contract_call( let trait_id = match context.lookup_trait_reference_type(trait_instance) { Some(trait_id) => trait_id, _ => { - return Err(CheckErrorKind::TraitReferenceUnknown( + return Err(StaticCheckErrorKind::TraitReferenceUnknown( trait_instance.to_string(), ) .into()); @@ -595,10 +614,10 @@ fn check_contract_call( runtime_cost(ClarityCostFunction::AnalysisLookupFunction, checker, 0)?; let trait_signature = checker.contract_context.get_trait(trait_id).ok_or( - CheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()), + StaticCheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()), )?; let func_signature = trait_signature.get(func_name).ok_or( - CheckErrorKind::TraitMethodUnknown( + StaticCheckErrorKind::TraitMethodUnknown( trait_id.name.to_string(), func_name.to_string(), ), @@ -617,7 +636,7 @@ fn check_contract_call( } _ => { return Err(StaticCheckError::new( - CheckErrorKind::ContractCallExpectName, + StaticCheckErrorKind::ContractCallExpectName, )) } }; @@ -641,14 +660,18 @@ fn check_contract_of( SymbolicExpressionType::Atom(trait_instance) => trait_instance, _ => { return Err(StaticCheckError::new( - CheckErrorKind::ContractOfExpectsTrait, + StaticCheckErrorKind::ContractOfExpectsTrait, )) } }; let trait_id = match context.lookup_trait_reference_type(trait_instance) { Some(trait_id) => trait_id, - _ => return Err(CheckErrorKind::TraitReferenceUnknown(trait_instance.to_string()).into()), + _ => { + return Err( + StaticCheckErrorKind::TraitReferenceUnknown(trait_instance.to_string()).into(), + ) + } }; runtime_cost(ClarityCostFunction::ContractOf, checker, 1)?; @@ -656,7 +679,7 @@ fn check_contract_of( checker .contract_context .get_trait(trait_id) - .ok_or_else(|| CheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()))?; + .ok_or_else(|| StaticCheckErrorKind::TraitReferenceUnknown(trait_id.name.to_string()))?; Ok(TypeSignature::PrincipalType) } @@ -670,7 +693,7 @@ fn check_principal_of( checker.type_check_expects(&args[0], context, &TypeSignature::BUFFER_33)?; Ok( TypeSignature::new_response(TypeSignature::PrincipalType, TypeSignature::UIntType) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, ) } @@ -702,13 +725,13 @@ fn check_principal_construct( ("error_code".into(), TypeSignature::UIntType), ( "value".into(), - TypeSignature::new_option(TypeSignature::PrincipalType).map_err(|_| CheckErrorKind::Expects("FATAL: failed to create (optional principal) type signature".into()))?, + TypeSignature::new_option(TypeSignature::PrincipalType).map_err(|_| StaticCheckErrorKind::Expects("FATAL: failed to create (optional principal) type signature".into()))?, ), ]) - .map_err(|_| CheckErrorKind::Expects("FAIL: PrincipalConstruct failed to initialize type signature".into()))? + .map_err(|_| StaticCheckErrorKind::Expects("FAIL: PrincipalConstruct failed to initialize type signature".into()))? .into() ) - .map_err(|_| CheckErrorKind::Expects("FATAL: failed to create `(response principal { error_code: uint, principal: (optional principal) })` type signature".into()))? + .map_err(|_| StaticCheckErrorKind::Expects("FATAL: failed to create `(response principal { error_code: uint, principal: (optional principal) })` type signature".into()))? ) } @@ -722,7 +745,7 @@ fn check_secp256k1_recover( checker.type_check_expects(&args[1], context, &TypeSignature::BUFFER_65)?; Ok( TypeSignature::new_response(TypeSignature::BUFFER_33, TypeSignature::UIntType) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, ) } @@ -758,13 +781,13 @@ fn check_get_block_info( check_arguments_at_least(2, args)?; let block_info_prop_str = args[0].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::GetBlockInfoExpectPropertyName, + StaticCheckErrorKind::GetBlockInfoExpectPropertyName, ))?; let block_info_prop = BlockInfoProperty::lookup_by_name_at_version(block_info_prop_str, &checker.clarity_version) .ok_or(StaticCheckError::new( - CheckErrorKind::NoSuchBlockInfoProperty(block_info_prop_str.to_string()), + StaticCheckErrorKind::NoSuchBlockInfoProperty(block_info_prop_str.to_string()), ))?; checker.type_check_expects(&args[1], context, &TypeSignature::UIntType)?; @@ -773,8 +796,8 @@ fn check_get_block_info( } // # Errors -// - `CheckErrorKind::GetBurnBlockInfoExpectPropertyName` when `args[0]` is not a valid `ClarityName`. -// - `CheckErrorKind::NoSuchBlockInfoProperty` when `args[0]` does not name a `BurnBlockInfoProperty`. +// - `StaticCheckErrorKind::GetBurnBlockInfoExpectPropertyName` when `args[0]` is not a valid `ClarityName`. +// - `StaticCheckErrorKind::NoSuchBlockInfoProperty` when `args[0]` does not name a `BurnBlockInfoProperty`. fn check_get_burn_block_info( checker: &mut TypeChecker, args: &[SymbolicExpression], @@ -783,19 +806,19 @@ fn check_get_burn_block_info( check_argument_count(2, args)?; let block_info_prop_str = args[0].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::GetBurnBlockInfoExpectPropertyName, + StaticCheckErrorKind::GetBurnBlockInfoExpectPropertyName, ))?; let block_info_prop = BurnBlockInfoProperty::lookup_by_name(block_info_prop_str).ok_or(StaticCheckError::new( - CheckErrorKind::NoSuchBlockInfoProperty(block_info_prop_str.to_string()), + StaticCheckErrorKind::NoSuchBlockInfoProperty(block_info_prop_str.to_string()), ))?; checker.type_check_expects(&args[1], context, &TypeSignature::UIntType)?; Ok(TypeSignature::new_option( block_info_prop.type_result().map_err(|_| { - CheckErrorKind::Expects("FAILED to type valid burn info property".into()) + StaticCheckErrorKind::Expects("FAILED to type valid burn info property".into()) })?, )?) } @@ -808,11 +831,11 @@ fn check_get_stacks_block_info( check_argument_count(2, args)?; let block_info_prop_str = args[0].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::GetStacksBlockInfoExpectPropertyName, + StaticCheckErrorKind::GetStacksBlockInfoExpectPropertyName, ))?; let block_info_prop = StacksBlockInfoProperty::lookup_by_name(block_info_prop_str).ok_or( - StaticCheckError::new(CheckErrorKind::NoSuchStacksBlockInfoProperty( + StaticCheckError::new(StaticCheckErrorKind::NoSuchStacksBlockInfoProperty( block_info_prop_str.to_string(), )), )?; @@ -830,12 +853,12 @@ fn check_get_tenure_info( check_argument_count(2, args)?; let block_info_prop_str = args[0].match_atom().ok_or(StaticCheckError::new( - CheckErrorKind::GetTenureInfoExpectPropertyName, + StaticCheckErrorKind::GetTenureInfoExpectPropertyName, ))?; let block_info_prop = TenureInfoProperty::lookup_by_name(block_info_prop_str).ok_or(StaticCheckError::new( - CheckErrorKind::NoSuchTenureInfoProperty(block_info_prop_str.to_string()), + StaticCheckErrorKind::NoSuchTenureInfoProperty(block_info_prop_str.to_string()), ))?; checker.type_check_expects(&args[1], context, &TypeSignature::UIntType)?; @@ -865,7 +888,7 @@ impl TypedNativeFunction { pub fn type_native_function( function: &NativeFunctions, - ) -> Result { + ) -> Result { use self::TypedNativeFunction::{Simple, Special}; use crate::vm::functions::NativeFunctions::*; let out = match function { @@ -894,7 +917,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::IntType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -905,7 +928,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::UIntType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -916,7 +939,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -927,11 +950,12 @@ impl TypedNativeFunction { Simple(SimpleNativeFunction(FunctionType::Fixed(FixedFunction { args: vec![FunctionArg::new( TypeSignature::SequenceType(SequenceSubtype::BufferType( - BufferLength::try_from(16_u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + BufferLength::try_from(16_u32).map_err(|_| { + StaticCheckErrorKind::Expects("Bad constructor".into()) + })?, )), ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -943,11 +967,12 @@ impl TypedNativeFunction { Simple(SimpleNativeFunction(FunctionType::Fixed(FixedFunction { args: vec![FunctionArg::new( TypeSignature::SequenceType(SequenceSubtype::BufferType( - BufferLength::try_from(16_u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + BufferLength::try_from(16_u32).map_err(|_| { + StaticCheckErrorKind::Expects("Bad constructor".into()) + })?, )), ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -983,7 +1008,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::BoolType, ClarityName::try_from("value".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1036,7 +1061,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("owner".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1048,7 +1073,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("principal".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1056,7 +1081,8 @@ impl TypedNativeFunction { returns: { /// The return type of `principal-destruct` is a Response, in which the success /// and error types are the same. - fn parse_principal_basic_type() -> Result { + fn parse_principal_basic_type( + ) -> Result { TupleTypeSignature::try_from(vec![ ("version".into(), TypeSignature::BUFFER_1), ("hash-bytes".into(), TypeSignature::BUFFER_20), @@ -1065,11 +1091,13 @@ impl TypedNativeFunction { TypeSignature::new_option( TypeSignature::CONTRACT_NAME_STRING_ASCII_MAX, ) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| { + StaticCheckErrorKind::Expects("Bad constructor".into()) + })?, ), ]) .map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: PrincipalDestruct failed to initialize type signature" .into(), ) @@ -1085,7 +1113,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("owner".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1096,7 +1124,7 @@ impl TypedNativeFunction { ("unlock-height".into(), TypeSignature::UIntType), ]) .map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: StxGetAccount failed to initialize type signature".into(), ) })? @@ -1107,7 +1135,7 @@ impl TypedNativeFunction { FunctionArg::new( TypeSignature::UIntType, ClarityName::try_from("amount".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1115,7 +1143,7 @@ impl TypedNativeFunction { FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("sender".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1125,7 +1153,7 @@ impl TypedNativeFunction { TypeSignature::BoolType, TypeSignature::UIntType, ) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, }))), StxTransfer => Special(SpecialNativeFunction(&assets::check_special_stx_transfer)), StxTransferMemo => Special(SpecialNativeFunction( @@ -1208,7 +1236,7 @@ impl TypedNativeFunction { args: vec![FunctionArg::new( TypeSignature::PrincipalType, ClarityName::try_from("contract".to_owned()).map_err(|_| { - CheckErrorKind::Expects( + StaticCheckErrorKind::Expects( "FAIL: ClarityName failed to accept default arg name".into(), ) })?, @@ -1217,7 +1245,7 @@ impl TypedNativeFunction { TypeSignature::BUFFER_32, TypeSignature::UIntType, ) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, }))), ToAscii => Special(SpecialNativeFunction(&conversions::check_special_to_ascii)), RestrictAssets => Special(SpecialNativeFunction( diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/options.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/options.rs index b4f01b196c7..57406396d71 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/options.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/options.rs @@ -19,8 +19,8 @@ use clarity_types::types::TypeSignature; use stacks_common::types::StacksEpochId; use super::{ - check_argument_count, check_arguments_at_least, no_type, CheckErrorKind, StaticCheckError, - TypeChecker, + check_argument_count, check_arguments_at_least, no_type, StaticCheckError, + StaticCheckErrorKind, TypeChecker, }; use crate::vm::analysis::type_checker::contexts::TypingContext; use crate::vm::costs::cost_functions::ClarityCostFunction; @@ -83,7 +83,7 @@ pub fn check_special_is_response( if let TypeSignature::ResponseType(_types) = input { Ok(TypeSignature::BoolType) } else { - Err(CheckErrorKind::ExpectedResponseType(Box::new(input.clone())).into()) + Err(StaticCheckErrorKind::ExpectedResponseType(Box::new(input.clone())).into()) } } @@ -101,7 +101,7 @@ pub fn check_special_is_optional( if let TypeSignature::OptionalType(_type) = input { Ok(TypeSignature::BoolType) } else { - Err(CheckErrorKind::ExpectedOptionalType(Box::new(input.clone())).into()) + Err(StaticCheckErrorKind::ExpectedOptionalType(Box::new(input.clone())).into()) } } @@ -121,12 +121,15 @@ pub fn check_special_default_to( let contained_type = *input_type; TypeSignature::least_supertype(&StacksEpochId::Epoch21, &default, &contained_type).map_err( |_| { - CheckErrorKind::DefaultTypesMustMatch(Box::new(default), Box::new(contained_type)) - .into() + StaticCheckErrorKind::DefaultTypesMustMatch( + Box::new(default), + Box::new(contained_type), + ) + .into() }, ) } else { - Err(CheckErrorKind::ExpectedOptionalType(Box::new(input)).into()) + Err(StaticCheckErrorKind::ExpectedOptionalType(Box::new(input)).into()) } } @@ -154,7 +157,7 @@ fn inner_unwrap( match input { TypeSignature::OptionalType(input_type) => { if input_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else { Ok(*input_type) } @@ -162,12 +165,12 @@ fn inner_unwrap( TypeSignature::ResponseType(response_type) => { let ok_type = response_type.0; if ok_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else { Ok(ok_type) } } - _ => Err(CheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), + _ => Err(StaticCheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), } } @@ -180,12 +183,12 @@ fn inner_unwrap_err( if let TypeSignature::ResponseType(response_type) = input { let err_type = response_type.1; if err_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseErrType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseErrType.into()) } else { Ok(err_type) } } else { - Err(CheckErrorKind::ExpectedResponseType(Box::new(input)).into()) + Err(StaticCheckErrorKind::ExpectedResponseType(Box::new(input)).into()) } } @@ -233,7 +236,7 @@ pub fn check_special_try_ret( match input { TypeSignature::OptionalType(input_type) => { if input_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else { checker.track_return_type(TypeSignature::new_option(TypeSignature::NoType)?)?; Ok(*input_type) @@ -242,9 +245,9 @@ pub fn check_special_try_ret( TypeSignature::ResponseType(response_type) => { let (ok_type, err_type) = *response_type; if ok_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseOkType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseOkType.into()) } else if err_type.is_no_type() { - Err(CheckErrorKind::CouldNotDetermineResponseErrType.into()) + Err(StaticCheckErrorKind::CouldNotDetermineResponseErrType.into()) } else { checker.track_return_type(TypeSignature::new_response( TypeSignature::NoType, @@ -253,7 +256,7 @@ pub fn check_special_try_ret( Ok(ok_type) } } - _ => Err(CheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), + _ => Err(StaticCheckErrorKind::ExpectedOptionalOrResponseType(Box::new(input)).into()), } } @@ -306,7 +309,7 @@ fn eval_with_new_binding( checker.contract_context.check_name_used(&bind_name)?; if inner_context.lookup_variable_type(&bind_name).is_some() { - return Err(CheckErrorKind::NameAlreadyUsed(bind_name.into()).into()); + return Err(StaticCheckErrorKind::NameAlreadyUsed(bind_name.into()).into()); } inner_context.add_variable_type(bind_name, bind_type, checker.clarity_version); @@ -325,22 +328,22 @@ fn check_special_match_opt( context: &TypingContext, ) -> Result { if args.len() != 3 { - Err(CheckErrorKind::BadMatchOptionSyntax(Box::new( - CheckErrorKind::IncorrectArgumentCount(4, args.len() + 1), + Err(StaticCheckErrorKind::BadMatchOptionSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(4, args.len() + 1), )))?; } let bind_name = args[0] .match_atom() .ok_or_else(|| { - CheckErrorKind::BadMatchOptionSyntax(Box::new(CheckErrorKind::ExpectedName)) + StaticCheckErrorKind::BadMatchOptionSyntax(Box::new(StaticCheckErrorKind::ExpectedName)) })? .clone(); let some_branch = &args[1]; let none_branch = &args[2]; if option_type.is_no_type() { - return Err(CheckErrorKind::CouldNotDetermineMatchTypes.into()); + return Err(StaticCheckErrorKind::CouldNotDetermineMatchTypes.into()); } let some_branch_type = @@ -355,8 +358,11 @@ fn check_special_match_opt( &none_branch_type, ) .map_err(|_| { - CheckErrorKind::MatchArmsMustMatch(Box::new(some_branch_type), Box::new(none_branch_type)) - .into() + StaticCheckErrorKind::MatchArmsMustMatch( + Box::new(some_branch_type), + Box::new(none_branch_type), + ) + .into() }) } @@ -367,22 +373,26 @@ fn check_special_match_resp( context: &TypingContext, ) -> Result { if args.len() != 4 { - Err(CheckErrorKind::BadMatchResponseSyntax(Box::new( - CheckErrorKind::IncorrectArgumentCount(5, args.len() + 1), + Err(StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(5, args.len() + 1), )))?; } let ok_bind_name = args[0] .match_atom() .ok_or_else(|| { - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)) + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )) })? .clone(); let ok_branch = &args[1]; let err_bind_name = args[2] .match_atom() .ok_or_else(|| { - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)) + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )) })? .clone(); let err_branch = &args[3]; @@ -390,7 +400,7 @@ fn check_special_match_resp( let (ok_type, err_type) = resp_type; if ok_type.is_no_type() || err_type.is_no_type() { - return Err(CheckErrorKind::CouldNotDetermineMatchTypes.into()); + return Err(StaticCheckErrorKind::CouldNotDetermineMatchTypes.into()); } let ok_branch_type = eval_with_new_binding(ok_branch, ok_bind_name, ok_type, checker, context)?; @@ -401,8 +411,11 @@ fn check_special_match_resp( TypeSignature::least_supertype(&StacksEpochId::Epoch21, &ok_branch_type, &err_branch_type) .map_err(|_| { - CheckErrorKind::MatchArmsMustMatch(Box::new(ok_branch_type), Box::new(err_branch_type)) - .into() + StaticCheckErrorKind::MatchArmsMustMatch( + Box::new(ok_branch_type), + Box::new(err_branch_type), + ) + .into() }) } @@ -422,6 +435,6 @@ pub fn check_special_match( TypeSignature::ResponseType(resp_type) => { check_special_match_resp(*resp_type, checker, &args[1..], context) } - _ => Err(CheckErrorKind::BadMatchInput(Box::new(input)).into()), + _ => Err(StaticCheckErrorKind::BadMatchInput(Box::new(input)).into()), } } diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/post_conditions.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/post_conditions.rs index dc862545adb..4288820fd62 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/post_conditions.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/post_conditions.rs @@ -13,8 +13,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use clarity_types::errors::analysis::{check_argument_count, check_arguments_at_least}; -use clarity_types::errors::{CheckErrorKind, StaticCheckError}; +use clarity_types::errors::analysis::{ + check_argument_count, check_arguments_at_least, StaticCheckErrorKind, +}; +use clarity_types::errors::StaticCheckError; use clarity_types::representations::SymbolicExpression; use clarity_types::types::{SequenceSubtype, TypeSignature}; @@ -40,21 +42,23 @@ pub fn check_restrict_assets( let asset_owner = args .first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)?; + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?; let allowance_list = args .get(1) - .ok_or(CheckErrorKind::CheckerImplementationFailure)? + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)? .match_list() - .ok_or(CheckErrorKind::ExpectedListOfAllowances( + .ok_or(StaticCheckErrorKind::ExpectedListOfAllowances( "restrict-assets?".into(), 2, ))?; let body_exprs = args .get(2..) - .ok_or(CheckErrorKind::CheckerImplementationFailure)?; + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?; if allowance_list.len() > MAX_ALLOWANCES { - return Err(CheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, allowance_list.len()).into()); + return Err( + StaticCheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, allowance_list.len()).into(), + ); } runtime_cost( @@ -67,7 +71,7 @@ pub fn check_restrict_assets( for allowance in allowance_list { if check_allowance(checker, allowance, context)? { - return Err(CheckErrorKind::WithAllAllowanceNotAllowed.into()); + return Err(StaticCheckErrorKind::WithAllAllowanceNotAllowed.into()); } } @@ -76,12 +80,12 @@ pub fn check_restrict_assets( for expr in body_exprs { let type_return = checker.type_check(expr, context)?; if type_return.is_response_type() { - return Err(CheckErrorKind::UncheckedIntermediaryResponses.into()); + return Err(StaticCheckErrorKind::UncheckedIntermediaryResponses.into()); } last_return = Some(type_return); } - let ok_type = last_return.ok_or_else(|| CheckErrorKind::CheckerImplementationFailure)?; + let ok_type = last_return.ok_or_else(|| StaticCheckErrorKind::CheckerImplementationFailure)?; Ok(TypeSignature::new_response( ok_type, TypeSignature::UIntType, @@ -97,18 +101,20 @@ pub fn check_as_contract( let allowance_list = args .first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)? + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)? .match_list() - .ok_or(CheckErrorKind::ExpectedListOfAllowances( + .ok_or(StaticCheckErrorKind::ExpectedListOfAllowances( "as-contract?".into(), 1, ))?; let body_exprs = args .get(1..) - .ok_or(CheckErrorKind::CheckerImplementationFailure)?; + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?; if allowance_list.len() > MAX_ALLOWANCES { - return Err(CheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, allowance_list.len()).into()); + return Err( + StaticCheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, allowance_list.len()).into(), + ); } runtime_cost( @@ -119,7 +125,7 @@ pub fn check_as_contract( for allowance in allowance_list { if check_allowance(checker, allowance, context)? && allowance_list.len() > 1 { - return Err(CheckErrorKind::WithAllAllowanceNotAlone.into()); + return Err(StaticCheckErrorKind::WithAllAllowanceNotAlone.into()); } } @@ -128,12 +134,12 @@ pub fn check_as_contract( for expr in body_exprs { let type_return = checker.type_check(expr, context)?; if type_return.is_response_type() { - return Err(CheckErrorKind::UncheckedIntermediaryResponses.into()); + return Err(StaticCheckErrorKind::UncheckedIntermediaryResponses.into()); } last_return = Some(type_return); } - let ok_type = last_return.ok_or_else(|| CheckErrorKind::CheckerImplementationFailure)?; + let ok_type = last_return.ok_or_else(|| StaticCheckErrorKind::CheckerImplementationFailure)?; Ok(TypeSignature::new_response( ok_type, TypeSignature::UIntType, @@ -148,7 +154,7 @@ pub fn check_allowance_err( _args: &[SymbolicExpression], _context: &TypingContext, ) -> Result { - Err(CheckErrorKind::AllowanceExprNotAllowed.into()) + Err(StaticCheckErrorKind::AllowanceExprNotAllowed.into()) } /// Type check an allowance expression, returning whether it is a @@ -160,17 +166,17 @@ pub fn check_allowance( ) -> Result { let list = allowance .match_list() - .ok_or(CheckErrorKind::ExpectedListApplication)?; + .ok_or(StaticCheckErrorKind::ExpectedListApplication)?; let (allowance_fn, args) = list .split_first() - .ok_or(CheckErrorKind::ExpectedListApplication)?; + .ok_or(StaticCheckErrorKind::ExpectedListApplication)?; let function_name = allowance_fn .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; let Some(ref native_function) = NativeFunctions::lookup_by_name_at_version(function_name, &checker.clarity_version) else { - return Err(CheckErrorKind::ExpectedAllowanceExpr(function_name.to_string()).into()); + return Err(StaticCheckErrorKind::ExpectedAllowanceExpr(function_name.to_string()).into()); }; match native_function { @@ -181,7 +187,7 @@ pub fn check_allowance( check_allowance_with_stacking(checker, args, context) } NativeFunctions::AllowanceAll => check_allowance_all(checker, args, context), - _ => Err(CheckErrorKind::ExpectedAllowanceExpr(function_name.to_string()).into()), + _ => Err(StaticCheckErrorKind::ExpectedAllowanceExpr(function_name.to_string()).into()), } } @@ -196,7 +202,7 @@ fn check_allowance_with_stx( checker.type_check_expects( args.first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::UIntType, )?; @@ -215,19 +221,19 @@ fn check_allowance_with_ft( checker.type_check_expects( args.first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::PrincipalType, )?; checker.type_check_expects( args.get(1) - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::STRING_ASCII_128, )?; checker.type_check_expects( args.get(2) - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::UIntType, )?; @@ -246,13 +252,13 @@ fn check_allowance_with_nft( checker.type_check_expects( args.first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::PrincipalType, )?; checker.type_check_expects( args.get(1) - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::STRING_ASCII_128, )?; @@ -260,14 +266,14 @@ fn check_allowance_with_nft( // Asset identifiers must be a Clarity list with any type of elements let id_list_ty = checker.type_check( args.get(2) - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, )?; let TypeSignature::SequenceType(SequenceSubtype::ListType(list_data)) = id_list_ty else { - return Err(CheckErrorKind::WithNftExpectedListOfIdentifiers.into()); + return Err(StaticCheckErrorKind::WithNftExpectedListOfIdentifiers.into()); }; if list_data.get_max_len() > MAX_NFT_IDENTIFIERS { - return Err(CheckErrorKind::MaxIdentifierLengthExceeded( + return Err(StaticCheckErrorKind::MaxIdentifierLengthExceeded( MAX_NFT_IDENTIFIERS, list_data.get_max_len(), ) @@ -288,7 +294,7 @@ fn check_allowance_with_stacking( checker.type_check_expects( args.first() - .ok_or(CheckErrorKind::CheckerImplementationFailure)?, + .ok_or(StaticCheckErrorKind::CheckerImplementationFailure)?, context, &TypeSignature::UIntType, )?; diff --git a/clarity/src/vm/analysis/type_checker/v2_1/natives/sequences.rs b/clarity/src/vm/analysis/type_checker/v2_1/natives/sequences.rs index c2e162dae25..ab81b4a5d22 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/natives/sequences.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/natives/sequences.rs @@ -18,8 +18,8 @@ use stacks_common::types::StacksEpochId; use super::{SimpleNativeFunction, TypedNativeFunction}; use crate::vm::analysis::type_checker::v2_1::{ - check_argument_count, check_arguments_at_least, CheckErrorKind, StaticCheckError, TypeChecker, - TypingContext, + check_argument_count, check_arguments_at_least, StaticCheckError, StaticCheckErrorKind, + TypeChecker, TypingContext, }; use crate::vm::costs::cost_functions::ClarityCostFunction; use crate::vm::costs::{analysis_typecheck_cost, runtime_cost, CostTracker}; @@ -44,14 +44,15 @@ fn get_simple_native_or_user_define( { Ok(function_type) } else { - Err( - CheckErrorKind::IllegalOrUnknownFunctionApplication(function_name.to_string()) - .into(), + Err(StaticCheckErrorKind::IllegalOrUnknownFunctionApplication( + function_name.to_string(), ) + .into()) } } else { checker.get_function_type(function_name).ok_or( - CheckErrorKind::IllegalOrUnknownFunctionApplication(function_name.to_string()).into(), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication(function_name.to_string()) + .into(), ) } } @@ -65,7 +66,7 @@ pub fn check_special_map( let function_name = args[0] .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; // we will only lookup native or defined functions here. // you _cannot_ map a special function. let function_type = get_simple_native_or_user_define(function_name, checker)?; @@ -107,7 +108,7 @@ pub fn check_special_map( // However that could lead to confusions when combining certain types: // ex: (map concat (list "hello " "hi ") "world") would fail, because // strings are handled as sequences. - return Err(CheckErrorKind::ExpectedSequence(Box::new(argument_type)).into()); + return Err(StaticCheckErrorKind::ExpectedSequence(Box::new(argument_type)).into()); } }; @@ -137,8 +138,8 @@ pub fn check_special_map( } if let Err(mut check_error) = check_result { - if let CheckErrorKind::IncorrectArgumentCount(expected, _actual) = *check_error.err { - check_error.err = Box::new(CheckErrorKind::IncorrectArgumentCount( + if let StaticCheckErrorKind::IncorrectArgumentCount(expected, _actual) = *check_error.err { + check_error.err = Box::new(StaticCheckErrorKind::IncorrectArgumentCount( expected, args.len().saturating_sub(1), )); @@ -159,7 +160,7 @@ pub fn check_special_map( context.clarity_version, )?; TypeSignature::list_of(mapped_type, min_args) - .map_err(|_| CheckErrorKind::ConstructedListTooLarge.into()) + .map_err(|_| StaticCheckErrorKind::ConstructedListTooLarge.into()) } pub fn check_special_filter( @@ -171,7 +172,7 @@ pub fn check_special_filter( let function_name = args[0] .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; // we will only lookup native or defined functions here. // you _cannot_ map a special function. let function_type = get_simple_native_or_user_define(function_name, checker)?; @@ -182,7 +183,7 @@ pub fn check_special_filter( { let input_type = match argument_type { TypeSignature::SequenceType(ref sequence_type) => Ok(sequence_type.unit_type()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new( + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new( argument_type.clone(), ))), }?; @@ -195,7 +196,7 @@ pub fn check_special_filter( )?; if TypeSignature::BoolType != filter_type { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BoolType), Box::new(filter_type), ) @@ -215,7 +216,7 @@ pub fn check_special_fold( let function_name = args[0] .match_atom() - .ok_or(CheckErrorKind::NonFunctionApplication)?; + .ok_or(StaticCheckErrorKind::NonFunctionApplication)?; // we will only lookup native or defined functions here. // you _cannot_ fold a special function. let function_type = get_simple_native_or_user_define(function_name, checker)?; @@ -225,7 +226,9 @@ pub fn check_special_fold( let input_type = match argument_type { TypeSignature::SequenceType(sequence_type) => Ok(sequence_type.unit_type()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(argument_type))), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new( + argument_type, + ))), }?; let initial_value_type = checker.type_check(&args[2], context)?; @@ -283,29 +286,29 @@ pub fn check_special_concat( )?; let new_len = lhs_max_len .checked_add(rhs_max_len) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::list_of(list_entry_type, new_len)? } (BufferType(lhs_len), BufferType(rhs_len)) => { let size: u32 = u32::from(lhs_len) .checked_add(u32::from(rhs_len)) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::SequenceType(BufferType(size.try_into()?)) } (StringType(ASCII(lhs_len)), StringType(ASCII(rhs_len))) => { let size: u32 = u32::from(lhs_len) .checked_add(u32::from(rhs_len)) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::SequenceType(StringType(ASCII(size.try_into()?))) } (StringType(UTF8(lhs_len)), StringType(UTF8(rhs_len))) => { let size: u32 = u32::from(lhs_len) .checked_add(u32::from(rhs_len)) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; TypeSignature::SequenceType(StringType(UTF8(size.try_into()?))) } (_, _) => { - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(lhs_type.clone()), Box::new(rhs_type.clone()), ) @@ -313,7 +316,7 @@ pub fn check_special_concat( } } } - _ => return Err(CheckErrorKind::ExpectedSequence(Box::new(lhs_type.clone())).into()), + _ => return Err(StaticCheckErrorKind::ExpectedSequence(Box::new(lhs_type.clone())).into()), }; Ok(res) } @@ -342,11 +345,11 @@ pub fn check_special_append( )?; let new_len = lhs_max_len .checked_add(1) - .ok_or(CheckErrorKind::MaxLengthOverflow)?; + .ok_or(StaticCheckErrorKind::MaxLengthOverflow)?; let return_type = TypeSignature::list_of(list_entry_type, new_len)?; Ok(return_type) } - _ => Err(CheckErrorKind::ExpectedListApplication.into()), + _ => Err(StaticCheckErrorKind::ExpectedListApplication.into()), } } @@ -361,7 +364,7 @@ pub fn check_special_as_max_len( SymbolicExpressionType::LiteralValue(Value::UInt(expected_len)) => expected_len, _ => { let expected_len_type = checker.type_check(&args[1], context)?; - return Err(CheckErrorKind::TypeError( + return Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(expected_len_type), ) @@ -378,7 +381,7 @@ pub fn check_special_as_max_len( .set_type(&args[1], TypeSignature::UIntType)?; let expected_len = - u32::try_from(expected_len).map_err(|_e| CheckErrorKind::MaxLengthOverflow)?; + u32::try_from(expected_len).map_err(|_e| StaticCheckErrorKind::MaxLengthOverflow)?; let sequence = checker.type_check(&args[0], context)?; runtime_cost(ClarityCostFunction::AnalysisIterableFunc, checker, 0)?; @@ -404,7 +407,7 @@ pub fn check_special_as_max_len( StringUTF8Length::try_from(expected_len)?, )))), )), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(sequence)).into()), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new(sequence)).into()), } } @@ -420,7 +423,9 @@ pub fn check_special_len( match collection_type { TypeSignature::SequenceType(_) => Ok(()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(collection_type))), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new( + collection_type, + ))), }?; Ok(TypeSignature::UIntType) @@ -449,16 +454,16 @@ pub fn check_special_element_at( TypeSignature::SequenceType(StringType(ASCII(_))) => Ok(TypeSignature::OptionalType( Box::new(TypeSignature::SequenceType(StringType(ASCII( BufferLength::try_from(1u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, )))), )), TypeSignature::SequenceType(StringType(UTF8(_))) => Ok(TypeSignature::OptionalType( Box::new(TypeSignature::SequenceType(StringType(UTF8( StringUTF8Length::try_from(1u32) - .map_err(|_| CheckErrorKind::Expects("Bad constructor".into()))?, + .map_err(|_| StaticCheckErrorKind::Expects("Bad constructor".into()))?, )))), )), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(collection_type)).into()), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new(collection_type)).into()), } } @@ -474,7 +479,7 @@ pub fn check_special_index_of( let expected_input_type = match list_type { TypeSignature::SequenceType(ref sequence_type) => Ok(sequence_type.unit_type()), - _ => Err(CheckErrorKind::ExpectedSequence(Box::new(list_type))), + _ => Err(StaticCheckErrorKind::ExpectedSequence(Box::new(list_type))), }?; checker.type_check_expects(&args[1], context, &expected_input_type)?; @@ -497,7 +502,7 @@ pub fn check_special_slice( TypeSignature::SequenceType(seq) => { TypeSignature::new_option(TypeSignature::SequenceType(seq))? } - _ => return Err(CheckErrorKind::ExpectedSequence(Box::new(seq_type)).into()), + _ => return Err(StaticCheckErrorKind::ExpectedSequence(Box::new(seq_type)).into()), }; // Check left position argument @@ -521,7 +526,7 @@ pub fn check_special_replace_at( let input_type = checker.type_check(&args[0], context)?; let seq_type = match &input_type { TypeSignature::SequenceType(seq) => seq, - _ => return Err(CheckErrorKind::ExpectedSequence(Box::new(input_type)).into()), + _ => return Err(StaticCheckErrorKind::ExpectedSequence(Box::new(input_type)).into()), }; let unit_seq = seq_type.unit_type(); // Check index argument diff --git a/clarity/src/vm/analysis/type_checker/v2_1/tests/assets.rs b/clarity/src/vm/analysis/type_checker/v2_1/tests/assets.rs index cd2c5620c04..e8a4eeadaac 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/tests/assets.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/tests/assets.rs @@ -21,7 +21,7 @@ use rstest_reuse::{self, *}; use stacks_common::types::StacksEpochId; use super::contracts::type_check; -use crate::vm::analysis::errors::CheckErrorKind; +use crate::vm::analysis::errors::StaticCheckErrorKind; use crate::vm::ast::parse; use crate::vm::database::MemoryBackingStore; use crate::vm::tests::test_clarity_versions; @@ -173,108 +173,108 @@ fn test_bad_asset_usage() { ]; let expected = [ - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::BadTokenName, - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::NoSuchNFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::NoSuchNFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(string_ascii_type(15)), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::NoSuchNFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::NoSuchNFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(string_ascii_type(15)), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::BoolType), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::NoSuchNFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::NoSuchNFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(string_ascii_type(10)), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::BadTokenName, - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::BadTokenName, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::BoolType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::BoolType), ), - CheckErrorKind::DefineNFTBadSignature, - CheckErrorKind::TypeError( + StaticCheckErrorKind::DefineNFTBadSignature, + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::NoSuchFT("stackoos".to_string()), - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::NoSuchFT("stackoos".to_string()), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::IntType), ), diff --git a/clarity/src/vm/analysis/type_checker/v2_1/tests/contracts.rs b/clarity/src/vm/analysis/type_checker/v2_1/tests/contracts.rs index 2b09b450d3f..8ce09650793 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/tests/contracts.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/tests/contracts.rs @@ -21,11 +21,10 @@ use serde_json; use stacks_common::types::StacksEpochId; use crate::vm::analysis::contract_interface_builder::build_contract_interface; -use crate::vm::analysis::errors::CheckErrorKind; use crate::vm::analysis::type_checker::v2_1::tests::mem_type_check; use crate::vm::analysis::{ mem_type_check as mem_run_analysis, run_analysis, AnalysisDatabase, ContractAnalysis, - StaticCheckError, + StaticCheckError, StaticCheckErrorKind, }; use crate::vm::ast::parse; use crate::vm::costs::LimitedCostTracker; @@ -494,7 +493,7 @@ fn test_names_tokens_contracts_bad(#[case] version: ClarityVersion, #[case] epoc let err = db .execute(|db| type_check(&names_contract_id, &mut names_contract, db, true)) .unwrap_err(); - assert!(matches!(*err.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*err.err, StaticCheckErrorKind::TypeError(_, _))); } #[test] @@ -535,12 +534,12 @@ fn test_bad_map_usage() { for contract in tests.iter() { let err = mem_type_check(contract).unwrap_err(); - assert!(matches!(*err.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*err.err, StaticCheckErrorKind::TypeError(_, _))); } assert!(matches!( *mem_type_check(unhandled_option).unwrap_err().err, - CheckErrorKind::UnionTypeError(_, _) + StaticCheckErrorKind::UnionTypeError(_, _) )); } @@ -629,7 +628,7 @@ fn test_expects() { eprintln!("unmatched_return_types returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::ReturnTypesMustMatch(_, _) + StaticCheckErrorKind::ReturnTypesMustMatch(_, _) )); } @@ -637,21 +636,21 @@ fn test_expects() { eprintln!("bad_default_types returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::DefaultTypesMustMatch(_, _) + StaticCheckErrorKind::DefaultTypesMustMatch(_, _) )); let err = mem_type_check(notype_response_type).unwrap_err(); eprintln!("notype_response_type returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::CouldNotDetermineResponseErrType + StaticCheckErrorKind::CouldNotDetermineResponseErrType )); let err = mem_type_check(notype_response_type_2).unwrap_err(); eprintln!("notype_response_type_2 returned check error: {err}"); assert!(matches!( *err.err, - CheckErrorKind::CouldNotDetermineResponseOkType + StaticCheckErrorKind::CouldNotDetermineResponseOkType )); } @@ -687,7 +686,7 @@ fn test_trait_to_compatible_trait() { mem_type_check(trait_to_compatible_trait).unwrap(); let err = mem_type_check_v1(trait_to_compatible_trait).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -714,7 +713,7 @@ fn test_bad_principal_to_trait() { let err = mem_type_check(bad_principal_to_trait).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::PrincipalType, @@ -727,7 +726,7 @@ fn test_bad_principal_to_trait() { }; let err = mem_type_check_v1(bad_principal_to_trait).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::PrincipalType, @@ -756,7 +755,7 @@ fn test_bad_other_trait() { let err = mem_type_check(bad_other_trait).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-2"); assert_eq!(actual.name.as_str(), "trait-1"); } @@ -764,7 +763,7 @@ fn test_bad_other_trait() { }; let err = mem_type_check_v1(bad_other_trait).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, actual) => match (&*expected, &*actual) { + StaticCheckErrorKind::TypeError(expected, actual) => match (&*expected, &*actual) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -797,7 +796,7 @@ fn test_embedded_trait() { mem_type_check(embedded_trait).unwrap(); let err = mem_type_check_v1(embedded_trait).unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(name) => { + StaticCheckErrorKind::TraitReferenceUnknown(name) => { assert_eq!(name.as_str(), "contract"); } _ => panic!("Unexpected error: {err:?}"), @@ -827,7 +826,7 @@ fn test_embedded_trait_compatible() { mem_type_check(embedded_trait_compatible).unwrap(); let err = mem_type_check_v1(embedded_trait_compatible).unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(name) => { + StaticCheckErrorKind::TraitReferenceUnknown(name) => { assert_eq!(name.as_str(), "contract"); } _ => panic!("Unexpected error: {err:?}"), @@ -860,7 +859,7 @@ fn test_bad_embedded_trait() { let err = mem_type_check(bad_embedded_trait).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-12"); assert_eq!(actual.name.as_str(), "trait-1"); } @@ -868,7 +867,7 @@ fn test_bad_embedded_trait() { }; let err = mem_type_check_v1(bad_embedded_trait).unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(name) => { + StaticCheckErrorKind::TraitReferenceUnknown(name) => { assert_eq!(name.as_str(), "contract"); } _ => panic!("Unexpected error: {err:?}"), @@ -890,7 +889,7 @@ fn test_let_trait() { mem_type_check(let_trait).unwrap(); let err = mem_type_check_v1(let_trait).unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(name) => { + StaticCheckErrorKind::TraitReferenceUnknown(name) => { assert_eq!(name.as_str(), "t1"); } _ => panic!("Unexpected error: {err:?}"), @@ -916,7 +915,7 @@ fn test_let3_trait() { mem_type_check(let3_trait).unwrap(); let err = mem_type_check_v1(let3_trait).unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(name) => { + StaticCheckErrorKind::TraitReferenceUnknown(name) => { assert_eq!(name.as_str(), "t3"); } _ => panic!("Unexpected error: {err:?}"), @@ -971,7 +970,7 @@ fn test_let3_compound_trait_call() { mem_type_check(let3_compound_trait_call).unwrap(); let err = mem_type_check_v1(let3_compound_trait_call).unwrap_err(); match *err.err { - CheckErrorKind::TraitReferenceUnknown(name) => { + StaticCheckErrorKind::TraitReferenceUnknown(name) => { assert_eq!(name.as_str(), "t4"); } _ => panic!("Unexpected error: {err:?}"), @@ -995,7 +994,7 @@ fn test_trait_args_differ() { let err = mem_type_check(trait_args_differ).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-2"); assert_eq!(actual.name.as_str(), "trait-1"); } @@ -1003,7 +1002,7 @@ fn test_trait_args_differ() { }; let err = mem_type_check_v1(trait_args_differ).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1033,7 +1032,7 @@ fn test_trait_arg_counts_differ1() { let err = mem_type_check(trait_to_compatible_trait).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, found) => { + StaticCheckErrorKind::IncompatibleTrait(expected, found) => { assert_eq!(expected.name.as_str(), "trait-2"); assert_eq!(found.name.as_str(), "trait-1"); } @@ -1041,7 +1040,7 @@ fn test_trait_arg_counts_differ1() { }; let err = mem_type_check_v1(trait_to_compatible_trait).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1071,7 +1070,7 @@ fn test_trait_arg_counts_differ2() { let err = mem_type_check(trait_to_compatible_trait).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, found) => { + StaticCheckErrorKind::IncompatibleTrait(expected, found) => { assert_eq!(expected.name.as_str(), "trait-2"); assert_eq!(found.name.as_str(), "trait-1"); } @@ -1079,7 +1078,7 @@ fn test_trait_arg_counts_differ2() { }; let err = mem_type_check_v1(trait_to_compatible_trait).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1109,7 +1108,7 @@ fn test_trait_ret_ty_differ() { let err = mem_type_check(trait_ret_ty_differ).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-2"); assert_eq!(actual.name.as_str(), "trait-1"); } @@ -1117,7 +1116,7 @@ fn test_trait_ret_ty_differ() { }; let err = mem_type_check_v1(trait_ret_ty_differ).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1155,7 +1154,7 @@ fn test_trait_with_compatible_trait_arg() { mem_type_check(trait_with_compatible_trait_arg).unwrap(); let err = mem_type_check_v1(trait_with_compatible_trait_arg).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1192,7 +1191,7 @@ fn test_trait_with_bad_trait_arg() { let err = mem_type_check(trait_with_bad_trait_arg).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-b"); assert_eq!(actual.name.as_str(), "trait-a"); } @@ -1200,7 +1199,7 @@ fn test_trait_with_bad_trait_arg() { }; let err = mem_type_check_v1(trait_with_bad_trait_arg).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1238,7 +1237,7 @@ fn test_trait_with_superset_trait_arg() { let err = mem_type_check(trait_with_superset_trait_arg).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-b"); assert_eq!(actual.name.as_str(), "trait-a"); } @@ -1248,7 +1247,7 @@ fn test_trait_with_superset_trait_arg() { let err = mem_type_check_v1(trait_with_superset_trait_arg).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1287,7 +1286,7 @@ fn test_trait_with_subset_trait_arg() { mem_type_check(trait_with_subset_trait_arg).unwrap(); let err = mem_type_check_v1(trait_with_subset_trait_arg).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1311,7 +1310,7 @@ fn test_trait_with_duplicate_method() { let err = mem_type_check(trait_with_duplicate_method).unwrap_err(); match *err.err { - CheckErrorKind::DefineTraitDuplicateMethod(method_name) => { + StaticCheckErrorKind::DefineTraitDuplicateMethod(method_name) => { assert_eq!(method_name.as_str(), "foo"); } _ => panic!("Unexpected error: {err:?}"), @@ -1340,7 +1339,7 @@ fn test_trait_to_subtrait_and_back() { let err = mem_type_check(trait_to_subtrait_and_back).unwrap_err(); match *err.err { - CheckErrorKind::IncompatibleTrait(expected, actual) => { + StaticCheckErrorKind::IncompatibleTrait(expected, actual) => { assert_eq!(expected.name.as_str(), "trait-2"); assert_eq!(actual.name.as_str(), "trait-1"); } @@ -1348,7 +1347,7 @@ fn test_trait_to_subtrait_and_back() { }; let err = mem_type_check_v1(trait_to_subtrait_and_back).unwrap_err(); match *err.err { - CheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { + StaticCheckErrorKind::TypeError(expected, found) => match (&*expected, &*found) { ( TypeSignature::CallableType(CallableSubtype::Trait(expected_trait)), TypeSignature::CallableType(CallableSubtype::Trait(found_trait)), @@ -1395,7 +1394,7 @@ fn test_if_branches_with_incompatible_trait_types() { )"; let err = mem_type_check(if_branches_with_incompatible_trait_types).unwrap_err(); match *err.err { - CheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { + StaticCheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { ( TypeSignature::CallableType(CallableSubtype::Trait(trait1)), TypeSignature::CallableType(CallableSubtype::Trait(trait2)), @@ -1409,7 +1408,7 @@ fn test_if_branches_with_incompatible_trait_types() { }; let err = mem_type_check_v1(if_branches_with_incompatible_trait_types).unwrap_err(); match *err.err { - CheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { + StaticCheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { ( TypeSignature::CallableType(CallableSubtype::Trait(trait1)), TypeSignature::CallableType(CallableSubtype::Trait(trait2)), @@ -1441,7 +1440,7 @@ fn test_if_branches_with_compatible_trait_types() { let err = mem_type_check(if_branches_with_compatible_trait_types).unwrap_err(); match *err.err { - CheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { + StaticCheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { ( TypeSignature::CallableType(CallableSubtype::Trait(trait1)), TypeSignature::CallableType(CallableSubtype::Trait(trait2)), @@ -1455,7 +1454,7 @@ fn test_if_branches_with_compatible_trait_types() { }; let err = mem_type_check_v1(if_branches_with_compatible_trait_types).unwrap_err(); match *err.err { - CheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { + StaticCheckErrorKind::IfArmsMustMatch(type1, type2) => match (&*type1, &*type2) { ( TypeSignature::CallableType(CallableSubtype::Trait(trait1)), TypeSignature::CallableType(CallableSubtype::Trait(trait2)), @@ -1514,7 +1513,7 @@ fn test_traits_multi_contract(#[case] version: ClarityVersion) { match result { Ok(_) if version >= ClarityVersion::Clarity2 => (), Err(StaticCheckError { err, .. }) if version < ClarityVersion::Clarity2 => match *err { - CheckErrorKind::TraitMethodUnknown(trait_name, function) => { + StaticCheckErrorKind::TraitMethodUnknown(trait_name, function) => { assert_eq!(trait_name.as_str(), "a"); assert_eq!(function.as_str(), "do-it"); } @@ -3399,7 +3398,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? 123)", "int type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::IntType), )), @@ -3407,7 +3406,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? u123)", "uint type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::UIntType), )), @@ -3415,7 +3414,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? true)", "bool type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::BoolType), )), @@ -3423,7 +3422,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? 0x1234)", "buffer type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::SequenceType(SequenceSubtype::BufferType( BufferLength::try_from(2u32).unwrap(), @@ -3433,7 +3432,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? \"60 percent of the time, it works every time\")", "ascii string", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::SequenceType(SequenceSubtype::StringType( StringSubtype::ASCII(BufferLength::try_from(43u32).unwrap()), @@ -3443,7 +3442,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? u\"I am serious, and don't call me Shirley.\")", "utf8 string", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::SequenceType(SequenceSubtype::StringType( StringSubtype::UTF8(StringUTF8Length::try_from(40u32).unwrap()), @@ -3453,7 +3452,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? (list 1 2 3))", "list type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::SequenceType(SequenceSubtype::ListType( ListTypeData::new_list(TypeSignature::IntType, 3).unwrap(), @@ -3463,7 +3462,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? { a: 1, b: u2 })", "tuple type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::TupleType( vec![ @@ -3478,7 +3477,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? (some u789))", "optional type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::new_option(TypeSignature::UIntType).unwrap()), )), @@ -3486,7 +3485,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc ( "(contract-hash? (ok true))", "response type", - Err(CheckErrorKind::TypeError( + Err(StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new( TypeSignature::new_response(TypeSignature::BoolType, TypeSignature::NoType) @@ -3503,7 +3502,7 @@ fn test_contract_hash(#[case] version: ClarityVersion, #[case] epoch: StacksEpoc let expected = if version >= ClarityVersion::Clarity4 { clarity4_expected } else { - &Err(CheckErrorKind::UnknownFunction( + &Err(StaticCheckErrorKind::UnknownFunction( "contract-hash?".to_string(), )) }; diff --git a/clarity/src/vm/analysis/type_checker/v2_1/tests/conversions.rs b/clarity/src/vm/analysis/type_checker/v2_1/tests/conversions.rs index b889bcc53ff..5cc016fafe4 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/tests/conversions.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/tests/conversions.rs @@ -12,8 +12,7 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . - -use clarity_types::errors::CheckErrorKind; +use clarity_types::errors::analysis::StaticCheckErrorKind; use clarity_types::types::{ BufferLength, ListTypeData, SequenceSubtype, StringSubtype, TypeSignature, MAX_TO_ASCII_BUFFER_LEN, @@ -99,7 +98,7 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ( &format!("(to-ascii? 0x{})", "ff".repeat(524285)), "oversized buffer type", - Err(CheckErrorKind::UnionTypeError( + Err(StaticCheckErrorKind::UnionTypeError( to_ascii_expected_types.clone(), Box::new(TypeSignature::SequenceType(SequenceSubtype::BufferType( BufferLength::try_from(524285u32).unwrap(), @@ -125,7 +124,7 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ( "(to-ascii? \"60 percent of the time, it works every time\")", "ascii string", - Err(CheckErrorKind::UnionTypeError( + Err(StaticCheckErrorKind::UnionTypeError( to_ascii_expected_types.clone(), Box::new(TypeSignature::SequenceType(SequenceSubtype::StringType( StringSubtype::ASCII(BufferLength::try_from(43u32).unwrap()), @@ -135,7 +134,7 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ( "(to-ascii? (list 1 2 3))", "list type", - Err(CheckErrorKind::UnionTypeError( + Err(StaticCheckErrorKind::UnionTypeError( to_ascii_expected_types.clone(), Box::new(TypeSignature::SequenceType(SequenceSubtype::ListType( ListTypeData::new_list(TypeSignature::IntType, 3).unwrap(), @@ -145,7 +144,7 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ( "(to-ascii? { a: 1, b: u2 })", "tuple type", - Err(CheckErrorKind::UnionTypeError( + Err(StaticCheckErrorKind::UnionTypeError( to_ascii_expected_types.clone(), Box::new(TypeSignature::TupleType( vec![ @@ -160,7 +159,7 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ( "(to-ascii? (some u789))", "optional type", - Err(CheckErrorKind::UnionTypeError( + Err(StaticCheckErrorKind::UnionTypeError( to_ascii_expected_types.clone(), Box::new(TypeSignature::new_option(TypeSignature::UIntType).unwrap()), )), @@ -168,7 +167,7 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ( "(to-ascii? (ok true))", "response type", - Err(CheckErrorKind::UnionTypeError( + Err(StaticCheckErrorKind::UnionTypeError( to_ascii_expected_types.clone(), Box::new( TypeSignature::new_response(TypeSignature::BoolType, TypeSignature::NoType) @@ -185,7 +184,9 @@ fn test_to_ascii(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) let expected = if version >= ClarityVersion::Clarity4 { clarity4_expected } else { - &Err(CheckErrorKind::UnknownFunction("to-ascii?".to_string())) + &Err(StaticCheckErrorKind::UnknownFunction( + "to-ascii?".to_string(), + )) }; assert_eq!(&actual, expected, "Failed for test case: {description}"); diff --git a/clarity/src/vm/analysis/type_checker/v2_1/tests/mod.rs b/clarity/src/vm/analysis/type_checker/v2_1/tests/mod.rs index 3dc3148ba01..f3c6143b3a7 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/tests/mod.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/tests/mod.rs @@ -22,7 +22,7 @@ use rstest::rstest; use rstest_reuse::{self, *}; use stacks_common::types::StacksEpochId; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError, SyntaxBindingError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind, SyntaxBindingError}; use crate::vm::analysis::mem_type_check as mem_run_analysis; use crate::vm::analysis::type_checker::v2_1::{MAX_FUNCTION_PARAMETERS, MAX_TRAIT_METHODS}; use crate::vm::analysis::types::ContractAnalysis; @@ -105,26 +105,26 @@ fn test_from_consensus_buff() { let bad = [ ( "(from-consensus-buff?)", - CheckErrorKind::IncorrectArgumentCount(2, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 0), ), ( "(from-consensus-buff? 0x00 0x00 0x00)", - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ), ( "(from-consensus-buff? 0x00 0x00)", - CheckErrorKind::InvalidTypeDescription, + StaticCheckErrorKind::InvalidTypeDescription, ), ( "(from-consensus-buff? int u6)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_MAX), Box::new(TypeSignature::UIntType), ), ), ( "(from-consensus-buff? (buff 1048576) 0x00)", - CheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, ), ]; @@ -201,26 +201,26 @@ fn test_to_consensus_buff() { let bad = [ ( "(to-consensus-buff?)", - CheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), ), ( "(to-consensus-buff? 0x00 0x00)", - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ), ( "(define-private (my-func (x (buff 1048576))) (to-consensus-buff? x))", - CheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, ), ( "(define-private (my-func (x (buff 1048570))) (to-consensus-buff? x))", - CheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, ), ( "(define-private (my-func (x (buff 1048567))) (to-consensus-buff? x))", - CheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, ), ]; @@ -279,10 +279,10 @@ fn test_get_block_info() { "(get-block-info? time)", ]; let bad_expected = [ - CheckErrorKind::NoSuchBlockInfoProperty("none".to_string()), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::RequiresAtLeastArguments(2, 1), + StaticCheckErrorKind::NoSuchBlockInfoProperty("none".to_string()), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::RequiresAtLeastArguments(2, 1), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -324,7 +324,7 @@ fn test_get_block_info() { } for good_test in good_v210.iter() { - if let CheckErrorKind::NoSuchBlockInfoProperty(_) = + if let StaticCheckErrorKind::NoSuchBlockInfoProperty(_) = *type_check_helper_v1(good_test).unwrap_err().err { } else { @@ -345,10 +345,10 @@ fn test_get_burn_block_info() { r#"(get-burn-block-info? header-hash "a")"#, ]; let bad_expected = [ - CheckErrorKind::NoSuchBlockInfoProperty("none".to_string()), - CheckErrorKind::IncorrectArgumentCount(2, 0), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::TypeError( + StaticCheckErrorKind::NoSuchBlockInfoProperty("none".to_string()), + StaticCheckErrorKind::IncorrectArgumentCount(2, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError( Box::new(UIntType), Box::new(SequenceType(StringType(ASCII( BufferLength::try_from(1u32).expect("BufferLength::try_from failed"), @@ -405,15 +405,15 @@ fn test_define_functions(#[case] version: ClarityVersion, #[case] epoch: StacksE ), ]; let bad_expected = [ - CheckErrorKind::TooManyFunctionParameters( + StaticCheckErrorKind::TooManyFunctionParameters( MAX_FUNCTION_PARAMETERS + 1, MAX_FUNCTION_PARAMETERS, ), - CheckErrorKind::TooManyFunctionParameters( + StaticCheckErrorKind::TooManyFunctionParameters( MAX_FUNCTION_PARAMETERS + 1, MAX_FUNCTION_PARAMETERS, ), - CheckErrorKind::TooManyFunctionParameters( + StaticCheckErrorKind::TooManyFunctionParameters( MAX_FUNCTION_PARAMETERS + 1, MAX_FUNCTION_PARAMETERS, ), @@ -453,11 +453,11 @@ fn test_define_trait(#[case] version: ClarityVersion, #[case] epoch: StacksEpoch "(define-trait trait-1 ((get-1 (uint) (response uint uint)) u1))", ]; let bad_expected = [ - CheckErrorKind::InvalidTypeDescription, - CheckErrorKind::DefineTraitBadSignature, - CheckErrorKind::DefineTraitBadSignature, - CheckErrorKind::InvalidTypeDescription, - CheckErrorKind::DefineTraitBadSignature, + StaticCheckErrorKind::InvalidTypeDescription, + StaticCheckErrorKind::DefineTraitBadSignature, + StaticCheckErrorKind::DefineTraitBadSignature, + StaticCheckErrorKind::InvalidTypeDescription, + StaticCheckErrorKind::DefineTraitBadSignature, ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { @@ -505,8 +505,8 @@ fn test_define_trait(#[case] version: ClarityVersion, #[case] epoch: StacksEpoch ), ]; let bad_expected = [ - CheckErrorKind::TraitTooManyMethods(MAX_TRAIT_METHODS + 1, MAX_TRAIT_METHODS), - CheckErrorKind::TooManyFunctionParameters( + StaticCheckErrorKind::TraitTooManyMethods(MAX_TRAIT_METHODS + 1, MAX_TRAIT_METHODS), + StaticCheckErrorKind::TooManyFunctionParameters( MAX_FUNCTION_PARAMETERS + 1, MAX_FUNCTION_PARAMETERS, ), @@ -601,42 +601,42 @@ fn test_stx_ops() { "(stx-get-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)" ]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(PrincipalType), Box::new(SequenceType(BufferType( BufferLength::try_from(2_u32).unwrap(), ))), ), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 5), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 5), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError( Box::new(PrincipalType), Box::new(OptionalType(Box::from(PrincipalType))), ), - CheckErrorKind::IncorrectArgumentCount(3, 4), - CheckErrorKind::TypeError( + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::TypeError( Box::new(PrincipalType), Box::new(SequenceType(BufferType( BufferLength::try_from(2_u32).unwrap(), ))), ), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(4, 5), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(4, 5), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError( Box::new(PrincipalType), Box::new(OptionalType(Box::from(PrincipalType))), ), - CheckErrorKind::IncorrectArgumentCount(4, 3), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), - CheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(4, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::TypeError(Box::new(PrincipalType), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -665,7 +665,7 @@ fn test_tx_sponsor() { ]; let bad = ["(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"]; - let bad_expected = [CheckErrorKind::TypeError( + let bad_expected = [StaticCheckErrorKind::TypeError( Box::new(PrincipalType), Box::new(OptionalType(Box::from(PrincipalType))), )]; @@ -733,7 +733,7 @@ fn test_destructuring_opts(#[case] version: ClarityVersion, #[case] epoch: Stack let bad = [ ( "(unwrap-err! (some 2) 2)", - CheckErrorKind::ExpectedResponseType(Box::new(TypeSignature::from_string( + StaticCheckErrorKind::ExpectedResponseType(Box::new(TypeSignature::from_string( "(optional int)", version, epoch, @@ -741,92 +741,101 @@ fn test_destructuring_opts(#[case] version: ClarityVersion, #[case] epoch: Stack ), ( "(unwrap! (err 3) 2)", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(unwrap-err-panic (ok 3))", - CheckErrorKind::CouldNotDetermineResponseErrType, + StaticCheckErrorKind::CouldNotDetermineResponseErrType, ), ( "(unwrap-panic none)", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(define-private (foo) (if (> 1 0) none none)) (unwrap-panic (foo))", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(unwrap-panic (err 3))", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(match none inner-value (/ 1 0) (+ 1 8))", - CheckErrorKind::CouldNotDetermineMatchTypes, + StaticCheckErrorKind::CouldNotDetermineMatchTypes, ), ( "(match (ok 1) ok-val (/ ok-val 0) err-val (+ err-val 7))", - CheckErrorKind::CouldNotDetermineMatchTypes, + StaticCheckErrorKind::CouldNotDetermineMatchTypes, ), ( "(match (err 1) ok-val (/ ok-val 0) err-val (+ err-val 7))", - CheckErrorKind::CouldNotDetermineMatchTypes, + StaticCheckErrorKind::CouldNotDetermineMatchTypes, ), ( "(define-private (foo) (if (> 1 0) (ok 1) (err u8))) (match (foo) ok-val (+ 1 ok-val) err-val (/ err-val u0))", - CheckErrorKind::MatchArmsMustMatch( + StaticCheckErrorKind::MatchArmsMustMatch( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), ), ( "(match (some 1) inner-value (+ 1 inner-value) (> 1 28))", - CheckErrorKind::MatchArmsMustMatch( + StaticCheckErrorKind::MatchArmsMustMatch( Box::new(TypeSignature::IntType), Box::new(TypeSignature::BoolType), ), ), ( "(match (some 1) inner-value (+ 1 inner-value))", - CheckErrorKind::BadMatchOptionSyntax(Box::new(CheckErrorKind::IncorrectArgumentCount( - 4, 3, - ))), + StaticCheckErrorKind::BadMatchOptionSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(4, 3), + )), ), ( "(match (ok 1) inner-value (+ 1 inner-value))", - CheckErrorKind::BadMatchResponseSyntax(Box::new( - CheckErrorKind::IncorrectArgumentCount(5, 3), + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::IncorrectArgumentCount(5, 3), )), ), ( "(match (ok 1) 1 (+ 1 1) err-val (+ 2 err-val))", - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)), + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )), ), ( "(match (ok 1) ok-val (+ 1 1) (+ 3 4) (+ 2 err-val))", - CheckErrorKind::BadMatchResponseSyntax(Box::new(CheckErrorKind::ExpectedName)), + StaticCheckErrorKind::BadMatchResponseSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )), ), ( "(match (some 1) 2 (+ 1 1) (+ 3 4))", - CheckErrorKind::BadMatchOptionSyntax(Box::new(CheckErrorKind::ExpectedName)), + StaticCheckErrorKind::BadMatchOptionSyntax(Box::new( + StaticCheckErrorKind::ExpectedName, + )), + ), + ( + "(match)", + StaticCheckErrorKind::RequiresAtLeastArguments(1, 0), ), - ("(match)", CheckErrorKind::RequiresAtLeastArguments(1, 0)), ( "(match 1 ok-val (/ ok-val 0) err-val (+ err-val 7))", - CheckErrorKind::BadMatchInput(Box::new(TypeSignature::from_string( + StaticCheckErrorKind::BadMatchInput(Box::new(TypeSignature::from_string( "int", version, epoch, ))), ), ( "(default-to 3 5)", - CheckErrorKind::ExpectedOptionalType(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::ExpectedOptionalType(Box::new(TypeSignature::IntType)), ), ( "(define-private (foo (x int)) (match (some 3) x (+ x 2) 5))", - CheckErrorKind::NameAlreadyUsed("x".to_string()), + StaticCheckErrorKind::NameAlreadyUsed("x".to_string()), ), ( "(define-private (t1 (x uint)) (if (> x u1) (ok x) (err false))) @@ -834,7 +843,7 @@ fn test_destructuring_opts(#[case] version: ClarityVersion, #[case] epoch: Stack (if (> x u4) (err u3) (ok (+ u2 (try! (t1 x))))))", - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new( TypeSignature::new_response(TypeSignature::NoType, TypeSignature::BoolType) .unwrap(), @@ -849,7 +858,7 @@ fn test_destructuring_opts(#[case] version: ClarityVersion, #[case] epoch: Stack "(define-private (t1 (x uint)) (if (> x u1) (ok x) (err false))) (define-private (t2 (x uint)) (> u2 (try! (t1 x))))", - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( Box::new( TypeSignature::new_response(TypeSignature::NoType, TypeSignature::BoolType) .unwrap(), @@ -859,23 +868,23 @@ fn test_destructuring_opts(#[case] version: ClarityVersion, #[case] epoch: Stack ), ( "(try! (ok 3))", - CheckErrorKind::CouldNotDetermineResponseErrType, + StaticCheckErrorKind::CouldNotDetermineResponseErrType, ), ( "(try! none)", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(try! (err 3))", - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ), ( "(try! 3)", - CheckErrorKind::ExpectedOptionalOrResponseType(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::ExpectedOptionalOrResponseType(Box::new(TypeSignature::IntType)), ), ( "(try! (ok 3) 4)", - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ), ]; @@ -898,14 +907,14 @@ fn test_at_block() { let bad = [ ( "(at-block (sha512 u0) u1)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_32), Box::new(TypeSignature::BUFFER_64), ), ), ( "(at-block (sha256 u0) u1 u2)", - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ), ]; @@ -939,7 +948,7 @@ fn test_trait_reference_unknown(#[case] version: ClarityVersion, #[case] epoch: fn test_unexpected_use_of_field_or_trait_reference() { let bad = [( "(+ 1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.contract.field)", - CheckErrorKind::UnexpectedTraitOrFieldReference, + StaticCheckErrorKind::UnexpectedTraitOrFieldReference, )]; for (bad_test, expected) in bad.iter() { @@ -986,23 +995,23 @@ fn test_bitwise_bad_checks() { "(bit-or 1 2 u4)", ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::UnionTypeError( vec![IntType, UIntType], Box::new(SequenceType(StringType(ASCII( BufferLength::try_from(5u32).unwrap(), )))), ), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { @@ -1027,12 +1036,12 @@ fn test_simple_arithmetic_checks() { "(and (or true false) (+ 1 2 3))", ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::RequiresAtLeastArguments(1, 0), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UndefinedVariable("x".to_string()), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::RequiresAtLeastArguments(1, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UndefinedVariable("x".to_string()), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1093,14 +1102,14 @@ fn test_simple_hash_checks() { for bad_test in bad_types.iter() { assert!(matches!( *type_check_helper(bad_test).unwrap_err().err, - CheckErrorKind::UnionTypeError(_, _) + StaticCheckErrorKind::UnionTypeError(_, _) )); } for bad_test in invalid_args.iter() { assert!(matches!( *type_check_helper(bad_test).unwrap_err().err, - CheckErrorKind::IncorrectArgumentCount(_, _) + StaticCheckErrorKind::IncorrectArgumentCount(_, _) )); } } @@ -1123,10 +1132,10 @@ fn test_simple_ifs() { ]; let bad_expected = [ - CheckErrorKind::IfArmsMustMatch(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IfArmsMustMatch(Box::new(ascii_type(1)), Box::new(BoolType)), - CheckErrorKind::IncorrectArgumentCount(3, 0), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IfArmsMustMatch(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IfArmsMustMatch(Box::new(ascii_type(1)), Box::new(BoolType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 0), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1159,9 +1168,9 @@ fn test_simple_lets() { ]; let bad_expected = [ - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_invalid_length(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_atom(0)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_invalid_length(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_atom(0)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), @@ -1234,47 +1243,47 @@ fn test_index_of() { ]; let bad_expected = [ - CheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_MIN), Box::new(TypeSignature::STRING_ASCII_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::STRING_UTF8_MIN), Box::new(TypeSignature::STRING_ASCII_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::STRING_ASCII_MIN), Box::new(TypeSignature::STRING_UTF8_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(TypeSignature::IntType, 1).unwrap()), Box::new(TypeSignature::list_of(TypeSignature::IntType, 2).unwrap()), ), - CheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_MIN), Box::new(TypeSignature::STRING_ASCII_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::STRING_UTF8_MIN), Box::new(TypeSignature::STRING_ASCII_MIN), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::STRING_ASCII_MIN), Box::new(TypeSignature::STRING_UTF8_MIN), ), - CheckErrorKind::CouldNotDetermineType, - CheckErrorKind::CouldNotDetermineType, - CheckErrorKind::CouldNotDetermineType, + StaticCheckErrorKind::CouldNotDetermineType, + StaticCheckErrorKind::CouldNotDetermineType, + StaticCheckErrorKind::CouldNotDetermineType, ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { @@ -1318,16 +1327,16 @@ fn test_element_at() { ]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::UIntType), Box::new(TypeSignature::IntType), ), - CheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(TypeSignature::IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1359,12 +1368,12 @@ fn test_eqs(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(IntType, 1).unwrap()), Box::new(IntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::from_string( "(optional bool)", version, @@ -1402,9 +1411,9 @@ fn test_asserts() { ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1468,23 +1477,23 @@ fn test_lists() { "(map + (list 1 2 3 4 5) (list true true true true true))", ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), - CheckErrorKind::UnknownFunction("ynot".to_string()), - CheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), - CheckErrorKind::ExpectedSequence(Box::new(UIntType)), - CheckErrorKind::ExpectedSequence(Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::UnknownFunction("ynot".to_string()), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(UIntType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1525,20 +1534,20 @@ fn test_buff() { "(len 1)", ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 3), - CheckErrorKind::UnknownFunction("ynot".to_string()), - CheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), - CheckErrorKind::ExpectedSequence(Box::new(UIntType)), - CheckErrorKind::ExpectedSequence(Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(buff_type(20))), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::UnknownFunction("ynot".to_string()), + StaticCheckErrorKind::IllegalOrUnknownFunctionApplication("if".to_string()), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::UnionTypeError(vec![IntType, UIntType], Box::new(BoolType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(UIntType)), + StaticCheckErrorKind::ExpectedSequence(Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -1606,9 +1615,9 @@ fn test_native_as_max_len() { "(as-max-len? 0x01 u1048577)", ]; let bad_expected = [ - CheckErrorKind::ValueTooLarge, - CheckErrorKind::ValueTooLarge, - CheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, + StaticCheckErrorKind::ValueTooLarge, ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1652,9 +1661,9 @@ fn test_native_append() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1692,9 +1701,9 @@ fn test_slice_list() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1723,9 +1732,9 @@ fn test_slice_buff() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1757,9 +1766,9 @@ fn test_slice_ascii() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1788,9 +1797,9 @@ fn test_slice_utf8() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -1836,17 +1845,17 @@ fn test_replace_at_list() { ]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(IntType), Box::new(SequenceType(ListType( ListTypeData::new_list(IntType, 1).unwrap(), ))), ), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 4), - CheckErrorKind::IncorrectArgumentCount(3, 2), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError( Box::new(SequenceType(ListType( ListTypeData::new_list(IntType, 1).unwrap(), ))), @@ -1894,20 +1903,20 @@ fn test_replace_at_buff() { let buff_len = BufferLength::try_from(1u32).unwrap(); let buff_len_two = BufferLength::try_from(2u32).unwrap(); let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType(buff_len.clone()))), Box::new(SequenceType(ListType( ListTypeData::new_list(IntType, 1).unwrap(), ))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType(buff_len.clone()))), Box::new(SequenceType(StringType(ASCII(buff_len.clone())))), ), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 4), - CheckErrorKind::IncorrectArgumentCount(3, 2), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType(buff_len))), Box::new(SequenceType(BufferType(buff_len_two))), ), @@ -1952,20 +1961,20 @@ fn test_replace_at_ascii() { let buff_len = BufferLength::try_from(1u32).unwrap(); let buff_len_two = BufferLength::try_from(2u32).unwrap(); let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(ASCII(buff_len.clone())))), Box::new(SequenceType(ListType( ListTypeData::new_list(IntType, 1).unwrap(), ))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(ASCII(buff_len.clone())))), Box::new(SequenceType(BufferType(buff_len.clone()))), ), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 4), - CheckErrorKind::IncorrectArgumentCount(3, 2), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(ASCII(buff_len)))), Box::new(SequenceType(StringType(ASCII(buff_len_two)))), ), @@ -2010,20 +2019,20 @@ fn test_replace_at_utf8() { let str_len = StringUTF8Length::try_from(1u32).unwrap(); let str_len_two = StringUTF8Length::try_from(2u32).unwrap(); let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(UTF8(str_len.clone())))), Box::new(SequenceType(ListType( ListTypeData::new_list(IntType, 1).unwrap(), ))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(UTF8(str_len.clone())))), Box::new(SequenceType(BufferType(buff_len))), ), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(3, 4), - CheckErrorKind::IncorrectArgumentCount(3, 2), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(UTF8(str_len)))), Box::new(SequenceType(StringType(UTF8(str_len_two)))), ), @@ -2052,9 +2061,9 @@ fn test_native_concat() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(UIntType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { assert_eq!(*expected, *type_check_helper(bad_test).unwrap_err().err); @@ -2137,8 +2146,8 @@ fn test_tuples() { ]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(BoolType), Box::new(IntType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -2162,7 +2171,7 @@ fn test_empty_tuple_should_fail() { assert_eq!( *mem_type_check(contract_src).unwrap_err().err, - CheckErrorKind::EmptyTuplesNotAllowed, + StaticCheckErrorKind::EmptyTuplesNotAllowed, ); } @@ -2242,9 +2251,9 @@ fn test_simple_uints() { let bad = ["(> u1 1)", "(to-uint true)", "(to-int false)"]; let bad_expected = [ - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), - CheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(IntType)), + StaticCheckErrorKind::TypeError(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::TypeError(Box::new(UIntType), Box::new(BoolType)), ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -2276,9 +2285,9 @@ fn test_buffer_to_ints() { ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 0), - CheckErrorKind::TypeError( + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType( BufferLength::try_from(16_u32).unwrap(), ))), @@ -2286,7 +2295,7 @@ fn test_buffer_to_ints() { BufferLength::try_from(17_u32).unwrap(), ))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType( BufferLength::try_from(16_u32).unwrap(), ))), @@ -2350,37 +2359,37 @@ fn test_string_to_ints() { ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 0), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::UnionTypeError( vec![IntType, UIntType], Box::new(SequenceType(BufferType( BufferLength::try_from(17_u32).unwrap(), ))), ), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::UnionTypeError( vec![IntType, UIntType], Box::new(SequenceType(StringType(ASCII( BufferLength::try_from(1_u32).unwrap(), )))), ), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 0), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::UnionTypeError( vec![IntType, UIntType], Box::new(SequenceType(BufferType( BufferLength::try_from(17_u32).unwrap(), ))), ), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::UnionTypeError( vec![IntType, UIntType], Box::new(SequenceType(StringType(ASCII( BufferLength::try_from(1_u32).unwrap(), )))), ), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 0), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::UnionTypeError( vec![ TypeSignature::STRING_ASCII_MAX, TypeSignature::STRING_UTF8_MAX, @@ -2389,16 +2398,16 @@ fn test_string_to_ints() { BufferLength::try_from(17_u32).unwrap(), ))), ), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::UnionTypeError( vec![ TypeSignature::STRING_ASCII_MAX, TypeSignature::STRING_UTF8_MAX, ], Box::new(IntType), ), - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 0), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::UnionTypeError( vec![ TypeSignature::STRING_ASCII_MAX, TypeSignature::STRING_UTF8_MAX, @@ -2407,7 +2416,7 @@ fn test_string_to_ints() { BufferLength::try_from(17_u32).unwrap(), ))), ), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::UnionTypeError( vec![ TypeSignature::STRING_ASCII_MAX, TypeSignature::STRING_UTF8_MAX, @@ -2462,7 +2471,7 @@ fn test_response_inference(#[case] version: ClarityVersion, #[case] epoch: Stack ]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::from_string( "(response bool int)", version, @@ -2470,8 +2479,8 @@ fn test_response_inference(#[case] version: ClarityVersion, #[case] epoch: Stack )), Box::new(BoolType), ), - CheckErrorKind::ReturnTypesMustMatch(Box::new(IntType), Box::new(BoolType)), - CheckErrorKind::CouldNotDetermineResponseOkType, + StaticCheckErrorKind::ReturnTypesMustMatch(Box::new(IntType), Box::new(BoolType)), + StaticCheckErrorKind::CouldNotDetermineResponseOkType, ]; for (good_test, expected) in good.iter().zip(expected.iter()) { @@ -2589,7 +2598,7 @@ fn test_options(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) { if version < ClarityVersion::Clarity2 { assert!( match *mem_run_analysis(contract, version, epoch).unwrap_err().err { - CheckErrorKind::TypeError(t1, t2) => { + StaticCheckErrorKind::TypeError(t1, t2) => { *t1 == TypeSignature::from_string("(optional bool)", version, epoch) && *t2 == TypeSignature::from_string("(optional int)", version, epoch) } @@ -2599,7 +2608,7 @@ fn test_options(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) { } else { assert!( match *mem_run_analysis(contract, version, epoch).unwrap_err().err { - CheckErrorKind::TypeError(t1, t2) => { + StaticCheckErrorKind::TypeError(t1, t2) => { *t1 == TypeSignature::from_string("bool", version, epoch) && *t2 == TypeSignature::from_string("int", version, epoch) } @@ -2708,7 +2717,7 @@ fn test_missing_value_on_declaration_should_fail() { let res = mem_type_check(contract_src).unwrap_err(); assert!(matches!( *res.err, - CheckErrorKind::IncorrectArgumentCount(_, _) + StaticCheckErrorKind::IncorrectArgumentCount(_, _) )); } @@ -2719,7 +2728,7 @@ fn test_mismatching_type_on_declaration_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } #[test] @@ -2735,7 +2744,7 @@ fn test_mismatching_type_on_update_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } #[test] @@ -2747,7 +2756,10 @@ fn test_direct_access_to_persisted_var_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } #[test] @@ -2762,7 +2774,7 @@ fn test_data_var_shadowed_by_let_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -2775,7 +2787,10 @@ fn test_mutating_unknown_data_var_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NoSuchDataVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::NoSuchDataVariable(_) + )); } #[test] @@ -2786,7 +2801,10 @@ fn test_accessing_unknown_data_var_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NoSuchDataVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::NoSuchDataVariable(_) + )); } #[test] @@ -2797,7 +2815,7 @@ fn test_let_shadowed_by_let_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -2809,7 +2827,7 @@ fn test_let_shadowed_by_nested_let_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -2822,7 +2840,7 @@ fn test_define_constant_shadowed_by_let_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -2834,7 +2852,7 @@ fn test_define_constant_shadowed_by_argument_should_fail() { "#; let res = mem_type_check(contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::NameAlreadyUsed(_))); + assert!(matches!(*res.err, StaticCheckErrorKind::NameAlreadyUsed(_))); } #[test] @@ -3034,7 +3052,7 @@ fn test_fetch_entry_mismatching_type_signatures() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -3049,7 +3067,10 @@ fn test_fetch_entry_unbound_variables() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -3091,7 +3112,7 @@ fn test_insert_entry_mismatching_type_signatures() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -3109,7 +3130,10 @@ fn test_insert_entry_unbound_variables() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -3149,7 +3173,7 @@ fn test_delete_entry_mismatching_type_signatures() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -3164,7 +3188,10 @@ fn test_delete_entry_unbound_variables() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -3208,7 +3235,7 @@ fn test_set_entry_mismatching_type_signatures() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::TypeError(_, _))); + assert!(matches!(*res.err, StaticCheckErrorKind::TypeError(_, _))); } } @@ -3226,7 +3253,10 @@ fn test_set_entry_unbound_variables() { ({case}))" ); let res = mem_type_check(&contract_src).unwrap_err(); - assert!(matches!(*res.err, CheckErrorKind::UndefinedVariable(_))); + assert!(matches!( + *res.err, + StaticCheckErrorKind::UndefinedVariable(_) + )); } } @@ -3342,7 +3372,7 @@ fn test_buff_negative_len() { (func 0x00)"; let res = mem_type_check(contract_src).unwrap_err(); - assert_eq!(*res.err, CheckErrorKind::ValueOutOfBounds); + assert_eq!(*res.err, StaticCheckErrorKind::ValueOutOfBounds); } #[test] @@ -3351,7 +3381,7 @@ fn test_string_ascii_negative_len() { (func \"\")"; let res = mem_type_check(contract_src).unwrap_err(); - assert_eq!(*res.err, CheckErrorKind::ValueOutOfBounds); + assert_eq!(*res.err, StaticCheckErrorKind::ValueOutOfBounds); } #[test] @@ -3360,7 +3390,7 @@ fn test_string_utf8_negative_len() { (func u\"\")"; let res = mem_type_check(contract_src).unwrap_err(); - assert_eq!(*res.err, CheckErrorKind::ValueOutOfBounds); + assert_eq!(*res.err, StaticCheckErrorKind::ValueOutOfBounds); } #[test] @@ -3404,7 +3434,7 @@ fn test_comparison_types() { r#"(>= "aaa" "aaa" "aaa")"#, ]; let bad_expected = [ - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::UnionTypeError( vec![ IntType, UIntType, @@ -3418,7 +3448,7 @@ fn test_comparison_types() { ], Box::new(PrincipalType), ), - CheckErrorKind::UnionTypeError( + StaticCheckErrorKind::UnionTypeError( vec![ IntType, UIntType, @@ -3434,7 +3464,7 @@ fn test_comparison_types() { ListTypeData::new_list(IntType, 3).unwrap(), ))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(UTF8( StringUTF8Length::try_from(3u32).unwrap(), )))), @@ -3442,7 +3472,7 @@ fn test_comparison_types() { BufferLength::try_from(2_u32).unwrap(), )))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(StringType(ASCII( BufferLength::try_from(3_u32).unwrap(), )))), @@ -3450,7 +3480,7 @@ fn test_comparison_types() { BufferLength::try_from(2_u32).unwrap(), ))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType( BufferLength::try_from(2_u32).unwrap(), ))), @@ -3458,7 +3488,7 @@ fn test_comparison_types() { StringUTF8Length::try_from(3u32).unwrap(), )))), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(SequenceType(BufferType( BufferLength::try_from(2_u32).unwrap(), ))), @@ -3466,9 +3496,9 @@ fn test_comparison_types() { BufferLength::try_from(3_u32).unwrap(), )))), ), - CheckErrorKind::IncorrectArgumentCount(2, 0), - CheckErrorKind::IncorrectArgumentCount(2, 1), - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 1), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ]; for (bad_test, expected) in bad.iter().zip(bad_expected.iter()) { @@ -3497,9 +3527,9 @@ fn test_principal_destruct() { r#"(principal-destruct? 0x22)"#, ]; let bad_expected = [ - CheckErrorKind::IncorrectArgumentCount(1, 2), - CheckErrorKind::IncorrectArgumentCount(1, 0), - CheckErrorKind::TypeError( + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::PrincipalType), Box::new(TypeSignature::BUFFER_1), ), @@ -3553,17 +3583,17 @@ fn test_principal_construct() { // Too few arguments, just has the `(buff 1)`. ( r#"(principal-construct? 0x22)"#, - CheckErrorKind::RequiresAtLeastArguments(2, 1), + StaticCheckErrorKind::RequiresAtLeastArguments(2, 1), ), // Too few arguments, just hs the `(buff 20)`. ( r#"(principal-construct? 0xfa6bf38ed557fe417333710d6033e9419391a320)"#, - CheckErrorKind::RequiresAtLeastArguments(2, 1), + StaticCheckErrorKind::RequiresAtLeastArguments(2, 1), ), // The first buffer is too long, should be `(buff 1)`. ( r#"(principal-construct? 0xfa6bf38ed557fe417333710d6033e9419391a320 0xfa6bf38ed557fe417333710d6033e9419391a320)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_1), Box::new(TypeSignature::BUFFER_20), ), @@ -3571,7 +3601,7 @@ fn test_principal_construct() { // The second buffer is too long, should be `(buff 20)`. ( r#"(principal-construct? 0x22 0xfa6bf38ed557fe417333710d6033e9419391a32009)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_20), Box::new(TypeSignature::SequenceType(SequenceSubtype::BufferType( 21_u32.try_into().unwrap(), @@ -3581,12 +3611,15 @@ fn test_principal_construct() { // `int` argument instead of `(buff 1)` for version. ( r#"(principal-construct? 22 0xfa6bf38ed557fe417333710d6033e9419391a320)"#, - CheckErrorKind::TypeError(Box::new(TypeSignature::BUFFER_1), Box::new(IntType.clone())), + StaticCheckErrorKind::TypeError( + Box::new(TypeSignature::BUFFER_1), + Box::new(IntType.clone()), + ), ), // `name` argument is too long ( r#"(principal-construct? 0x22 0xfa6bf38ed557fe417333710d6033e9419391a320 "foooooooooooooooooooooooooooooooooooooooo")"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::CONTRACT_NAME_STRING_ASCII_MAX), Box::new(SequenceType(StringType(ASCII(41_u32.try_into().unwrap())))), ), @@ -3594,7 +3627,7 @@ fn test_principal_construct() { // bad argument type for `name` ( r#"(principal-construct? 0x22 0xfa6bf38ed557fe417333710d6033e9419391a320 u123)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::CONTRACT_NAME_STRING_ASCII_MAX), Box::new(UIntType), ), @@ -3602,7 +3635,7 @@ fn test_principal_construct() { // too many arguments ( r#"(principal-construct? 0x22 0xfa6bf38ed557fe417333710d6033e9419391a320 "foo" "bar")"#, - CheckErrorKind::RequiresAtMostArguments(3, 4), + StaticCheckErrorKind::RequiresAtMostArguments(3, 4), ), ]; @@ -3656,7 +3689,7 @@ fn test_trait_args() { )"]; let contract_identifier = QualifiedContractIdentifier::transient(); - let bad_expected = [CheckErrorKind::IncompatibleTrait( + let bad_expected = [StaticCheckErrorKind::IncompatibleTrait( Box::new(TraitIdentifier { name: ClarityName::from("trait-foo"), contract_identifier: contract_identifier.clone(), @@ -3822,15 +3855,15 @@ fn test_list_arg(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ", ]; let bad_expected = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(TypeSignature::IntType, 3).unwrap()), Box::new(TypeSignature::list_of(TypeSignature::IntType, 4).unwrap()), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(TypeSignature::IntType, 3).unwrap()), Box::new(TypeSignature::list_of(TypeSignature::UIntType, 1).unwrap()), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(TypeSignature::IntType, 3).unwrap()), Box::new( TypeSignature::list_of( @@ -3842,15 +3875,15 @@ fn test_list_arg(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) ), ]; let bad_expected2 = [ - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::list_of(TypeSignature::IntType, 3).unwrap()), Box::new(TypeSignature::list_of(TypeSignature::IntType, 4).unwrap()), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::UIntType), ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::IntType), Box::new(TypeSignature::list_of(TypeSignature::NoType, 0).unwrap()), ), @@ -3962,17 +3995,17 @@ fn test_simple_bad_syntax_bindings() { "(from-consensus-buff? (tuple (a (string-ascii -12))) 0x00)", ]; let expected = [ - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_list(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_invalid_length(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_atom(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::eval_binding_not_list(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::eval_binding_invalid_length(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::eval_binding_not_atom(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::tuple_cons_not_list(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::tuple_cons_invalid_length(0)), - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::tuple_cons_not_atom(0)), - CheckErrorKind::ValueOutOfBounds, - CheckErrorKind::ValueOutOfBounds, + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_list(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_invalid_length(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::let_binding_not_atom(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::eval_binding_not_list(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::eval_binding_invalid_length(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::eval_binding_not_atom(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::tuple_cons_not_list(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::tuple_cons_invalid_length(0)), + StaticCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::tuple_cons_not_atom(0)), + StaticCheckErrorKind::ValueOutOfBounds, + StaticCheckErrorKind::ValueOutOfBounds, ]; for (bad_code, expected_err) in bad.iter().zip(expected.iter()) { @@ -3996,9 +4029,9 @@ fn test_nested_bad_type_signature_syntax_bindings() { ]; let expected = [ - CheckErrorKind::ValueOutOfBounds, - CheckErrorKind::InvalidTypeDescription, - CheckErrorKind::ValueOutOfBounds, + StaticCheckErrorKind::ValueOutOfBounds, + StaticCheckErrorKind::InvalidTypeDescription, + StaticCheckErrorKind::ValueOutOfBounds, ]; for (bad_code, expected_err) in bad.iter().zip(expected.iter()) { @@ -4023,21 +4056,21 @@ fn test_secp256k1_recover_type_check() { let bad_cases = [ ( "(secp256k1-recover?)".to_string(), - CheckErrorKind::IncorrectArgumentCount(2, 0), + StaticCheckErrorKind::IncorrectArgumentCount(2, 0), ), ( format!( "(secp256k1-recover? {} {} {})", SECP256_MESSAGE_HASH, SECP256K1_SIGNATURE, SECP256K1_PUBLIC_KEY ), - CheckErrorKind::IncorrectArgumentCount(2, 3), + StaticCheckErrorKind::IncorrectArgumentCount(2, 3), ), ( format!( "(secp256k1-recover? {} {})", SECP256K1_SIGNATURE, SECP256K1_SIGNATURE ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_32), Box::new(TypeSignature::BUFFER_65), ), @@ -4047,7 +4080,7 @@ fn test_secp256k1_recover_type_check() { "(secp256k1-recover? {} {})", SECP256_MESSAGE_HASH, SECP256K1_SIGNATURE_TOO_LONG ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_65), Box::new(buffer_66_type.clone()), ), @@ -4081,21 +4114,21 @@ fn test_secp256k1_verify_type_check() { let bad_cases = [ ( "(secp256k1-verify)".to_string(), - CheckErrorKind::IncorrectArgumentCount(3, 0), + StaticCheckErrorKind::IncorrectArgumentCount(3, 0), ), ( format!( "(secp256k1-verify {} {})", SECP256_MESSAGE_HASH, SECP256K1_SIGNATURE ), - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ), ( format!( "(secp256k1-verify {} {} {})", SECP256K1_SIGNATURE, SECP256K1_SIGNATURE, SECP256K1_PUBLIC_KEY ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_32), Box::new(TypeSignature::BUFFER_65), ), @@ -4105,7 +4138,7 @@ fn test_secp256k1_verify_type_check() { "(secp256k1-verify {} {} {})", SECP256_MESSAGE_HASH, SECP256K1_SIGNATURE_TOO_LONG, SECP256K1_PUBLIC_KEY ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_65), Box::new(buffer_66_type.clone()), ), @@ -4115,7 +4148,7 @@ fn test_secp256k1_verify_type_check() { "(secp256k1-verify {} {} {})", SECP256_MESSAGE_HASH, SECP256K1_SIGNATURE, SECP256K1_SIGNATURE ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_33), Box::new(TypeSignature::BUFFER_65), ), @@ -4144,21 +4177,21 @@ fn test_secp256r1_verify_type_check() { let bad_cases = [ ( "(secp256r1-verify)".to_string(), - CheckErrorKind::IncorrectArgumentCount(3, 0), + StaticCheckErrorKind::IncorrectArgumentCount(3, 0), ), ( format!( "(secp256r1-verify {} {})", SECP256_MESSAGE_HASH, SECP256R1_SIGNATURE ), - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ), ( format!( "(secp256r1-verify {} {} {})", SECP256K1_SIGNATURE, SECP256R1_SIGNATURE, SECP256K1_PUBLIC_KEY ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_32), Box::new(TypeSignature::BUFFER_65), ), @@ -4168,7 +4201,7 @@ fn test_secp256r1_verify_type_check() { "(secp256r1-verify {} {} {})", SECP256_MESSAGE_HASH, SECP256K1_SIGNATURE, SECP256K1_PUBLIC_KEY ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_64), Box::new(TypeSignature::BUFFER_65), ), @@ -4178,7 +4211,7 @@ fn test_secp256r1_verify_type_check() { "(secp256r1-verify {} {} {})", SECP256_MESSAGE_HASH, SECP256R1_SIGNATURE, SECP256K1_SIGNATURE ), - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( Box::new(TypeSignature::BUFFER_33), Box::new(TypeSignature::BUFFER_65), ), diff --git a/clarity/src/vm/analysis/type_checker/v2_1/tests/post_conditions.rs b/clarity/src/vm/analysis/type_checker/v2_1/tests/post_conditions.rs index 85ff9b1fe2f..ad41e160f72 100644 --- a/clarity/src/vm/analysis/type_checker/v2_1/tests/post_conditions.rs +++ b/clarity/src/vm/analysis/type_checker/v2_1/tests/post_conditions.rs @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use clarity_types::errors::CheckErrorKind; +use clarity_types::errors::analysis::StaticCheckErrorKind; use clarity_types::representations::MAX_STRING_LEN; use clarity_types::types::TypeSignature; use stacks_common::types::StacksEpochId; @@ -70,22 +70,22 @@ fn test_restrict_assets(#[case] version: ClarityVersion, #[case] epoch: StacksEp // with-all-assets-unsafe ( "(restrict-assets? tx-sender ((with-all-assets-unsafe)) true)", - CheckErrorKind::WithAllAllowanceNotAllowed, + StaticCheckErrorKind::WithAllAllowanceNotAllowed, ), // no asset-owner ( "(restrict-assets? ((with-stx u5000)) true)", - CheckErrorKind::RequiresAtLeastArguments(3, 2), + StaticCheckErrorKind::RequiresAtLeastArguments(3, 2), ), // no asset-owner, 3 args ( "(restrict-assets? ((with-stx u5000)) true true)", - CheckErrorKind::NonFunctionApplication, + StaticCheckErrorKind::NonFunctionApplication, ), // bad asset-owner type ( "(restrict-assets? u100 ((with-stx u5000)) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::PrincipalType.into(), TypeSignature::UIntType.into(), ), @@ -93,57 +93,57 @@ fn test_restrict_assets(#[case] version: ClarityVersion, #[case] epoch: StacksEp // no allowances ( "(restrict-assets? tx-sender true)", - CheckErrorKind::RequiresAtLeastArguments(3, 2), + StaticCheckErrorKind::RequiresAtLeastArguments(3, 2), ), // allowance not in list ( "(restrict-assets? tx-sender (with-stx u1) true)", - CheckErrorKind::ExpectedListApplication, + StaticCheckErrorKind::ExpectedListApplication, ), // other value in place of allowance list ( "(restrict-assets? tx-sender u1 true)", - CheckErrorKind::ExpectedListOfAllowances("restrict-assets?".into(), 2), + StaticCheckErrorKind::ExpectedListOfAllowances("restrict-assets?".into(), 2), ), // non-allowance in allowance list ( "(restrict-assets? tx-sender (u1) true)", - CheckErrorKind::ExpectedListApplication, + StaticCheckErrorKind::ExpectedListApplication, ), // empty list in allowance list ( "(restrict-assets? tx-sender (()) true)", - CheckErrorKind::NonFunctionApplication, + StaticCheckErrorKind::NonFunctionApplication, ), // list with literal in allowance list ( "(restrict-assets? tx-sender ((123)) true)", - CheckErrorKind::NonFunctionApplication, + StaticCheckErrorKind::NonFunctionApplication, ), // non-allowance function in allowance list ( "(restrict-assets? tx-sender ((foo)) true)", - CheckErrorKind::UnknownFunction("foo".into()), + StaticCheckErrorKind::UnknownFunction("foo".into()), ), // no body expressions ( "(restrict-assets? tx-sender ((with-stx u5000)))", - CheckErrorKind::RequiresAtLeastArguments(3, 2), + StaticCheckErrorKind::RequiresAtLeastArguments(3, 2), ), // unhandled response in only body expression ( "(restrict-assets? tx-sender ((with-stx u1000)) (err u1))", - CheckErrorKind::UncheckedIntermediaryResponses, + StaticCheckErrorKind::UncheckedIntermediaryResponses, ), // unhandled response in last body expression ( "(restrict-assets? tx-sender ((with-stx u1000)) true (err u1))", - CheckErrorKind::UncheckedIntermediaryResponses, + StaticCheckErrorKind::UncheckedIntermediaryResponses, ), // unhandled response in other body expression ( "(restrict-assets? tx-sender ((with-stx u1000)) (err u1) true)", - CheckErrorKind::UncheckedIntermediaryResponses, + StaticCheckErrorKind::UncheckedIntermediaryResponses, ), // too many allowances ( @@ -153,7 +153,7 @@ fn test_restrict_assets(#[case] version: ClarityVersion, #[case] epoch: StacksEp .collect::>() .join(" ") ), - CheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, 130), + StaticCheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, 130), ), // different error types thrown from body expressions ( @@ -164,7 +164,7 @@ fn test_restrict_assets(#[case] version: ClarityVersion, #[case] epoch: StacksEp u0 ) )", - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( TypeSignature::new_response(TypeSignature::NoType, TypeSignature::UIntType) .unwrap() .into(), @@ -179,7 +179,7 @@ fn test_restrict_assets(#[case] version: ClarityVersion, #[case] epoch: StacksEp if version < ClarityVersion::Clarity4 { // restrict-assets? is only available in Clarity 4+ assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -198,7 +198,7 @@ fn test_restrict_assets(#[case] version: ClarityVersion, #[case] epoch: StacksEp if version < ClarityVersion::Clarity4 { // restrict-assets? is only available in Clarity 4+ assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -252,67 +252,67 @@ fn test_as_contract(#[case] version: ClarityVersion, #[case] epoch: StacksEpochI // no allowances ( "(as-contract? true)", - CheckErrorKind::RequiresAtLeastArguments(2, 1), + StaticCheckErrorKind::RequiresAtLeastArguments(2, 1), ), // allowance not in list ( "(as-contract? (with-stx u1) true)", - CheckErrorKind::ExpectedListApplication, + StaticCheckErrorKind::ExpectedListApplication, ), // other value in place of allowance list ( "(as-contract? u1 true)", - CheckErrorKind::ExpectedListOfAllowances("as-contract?".into(), 1), + StaticCheckErrorKind::ExpectedListOfAllowances("as-contract?".into(), 1), ), // non-allowance in allowance list ( "(as-contract? (u1) true)", - CheckErrorKind::ExpectedListApplication, + StaticCheckErrorKind::ExpectedListApplication, ), // empty list in allowance list ( "(as-contract? (()) true)", - CheckErrorKind::NonFunctionApplication, + StaticCheckErrorKind::NonFunctionApplication, ), // list with literal in allowance list ( "(as-contract? ((123)) true)", - CheckErrorKind::NonFunctionApplication, + StaticCheckErrorKind::NonFunctionApplication, ), // non-allowance function in allowance list ( "(as-contract? ((foo)) true)", - CheckErrorKind::UnknownFunction("foo".into()), + StaticCheckErrorKind::UnknownFunction("foo".into()), ), // no body expressions ( "(as-contract? ((with-stx u5000)))", - CheckErrorKind::RequiresAtLeastArguments(2, 1), + StaticCheckErrorKind::RequiresAtLeastArguments(2, 1), ), // unhandled response in only body expression ( "(as-contract? ((with-stx u1000)) (err u1))", - CheckErrorKind::UncheckedIntermediaryResponses, + StaticCheckErrorKind::UncheckedIntermediaryResponses, ), // unhandled response in last body expression ( "(as-contract? ((with-stx u1000)) true (err u1))", - CheckErrorKind::UncheckedIntermediaryResponses, + StaticCheckErrorKind::UncheckedIntermediaryResponses, ), // unhandled response in other body expression ( "(as-contract? ((with-stx u1000)) (err u1) true)", - CheckErrorKind::UncheckedIntermediaryResponses, + StaticCheckErrorKind::UncheckedIntermediaryResponses, ), // other allowances together with with-all-assets-unsafe (first) ( "(as-contract? ((with-all-assets-unsafe) (with-stx u1000)) true)", - CheckErrorKind::WithAllAllowanceNotAlone, + StaticCheckErrorKind::WithAllAllowanceNotAlone, ), // other allowances together with with-all-assets-unsafe (second) ( "(as-contract? ((with-stx u1000) (with-all-assets-unsafe)) true)", - CheckErrorKind::WithAllAllowanceNotAlone, + StaticCheckErrorKind::WithAllAllowanceNotAlone, ), // too many allowances ( @@ -322,7 +322,7 @@ fn test_as_contract(#[case] version: ClarityVersion, #[case] epoch: StacksEpochI .collect::>() .join(" ") ), - CheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, 130), + StaticCheckErrorKind::TooManyAllowances(MAX_ALLOWANCES, 130), ), // different error types thrown from body expressions ( @@ -333,7 +333,7 @@ fn test_as_contract(#[case] version: ClarityVersion, #[case] epoch: StacksEpochI u0 ) )", - CheckErrorKind::ReturnTypesMustMatch( + StaticCheckErrorKind::ReturnTypesMustMatch( TypeSignature::new_response(TypeSignature::NoType, TypeSignature::UIntType) .unwrap() .into(), @@ -348,7 +348,7 @@ fn test_as_contract(#[case] version: ClarityVersion, #[case] epoch: StacksEpochI if version < ClarityVersion::Clarity4 { // as-contract? is only available in Clarity 4+ assert_eq!( - CheckErrorKind::UnknownFunction("as-contract?".to_string()), + StaticCheckErrorKind::UnknownFunction("as-contract?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -367,7 +367,7 @@ fn test_as_contract(#[case] version: ClarityVersion, #[case] epoch: StacksEpochI if version < ClarityVersion::Clarity4 { // as-contract? is only available in Clarity 4+ assert_eq!( - CheckErrorKind::UnknownFunction("as-contract?".to_string()), + StaticCheckErrorKind::UnknownFunction("as-contract?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -416,17 +416,17 @@ fn test_with_stx_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack // no arguments ( "(restrict-assets? tx-sender ((with-stx)) true)", - CheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), ), // too many arguments ( "(restrict-assets? tx-sender ((with-stx u1000 u2000)) true)", - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ), // wrong type - string instead of uint ( r#"(restrict-assets? tx-sender ((with-stx "1000")) true)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::UIntType.into(), TypeSignature::new_ascii_type_checked(4).into(), ), @@ -434,7 +434,7 @@ fn test_with_stx_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack // wrong type - int instead of uint ( "(restrict-assets? tx-sender ((with-stx 1000)) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::UIntType.into(), TypeSignature::IntType.into(), ), @@ -444,7 +444,7 @@ fn test_with_stx_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack for (code, expected_type) in &good { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -462,7 +462,7 @@ fn test_with_stx_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack for (code, expected_err) in &bad { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -526,27 +526,27 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks // no arguments ( "(restrict-assets? tx-sender ((with-ft)) true)", - CheckErrorKind::IncorrectArgumentCount(3, 0), + StaticCheckErrorKind::IncorrectArgumentCount(3, 0), ), // one argument ( "(restrict-assets? tx-sender ((with-ft .token)) true)", - CheckErrorKind::IncorrectArgumentCount(3, 1), + StaticCheckErrorKind::IncorrectArgumentCount(3, 1), ), // two arguments ( r#"(restrict-assets? tx-sender ((with-ft .token "token-name")) true)"#, - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ), // too many arguments ( r#"(restrict-assets? tx-sender ((with-ft .token "token-name" u1000 u2000)) true)"#, - CheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), ), // wrong type for contract-id - uint instead of principal ( r#"(restrict-assets? tx-sender ((with-ft u123 "token-name" u1000)) true)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::PrincipalType.into(), TypeSignature::UIntType.into(), ), @@ -554,7 +554,7 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks // wrong type for token-name - uint instead of string ( "(restrict-assets? tx-sender ((with-ft .token u123 u1000)) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::new_ascii_type_checked(MAX_STRING_LEN as u32).into(), TypeSignature::UIntType.into(), ), @@ -562,7 +562,7 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks // wrong type for amount - string instead of uint ( r#"(restrict-assets? tx-sender ((with-ft .token "token-name" "1000")) true)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::UIntType.into(), TypeSignature::new_ascii_type_checked(4).into(), ), @@ -570,7 +570,7 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks // wrong type for amount - int instead of uint ( r#"(restrict-assets? tx-sender ((with-ft .token "token-name" 1000)) true)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::UIntType.into(), TypeSignature::IntType.into(), ), @@ -578,7 +578,7 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks // too long token name (longer than 128 chars) ( "(restrict-assets? tx-sender ((with-ft .token \"this-token-name-is-way-too-long-to-be-valid-because-it-has-more-than-one-hundred-and-twenty-eight-characters-in-it-so-it-is-not-a-valid-token-name\" u1000)) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::new_ascii_type_checked(MAX_STRING_LEN as u32).into(), TypeSignature::new_ascii_type_checked(146u32).into(), ), @@ -588,7 +588,7 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks for (code, expected_type) in &good { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -606,7 +606,7 @@ fn test_with_ft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stacks for (code, expected_err) in &bad { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -680,27 +680,27 @@ fn test_with_nft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack // no arguments ( "(restrict-assets? tx-sender ((with-nft)) true)", - CheckErrorKind::IncorrectArgumentCount(3, 0), + StaticCheckErrorKind::IncorrectArgumentCount(3, 0), ), // one argument ( "(restrict-assets? tx-sender ((with-nft .token)) true)", - CheckErrorKind::IncorrectArgumentCount(3, 1), + StaticCheckErrorKind::IncorrectArgumentCount(3, 1), ), // two arguments ( r#"(restrict-assets? tx-sender ((with-nft .token "token-name")) true)"#, - CheckErrorKind::IncorrectArgumentCount(3, 2), + StaticCheckErrorKind::IncorrectArgumentCount(3, 2), ), // too many arguments ( r#"(restrict-assets? tx-sender ((with-nft .token "token-name" (list u123) (list u456))) true)"#, - CheckErrorKind::IncorrectArgumentCount(3, 4), + StaticCheckErrorKind::IncorrectArgumentCount(3, 4), ), // wrong type for contract-id - uint instead of principal ( r#"(restrict-assets? tx-sender ((with-nft u123 "token-name" (list u456))) true)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::PrincipalType.into(), TypeSignature::UIntType.into(), ), @@ -708,7 +708,7 @@ fn test_with_nft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack // wrong type for token-name - uint instead of string ( "(restrict-assets? tx-sender ((with-nft .token u123 (list u456))) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::new_ascii_type_checked(MAX_STRING_LEN as u32).into(), TypeSignature::UIntType.into(), ), @@ -716,7 +716,7 @@ fn test_with_nft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack // too long token name (longer than 128 chars) ( "(restrict-assets? tx-sender ((with-ft .token \"this-token-name-is-way-too-long-to-be-valid-because-it-has-more-than-one-hundred-and-twenty-eight-characters-in-it-so-it-is-not-a-valid-token-name\" u1000)) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::new_ascii_type_checked(MAX_STRING_LEN as u32).into(), TypeSignature::new_ascii_type_checked(146u32).into(), ), @@ -729,14 +729,14 @@ fn test_with_nft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack .collect::>() .join(" ") ), - CheckErrorKind::MaxIdentifierLengthExceeded(MAX_NFT_IDENTIFIERS, 130), + StaticCheckErrorKind::MaxIdentifierLengthExceeded(MAX_NFT_IDENTIFIERS, 130), ), ]; for (code, expected_type) in &good { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -754,7 +754,7 @@ fn test_with_nft_allowance(#[case] version: ClarityVersion, #[case] epoch: Stack for (code, expected_err) in &bad { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -798,17 +798,17 @@ fn test_with_stacking_allowance(#[case] version: ClarityVersion, #[case] epoch: // no arguments ( "(restrict-assets? tx-sender ((with-stacking)) true)", - CheckErrorKind::IncorrectArgumentCount(1, 0), + StaticCheckErrorKind::IncorrectArgumentCount(1, 0), ), // too many arguments ( "(restrict-assets? tx-sender ((with-stacking u1000 u2000)) true)", - CheckErrorKind::IncorrectArgumentCount(1, 2), + StaticCheckErrorKind::IncorrectArgumentCount(1, 2), ), // wrong type - string instead of uint ( r#"(restrict-assets? tx-sender ((with-stacking "1000")) true)"#, - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::UIntType.into(), TypeSignature::new_ascii_type_checked(4).into(), ), @@ -816,7 +816,7 @@ fn test_with_stacking_allowance(#[case] version: ClarityVersion, #[case] epoch: // wrong type - int instead of uint ( "(restrict-assets? tx-sender ((with-stacking 1000)) true)", - CheckErrorKind::TypeError( + StaticCheckErrorKind::TypeError( TypeSignature::UIntType.into(), TypeSignature::IntType.into(), ), @@ -826,7 +826,7 @@ fn test_with_stacking_allowance(#[case] version: ClarityVersion, #[case] epoch: for (code, expected_type) in &good { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -844,7 +844,7 @@ fn test_with_stacking_allowance(#[case] version: ClarityVersion, #[case] epoch: for (code, expected_err) in &bad { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -881,19 +881,19 @@ fn test_with_all_assets_unsafe_allowance( // with-all-assets-unsafe in restrict-assets? (not allowed) ( "(restrict-assets? tx-sender ((with-all-assets-unsafe)) true)", - CheckErrorKind::WithAllAllowanceNotAllowed, + StaticCheckErrorKind::WithAllAllowanceNotAllowed, ), // with-all-assets-unsafe with arguments (should take 0) ( "(restrict-assets? tx-sender ((with-all-assets-unsafe u123)) true)", - CheckErrorKind::IncorrectArgumentCount(0, 1), + StaticCheckErrorKind::IncorrectArgumentCount(0, 1), ), ]; for (code, expected_type) in &good { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("as-contract?".to_string()), + StaticCheckErrorKind::UnknownFunction("as-contract?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, @@ -911,7 +911,7 @@ fn test_with_all_assets_unsafe_allowance( for (code, expected_err) in &bad { if version < ClarityVersion::Clarity4 { assert_eq!( - CheckErrorKind::UnknownFunction("restrict-assets?".to_string()), + StaticCheckErrorKind::UnknownFunction("restrict-assets?".to_string()), *type_check_helper_version(code, version, epoch) .unwrap_err() .err, diff --git a/clarity/src/vm/analysis/types.rs b/clarity/src/vm/analysis/types.rs index 1be8f15918e..58f08e8de95 100644 --- a/clarity/src/vm/analysis/types.rs +++ b/clarity/src/vm/analysis/types.rs @@ -22,7 +22,7 @@ use stacks_common::types::StacksEpochId; use crate::vm::analysis::analysis_db::AnalysisDatabase; use crate::vm::analysis::contract_interface_builder::ContractInterface; -use crate::vm::analysis::errors::{CheckErrorKind, StaticCheckError}; +use crate::vm::analysis::errors::{StaticCheckError, StaticCheckErrorKind}; use crate::vm::analysis::type_checker::contexts::TypeMap; use crate::vm::costs::LimitedCostTracker; use crate::vm::types::signatures::FunctionSignature; @@ -242,7 +242,7 @@ impl ContractAnalysis { | (None, Some(FunctionType::Fixed(func))) => { let args_sig = func.args.iter().map(|a| a.signature.clone()).collect(); if !expected_sig.check_args_trait_compliance(epoch, args_sig)? { - return Err(CheckErrorKind::BadTraitImplementation( + return Err(StaticCheckErrorKind::BadTraitImplementation( trait_name, func_name.to_string(), ) @@ -250,7 +250,7 @@ impl ContractAnalysis { } if !expected_sig.returns.admits_type(epoch, &func.returns)? { - return Err(CheckErrorKind::BadTraitImplementation( + return Err(StaticCheckErrorKind::BadTraitImplementation( trait_name, func_name.to_string(), ) @@ -258,7 +258,7 @@ impl ContractAnalysis { } } (_, _) => { - return Err(CheckErrorKind::BadTraitImplementation( + return Err(StaticCheckErrorKind::BadTraitImplementation( trait_name, func_name.to_string(), ) diff --git a/clarity/src/vm/clarity.rs b/clarity/src/vm/clarity.rs index 0bbd6a7d0a6..7cdb1f2a016 100644 --- a/clarity/src/vm/clarity.rs +++ b/clarity/src/vm/clarity.rs @@ -2,7 +2,9 @@ use std::fmt; use stacks_common::types::StacksEpochId; -use crate::vm::analysis::{AnalysisDatabase, CheckErrorKind, ContractAnalysis, StaticCheckError}; +use crate::vm::analysis::{ + AnalysisDatabase, CheckErrorKind, ContractAnalysis, StaticCheckError, StaticCheckErrorKind, +}; use crate::vm::ast::errors::{ParseError, ParseErrorKind}; use crate::vm::ast::ContractAST; use crate::vm::contexts::{AssetMap, Environment, OwnedEnvironment}; @@ -79,14 +81,14 @@ impl std::error::Error for ClarityError { impl From for ClarityError { fn from(e: StaticCheckError) -> Self { match *e.err { - CheckErrorKind::CostOverflow => { + StaticCheckErrorKind::CostOverflow => { ClarityError::CostError(ExecutionCost::max_value(), ExecutionCost::max_value()) } - CheckErrorKind::CostBalanceExceeded(a, b) => ClarityError::CostError(a, b), - CheckErrorKind::MemoryBalanceExceeded(_a, _b) => { + StaticCheckErrorKind::CostBalanceExceeded(a, b) => ClarityError::CostError(a, b), + StaticCheckErrorKind::MemoryBalanceExceeded(_a, _b) => { ClarityError::CostError(ExecutionCost::max_value(), ExecutionCost::max_value()) } - CheckErrorKind::ExecutionTimeExpired => { + StaticCheckErrorKind::ExecutionTimeExpired => { ClarityError::CostError(ExecutionCost::max_value(), ExecutionCost::max_value()) } _ => ClarityError::StaticCheck(e), @@ -297,13 +299,13 @@ pub trait TransactionConnection: ClarityConnection { Ok(_) => { let result = db .commit() - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")).into()); + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")).into()); (cost_tracker, result) } Err(e) => { let result = db .roll_back() - .map_err(|e| CheckErrorKind::Expects(format!("{e:?}")).into()); + .map_err(|e| StaticCheckErrorKind::Expects(format!("{e:?}")).into()); if result.is_err() { (cost_tracker, result) } else { diff --git a/clarity/src/vm/contexts.rs b/clarity/src/vm/contexts.rs index e0d664a0cf9..b2ea58e5f0d 100644 --- a/clarity/src/vm/contexts.rs +++ b/clarity/src/vm/contexts.rs @@ -287,37 +287,52 @@ impl AssetMap { } } - // This will get the next amount for a (principal, stx) entry in the stx table. + /// This will get the next amount for a (principal, stx) entry in the stx table. fn get_next_stx_amount( &self, principal: &PrincipalData, amount: u128, ) -> Result { + // `ArithmeticOverflow` in this function is **unreachable** in normal Clarity execution because: + // - Every `stx-transfer?` or `stx-burn?` is validated against the sender’s + // **unlocked balance** before being queued in `AssetMap`. + // - The unlocked balance is a subset of `stx-liquid-supply`. + // - All balance updates in Clarity use the `+` operator **before** logging to `AssetMap`. + // - `+` performs `checked_add` and returns `RuntimeError::ArithmeticOverflow` **first**. let current_amount = self.stx_map.get(principal).unwrap_or(&0); current_amount .checked_add(amount) .ok_or(RuntimeError::ArithmeticOverflow.into()) } - // This will get the next amount for a (principal, stx) entry in the burn table. + /// This will get the next amount for a (principal, stx) entry in the burn table. fn get_next_stx_burn_amount( &self, principal: &PrincipalData, amount: u128, ) -> Result { + // `ArithmeticOverflow` in this function is **unreachable** in normal Clarity execution because: + // - Every `stx-burn?` is validated against the sender’s **unlocked balance** first. + // - Unlocked balance is a subset of `stx-liquid-supply`, which is <= `u128::MAX`. + // - All balance updates in Clarity use the `+` operator **before** logging to `AssetMap`. + // - `+` performs `checked_add` and returns `RuntimeError::ArithmeticOverflow` **first**. let current_amount = self.burn_map.get(principal).unwrap_or(&0); current_amount .checked_add(amount) .ok_or(RuntimeError::ArithmeticOverflow.into()) } - // This will get the next amount for a (principal, asset) entry in the asset table. + /// This will get the next amount for a (principal, asset) entry in the asset table. fn get_next_amount( &self, principal: &PrincipalData, asset: &AssetIdentifier, amount: u128, ) -> Result { + // `ArithmeticOverflow` in this function is **unreachable** in normal Clarity execution because: + // - The inner transaction must have **partially succeeded** to log any assets. + // - All balance updates in Clarity use the `+` operator **before** logging to `AssetMap`. + // - `+` performs `checked_add` and returns `RuntimeError::ArithmeticOverflow` **first**. let current_amount = self .token_map .get(principal) @@ -1012,6 +1027,13 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> { .expressions; if parsed.is_empty() { + // `TypeParseFailure` is **unreachable** in standard Clarity VM execution. + // - `eval_read_only` parses a raw program string into an AST. + // - Any empty or invalid program would be rejected at publish/deploy time or earlier parsing stages. + // - Therefore, `parsed.is_empty()` cannot occur for programs originating from a valid contract + // or transaction. + // - Only malformed input fed directly to this internal method (e.g., in unit tests or + // artificial VM invocations) can trigger this error. return Err(RuntimeError::TypeParseFailure( "Expected a program of at least length 1".to_string(), ) @@ -1061,6 +1083,12 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> { .expressions; if parsed.is_empty() { + // `TypeParseFailure` is **unreachable** in standard Clarity VM execution. + // - `eval_raw` parses a raw program string into an AST. + // - All programs deployed or called via the standard VM go through static parsing and validation first. + // - Any empty or invalid program would be rejected at publish/deploy time or earlier parsing stages. + // - Therefore, `parsed.is_empty()` cannot occur for a program that originates from a valid Clarity contract or transaction. + // Only malformed input directly fed to this internal method (e.g., in unit tests) can trigger this error. return Err(RuntimeError::TypeParseFailure( "Expected a program of at least length 1".to_string(), ) @@ -1426,9 +1454,9 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> { batch.events.push(event); *total_size = total_size.saturating_add(size.into()); if *total_size >= MAX_EVENTS_BATCH { - return Err(VmInternalError::Expect(format!( - "Event batch grew too large during execution" - )) + return Err(VmInternalError::Expect( + "Event batch grew too large during execution".to_string(), + ) .into()); } } @@ -1970,6 +1998,14 @@ impl<'a> LocalContext<'a> { pub fn extend(&'a self) -> Result, VmExecutionError> { if self.depth >= MAX_CONTEXT_DEPTH { + // `MaxContextDepthReached` in this function is **unreachable** in normal Clarity execution because: + // - Every function call in Clarity increments both the call stack depth and the local context depth. + // - The VM enforces `MAX_CALL_STACK_DEPTH` (currently 64) **before** `MAX_CONTEXT_DEPTH` (256). + // - This means no contract can create more than 64 nested function calls, preventing context depth from reaching 256. + // - Nested expressions (`let`, `begin`, `if`, etc.) increment context depth, but the Clarity parser enforces + // `ExpressionStackDepthTooDeep` long before MAX_CONTEXT_DEPTH nested contexts can be written. + // - As a result, `MaxContextDepthReached` can only occur in artificial Rust-level tests calling `LocalContext::extend()`, + // not in deployed contract execution. Err(RuntimeError::MaxContextDepthReached.into()) } else { Ok(LocalContext { @@ -2081,12 +2117,16 @@ impl CallStack { #[cfg(test)] mod test { + use stacks_common::consts::CHAIN_ID_TESTNET; use stacks_common::types::chainstate::StacksAddress; use stacks_common::util::hash::Hash160; use super::*; use crate::vm::callables::DefineType; - use crate::vm::tests::{test_epochs, tl_env_factory, TopLevelMemoryEnvironmentGenerator}; + use crate::vm::database::MemoryBackingStore; + use crate::vm::tests::{ + test_clarity_versions, test_epochs, tl_env_factory, TopLevelMemoryEnvironmentGenerator, + }; use crate::vm::types::signatures::CallableSubtype; use crate::vm::types::StandardPrincipalData; @@ -2322,4 +2362,158 @@ mod test { TypeSignature::CallableType(CallableSubtype::Trait(trait_id)) ); } + + #[test] + fn asset_map_arithmetic_overflows() { + let a_contract_id = QualifiedContractIdentifier::local("a").unwrap(); + let b_contract_id = QualifiedContractIdentifier::local("b").unwrap(); + let p1 = PrincipalData::Contract(a_contract_id.clone()); + let p2 = PrincipalData::Contract(b_contract_id.clone()); + let t1 = AssetIdentifier { + contract_identifier: a_contract_id, + asset_name: "a".into(), + }; + + let mut am1 = AssetMap::new(); + let mut am2 = AssetMap::new(); + + // Token transfer: add u128::MAX followed by 1 to overflow + am1.add_token_transfer(&p1, t1.clone(), u128::MAX).unwrap(); + assert!(matches!( + am1.add_token_transfer(&p1, t1.clone(), 1).unwrap_err(), + VmExecutionError::Runtime(RuntimeError::ArithmeticOverflow, _) + )); + + // STX burn: add u128::MAX followed by 1 to overflow + am1.add_stx_burn(&p1, u128::MAX).unwrap(); + assert!(matches!( + am1.add_stx_burn(&p1, 1).unwrap_err(), + VmExecutionError::Runtime(RuntimeError::ArithmeticOverflow, _) + )); + + // STX transfer: add u128::MAX followed by 1 to overflow + am1.add_stx_transfer(&p1, u128::MAX).unwrap(); + assert!(matches!( + am1.add_stx_transfer(&p1, 1).unwrap_err(), + VmExecutionError::Runtime(RuntimeError::ArithmeticOverflow, _) + )); + + // commit_other: merge two maps where sum exceeds u128::MAX + am2.add_token_transfer(&p1, t1.clone(), u128::MAX).unwrap(); + assert!(matches!( + am1.commit_other(am2).unwrap_err(), + VmExecutionError::Runtime(RuntimeError::ArithmeticOverflow, _) + )); + } + + #[test] + fn eval_raw_empty_program() { + // Setup environment + let mut tl_env_factory = tl_env_factory(); + let mut env = tl_env_factory.get_env(StacksEpochId::latest()); + + // Call eval_read_only with an empty program + let program = ""; // empty program triggers parsed.is_empty() + let err = env.eval_raw(program).unwrap_err(); + + assert!( + matches!( + err, + VmExecutionError::Runtime(RuntimeError::TypeParseFailure(msg), _) if msg.contains("Expected a program of at least length 1")), + "Expected a type parse failure" + ); + } + + #[test] + fn eval_read_only_empty_program() { + // Setup environment + let mut tl_env_factory = tl_env_factory(); + let mut env = tl_env_factory.get_env(StacksEpochId::latest()); + + // Construct a dummy contract context + let contract_id = QualifiedContractIdentifier::local("dummy-contract").unwrap(); + + // Call eval_read_only with an empty program + let program = ""; // empty program triggers parsed.is_empty() + let err = env.eval_read_only(&contract_id, program).unwrap_err(); + + assert!( + matches!( + err, + VmExecutionError::Runtime(RuntimeError::TypeParseFailure(msg), _) if msg.contains("Expected a program of at least length 1")), + "Expected a type parse failure" + ); + } + + #[test] + fn max_context_depth_exceeded() { + let root = LocalContext { + function_context: None, + parent: None, + callable_contracts: HashMap::new(), + variables: HashMap::new(), + depth: MAX_CONTEXT_DEPTH - 1, + }; + // We should be able to extend once successfully. + let result = root.extend().unwrap(); + // We are now at the MAX_CONTEXT_DEPTH and should fail. + let result_2 = result.extend(); + assert!(matches!( + result_2, + Err(VmExecutionError::Runtime( + RuntimeError::MaxContextDepthReached, + _ + )) + )); + } + + #[apply(test_clarity_versions)] + fn vm_initialize_contract_already_exists( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + // --- Setup VM --- + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + StacksEpochId::Epoch21, // any modern epoch + ); + + let mut call_stack = CallStack::new(); + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let contract_id = QualifiedContractIdentifier::local("dup").unwrap(); + + let contract_src = "(define-public (ping) (ok u1))"; + + let ast = ast::build_ast(&contract_id, contract_src, &mut env, version, epoch).unwrap(); + + // First initialization succeeds + env.initialize_contract_from_ast(contract_id.clone(), version, &ast, contract_src) + .unwrap(); + + // Second initialization hits ContractAlreadyExists + let err = env + .initialize_contract_from_ast(contract_id.clone(), version, &ast, contract_src) + .unwrap_err(); + + assert!(matches!( + err, + VmExecutionError::Unchecked(CheckErrorKind::ContractAlreadyExists(_)) + )); + } } diff --git a/clarity/src/vm/costs/cost_functions.rs b/clarity/src/vm/costs/cost_functions.rs index 0f59e92232d..9621d9cc8bf 100644 --- a/clarity/src/vm/costs/cost_functions.rs +++ b/clarity/src/vm/costs/cost_functions.rs @@ -171,6 +171,10 @@ pub fn linear(n: u64, a: u64, b: u64) -> u64 { } pub fn logn(n: u64, a: u64, b: u64) -> Result { if n < 1 { + // This branch is **unreachable** in standard Clarity execution: + // - `logn` is only called from tuple access operations. + // - Tuples must have at least one field, so `n >= 1` is always true (this is enforced via static checks). + // - Hitting this branch requires manual VM manipulation or internal test harnesses. return Err(VmExecutionError::Runtime( RuntimeError::Arithmetic("log2 must be passed a positive integer".to_string()), Some(vec![]), diff --git a/clarity/src/vm/coverage.rs b/clarity/src/vm/coverage.rs deleted file mode 100644 index afbf45a87aa..00000000000 --- a/clarity/src/vm/coverage.rs +++ /dev/null @@ -1,253 +0,0 @@ -use std::collections::{BTreeMap, HashMap, HashSet}; -use std::fs::File; -use std::io::Write; - -use super::functions::define::DefineFunctionsParsed; -use super::EvalHook; -use crate::vm::types::QualifiedContractIdentifier; -use crate::vm::SymbolicExpression; - -pub struct CoverageReporter { - executed_lines: HashMap>, -} - -#[derive(Serialize, Deserialize)] -struct ContractFileInfo { - contract: String, - src_file: String, - executable_lines: Vec, -} - -#[derive(Serialize, Deserialize)] -struct CoverageFileInfo { - coverage: HashMap>, -} - -impl Default for CoverageReporter { - fn default() -> Self { - Self::new() - } -} - -impl CoverageReporter { - pub fn new() -> CoverageReporter { - CoverageReporter { - executed_lines: HashMap::new(), - } - } - - #[cfg(not(feature = "developer-mode"))] - pub fn report_eval( - &mut self, - _expr: &SymbolicExpression, - _contract: &QualifiedContractIdentifier, - ) { - } - - #[cfg(feature = "developer-mode")] - pub fn report_eval( - &mut self, - expr: &SymbolicExpression, - contract: &QualifiedContractIdentifier, - ) { - if expr.match_list().is_some() { - // don't count the whole list expression: wait until we've eval'ed the - // list components - return; - } - - // other sexps can only span 1 line - let line_executed = expr.span.start_line; - - if let Some(execution_map_contract) = self.executed_lines.get_mut(contract) { - if let Some(execution_count) = execution_map_contract.get_mut(&line_executed) { - *execution_count += 1; - } else { - execution_map_contract.insert(line_executed, 1); - } - } else { - let mut execution_map_contract = HashMap::new(); - execution_map_contract.insert(line_executed, 1); - self.executed_lines - .insert(contract.clone(), execution_map_contract); - } - } - - pub fn to_file + Copy>(&self, filename: P) -> std::io::Result<()> { - let f = File::create(filename)?; - let iter = self.executed_lines.iter(); - let mut coverage = HashMap::with_capacity(iter.len()); - for (contract, execution_map) in iter { - let mut executed_lines = execution_map - .iter() - .map(|(line, count)| (*line, *count)) - .collect::>(); - - executed_lines.sort_by_key(|f| f.0); - - coverage.insert(contract.to_string(), executed_lines); - } - - let out = CoverageFileInfo { coverage }; - if let Err(e) = serde_json::to_writer(f, &out) { - error!( - "Failed to serialize JSON to coverage file {}: {e}", - filename.as_ref().display() - ); - return Err(e.into()); - } - - Ok(()) - } - - fn executable_lines(exprs: &[SymbolicExpression]) -> Vec { - let mut lines = vec![]; - let mut lines_seen = HashSet::new(); - for expression in exprs.iter() { - let mut frontier = vec![expression]; - while let Some(cur_expr) = frontier.pop() { - // handle defines: the `define-` atom is non executable, and neither are any of the type arguments, - // but the bodies of functions, the value of a constant, initial values for variables, and the - // max supply of FTs - if let Some(define_expr) = DefineFunctionsParsed::try_parse(cur_expr).ok().flatten() - { - match define_expr { - DefineFunctionsParsed::Constant { name: _, value } => { - frontier.push(value); - } - DefineFunctionsParsed::PrivateFunction { signature: _, body } - | DefineFunctionsParsed::PublicFunction { signature: _, body } - | DefineFunctionsParsed::ReadOnlyFunction { signature: _, body } => { - frontier.push(body); - } - DefineFunctionsParsed::BoundedFungibleToken { - name: _, - max_supply, - } => { - frontier.push(max_supply); - } - DefineFunctionsParsed::PersistedVariable { - name: _, - data_type: _, - initial, - } => { - frontier.push(initial); - } - DefineFunctionsParsed::NonFungibleToken { .. } => {} - DefineFunctionsParsed::UnboundedFungibleToken { .. } => {} - DefineFunctionsParsed::Map { .. } => {} - DefineFunctionsParsed::Trait { .. } => {} - DefineFunctionsParsed::UseTrait { .. } => {} - DefineFunctionsParsed::ImplTrait { .. } => {} - } - - continue; - } - - if let Some(children) = cur_expr.match_list() { - // don't count list expressions as a whole, just their children - frontier.extend(children); - } else { - let line = cur_expr.span().start_line; - if !lines_seen.contains(&line) { - lines_seen.insert(line); - lines.push(line); - } - } - } - } - - lines.sort(); - lines - } - - pub fn register_src_file + Copy>( - contract: &QualifiedContractIdentifier, - src_file_name: &str, - ast: &[SymbolicExpression], - filename: P, - ) -> std::io::Result<()> { - let f = File::create(filename)?; - - let executable_lines = CoverageReporter::executable_lines(ast); - - let json = ContractFileInfo { - contract: contract.to_string(), - src_file: src_file_name.to_string(), - executable_lines, - }; - - if let Err(e) = serde_json::to_writer(f, &json) { - error!( - "Failed to serialize JSON to coverage file {}: {e}", - filename.as_ref().display() - ); - return Err(e.into()); - } - Ok(()) - } - - pub fn produce_lcov>( - out_filename: &str, - register_files: &[P], - coverage_files: &[P], - ) -> std::io::Result<()> { - let mut out = File::create(out_filename)?; - - for contract_filename in register_files.iter() { - let reader = File::open(contract_filename)?; - let info: ContractFileInfo = serde_json::from_reader(reader)?; - let mut summed_coverage = BTreeMap::new(); - for coverage_filename in coverage_files.iter() { - let cov_reader = File::open(coverage_filename)?; - let coverage: CoverageFileInfo = serde_json::from_reader(cov_reader)?; - if let Some(contract_coverage) = coverage.coverage.get(&info.contract) { - for (line, count) in contract_coverage.iter() { - if let Some(line_count) = summed_coverage.get_mut(line) { - *line_count += *count; - } else { - summed_coverage.insert(*line, *count); - } - } - } - } - writeln!(out, "TN:{}", &info.contract)?; - writeln!(out, "SF:{}", &info.src_file)?; - for line in info.executable_lines.iter() { - let count = summed_coverage.get(line).cloned().unwrap_or(0); - writeln!(out, "DA:{line},{count}")?; - } - writeln!(out, "LH:{}", summed_coverage.len())?; - writeln!(out, "LF:{}", &info.executable_lines.len())?; - writeln!(out, "end_of_record")?; - } - - Ok(()) - } -} - -impl EvalHook for CoverageReporter { - fn will_begin_eval( - &mut self, - env: &mut crate::vm::contexts::Environment, - _context: &crate::vm::contexts::LocalContext, - expr: &SymbolicExpression, - ) { - self.report_eval(expr, &env.contract_context.contract_identifier); - } - - fn did_finish_eval( - &mut self, - _env: &mut crate::vm::Environment, - _context: &crate::vm::LocalContext, - _expr: &SymbolicExpression, - _res: &core::result::Result, - ) { - } - - fn did_complete( - &mut self, - _result: core::result::Result<&mut crate::vm::ExecutionResult, String>, - ) { - } -} diff --git a/clarity/src/vm/database/clarity_db.rs b/clarity/src/vm/database/clarity_db.rs index ba9af6ff763..62e4ccd3f90 100644 --- a/clarity/src/vm/database/clarity_db.rs +++ b/clarity/src/vm/database/clarity_db.rs @@ -944,6 +944,10 @@ impl<'a> ClarityDatabase<'a> { pub fn decrement_ustx_liquid_supply(&mut self, decr_by: u128) -> Result<(), VmExecutionError> { let current = self.get_total_liquid_ustx()?; + // This `ArithmeticUnderflow` is **unreachable** in normal Clarity execution. + // The sender's balance is always checked first (`amount <= sender_balance`), + // and `sender_balance <= current_supply` always holds. + // Thus, `decr_by > current_supply` cannot occur. let next = current.checked_sub(decr_by).ok_or_else(|| { error!("`stx-burn?` accepted that reduces `ustx-liquid-supply` below 0"); RuntimeError::ArithmeticUnderflow @@ -2091,6 +2095,10 @@ impl ClarityDatabase<'_> { })?; if amount > current_supply { + // `SupplyUnderflow` is **unreachable** in normal Clarity execution: + // the sender's balance is checked first (`amount <= sender_balance`), + // and `sender_balance <= current_supply` always holds. + // Thus, `amount > current_supply` cannot occur. return Err(RuntimeError::SupplyUnderflow(current_supply, amount).into()); } @@ -2411,3 +2419,142 @@ impl ClarityDatabase<'_> { Ok(epoch.epoch_id) } } + +#[test] +fn increment_ustx_liquid_supply_overflow() { + use crate::vm::database::MemoryBackingStore; + use crate::vm::errors::{RuntimeError, VmExecutionError}; + + let mut store = MemoryBackingStore::new(); + let mut db = store.as_clarity_db(); + + db.begin(); + // Set the liquid supply to one less than the max + db.set_ustx_liquid_supply(u128::MAX - 1) + .expect("Failed to set liquid supply"); + // Trust but verify. + assert_eq!( + db.get_total_liquid_ustx().unwrap(), + u128::MAX - 1, + "Supply should now be u128::MAX - 1" + ); + + db.increment_ustx_liquid_supply(1) + .expect("Increment by 1 should succeed"); + + // Trust but verify. + assert_eq!( + db.get_total_liquid_ustx().unwrap(), + u128::MAX, + "Supply should now be u128::MAX" + ); + + // Attempt to overflow + let err = db.increment_ustx_liquid_supply(1).unwrap_err(); + assert!(matches!( + err, + VmExecutionError::Runtime(RuntimeError::ArithmeticOverflow, _) + )); + + // Verify adding 0 doesn't overflow + db.increment_ustx_liquid_supply(0) + .expect("Increment by 0 should succeed"); + + assert_eq!(db.get_total_liquid_ustx().unwrap(), u128::MAX); + + db.commit().unwrap(); +} + +#[test] +fn checked_decrease_token_supply_underflow() { + use crate::vm::database::{MemoryBackingStore, StoreType}; + use crate::vm::errors::{RuntimeError, VmExecutionError}; + + let mut store = MemoryBackingStore::new(); + let mut db = store.as_clarity_db(); + let contract_id = QualifiedContractIdentifier::transient(); + let token_name = "token".to_string(); + + db.begin(); + + // Set initial supply to 1000 + let key = + ClarityDatabase::make_key_for_trip(&contract_id, StoreType::CirculatingSupply, &token_name); + db.put_data(&key, &1000u128) + .expect("Failed to set initial token supply"); + + // Trust but verify. + let current_supply: u128 = db.get_data(&key).unwrap().unwrap(); + assert_eq!(current_supply, 1000, "Initial supply should be 1000"); + + // Decrease by 500: should succeed + db.checked_decrease_token_supply(&contract_id, &token_name, 500) + .expect("Decreasing by 500 should succeed"); + + let new_supply: u128 = db.get_data(&key).unwrap().unwrap(); + assert_eq!(new_supply, 500, "Supply should now be 500"); + + // Decrease by 0: should succeed (no change) + db.checked_decrease_token_supply(&contract_id, &token_name, 0) + .expect("Decreasing by 0 should succeed"); + let supply_after_zero: u128 = db.get_data(&key).unwrap().unwrap(); + assert_eq!( + supply_after_zero, 500, + "Supply should remain 500 after decreasing by 0" + ); + + // Attempt to decrease by 501; should trigger SupplyUnderflow + let err = db + .checked_decrease_token_supply(&contract_id, &token_name, 501) + .unwrap_err(); + + assert!( + matches!( + err, + VmExecutionError::Runtime(RuntimeError::SupplyUnderflow(500, 501), _) + ), + "Expected SupplyUnderflow(500, 501), got: {err:?}" + ); + + // Supply should remain unchanged after failed underflow + let final_supply: u128 = db.get_data(&key).unwrap().unwrap(); + assert_eq!( + final_supply, 500, + "Supply should not change after underflow error" + ); + + db.commit().unwrap(); +} + +#[test] +fn trigger_no_such_token_rust() { + use crate::vm::database::MemoryBackingStore; + use crate::vm::errors::{RuntimeError, VmExecutionError}; + // Set up a memory backing store and Clarity database + let mut store = MemoryBackingStore::default(); + let mut db = store.as_clarity_db(); + + db.begin(); + // Define a fake contract identifier + let contract_id = QualifiedContractIdentifier::transient(); + + // Simulate querying a non-existent NFT + let asset_id = Value::Bool(false); // this token does not exist + let asset_name = "test-nft"; + + // Call get_nft_owner directly + let err = db + .get_nft_owner( + &contract_id, + asset_name, + &asset_id, + &TypeSignature::BoolType, + ) + .unwrap_err(); + + // Assert that it produces NoSuchToken + assert!( + matches!(err, VmExecutionError::Runtime(RuntimeError::NoSuchToken, _)), + "Expected NoSuchToken. Got: {err}" + ); +} diff --git a/clarity/src/vm/database/sqlite.rs b/clarity/src/vm/database/sqlite.rs index da9b25808c7..874a99b01ef 100644 --- a/clarity/src/vm/database/sqlite.rs +++ b/clarity/src/vm/database/sqlite.rs @@ -402,3 +402,24 @@ impl ClarityBackingStore for MemoryBackingStore { sqlite_get_metadata_manual(self, at_height, contract, key) } } + +#[test] +fn trigger_bad_block_height() { + let mut store = MemoryBackingStore::default(); + let contract_id = QualifiedContractIdentifier::transient(); + // Use a block height that does NOT exist in MemoryBackingStore + // MemoryBackingStore::get_block_at_height returns None for any height != 0 + let nonexistent_height = 42; + let key = "some-metadata-key"; + + let err = + sqlite_get_metadata_manual(&mut store, nonexistent_height, &contract_id, key).unwrap_err(); + + assert!( + matches!( + err, + VmExecutionError::Runtime(RuntimeError::BadBlockHeight(_), _) + ), + "Expected BadBlockHeight. Got {err}" + ); +} diff --git a/clarity/src/vm/docs/mod.rs b/clarity/src/vm/docs/mod.rs index 378837b8818..61db5ee1bc0 100644 --- a/clarity/src/vm/docs/mod.rs +++ b/clarity/src/vm/docs/mod.rs @@ -1485,7 +1485,7 @@ The function returns the result of evaluating `expr`. example: " (define-data-var data int 1) (at-block 0x0000000000000000000000000000000000000000000000000000000000000000 block-height) ;; Returns u0 -(at-block (unwrap-panic (get-block-info? id-header-hash u0)) (var-get data)) ;; Throws NoSuchDataVariable because `data` wasn't initialized at block height 0" +(at-block (unwrap-panic (get-stacks-block-info? id-header-hash u0)) (var-get data)) ;; Throws NoSuchDataVariable because `data` wasn't initialized at block height 0" }; const AS_CONTRACT_API: SpecialAPI = SpecialAPI { diff --git a/clarity/src/vm/errors.rs b/clarity/src/vm/errors.rs index e5d78e24f3b..7dd07dcb4fa 100644 --- a/clarity/src/vm/errors.rs +++ b/clarity/src/vm/errors.rs @@ -20,7 +20,8 @@ pub use clarity_types::errors::{ pub use crate::vm::analysis::errors::{ check_argument_count, check_arguments_at_least, check_arguments_at_most, CheckErrorKind, - SyntaxBindingError, SyntaxBindingErrorType, + CommonCheckErrorKind, StaticCheckError, StaticCheckErrorKind, SyntaxBindingError, + SyntaxBindingErrorType, }; #[cfg(test)] diff --git a/clarity/src/vm/functions/assets.rs b/clarity/src/vm/functions/assets.rs index debbee8ec5b..d1f397cfe8a 100644 --- a/clarity/src/vm/functions/assets.rs +++ b/clarity/src/vm/functions/assets.rs @@ -766,6 +766,8 @@ pub fn special_transfer_token( Some(ft_info), )?; + // `ArithmeticOverflow` in this function is **unreachable** in normal Clarity execution because: + // - the total liquid ustx supply will overflow before such an overflowing transfer is allowed. let final_to_bal = to_bal .checked_add(amount) .ok_or(RuntimeError::ArithmeticOverflow)?; diff --git a/clarity/src/vm/functions/crypto.rs b/clarity/src/vm/functions/crypto.rs index d3a6384e826..7af6ddd13ec 100644 --- a/clarity/src/vm/functions/crypto.rs +++ b/clarity/src/vm/functions/crypto.rs @@ -193,16 +193,14 @@ pub fn special_secp256k1_recover( } }; - match secp256k1_recover(message, signature) - .map_err(|_| CheckErrorKind::InvalidSecp65k1Signature) - { - Ok(pubkey) => Ok(Value::okay( - Value::buff_from(pubkey.to_vec()) - .map_err(|_| VmInternalError::Expect("Failed to construct buff".into()))?, - ) - .map_err(|_| VmInternalError::Expect("Failed to construct ok".into()))?), - _ => Ok(Value::err_uint(1)), - } + let Ok(pubkey) = secp256k1_recover(message, signature) else { + // We do not return the runtime error. Immediately map this to an error code. + return Ok(Value::err_uint(1)); + }; + let pubkey_buff = Value::buff_from(pubkey.to_vec()) + .map_err(|_| VmInternalError::Expect("Failed to construct buff".into()))?; + Ok(Value::okay(pubkey_buff) + .map_err(|_| VmInternalError::Expect("Failed to construct ok".into()))?) } pub fn special_secp256k1_verify( diff --git a/clarity/src/vm/functions/define.rs b/clarity/src/vm/functions/define.rs index b692d584217..ba973ad6412 100644 --- a/clarity/src/vm/functions/define.rs +++ b/clarity/src/vm/functions/define.rs @@ -19,8 +19,8 @@ use std::collections::BTreeMap; use crate::vm::callables::{DefineType, DefinedFunction}; use crate::vm::contexts::{ContractContext, Environment, LocalContext}; use crate::vm::errors::{ - check_argument_count, check_arguments_at_least, CheckErrorKind, SyntaxBindingErrorType, - VmExecutionError, + check_argument_count, check_arguments_at_least, CheckErrorKind, CommonCheckErrorKind, + SyntaxBindingErrorType, VmExecutionError, }; use crate::vm::eval; use crate::vm::representations::SymbolicExpressionType::Field; @@ -291,7 +291,7 @@ impl<'a> DefineFunctionsParsed<'a> { /// a define-statement, returns None if the supplied expression is not a define. pub fn try_parse( expression: &'a SymbolicExpression, - ) -> std::result::Result>, CheckErrorKind> { + ) -> std::result::Result>, CommonCheckErrorKind> { let (define_type, args) = match DefineFunctions::try_parse(expression) { Some(x) => x, None => return Ok(None), @@ -299,7 +299,9 @@ impl<'a> DefineFunctionsParsed<'a> { let result = match define_type { DefineFunctions::Constant => { check_argument_count(2, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; DefineFunctionsParsed::Constant { name, value: &args[1], @@ -309,7 +311,7 @@ impl<'a> DefineFunctionsParsed<'a> { check_argument_count(2, args)?; let signature = args[0] .match_list() - .ok_or(CheckErrorKind::DefineFunctionBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineFunctionBadSignature)?; DefineFunctionsParsed::PrivateFunction { signature, body: &args[1], @@ -319,7 +321,7 @@ impl<'a> DefineFunctionsParsed<'a> { check_argument_count(2, args)?; let signature = args[0] .match_list() - .ok_or(CheckErrorKind::DefineFunctionBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineFunctionBadSignature)?; DefineFunctionsParsed::ReadOnlyFunction { signature, body: &args[1], @@ -329,7 +331,7 @@ impl<'a> DefineFunctionsParsed<'a> { check_argument_count(2, args)?; let signature = args[0] .match_list() - .ok_or(CheckErrorKind::DefineFunctionBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineFunctionBadSignature)?; DefineFunctionsParsed::PublicFunction { signature, body: &args[1], @@ -337,7 +339,9 @@ impl<'a> DefineFunctionsParsed<'a> { } DefineFunctions::NonFungibleToken => { check_argument_count(2, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; DefineFunctionsParsed::NonFungibleToken { name, nft_type: &args[1], @@ -345,7 +349,9 @@ impl<'a> DefineFunctionsParsed<'a> { } DefineFunctions::FungibleToken => { check_arguments_at_least(1, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; if args.len() == 1 { DefineFunctionsParsed::UnboundedFungibleToken { name } } else if args.len() == 2 { @@ -354,12 +360,14 @@ impl<'a> DefineFunctionsParsed<'a> { max_supply: &args[1], } } else { - return Err(CheckErrorKind::IncorrectArgumentCount(1, args.len())); + return Err(CommonCheckErrorKind::IncorrectArgumentCount(1, args.len())); } } DefineFunctions::Map => { check_argument_count(3, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; DefineFunctionsParsed::Map { name, key_type: &args[1], @@ -368,7 +376,9 @@ impl<'a> DefineFunctionsParsed<'a> { } DefineFunctions::PersistedVariable => { check_argument_count(3, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; DefineFunctionsParsed::PersistedVariable { name, data_type: &args[1], @@ -377,7 +387,9 @@ impl<'a> DefineFunctionsParsed<'a> { } DefineFunctions::Trait => { check_argument_count(2, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; DefineFunctionsParsed::Trait { name, functions: &args[1..], @@ -385,13 +397,15 @@ impl<'a> DefineFunctionsParsed<'a> { } DefineFunctions::UseTrait => { check_argument_count(2, args)?; - let name = args[0].match_atom().ok_or(CheckErrorKind::ExpectedName)?; + let name = args[0] + .match_atom() + .ok_or(CommonCheckErrorKind::ExpectedName)?; match &args[1].expr { Field(ref field) => DefineFunctionsParsed::UseTrait { name, trait_identifier: field, }, - _ => return Err(CheckErrorKind::ExpectedTraitIdentifier), + _ => return Err(CommonCheckErrorKind::ExpectedTraitIdentifier), } } DefineFunctions::ImplTrait => { @@ -400,7 +414,7 @@ impl<'a> DefineFunctionsParsed<'a> { Field(ref field) => DefineFunctionsParsed::ImplTrait { trait_identifier: field, }, - _ => return Err(CheckErrorKind::ExpectedTraitIdentifier), + _ => return Err(CommonCheckErrorKind::ExpectedTraitIdentifier), } } }; @@ -460,3 +474,129 @@ pub fn evaluate_define( Ok(DefineResult::NoDefine) } } + +#[cfg(test)] +mod test { + use clarity_types::errors::CheckErrorKind; + use clarity_types::representations::SymbolicExpression; + use clarity_types::types::QualifiedContractIdentifier; + use clarity_types::{Value, VmExecutionError}; + use stacks_common::consts::CHAIN_ID_TESTNET; + use stacks_common::types::StacksEpochId; + + use crate::vm::analysis::type_checker::v2_1::MAX_FUNCTION_PARAMETERS; + use crate::vm::callables::DefineType; + use crate::vm::contexts::GlobalContext; + use crate::vm::costs::LimitedCostTracker; + use crate::vm::database::MemoryBackingStore; + use crate::vm::functions::define::{handle_define_function, handle_define_trait}; + use crate::vm::tests::test_clarity_versions; + use crate::vm::{CallStack, ClarityVersion, ContractContext, Environment, LocalContext}; + + #[apply(test_clarity_versions)] + fn bad_syntax_binding_define_function( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + // ---- BAD SIGNATURE ---- + // Instead of ((x uint)), we pass (x) + let bad_signature = vec![ + SymbolicExpression::atom("f".into()), + SymbolicExpression::atom("x".into()), // NOT a (name type) list + ]; + + let body = SymbolicExpression::atom_value(Value::UInt(1)); + + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let result = handle_define_function(&bad_signature, &body, &mut env, DefineType::Public); + + assert!(matches!( + result, + Err(VmExecutionError::Unchecked( + CheckErrorKind::BadSyntaxBinding(_) + )) + )); + } + + #[apply(test_clarity_versions)] + fn handle_define_trait_too_many_function_parameters( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + if epoch < StacksEpochId::Epoch33 { + return; + } + // Build a trait method with MORE than MAX_FUNCTION_PARAMETERS arguments + // (f (uint uint uint ... ) (response uint uint)) + let too_many_args = + vec![SymbolicExpression::atom("uint".into()); MAX_FUNCTION_PARAMETERS + 1]; + + let method = SymbolicExpression::list(vec![ + SymbolicExpression::atom("f".into()), + SymbolicExpression::list(too_many_args), + SymbolicExpression::list(vec![ + SymbolicExpression::atom("response".into()), + SymbolicExpression::atom("uint".into()), + SymbolicExpression::atom("uint".into()), + ]), + ]); + + // This is the `( (f (...) (response ...)) )` wrapper + let trait_body = vec![SymbolicExpression::list(vec![method])]; + + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let result = handle_define_trait(&"bad-trait".into(), &trait_body, &mut env); + + assert!(matches!( + result, + Err(VmExecutionError::Unchecked( + CheckErrorKind::TooManyFunctionParameters(found, max) + )) + )); + } +} diff --git a/clarity/src/vm/functions/mod.rs b/clarity/src/vm/functions/mod.rs index 7877a0dd34f..71d405313e3 100644 --- a/clarity/src/vm/functions/mod.rs +++ b/clarity/src/vm/functions/mod.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use clarity_types::errors::analysis::CommonCheckErrorKind; use stacks_common::types::StacksEpochId; use crate::vm::callables::{cost_input_sized_vararg, CallableType, NativeHandle}; @@ -711,7 +712,7 @@ pub fn handle_binding_list( ) -> std::result::Result<(), E> where F: FnMut(&ClarityName, &SymbolicExpression) -> std::result::Result<(), E>, - E: for<'a> From<(CheckErrorKind, &'a SymbolicExpression)>, + E: for<'a> From<(CommonCheckErrorKind, &'a SymbolicExpression)>, { for (i, binding) in bindings.iter().enumerate() { let binding_expression = binding.match_list().ok_or_else(|| { @@ -867,3 +868,429 @@ fn special_contract_of( let contract_principal = Value::Principal(PrincipalData::Contract(contract_identifier.clone())); Ok(contract_principal) } + +#[cfg(test)] +mod test { + use clarity_types::errors::CheckErrorKind; + use clarity_types::VmExecutionError; + use stacks_common::consts::CHAIN_ID_TESTNET; + use stacks_common::types::StacksEpochId; + + use super::ClarityVersion; + use crate::vm::costs::LimitedCostTracker; + use crate::vm::database::MemoryBackingStore; + use crate::vm::functions::database::{ + special_contract_call, special_get_burn_block_info, special_get_stacks_block_info, + special_get_tenure_info, + }; + use crate::vm::functions::{special_contract_of, special_let}; + use crate::vm::tests::test_clarity_versions; + use crate::vm::types::QualifiedContractIdentifier; + use crate::vm::{ + CallStack, ContractContext, Environment, GlobalContext, LocalContext, SymbolicExpression, + Value, + }; + + /// Tests that if somehow we bypass static analysis checks, contract_of will return + /// a ContractOfExpectsTrait for a poorly defined contract-of? call. + #[apply(test_clarity_versions)] + fn special_contract_of_expect_trait( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + // --- Non-atom argument: (list u1) --- + let non_atom = + SymbolicExpression::list(vec![SymbolicExpression::atom_value(Value::UInt(1))]); + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_contract_of(&[non_atom], &mut env, &context).unwrap_err(); + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::ContractOfExpectsTrait) + ); + } + + /// Tests that if the argument is an atom but NOT a callable trait binding, + /// contract_of returns ContractOfExpectsTrait at runtime. + #[apply(test_clarity_versions)] + fn special_contract_of_expect_trait_not_callable( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + // --- Atom argument, but NOT registered as a callable trait --- + let atom = SymbolicExpression::atom("not_a_trait".into()); + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + // NO callable contracts added to LocalContext + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_contract_of(&[atom], &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::ContractOfExpectsTrait) + ); + } + + #[apply(test_clarity_versions)] + fn special_let_bad_syntax(#[case] version: ClarityVersion, #[case] epoch: StacksEpochId) { + // Arg0 must be a list — we intentionally violate that + let bad_bindings = SymbolicExpression::atom_value(Value::UInt(1)); + + // Body expression (never reached) + let body = SymbolicExpression::atom_value(Value::UInt(2)); + + let args = vec![bad_bindings, body]; + + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_let(&args, &mut env, &context).unwrap_err(); + + assert!(matches!( + err, + VmExecutionError::Unchecked(CheckErrorKind::BadLetSyntax) + )); + } + + #[apply(test_clarity_versions)] + fn special_get_tenure_info_expect_property_name_non_atom( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + use clarity_types::errors::CheckErrorKind; + use clarity_types::VmExecutionError; + + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + // First arg is NOT an atom + let bad_property = SymbolicExpression::atom_value(Value::UInt(1)); + let height = SymbolicExpression::atom_value(Value::UInt(0)); + + let args = vec![bad_property, height]; + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_get_tenure_info(&args, &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::GetTenureInfoExpectPropertyName) + ); + } + + /// If we bypass static analysis and pass a non-atom as the property name to `get-burn-block-info?`, + /// the runtime returns `GetBlockInfoExpectPropertyName`. + #[apply(test_clarity_versions)] + fn special_get_burn_block_info_expected_property_name( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + // Build INVALID property argument (non-atom) + let bad_property = SymbolicExpression::atom_value(Value::UInt(1)); // must be an atom + + // Valid height argument + let height = SymbolicExpression::atom_value(Value::UInt(0)); + + let args = vec![bad_property, height]; + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_get_burn_block_info(&args, &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::GetBlockInfoExpectPropertyName) + ); + } + + /// If we bypass static analysis and pass a non-atom to `get-stacks-block-info?`, + /// the runtime returns `GetStacksBlockInfoExpectPropertyName`. + #[apply(test_clarity_versions)] + fn special_get_stacks_block_info_expect_property_name_non_atom( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + // First arg is NOT an atom + let bad_property = SymbolicExpression::atom_value(Value::UInt(1)); + let height = SymbolicExpression::atom_value(Value::UInt(0)); + + let args = vec![bad_property, height]; + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_get_stacks_block_info(&args, &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::GetStacksBlockInfoExpectPropertyName) + ); + } + + /// If we bypass static analysis and pass an atom for a non existing property to `get-stacks-block-info?`, + /// the runtime returns `NoSuchStacksBlockInfoProperty`. + #[apply(test_clarity_versions)] + fn special_get_stacks_block_info_no_such_property( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + // Pass an Atom but NOT a valid stacks block info property + let bad_property = SymbolicExpression::atom("not-a-valid-stacks-prop".into()); + + let height = SymbolicExpression::atom_value(Value::UInt(0)); + + let args = vec![bad_property, height]; + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_get_stacks_block_info(&args, &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::NoSuchStacksBlockInfoProperty( + "not-a-valid-stacks-prop".to_string() + )) + ); + } + + /// If we bypass static analysis and pass an atom for a non existing property to `get-burn-block-info?`, + /// the runtime returns `NoSuchBurnBlockInfoProperty`. + #[apply(test_clarity_versions)] + fn special_get_burn_block_info_no_such_property( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + // Atom But NOT a valid burn block info property + let bad_property = SymbolicExpression::atom("not-a-valid-burn-prop".into()); + + // Valid uint height to avoid TypeValueError + let height = SymbolicExpression::atom_value(Value::UInt(0)); + + let args = vec![bad_property, height]; + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let err = special_get_burn_block_info(&args, &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::NoSuchBurnBlockInfoProperty( + "not-a-valid-burn-prop".to_string() + )) + ); + } + + #[apply(test_clarity_versions)] + fn special_contract_call_expect_name_dynamic_not_callable( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + epoch, + ); + + let contract_context = + ContractContext::new(QualifiedContractIdentifier::transient(), version); + + let context = LocalContext::new(); // EMPTY — no callable_contracts + let mut call_stack = CallStack::new(); + + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + // (contract-call? unknown-contract foo) + let args = vec![ + SymbolicExpression::atom("unknown-contract".into()), // Atom, NOT registered + SymbolicExpression::atom("foo".into()), // Valid function name atom + ]; + + let err = special_contract_call(&args, &mut env, &context).unwrap_err(); + + assert_eq!( + err, + VmExecutionError::Unchecked(CheckErrorKind::ContractCallExpectName) + ); + } +} diff --git a/clarity/src/vm/functions/post_conditions.rs b/clarity/src/vm/functions/post_conditions.rs index d50638f8189..9beb952528c 100644 --- a/clarity/src/vm/functions/post_conditions.rs +++ b/clarity/src/vm/functions/post_conditions.rs @@ -15,7 +15,9 @@ use std::collections::HashMap; +use clarity_types::errors::RuntimeError; use clarity_types::types::{AssetIdentifier, PrincipalData, StandardPrincipalData}; +use clarity_types::ClarityName; use crate::vm::analysis::type_checker::v2_1::natives::post_conditions::MAX_ALLOWANCES; use crate::vm::contexts::AssetMap; @@ -135,7 +137,12 @@ fn eval_allowance( }; let asset_name = eval(&rest[1], env, context)?; - let asset_name = asset_name.expect_string_ascii()?.as_str().into(); + let asset_name = match ClarityName::try_from(asset_name.expect_string_ascii()?) { + Ok(name) => name, + Err(_) => { + return Err(RuntimeError::BadTokenName(rest[1].to_string()).into()); + } + }; let asset = AssetIdentifier { contract_identifier, @@ -165,7 +172,12 @@ fn eval_allowance( }; let asset_name = eval(&rest[1], env, context)?; - let asset_name = asset_name.expect_string_ascii()?.as_str().into(); + let asset_name = match ClarityName::try_from(asset_name.expect_string_ascii()?) { + Ok(name) => name, + Err(_) => { + return Err(RuntimeError::BadTokenName(rest[1].to_string()).into()); + } + }; let asset = AssetIdentifier { contract_identifier, @@ -557,3 +569,59 @@ pub fn special_allowance( ) -> Result { Err(CheckErrorKind::AllowanceExprNotAllowed.into()) } + +#[cfg(test)] +mod test { + use clarity_types::types::QualifiedContractIdentifier; + use stacks_common::consts::CHAIN_ID_TESTNET; + use stacks_common::types::StacksEpochId; + + use super::*; + use crate::vm::contexts::GlobalContext; + use crate::vm::costs::LimitedCostTracker; + use crate::vm::database::MemoryBackingStore; + use crate::vm::tests::test_clarity_versions; + use crate::vm::{CallStack, ClarityVersion, ContractContext}; + + #[apply(test_clarity_versions)] + fn non_function_application_in_eval_allowance( + #[case] version: ClarityVersion, + #[case] epoch: StacksEpochId, + ) { + let allowance_expr = SymbolicExpression::atom_value(Value::UInt(1)); // not a list + + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + StacksEpochId::latest(), + ); + + let contract_context = ContractContext::new( + QualifiedContractIdentifier::transient(), + ClarityVersion::Clarity3, + ); + + let context = LocalContext::new(); + let mut call_stack = CallStack::new(); + let mut env = Environment::new( + &mut global_context, + &contract_context, + &mut call_stack, + None, + None, + None, + ); + + let result = eval_allowance(&allowance_expr, &mut env, &context); + + assert!(matches!( + result, + Err(VmExecutionError::Unchecked( + CheckErrorKind::NonFunctionApplication + )) + )); + } +} diff --git a/clarity/src/vm/functions/tuples.rs b/clarity/src/vm/functions/tuples.rs index 5fd0f2c7a77..87b8eb72811 100644 --- a/clarity/src/vm/functions/tuples.rs +++ b/clarity/src/vm/functions/tuples.rs @@ -97,6 +97,6 @@ pub fn tuple_merge(base: Value, update: Value) -> Result>() + .join(" ") + ); + let max_allowances_err = VmExecutionError::Unchecked(CheckErrorKind::TooManyAllowances( + MAX_ALLOWANCES, + MAX_ALLOWANCES + 1, + )); + let err = execute(&snippet).expect_err("execution passed unexpectedly"); + assert_eq!(err, max_allowances_err); +} + +/// Test that passing a non-allowance expression to `restrict-assets?` triggers +/// the `ExpectedAllowanceExpr` runtime error. Normally, static analysis would prevent +/// invalid expressions, so this only occurs in artificial or host-level test scenarios. +#[test] +fn expected_allowance_expr_error() { + // Construct a "fake" allowance expression that is invalid + let snippet = "(restrict-assets? tx-sender ((bad-fn u1)) true)"; + + let expected_error = + VmExecutionError::Unchecked(CheckErrorKind::ExpectedAllowanceExpr("bad-fn".to_string())); + + // Execute and verify that the error is raised + let err = execute(snippet).expect_err("execution passed unexpectedly"); + assert_eq!(err, expected_error); +} + +/// Test that passing an invalid native function to `restrict-assets?` triggers +/// the `ExpectedAllowanceExpr` runtime error. Normally, static analysis would prevent +/// invalid expressions, so this only occurs in artificial or host-level test scenarios. +#[test] +fn expected_allowance_expr_error_unhandled_native() { + // Use a native function that exists but is not handled in eval_allowance + // For example: `tx-sender` (or `caller`), which is a native function but not a handled allowance + let snippet = "(restrict-assets? tx-sender ((tx-sender u1)) true)"; + + let expected_error = VmExecutionError::Unchecked(CheckErrorKind::ExpectedAllowanceExpr( + "tx-sender".to_string(), + )); + + let err = execute(snippet).expect_err("execution passed unexpectedly"); + assert_eq!(err, expected_error); +} + +/// Directly call an allowance function outside of restrict-assets? or as-contract? +/// This forces the VM to route evaluation through special_allowance(), +/// which always returns AllowanceExprNotAllowed. +#[test] +fn allowance_expr_not_allowed() { + let snippet = "(with-stx u1)"; + + let expected = VmExecutionError::Unchecked(CheckErrorKind::AllowanceExprNotAllowed); + + let err = execute(snippet).expect_err("execution unexpectedly succeeded"); + + assert_eq!(err, expected); +} + +/// Test that passing an invalid second argument to `restrict-assets?` triggers +/// the `ExpectedListOfAllowances` runtime error. Normally, static analysis would prevent +/// invalid expressions, so this only occurs in artificial or host-level test scenarios. +#[test] +fn restrict_assets_expected_list_of_allowances() { + let snippet = r#" + (restrict-assets? tx-sender + 42 + (ok u1) + ) + "#; + + let expected_error = VmExecutionError::Unchecked(CheckErrorKind::ExpectedListOfAllowances( + "restrict-assets?".into(), + 2, + )); + + let err = execute(snippet).expect_err("execution passed unexpectedly"); + assert_eq!(err, expected_error); +} + +/// Test that passing an invalid argument to `as-contract?` triggers +/// the `ExpectedListOfAllowances` runtime error. Normally, static analysis would prevent +/// invalid expressions, so this only occurs in artificial or host-level test scenarios. +#[test] +fn as_contract_expected_list_of_allowances() { + // Construct a as-contract? call where the argument is NOT a list + let snippet = r#" + (as-contract? u42 + (ok u1) + ) + "#; + + // The argument is `u42` (not a list), so we expect this error + let expected_error = VmExecutionError::Unchecked(CheckErrorKind::ExpectedListOfAllowances( + "as-contract?".to_string(), + 1, + )); + + let err = execute(snippet).expect_err("execution passed unexpectedly"); + assert_eq!(err, expected_error); +} + // ---------- Property Tests ---------- fn execute_with_assets_for_version( diff --git a/clarity/src/vm/tests/sequences.rs b/clarity/src/vm/tests/sequences.rs index 3fd92b6d055..5796d258c9b 100644 --- a/clarity/src/vm/tests/sequences.rs +++ b/clarity/src/vm/tests/sequences.rs @@ -1226,3 +1226,12 @@ fn test_eval_func_arg_panic() { let e: VmExecutionError = CheckErrorKind::ExpectedSequence(Box::new(IntType)).into(); assert_eq!(e, execute(test5).unwrap_err()); } + +#[test] +fn test_expected_list_application() { + // append expects (list, element) + // first argument is NOT a list + let test1 = "(append u1 u2)"; + let e: VmExecutionError = CheckErrorKind::ExpectedListApplication.into(); + assert_eq!(e, execute(test1).unwrap_err()); +} diff --git a/clarity/src/vm/tests/variables.rs b/clarity/src/vm/tests/variables.rs index af65c3e24c9..cbace07f7c0 100644 --- a/clarity/src/vm/tests/variables.rs +++ b/clarity/src/vm/tests/variables.rs @@ -13,7 +13,6 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . - #[cfg(any(test, feature = "testing"))] use rstest::rstest; #[cfg(test)] @@ -25,7 +24,7 @@ use crate::vm::{ analysis::type_checker::v2_1::tests::contracts::type_check_version, ast::parse, database::MemoryBackingStore, - errors::{CheckErrorKind, VmExecutionError}, + errors::{CheckErrorKind, StaticCheckErrorKind, VmExecutionError}, tests::{tl_env_factory, TopLevelMemoryEnvironmentGenerator}, types::{PrincipalData, QualifiedContractIdentifier, Value}, ClarityVersion, ContractContext, @@ -54,7 +53,7 @@ fn test_block_height( if version >= ClarityVersion::Clarity3 { let err = analysis.unwrap_err(); assert_eq!( - CheckErrorKind::UndefinedVariable("block-height".to_string()), + StaticCheckErrorKind::UndefinedVariable("block-height".to_string()), *err.err ); } else { @@ -113,7 +112,7 @@ fn test_stacks_block_height( if version < ClarityVersion::Clarity3 { let err = analysis.unwrap_err(); assert_eq!( - CheckErrorKind::UndefinedVariable("stacks-block-height".to_string()), + StaticCheckErrorKind::UndefinedVariable("stacks-block-height".to_string()), *err.err ); } else { @@ -172,7 +171,7 @@ fn test_tenure_height( if version < ClarityVersion::Clarity3 { let err = analysis.unwrap_err(); assert_eq!( - CheckErrorKind::UndefinedVariable("tenure-height".to_string()), + StaticCheckErrorKind::UndefinedVariable("tenure-height".to_string()), *err.err ); } else { @@ -208,12 +207,12 @@ fn test_tenure_height( } } +#[cfg(test)] #[derive(Debug, PartialEq)] -enum WhenError { - Analysis, - Initialization, - Runtime, - Never, +enum ExpectedContractError { + Analysis(StaticCheckErrorKind), + Initialization(CheckErrorKind), + Runtime(CheckErrorKind), } #[cfg(test)] @@ -225,9 +224,8 @@ fn expect_contract_error( name: &str, contract: &str, expected_errors: &[( - WhenError, fn(ClarityVersion, StacksEpochId) -> bool, - CheckErrorKind, + ExpectedContractError, )], expected_success: Value, ) { @@ -244,13 +242,15 @@ fn expect_contract_error( type_check_version(&contract_identifier, &mut exprs, db, true, epoch, version) }); - for (when, err_condition, expected_error) in expected_errors { - if *when == WhenError::Analysis && err_condition(version, epoch) { - let err = analysis.unwrap_err(); - assert_eq!(*expected_error, *err.err); + for (err_condition, expected_error) in expected_errors { + if let ExpectedContractError::Analysis(expected_error) = expected_error { + if err_condition(version, epoch) { + let err = analysis.unwrap_err(); + assert_eq!(expected_error, &*err.err); - // Do not continue with the test if the analysis failed. - return; + // Do not continue with the test if the analysis failed. + return; + } } } @@ -270,17 +270,18 @@ fn expect_contract_error( None, ); - for (when, err_condition, expected_error) in expected_errors { - if *when == WhenError::Initialization && err_condition(version, epoch) { - let err = init_result.unwrap_err(); - if let VmExecutionError::Unchecked(inner_err) = &err { - assert_eq!(expected_error, inner_err); - } else { - panic!("Expected an Unchecked error, but got a different error"); + for (err_condition, expected_error) in expected_errors { + if let ExpectedContractError::Initialization(expected_error) = expected_error { + if err_condition(version, epoch) { + let err = init_result.unwrap_err(); + if let VmExecutionError::Unchecked(inner_err) = &err { + assert_eq!(expected_error, inner_err); + } else { + panic!("Expected an Unchecked error, but got a different error"); + } + // Do not continue with the test if the initialization failed. + return; } - - // Do not continue with the test if the initialization failed. - return; } } @@ -289,17 +290,19 @@ fn expect_contract_error( // Call the function let eval_result = env.eval_read_only(&contract_identifier, "(test-func)"); - for (when, err_condition, expected_error) in expected_errors { - if *when == WhenError::Runtime && err_condition(version, epoch) { - let err = eval_result.unwrap_err(); - if let VmExecutionError::Unchecked(inner_err) = &err { - assert_eq!(expected_error, inner_err); - } else { - panic!("Expected an Unchecked error, but got a different error"); + for (err_condition, expected_error) in expected_errors { + if let ExpectedContractError::Runtime(expected_error) = expected_error { + if err_condition(version, epoch) { + let err = eval_result.unwrap_err(); + if let VmExecutionError::Unchecked(inner_err) = &err { + assert_eq!(expected_error, inner_err); + } else { + panic!("Expected an Unchecked error, but got a different error"); + } + + // Do not continue with the test if the evaluation failed. + return; } - - // Do not continue with the test if the evaluation failed. - return; } } @@ -326,14 +329,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::UInt(1234), @@ -353,14 +358,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(true), @@ -381,14 +388,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Runtime, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Runtime(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Int(32), @@ -412,14 +421,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Runtime, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Runtime(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Int(3), @@ -437,14 +448,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(true), @@ -462,14 +475,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::UInt(1234), @@ -487,14 +502,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(false), @@ -527,14 +544,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(false), @@ -552,14 +571,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(false), @@ -577,14 +598,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(true), @@ -602,14 +625,16 @@ fn reuse_block_height( "#, &[ ( - WhenError::Initialization, |version, _| version < ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "block-height".to_string(), + )), ), ( - WhenError::Analysis, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::ReservedWord("block-height".to_string()), + ExpectedContractError::Analysis(StaticCheckErrorKind::ReservedWord( + "block-height".to_string(), + )), ), ], Value::Bool(true), @@ -635,9 +660,10 @@ fn reuse_stacks_block_height( ) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::UInt(1234), ); @@ -655,9 +681,10 @@ fn reuse_stacks_block_height( ) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(true), ); @@ -676,9 +703,10 @@ fn reuse_stacks_block_height( ) "#, &[( - WhenError::Runtime, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Runtime(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Int(32), ); @@ -700,9 +728,10 @@ fn reuse_stacks_block_height( ) "#, &[( - WhenError::Runtime, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Runtime(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Int(3), ); @@ -718,9 +747,10 @@ fn reuse_stacks_block_height( (define-private (test-func) (stacks-block-height)) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(true), ); @@ -736,9 +766,10 @@ fn reuse_stacks_block_height( (define-read-only (test-func) stacks-block-height) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::UInt(1234), ); @@ -754,9 +785,10 @@ fn reuse_stacks_block_height( (define-read-only (test-func) false) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(false), ); @@ -787,9 +819,10 @@ fn reuse_stacks_block_height( (define-read-only (test-func) false) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(false), ); @@ -805,9 +838,10 @@ fn reuse_stacks_block_height( (define-read-only (test-func) false) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(false), ); @@ -823,9 +857,10 @@ fn reuse_stacks_block_height( (define-private (test-func) (unwrap-panic (stacks-block-height))) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(true), ); @@ -841,9 +876,10 @@ fn reuse_stacks_block_height( (define-private (test-func) (stacks-block-height)) "#, &[( - WhenError::Initialization, |version, _| version >= ClarityVersion::Clarity3, - CheckErrorKind::NameAlreadyUsed("stacks-block-height".to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + "stacks-block-height".to_string(), + )), )], Value::Bool(true), ); @@ -872,9 +908,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::UInt(1234), ); @@ -894,9 +931,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(true), ); @@ -917,9 +955,8 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Runtime, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Runtime(CheckErrorKind::NameAlreadyUsed(name.to_string())), )], Value::Int(32), ); @@ -943,9 +980,8 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Runtime, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Runtime(CheckErrorKind::NameAlreadyUsed(name.to_string())), )], Value::Int(3), ); @@ -963,9 +999,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(true), ); @@ -983,9 +1020,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::UInt(1234), ); @@ -1003,9 +1041,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(false), ); @@ -1040,9 +1079,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(false), ); @@ -1060,9 +1100,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(false), ); @@ -1080,9 +1121,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(true), ); @@ -1100,9 +1142,10 @@ fn reuse_builtin_name( "# ), &[( - WhenError::Initialization, version_check, - CheckErrorKind::NameAlreadyUsed(name.to_string()), + ExpectedContractError::Initialization(CheckErrorKind::NameAlreadyUsed( + name.to_string(), + )), )], Value::Bool(true), ); @@ -1133,7 +1176,7 @@ fn test_block_time( if version < ClarityVersion::Clarity4 { let err = analysis.unwrap_err(); assert_eq!( - CheckErrorKind::UndefinedVariable("stacks-block-time".to_string()), + StaticCheckErrorKind::UndefinedVariable("stacks-block-time".to_string()), *err.err ); } else { @@ -1260,7 +1303,7 @@ fn test_current_contract( if version < ClarityVersion::Clarity4 { let err = analysis.unwrap_err(); assert_eq!( - CheckErrorKind::UndefinedVariable("current-contract".to_string()), + StaticCheckErrorKind::UndefinedVariable("current-contract".to_string()), *err.err ); } else { diff --git a/clarity/src/vm/types/signatures.rs b/clarity/src/vm/types/signatures.rs index e2672a2b2cc..4f9dca8740a 100644 --- a/clarity/src/vm/types/signatures.rs +++ b/clarity/src/vm/types/signatures.rs @@ -17,6 +17,7 @@ use std::collections::BTreeMap; use std::fmt; +use clarity_types::errors::analysis::{CommonCheckErrorKind, StaticCheckErrorKind}; pub use clarity_types::types::signatures::{ AssetIdentifier, BufferLength, CallableSubtype, ListTypeData, SequenceSubtype, StringSubtype, StringUTF8Length, TupleTypeSignature, TypeSignature, @@ -27,7 +28,7 @@ use stacks_common::types::StacksEpochId; use self::TypeSignature::SequenceType; use crate::vm::analysis::type_checker::v2_1::{MAX_FUNCTION_PARAMETERS, MAX_TRAIT_METHODS}; use crate::vm::costs::{runtime_cost, CostOverflowingMath}; -use crate::vm::errors::{CheckErrorKind, SyntaxBindingError, SyntaxBindingErrorType}; +use crate::vm::errors::{SyntaxBindingError, SyntaxBindingErrorType}; use crate::vm::representations::{ ClarityName, SymbolicExpression, SymbolicExpressionType, TraitDefinition, }; @@ -163,59 +164,59 @@ impl From for FunctionSignature { /// This is not included in clarity-types because it requires the /// [`CostTracker`] trait. pub trait TypeSignatureExt { - fn parse_atom_type(typename: &str) -> Result; + fn parse_atom_type(typename: &str) -> Result; fn parse_list_type_repr( epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result; + ) -> Result; fn parse_tuple_type_repr( epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result; + ) -> Result; fn parse_buff_type_repr( type_args: &[SymbolicExpression], - ) -> Result; + ) -> Result; fn parse_string_utf8_type_repr( type_args: &[SymbolicExpression], - ) -> Result; + ) -> Result; fn parse_string_ascii_type_repr( type_args: &[SymbolicExpression], - ) -> Result; + ) -> Result; fn parse_optional_type_repr( epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result; + ) -> Result; fn parse_response_type_repr( epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result; + ) -> Result; fn parse_type_repr( epoch: StacksEpochId, x: &SymbolicExpression, accounting: &mut A, - ) -> Result; + ) -> Result; fn parse_trait_type_repr( type_args: &[SymbolicExpression], accounting: &mut A, epoch: StacksEpochId, clarity_version: ClarityVersion, - ) -> Result, CheckErrorKind>; + ) -> Result, CommonCheckErrorKind>; #[cfg(test)] fn from_string(val: &str, version: ClarityVersion, epoch: StacksEpochId) -> Self; } impl TypeSignatureExt for TypeSignature { - fn parse_atom_type(typename: &str) -> Result { + fn parse_atom_type(typename: &str) -> Result { match typename { "int" => Ok(TypeSignature::IntType), "uint" => Ok(TypeSignature::UIntType), "bool" => Ok(TypeSignature::BoolType), "principal" => Ok(TypeSignature::PrincipalType), - _ => Err(CheckErrorKind::UnknownTypeName(typename.into())), + _ => Err(CommonCheckErrorKind::UnknownTypeName(typename.into())), } } @@ -225,18 +226,19 @@ impl TypeSignatureExt for TypeSignature { epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result { + ) -> Result { if type_args.len() != 2 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } if let SymbolicExpressionType::LiteralValue(Value::Int(max_len)) = &type_args[0].expr { let atomic_type_arg = &type_args[type_args.len() - 1]; let entry_type = TypeSignature::parse_type_repr(epoch, atomic_type_arg, accounting)?; - let max_len = u32::try_from(*max_len).map_err(|_| CheckErrorKind::ValueTooLarge)?; + let max_len = + u32::try_from(*max_len).map_err(|_| CommonCheckErrorKind::ValueTooLarge)?; ListTypeData::new_list(entry_type, max_len).map(|x| x.into()) } else { - Err(CheckErrorKind::InvalidTypeDescription) + Err(CommonCheckErrorKind::InvalidTypeDescription) } } @@ -246,8 +248,8 @@ impl TypeSignatureExt for TypeSignature { epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result { - let mapped_key_types = parse_name_type_pairs::<_, CheckErrorKind>( + ) -> Result { + let mapped_key_types = parse_name_type_pairs::<_, CommonCheckErrorKind>( epoch, type_args, SyntaxBindingErrorType::TupleCons, @@ -261,15 +263,15 @@ impl TypeSignatureExt for TypeSignature { // (buff 10) fn parse_buff_type_repr( type_args: &[SymbolicExpression], - ) -> Result { + ) -> Result { if type_args.len() != 1 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } if let SymbolicExpressionType::LiteralValue(Value::Int(buff_len)) = &type_args[0].expr { BufferLength::try_from(*buff_len) .map(|buff_len| SequenceType(SequenceSubtype::BufferType(buff_len))) } else { - Err(CheckErrorKind::InvalidTypeDescription) + Err(CommonCheckErrorKind::InvalidTypeDescription) } } @@ -277,16 +279,16 @@ impl TypeSignatureExt for TypeSignature { // (string-utf8 10) fn parse_string_utf8_type_repr( type_args: &[SymbolicExpression], - ) -> Result { + ) -> Result { if type_args.len() != 1 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } if let SymbolicExpressionType::LiteralValue(Value::Int(utf8_len)) = &type_args[0].expr { StringUTF8Length::try_from(*utf8_len).map(|utf8_len| { SequenceType(SequenceSubtype::StringType(StringSubtype::UTF8(utf8_len))) }) } else { - Err(CheckErrorKind::InvalidTypeDescription) + Err(CommonCheckErrorKind::InvalidTypeDescription) } } @@ -294,16 +296,16 @@ impl TypeSignatureExt for TypeSignature { // (string-ascii 10) fn parse_string_ascii_type_repr( type_args: &[SymbolicExpression], - ) -> Result { + ) -> Result { if type_args.len() != 1 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } if let SymbolicExpressionType::LiteralValue(Value::Int(buff_len)) = &type_args[0].expr { BufferLength::try_from(*buff_len).map(|buff_len| { SequenceType(SequenceSubtype::StringType(StringSubtype::ASCII(buff_len))) }) } else { - Err(CheckErrorKind::InvalidTypeDescription) + Err(CommonCheckErrorKind::InvalidTypeDescription) } } @@ -311,9 +313,9 @@ impl TypeSignatureExt for TypeSignature { epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result { + ) -> Result { if type_args.len() != 1 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } let inner_type = TypeSignature::parse_type_repr(epoch, &type_args[0], accounting)?; @@ -324,20 +326,21 @@ impl TypeSignatureExt for TypeSignature { epoch: StacksEpochId, type_args: &[SymbolicExpression], accounting: &mut A, - ) -> Result { + ) -> Result { if type_args.len() != 2 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } let ok_type = TypeSignature::parse_type_repr(epoch, &type_args[0], accounting)?; let err_type = TypeSignature::parse_type_repr(epoch, &type_args[1], accounting)?; - TypeSignature::new_response(ok_type, err_type) + let response_type = TypeSignature::new_response(ok_type, err_type)?; + Ok(response_type) } fn parse_type_repr( epoch: StacksEpochId, x: &SymbolicExpression, accounting: &mut A, - ) -> Result { + ) -> Result { runtime_cost(ClarityCostFunction::TypeParseStep, accounting, 0)?; match x.expr { @@ -348,7 +351,7 @@ impl TypeSignatureExt for TypeSignature { SymbolicExpressionType::List(ref list_contents) => { let (compound_type, rest) = list_contents .split_first() - .ok_or(CheckErrorKind::InvalidTypeDescription)?; + .ok_or(CommonCheckErrorKind::InvalidTypeDescription)?; if let SymbolicExpressionType::Atom(ref compound_type) = compound_type.expr { match compound_type.as_ref() { "list" => TypeSignature::parse_list_type_repr(epoch, rest, accounting), @@ -362,10 +365,10 @@ impl TypeSignatureExt for TypeSignature { "response" => { TypeSignature::parse_response_type_repr(epoch, rest, accounting) } - _ => Err(CheckErrorKind::InvalidTypeDescription), + _ => Err(CommonCheckErrorKind::InvalidTypeDescription), } } else { - Err(CheckErrorKind::InvalidTypeDescription) + Err(CommonCheckErrorKind::InvalidTypeDescription) } } SymbolicExpressionType::TraitReference(_, ref trait_definition) @@ -390,7 +393,7 @@ impl TypeSignatureExt for TypeSignature { )), } } - _ => Err(CheckErrorKind::InvalidTypeDescription), + _ => Err(CommonCheckErrorKind::InvalidTypeDescription), } } @@ -399,17 +402,17 @@ impl TypeSignatureExt for TypeSignature { accounting: &mut A, epoch: StacksEpochId, clarity_version: ClarityVersion, - ) -> Result, CheckErrorKind> { + ) -> Result, CommonCheckErrorKind> { let mut trait_signature: BTreeMap = BTreeMap::new(); let functions_types = type_args .first() - .ok_or_else(|| CheckErrorKind::InvalidTypeDescription)? + .ok_or_else(|| CommonCheckErrorKind::InvalidTypeDescription)? .match_list() - .ok_or(CheckErrorKind::DefineTraitBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineTraitBadSignature)?; // Check the method count against the maximum allowed if epoch.limits_parameter_and_method_count() && functions_types.len() > MAX_TRAIT_METHODS { - return Err(CheckErrorKind::TraitTooManyMethods( + return Err(CommonCheckErrorKind::TraitTooManyMethods( functions_types.len(), MAX_TRAIT_METHODS, )); @@ -417,7 +420,7 @@ impl TypeSignatureExt for TypeSignature { // Check the method count against the maximum allowed if epoch.limits_parameter_and_method_count() && functions_types.len() > MAX_TRAIT_METHODS { - return Err(CheckErrorKind::TraitTooManyMethods( + return Err(CommonCheckErrorKind::TraitTooManyMethods( functions_types.len(), MAX_TRAIT_METHODS, )); @@ -426,26 +429,26 @@ impl TypeSignatureExt for TypeSignature { for function_type in functions_types.iter() { let args = function_type .match_list() - .ok_or(CheckErrorKind::DefineTraitBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineTraitBadSignature)?; if args.len() != 3 { - return Err(CheckErrorKind::InvalidTypeDescription); + return Err(CommonCheckErrorKind::InvalidTypeDescription); } // Extract function's name let fn_name = args[0] .match_atom() - .ok_or(CheckErrorKind::DefineTraitBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineTraitBadSignature)?; // Extract function's arguments let fn_args_exprs = args[1] .match_list() - .ok_or(CheckErrorKind::DefineTraitBadSignature)?; + .ok_or(CommonCheckErrorKind::DefineTraitBadSignature)?; // Check the argument count against the maximum allowed if epoch.limits_parameter_and_method_count() && fn_args_exprs.len() > MAX_FUNCTION_PARAMETERS { - return Err(CheckErrorKind::TooManyFunctionParameters( + return Err(CommonCheckErrorKind::TooManyFunctionParameters( fn_args_exprs.len(), MAX_FUNCTION_PARAMETERS, )); @@ -454,15 +457,15 @@ impl TypeSignatureExt for TypeSignature { let fn_args = fn_args_exprs .iter() .map(|arg_type| TypeSignature::parse_type_repr(epoch, arg_type, accounting)) - .collect::>()?; + .collect::>()?; // Extract function's type return - must be a response let fn_return = match TypeSignature::parse_type_repr(epoch, &args[2], accounting) { Ok(response) => match response { TypeSignature::ResponseType(_) => Ok(response), - _ => Err(CheckErrorKind::DefineTraitBadSignature), + _ => Err(CommonCheckErrorKind::DefineTraitBadSignature), }, - _ => Err(CheckErrorKind::DefineTraitBadSignature), + _ => Err(CommonCheckErrorKind::DefineTraitBadSignature), }?; if trait_signature @@ -476,7 +479,7 @@ impl TypeSignatureExt for TypeSignature { .is_some() && clarity_version >= ClarityVersion::Clarity2 { - return Err(CheckErrorKind::DefineTraitDuplicateMethod( + return Err(CommonCheckErrorKind::DefineTraitDuplicateMethod( fn_name.to_string(), )); } @@ -501,7 +504,7 @@ impl TypeSignatureExt for TypeSignature { } impl FixedFunction { - pub fn total_type_size(&self) -> Result { + pub fn total_type_size(&self) -> Result { let mut function_type_size = u64::from(self.returns.type_size()?); for arg in self.args.iter() { function_type_size = @@ -512,11 +515,12 @@ impl FixedFunction { } impl FunctionSignature { - pub fn total_type_size(&self) -> Result { + pub fn total_type_size(&self) -> Result { let mut function_type_size = u64::from(self.returns.type_size()?); for arg in self.args.iter() { - function_type_size = - function_type_size.cost_overflow_add(u64::from(arg.type_size()?))?; + function_type_size = function_type_size + .cost_overflow_add(u64::from(arg.type_size()?)) + .map_err(|_| StaticCheckErrorKind::CostOverflow)?; } Ok(function_type_size) } @@ -525,7 +529,7 @@ impl FunctionSignature { &self, epoch: &StacksEpochId, args: Vec, - ) -> Result { + ) -> Result { if args.len() != self.args.len() { return Ok(false); } @@ -574,7 +578,7 @@ pub fn parse_name_type_pairs( accounting: &mut A, ) -> Result, E> where - E: for<'a> From<(CheckErrorKind, &'a SymbolicExpression)>, + E: for<'a> From<(CommonCheckErrorKind, &'a SymbolicExpression)>, { // this is a pretty deep nesting here, but what we're trying to do is pick out the values of // the form: @@ -583,14 +587,14 @@ where use crate::vm::representations::SymbolicExpressionType::List; // step 1: parse it into a vec of symbolicexpression pairs. - let as_pairs: Result, (CheckErrorKind, &SymbolicExpression)> = name_type_pairs + let as_pairs: Result, (CommonCheckErrorKind, &SymbolicExpression)> = name_type_pairs .iter() .enumerate() .map(|(i, key_type_pair)| { if let List(ref as_vec) = key_type_pair.expr { if as_vec.len() != 2 { Err(( - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::InvalidLength( + CommonCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::InvalidLength( binding_error_type, i, )), @@ -609,7 +613,7 @@ where .collect(); // step 2: turn into a vec of (name, typesignature) pairs. - let key_types: Result, (CheckErrorKind, &SymbolicExpression)> = (as_pairs?) + let key_types: Result, (CommonCheckErrorKind, &SymbolicExpression)> = (as_pairs?) .iter() .enumerate() .map(|(i, (name_symbol, type_symbol))| { @@ -617,7 +621,7 @@ where .match_atom() .ok_or_else(|| { ( - CheckErrorKind::BadSyntaxBinding(SyntaxBindingError::NotAtom( + CommonCheckErrorKind::BadSyntaxBinding(SyntaxBindingError::NotAtom( binding_error_type, i, )), @@ -642,13 +646,14 @@ impl fmt::Display for FunctionArg { #[cfg(test)] mod test { + use clarity_types::errors::CheckErrorKind; + use clarity_types::errors::CheckErrorKind::*; #[cfg(test)] use rstest::rstest; #[cfg(test)] use rstest_reuse::{self, *}; use stacks_common::types::StacksEpochId; - use super::CheckErrorKind::*; use super::*; use crate::vm::tests::test_clarity_versions; use crate::vm::types::QualifiedContractIdentifier; @@ -663,7 +668,9 @@ mod test { epoch, ) .unwrap()[0]; - TypeSignature::parse_type_repr(epoch, expr, &mut ()).unwrap_err() + TypeSignature::parse_type_repr(epoch, expr, &mut ()) + .unwrap_err() + .into() } #[apply(test_clarity_versions)] @@ -691,7 +698,7 @@ mod test { assert_eq!( TupleTypeSignature::try_from(keys).unwrap_err(), - ValueTooLarge + CommonCheckErrorKind::ValueTooLarge ); } diff --git a/clarity/src/vm/variables.rs b/clarity/src/vm/variables.rs index b450bd9c157..82557544d8f 100644 --- a/clarity/src/vm/variables.rs +++ b/clarity/src/vm/variables.rs @@ -58,10 +58,14 @@ pub fn lookup_reserved_variable( { match variable { NativeVariables::TxSender => { + // This `NoSenderInContext` is **unreachable** in standard Clarity VM execution. + // - Every function call (public, private, or trait) is executed with a valid caller context. let sender = env.sender.clone().ok_or(RuntimeError::NoSenderInContext)?; Ok(Some(Value::Principal(sender))) } NativeVariables::ContractCaller => { + // This `NoCallerInContext` is **unreachable** in standard Clarity VM execution. + // - Every on-chain transaction and contract-call has a well-defined sender. let caller = env.caller.clone().ok_or(RuntimeError::NoCallerInContext)?; Ok(Some(Value::Principal(caller))) } @@ -144,3 +148,81 @@ pub fn lookup_reserved_variable( Ok(None) } } + +#[cfg(test)] +mod test { + use clarity_types::types::QualifiedContractIdentifier; + use stacks_common::consts::CHAIN_ID_TESTNET; + + use super::*; + use crate::vm::contexts::GlobalContext; + use crate::vm::costs::LimitedCostTracker; + use crate::vm::database::MemoryBackingStore; + use crate::vm::{CallStack, ClarityVersion, ContractContext}; + + #[test] + fn trigger_no_caller_in_context() { + let mut call_stack = CallStack::new(); + let contract = QualifiedContractIdentifier::transient(); + let contract_context = ContractContext::new(contract.clone(), ClarityVersion::Clarity1); + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + StacksEpochId::Epoch2_05, + ); + let mut env = Environment { + contract_context: &contract_context, + sender: Some(PrincipalData::Standard(contract.issuer.clone())), + caller: None, // <- intentionally missing + sponsor: None, + global_context: &mut global_context, + call_stack: &mut call_stack, + }; + let ctx = LocalContext::default(); + + let res = lookup_reserved_variable("contract-caller", &ctx, &mut env); + assert!(matches!( + res, + Err(VmExecutionError::Runtime( + RuntimeError::NoCallerInContext, + _ + )) + )); + } + + #[test] + fn trigger_no_sender_in_context() { + let mut call_stack = CallStack::new(); + let contract = QualifiedContractIdentifier::transient(); + let contract_context = ContractContext::new(contract.clone(), ClarityVersion::Clarity1); + let mut marf = MemoryBackingStore::new(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + marf.as_clarity_db(), + LimitedCostTracker::new_free(), + StacksEpochId::Epoch2_05, + ); + let mut env = Environment { + contract_context: &contract_context, + caller: Some(PrincipalData::Standard(contract.issuer.clone())), + sender: None, // <- intentionally missing + sponsor: None, + global_context: &mut global_context, + call_stack: &mut call_stack, + }; + let ctx = LocalContext::default(); + + let res = lookup_reserved_variable("tx-sender", &ctx, &mut env); + assert!(matches!( + res, + Err(VmExecutionError::Runtime( + RuntimeError::NoSenderInContext, + _ + )) + )); + } +} diff --git a/contrib/clarity-cli/Cargo.toml b/contrib/clarity-cli/Cargo.toml index 1075c774d00..9fa1f0f282f 100644 --- a/contrib/clarity-cli/Cargo.toml +++ b/contrib/clarity-cli/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] +clap = { version = "4.5.44", features = ["derive"] } clarity = { path = "../../clarity", default-features = false } stackslib = { package = "stackslib", path = "../../stackslib", default-features = false } stacks-common = { path = "../../stacks-common", default-features = false } diff --git a/contrib/clarity-cli/README.md b/contrib/clarity-cli/README.md index 32ed0a6690a..ed86dea6935 100644 --- a/contrib/clarity-cli/README.md +++ b/contrib/clarity-cli/README.md @@ -1,15 +1,355 @@ # clarity-cli -A thin wrapper executable for the Clarity CLI exposed by `blockstack_lib::clarity_cli`. It forwards argv to the library, prints JSON output, and exits with the underlying status code. +A command-line interface for developing, testing, and debugging Clarity smart contracts locally without needing a full Stacks node. + +## Build + +```bash +cargo build --release -p clarity-cli +``` + +The binary will be at `./target/release/clarity-cli`. + +## Overview + +clarity-cli provides a local VM environment for Clarity contract development. It maintains a persistent database that simulates blockchain state, allowing you to: + +- Initialize a local VM with boot contracts +- Type-check contracts before deployment +- Deploy ("launch") contracts to the local state +- Execute public functions on deployed contracts +- Evaluate Clarity expressions in various contexts + +All commands output JSON for easy parsing and integration with other tools. + +## Commands + +### `initialize` + +Create and initialize a new local VM state database with boot contracts. + +```bash +clarity-cli initialize [OPTIONS] [ALLOCATIONS_FILE] +``` + +**Arguments:** +- `DB_PATH` - Directory path for the VM state database +- `ALLOCATIONS_FILE` - Optional JSON file with initial STX allocations (or `-` for stdin) + +**Options:** +- `--testnet` - Use testnet boot code and block limits (default: mainnet) +- `--epoch ` - Stacks epoch to use (default: 3.3) + +**Example:** +```bash +# Initialize mainnet database +clarity-cli initialize ./my-db + +# Initialize testnet with allocations +clarity-cli initialize --testnet ./my-db allocations.json +``` + +**Allocations JSON format:** +```json +[ + { "principal": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM", "amount": 1000000 }, + { "principal": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract", "amount": 500000 } +] +``` + +--- + +### `generate-address` + +Generate a random Stacks address for testing. + +```bash +clarity-cli generate-address +``` + +**Example output:** +```json +{"address": "ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG"} +``` + +--- + +### `check` + +Type-check a Clarity contract without deploying it. -Build: ```bash -cargo build -p clarity-cli +clarity-cli check [OPTIONS] [DB_PATH] ``` -Usage: +**Arguments:** +- `CONTRACT_FILE` - Path to `.clar` file (or `-` for stdin) +- `DB_PATH` - Optional database path for resolving contract dependencies + +**Options:** +- `--contract-id ` - Contract identifier (default: transient) +- `--output-analysis` - Include contract interface analysis in output +- `--costs` - Include execution costs in output +- `--testnet` - Use testnet configuration +- `--clarity-version ` - Clarity version (e.g., `clarity1`, `clarity2`, `clarity3`, `clarity4`) +- `--epoch ` - Stacks epoch (e.g., `2.1`, `2.5`, `3.0`) + +**Example:** ```bash -./target/debug/clarity-cli --help +# Basic type check +clarity-cli check my-contract.clar + +# Check with cost analysis +clarity-cli check --costs --output-analysis my-contract.clar + +# Check against existing database (resolves contract-call? references) +clarity-cli check my-contract.clar ./my-db + +# Read from stdin +cat my-contract.clar | clarity-cli check - ``` -For advanced usage and subcommands, see the upstream Clarity CLI documentation or run with `--help`. +--- + +### `launch` + +Deploy a contract to the local VM state database. + +```bash +clarity-cli launch [OPTIONS] +``` + +**Arguments:** +- `CONTRACT_ID` - Fully qualified contract identifier (e.g., `ST1PQHQ...PGZGM.my-contract`) +- `CONTRACT_FILE` - Path to `.clar` file (or `-` for stdin) +- `DB_PATH` - Database path (must be initialized first) + +**Options:** +- `--costs` - Include execution costs in output +- `--assets` - Include asset changes in output +- `--output-analysis` - Include contract interface analysis +- `--clarity-version ` - Clarity version +- `--epoch ` - Stacks epoch + +**Example:** +```bash +# Deploy a contract +clarity-cli launch ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.tokens \ + tokens.clar ./my-db + +# Deploy with full output +clarity-cli launch --costs --assets --output-analysis \ + ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.tokens tokens.clar ./my-db +``` + +--- + +### `execute` + +Execute a public function on a deployed contract. + +```bash +clarity-cli execute [OPTIONS] [ARGS]... +``` + +**Arguments:** +- `CONTRACT_ID` - Contract identifier +- `FUNCTION_NAME` - Public function name to call +- `SENDER` - Sender principal address (becomes `tx-sender`) +- `DB_PATH` - Database path +- `ARGS` - Function arguments as Clarity literals + +**Options:** +- `--costs` - Include execution costs +- `--assets` - Include asset changes +- `--clarity-version ` - Clarity version +- `--epoch ` - Stacks epoch + +**Example:** +```bash +# Call a function with no arguments +clarity-cli execute ST1PQHQ...PGZGM.tokens get-balance \ + ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM ./my-db + +# Call with arguments +clarity-cli execute ST1PQHQ...PGZGM.tokens transfer \ + ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM ./my-db \ + u100 \ + 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG + +# Note: Principal arguments need the Clarity quote prefix (') +``` + +--- + +### `eval` + +Evaluate a Clarity expression in read-only mode within a contract's context. Advances to a new block. + +```bash +clarity-cli eval [OPTIONS] [PROGRAM_FILE] +``` + +**Arguments:** +- `CONTRACT_ID` - Contract context for evaluation +- `DB_PATH` - Database path +- `PROGRAM_FILE` - File with Clarity code (or `-` for stdin; omit for stdin) + +**Options:** +- `--costs` - Include execution costs +- `--clarity-version ` - Clarity version +- `--epoch ` - Stacks epoch + +**Example:** +```bash +# Evaluate from file +clarity-cli eval ST1PQHQ...PGZGM.tokens ./my-db query.clar + +# Evaluate from stdin +echo "(+ 1 2)" | clarity-cli eval ST1PQHQ...PGZGM.tokens ./my-db +``` + +--- + +### `eval-at-chaintip` + +Like `eval`, but does **not** advance to a new block. Useful for repeated read-only queries. + +```bash +clarity-cli eval-at-chaintip [OPTIONS] [PROGRAM_FILE] +``` + +**Options:** Same as `eval`. + +--- + +### `eval-at-block` + +Evaluate at a specific historical block identified by its index block hash. + +```bash +clarity-cli eval-at-block [OPTIONS] [PROGRAM_FILE] +``` + +**Arguments:** +- `INDEX_BLOCK_HASH` - Block hash (hex string, e.g., `0x1234...`) +- `CONTRACT_ID` - Contract context +- `VM_DIR` - VM/clarity directory path +- `PROGRAM_FILE` - File with Clarity code (or `-` for stdin; omit for stdin) + +**Options:** +- `--costs` - Include execution costs +- `--clarity-version ` - Clarity version +- `--epoch ` - Stacks epoch + +--- + +### `eval-raw` + +Evaluate a Clarity expression without any contract or database context. Useful for quick calculations. + +```bash +clarity-cli eval-raw [OPTIONS] [PROGRAM_FILE] +``` + +**Arguments:** +- `PROGRAM_FILE` - File with Clarity code (or `-` for stdin; omit for stdin) + +**Options:** +- `--testnet` - Use testnet configuration +- `--clarity-version ` - Clarity version +- `--epoch ` - Stacks epoch + +**Example:** +```bash +# Quick calculation +echo "(+ 1 2)" | clarity-cli eval-raw + +# From file +clarity-cli eval-raw expression.clar +``` + +--- + +### `repl` + +Start an interactive REPL (Read-Eval-Print Loop) for Clarity expressions. + +```bash +clarity-cli repl [OPTIONS] +``` + +**Options:** +- `--testnet` - Use testnet configuration +- `--clarity-version ` - Clarity version +- `--epoch ` - Stacks epoch + +**Example:** +```bash +clarity-cli repl --clarity-version clarity3 +> (+ 1 2) +3 +> (define-data-var counter uint u0) +true +> (var-set counter u10) +true +> (var-get counter) +u10 +``` + +--- + +## Typical Workflow + +```bash +# 1. Initialize database +clarity-cli initialize ./my-db + +# 2. Check your contract +clarity-cli check my-contract.clar ./my-db + +# 3. Deploy contract +clarity-cli launch ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract \ + my-contract.clar ./my-db + +# 4. Execute functions +clarity-cli execute ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract \ + my-function ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM ./my-db u42 + +# 5. Query state +echo "(contract-call? .my-contract get-value)" | \ + clarity-cli eval-at-chaintip ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract ./my-db +``` + +## Epoch and Clarity Version + +The CLI defaults to Epoch 3.3 with Clarity 4. You can specify earlier epochs/versions for compatibility testing. + +**Valid epoch values:** `1.0`, `2.0`, `2.05`, `2.1`, `2.2`, `2.3`, `2.4`, `2.5`, `3.0`, `3.1`, `3.2`, `3.3` + +**Valid clarity version values:** `clarity1`, `clarity2`, `clarity3`, `clarity4` + +| Epoch | Default Clarity Version | +|-------|------------------------| +| 2.0 | Clarity 1 | +| 2.05 | Clarity 1 | +| 2.1 | Clarity 2 | +| 2.2 | Clarity 2 | +| 2.3 | Clarity 2 | +| 2.4 | Clarity 2 | +| 2.5 | Clarity 2 | +| 3.0 | Clarity 3 | +| 3.1 | Clarity 3 | +| 3.2 | Clarity 3 | +| 3.3 | Clarity 4 | + +See `clarity/src/vm/version.rs` for Clarity version definitions and `stacks-common/src/types/mod.rs` for epoch definitions. + +## Exit Codes + +- `0` - Success +- `1` - Error (check JSON output for details) + +## JSON Output + +All commands output JSON to stdout. Errors are also returned as JSON with an `"error"` field. Use `--costs` and `--assets` flags to include additional information in the output. diff --git a/contrib/clarity-cli/src/lib.rs b/contrib/clarity-cli/src/lib.rs index b029bb03bd2..827c863d970 100644 --- a/contrib/clarity-cli/src/lib.rs +++ b/contrib/clarity-cli/src/lib.rs @@ -14,18 +14,28 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#[macro_use] -extern crate serde_derive; - -use std::io::{Read, Write}; +use std::io::Write; use std::path::PathBuf; use std::{fs, io}; -use clarity::vm::coverage::CoverageReporter; +use clarity::vm::analysis::contract_interface_builder::build_contract_interface; +use clarity::vm::analysis::{AnalysisDatabase, ContractAnalysis}; +use clarity::vm::ast::build_ast; +use clarity::vm::contexts::{AssetMap, GlobalContext, OwnedEnvironment}; +use clarity::vm::costs::{ExecutionCost, LimitedCostTracker}; +use clarity::vm::database::{ + BurnStateDB, ClarityDatabase, HeadersDB, NULL_BURN_STATE_DB, STXBalance, +}; +use clarity::vm::errors::{RuntimeError, StaticCheckError, VmExecutionError}; +use clarity::vm::types::{PrincipalData, QualifiedContractIdentifier}; +use clarity::vm::{ + ClarityVersion, ContractContext, ContractName, SymbolicExpression, Value, analysis, ast, + eval_all, +}; use lazy_static::lazy_static; use rand::Rng; use rusqlite::{Connection, OpenFlags}; -use serde::Serialize; +use serde::Deserialize; use serde_json::json; use stacks_common::address::c32::c32_address; use stacks_common::consts::{CHAIN_ID_MAINNET, CHAIN_ID_TESTNET}; @@ -34,7 +44,6 @@ use stacks_common::types::chainstate::{ BlockHeaderHash, BurnchainHeaderHash, ConsensusHash, StacksAddress, StacksBlockId, VRFSeed, }; use stacks_common::types::sqlite::NO_PARAMS; -use stacks_common::util::get_epoch_time_ms; use stacks_common::util::hash::{Hash160, Sha512Trunc256Sum, bytes_to_hex}; use stackslib::burnchains::{PoxConstants, Txid}; use stackslib::chainstate::stacks::boot::{ @@ -44,21 +53,6 @@ use stackslib::chainstate::stacks::boot::{ POX_2_MAINNET_CODE, POX_2_TESTNET_CODE, }; use stackslib::chainstate::stacks::index::ClarityMarfTrieId; -use stackslib::clarity::vm::analysis::contract_interface_builder::build_contract_interface; -use stackslib::clarity::vm::analysis::errors::StaticCheckError; -use stackslib::clarity::vm::analysis::{AnalysisDatabase, ContractAnalysis}; -use stackslib::clarity::vm::ast::build_ast; -use stackslib::clarity::vm::contexts::{AssetMap, GlobalContext, OwnedEnvironment}; -use stackslib::clarity::vm::costs::{ExecutionCost, LimitedCostTracker}; -use stackslib::clarity::vm::database::{ - BurnStateDB, ClarityDatabase, HeadersDB, NULL_BURN_STATE_DB, STXBalance, -}; -use stackslib::clarity::vm::errors::{RuntimeError, VmExecutionError}; -use stackslib::clarity::vm::types::{PrincipalData, QualifiedContractIdentifier}; -use stackslib::clarity::vm::{ - ClarityVersion, ContractContext, ContractName, SymbolicExpression, Value, analysis, ast, - eval_all, -}; use stackslib::clarity_vm::clarity::{ClarityMarfStore, ClarityMarfStoreTransaction}; use stackslib::clarity_vm::database::MemoryBackingStore; use stackslib::clarity_vm::database::marf::{MarfedKV, PersistentWritableMarfStore}; @@ -106,27 +100,6 @@ macro_rules! panic_test { }; } -fn print_usage(invoked_by: &str) { - eprintln!( - "Usage: {invoked_by} [command] -where command is one of: - - initialize to initialize a local VM state database. - check to typecheck a potential contract definition. - launch to launch a initialize a new contract in the local state database. - eval to evaluate (in read-only mode) a program in a given contract context. - eval_at_chaintip like `eval`, but does not advance to a new block. - eval_at_block like `eval_at_chaintip`, but accepts a index-block-hash to evaluate at, - must be passed eval string via stdin. - eval_raw to typecheck and evaluate an expression without a contract or database context from stdin. - repl to typecheck and evaluate expressions in a stdin/stdout loop. - execute to execute a public function of a defined contract. - generate_address to generate a random Stacks public address for testing purposes. -" - ); - panic_test!() -} - fn friendly_expect(input: Result, msg: &str) -> A { input.unwrap_or_else(|e| { eprintln!("{msg}\nCaused by: {e}"); @@ -141,15 +114,30 @@ fn friendly_expect_opt(input: Option, msg: &str) -> A { }) } -pub const DEFAULT_CLI_EPOCH: StacksEpochId = StacksEpochId::Epoch33; +/// Represents an initial allocation entry from JSON +#[derive(Deserialize)] +pub struct InitialAllocation { + pub principal: String, + pub amount: u64, +} -struct EvalInput { - #[allow(dead_code)] - marf_kv: MarfedKV, - contract_identifier: QualifiedContractIdentifier, - content: String, +/// Parse allocation JSON string into (PrincipalData, u64) pairs +pub fn parse_allocations_json(json_content: &str) -> Result, String> { + let initial_allocations: Vec = serde_json::from_str(json_content) + .map_err(|e| format!("Failed to parse allocations JSON: {e}"))?; + + initial_allocations + .into_iter() + .map(|a| { + let principal = PrincipalData::parse(&a.principal) + .map_err(|e| format!("Failed to parse principal {}: {e}", a.principal))?; + Ok((principal, a.amount)) + }) + .collect() } +pub const DEFAULT_CLI_EPOCH: StacksEpochId = StacksEpochId::Epoch33; + fn parse( contract_identifier: &QualifiedContractIdentifier, source_code: &str, @@ -270,7 +258,7 @@ fn create_or_open_db(path: &String) -> Connection { // need to create if let Some(dirp) = PathBuf::from(path).parent() { fs::create_dir_all(dirp).unwrap_or_else(|e| { - eprintln!("Failed to create {:?}: {:?}", dirp, &e); + eprintln!("Failed to create {dirp:?}: {e:?}"); panic_test!(); }); } @@ -410,7 +398,6 @@ fn with_env_costs( epoch: StacksEpochId, header_db: &CLIHeadersDB, marf: &mut PersistentWritableMarfStore, - coverage: Option<&mut CoverageReporter>, f: F, ) -> (R, ExecutionCost) where @@ -436,9 +423,6 @@ where cost_track, epoch, ); - if let Some(coverage) = coverage { - vm_env.add_eval_hook(coverage); - } let result = f(&mut vm_env); let cost = vm_env.get_cost_total(); (result, cost) @@ -476,49 +460,7 @@ pub fn vm_execute( program: &str, clarity_version: ClarityVersion, ) -> Result, VmExecutionError> { - let contract_id = QualifiedContractIdentifier::transient(); - let mut contract_context = ContractContext::new(contract_id.clone(), clarity_version); - let mut marf = MemoryBackingStore::new(); - let conn = marf.as_clarity_db(); - let mut global_context = GlobalContext::new( - false, - default_chain_id(false), - conn, - LimitedCostTracker::new_free(), - StacksEpochId::latest(), - ); - global_context.execute(|g| { - let parsed = ast::build_ast( - &contract_id, - program, - &mut (), - clarity_version, - StacksEpochId::latest(), - )? - .expressions; - eval_all(&parsed, &mut contract_context, g, None) - }) -} - -fn save_coverage( - coverage_folder: Option, - coverage: Option, - prefix: &str, -) { - match (coverage_folder, coverage) { - (Some(coverage_folder), Some(coverage)) => { - let mut coverage_file = PathBuf::from(coverage_folder); - coverage_file.push(format!("{prefix}_{}", get_epoch_time_ms())); - coverage_file.set_extension("clarcov"); - - coverage - .to_file(&coverage_file) - .expect("Coverage reference file generation failure"); - } - (None, None) => (), - (None, Some(_)) => (), - (Some(_), None) => (), - } + vm_execute_in_epoch(program, clarity_version, StacksEpochId::latest()) } struct CLIHeadersDB { @@ -559,7 +501,7 @@ impl CLIHeadersDB { friendly_expect( tx.commit(), - &format!("FATAL: failed to instantiate CLI DB at {:?}", &cli_db_path), + &format!("FATAL: failed to instantiate CLI DB at {cli_db_path:?}"), ); } @@ -586,7 +528,7 @@ impl CLIHeadersDB { pub fn resume(db_path: &str) -> Result { let cli_db_path = get_cli_db_path(db_path); if let Err(e) = fs::metadata(&cli_db_path) { - return Err(format!("Failed to access {:?}: {:?}", &cli_db_path, &e)); + return Err(format!("Failed to access {cli_db_path:?}: {e:?}")); } let conn = create_or_open_db(&cli_db_path); let db = CLIHeadersDB { @@ -625,9 +567,10 @@ impl CLIHeadersDB { } pub fn advance_cli_chain_tip(&mut self) -> (StacksBlockId, StacksBlockId) { + let db_path = &self.db_path; let tx = friendly_expect( self.conn.transaction(), - &format!("FATAL: failed to begin transaction on '{}'", &self.db_path), + &format!("FATAL: failed to begin transaction on '{db_path}'"), ); let parent_block_hash = get_cli_chain_tip(&tx); @@ -643,18 +586,12 @@ impl CLIHeadersDB { "INSERT INTO cli_chain_tips (block_hash) VALUES (?1)", [&next_block_hash], ), - &format!( - "FATAL: failed to store next block hash in '{}'", - &self.db_path - ), + &format!("FATAL: failed to store next block hash in '{db_path}'"), ); friendly_expect( tx.commit(), - &format!( - "FATAL: failed to commit new chain tip to '{}'", - &self.db_path - ), + &format!("FATAL: failed to commit new chain tip to '{db_path}'"), ); (parent_block_hash, next_block_hash) @@ -787,94 +724,6 @@ impl HeadersDB for CLIHeadersDB { } } -fn get_eval_input(invoked_by: &str, args: &[String]) -> EvalInput { - if args.len() < 3 || args.len() > 4 { - eprintln!( - "Usage: {invoked_by} {} [--costs] [--epoch E] [--clarity_version N] [contract-identifier] (program.clar) [vm-state.db]", - args[0] - ); - panic_test!(); - } - - let vm_filename = if args.len() == 3 { &args[2] } else { &args[3] }; - - let content: String = { - if args.len() == 3 { - let mut buffer = String::new(); - friendly_expect( - io::stdin().read_to_string(&mut buffer), - "Error reading from stdin.", - ); - buffer - } else { - friendly_expect( - fs::read_to_string(&args[2]), - &format!("Error reading file: {}", args[2]), - ) - } - }; - - let contract_identifier = friendly_expect( - QualifiedContractIdentifier::parse(&args[1]), - "Failed to parse contract identifier.", - ); - - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - // return (marf_kv, contract_identifier, vm_filename, content); - EvalInput { - marf_kv, - contract_identifier, - content, - } -} - -#[derive(Serialize, Deserialize)] -struct InitialAllocation { - principal: String, - amount: u64, -} - -fn consume_arg( - args: &mut Vec, - argnames: &[&str], - has_optarg: bool, -) -> Result, String> { - if let Some(ref switch) = args - .iter() - .find(|ref arg| argnames.iter().any(|ref argname| argname == arg)) - { - let idx = args - .iter() - .position(|ref arg| arg == switch) - .expect("BUG: did not find the thing that was just found"); - let argval = if has_optarg { - // following argument is the argument value - if idx + 1 < args.len() { - Some(args[idx + 1].clone()) - } else { - // invalid usage -- expected argument - return Err("Expected argument".to_string()); - } - } else { - // only care about presence of this option - Some("".to_string()) - }; - - args.remove(idx); - if has_optarg { - // also clear the argument - args.remove(idx); - } - Ok(argval) - } else { - // not found - Ok(None) - } -} - /// This function uses Clarity1 to parse the boot code. fn install_boot_code( header_db: &CLIHeadersDB, @@ -952,7 +801,7 @@ fn install_boot_code( .unwrap(); } Err(e) => { - panic!("failed to instantiate boot contract: {:?}", &e); + panic!("failed to instantiate boot contract: {e:?}"); } }; } @@ -1006,794 +855,660 @@ pub fn add_serialized_output(result: &mut serde_json::Value, value: Value) { result["output_serialized"] = serde_json::to_value(result_raw.as_str()).unwrap(); } -/// Parse --clarity_version flag. Defaults to version for epoch. -fn parse_clarity_version_flag(argv: &mut Vec, epoch: StacksEpochId) -> ClarityVersion { - if let Ok(Some(s)) = consume_arg(argv, &["--clarity_version"], true) { - friendly_expect( - s.parse::(), - &format!("Invalid clarity version: {s}"), - ) - } else { - ClarityVersion::default_for_epoch(epoch) - } -} +/// Initialize a local VM state database +pub fn execute_initialize( + db_name: &str, + mainnet: bool, + epoch: StacksEpochId, + allocations: Vec<(PrincipalData, u64)>, +) -> (i32, Option) { + debug!("Initialize {db_name}"); + + // Create database and MARF + let mut header_db = CLIHeadersDB::new(db_name, mainnet); + let mut marf_kv = friendly_expect( + MarfedKV::open(db_name, None, None), + "Failed to open VM database.", + ); -/// Parse --epoch flag. Defaults to DEFAULT_CLI_EPOCH. -fn parse_epoch_flag(argv: &mut Vec) -> StacksEpochId { - if let Ok(Some(s)) = consume_arg(argv, &["--epoch"], true) { - friendly_expect(s.parse::(), &format!("Invalid epoch: {s}")) - } else { - DEFAULT_CLI_EPOCH - } + // Install bootcode + let state = in_block(header_db, marf_kv, |header_db, mut marf| { + install_boot_code(&header_db, &mut marf, epoch); + (header_db, marf, ()) + }); + + header_db = state.0; + marf_kv = state.1; + + // Set initial balances + in_block(header_db, marf_kv, |header_db, mut kv| { + { + let mut db = kv.as_clarity_db(&header_db, &NULL_BURN_STATE_DB); + db.begin(); + for (principal, amount) in allocations.iter() { + let balance = STXBalance::initial(*amount as u128); + let total_balance = balance.get_total_balance().unwrap(); + + let mut snapshot = db.get_stx_balance_snapshot_genesis(principal).unwrap(); + snapshot.set_balance(balance); + snapshot.save().unwrap(); + + println!("{principal} credited: {total_balance} uSTX"); + } + db.commit().unwrap(); + }; + (header_db, kv, ()) + }); + + ( + 0, + Some(json!({ + "message": "Database created.", + "network": if mainnet { "mainnet" } else { "testnet" } + })), + ) } -/// Returns (process-exit-code, Option) -pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option) { - if args.is_empty() { - print_usage(invoked_by); - return (1, None); - } +/// Generate a random Stacks address for testing purposes +pub fn execute_generate_address() -> (i32, Option) { + // Generate random 20 bytes + let random_bytes = rand::thread_rng().r#gen::<[u8; 20]>(); - match args[0].as_ref() { - "initialize" => { - let mut argv = args.to_vec(); - - let epoch = parse_epoch_flag(&mut argv); - let mainnet = !matches!(consume_arg(&mut argv, &["--testnet"], false), Ok(Some(_))); - - let (db_name, allocations) = if argv.len() == 3 { - let filename = &argv[1]; - let json_in = if filename == "-" { - let mut buffer = String::new(); - friendly_expect( - io::stdin().read_to_string(&mut buffer), - "Error reading from stdin.", - ); - buffer - } else { - friendly_expect( - fs::read_to_string(filename), - &format!("Error reading file: {filename}"), - ) - }; - let allocations: Vec = - friendly_expect(serde_json::from_str(&json_in), "Failure parsing JSON"); - - let allocations: Vec<_> = allocations - .into_iter() - .map(|a| { - ( - friendly_expect( - PrincipalData::parse(&a.principal), - "Failed to parse principal in JSON", - ), - a.amount, - ) - }) - .collect(); + // Version = 22 + let addr = friendly_expect(c32_address(22, &random_bytes), "Failed to generate address"); - (&argv[2], allocations) - } else if argv.len() == 2 { - (&argv[1], Vec::new()) - } else { - eprintln!( - "Usage: {invoked_by} {} [--testnet] [--epoch E] (initial-allocations.json) [vm-state.db]", - argv[0] - ); - eprintln!( - " initial-allocations.json is a JSON array of {{ principal: \"ST...\", amount: 100 }} like objects." - ); - eprintln!(" if the provided filename is `-`, the JSON is read from stdin."); + (0, Some(json!({ "address": format!("{addr}") }))) +} + +/// Typecheck a potential contract definition +#[allow(clippy::too_many_arguments)] +pub fn execute_check( + content: &str, + contract_id: &QualifiedContractIdentifier, + output_analysis: bool, + costs: bool, + mainnet: bool, + clarity_version: ClarityVersion, + epoch: StacksEpochId, + db_path: Option<&str>, + testnet_given: bool, +) -> (i32, Option) { + // Parse the contract + let mut ast = friendly_expect( + parse(contract_id, content, clarity_version, epoch), + "Failed to parse program", + ); + + // Run analysis (either with persisted DB or in-memory) + let contract_analysis_res = { + if let Some(vm_filename) = db_path { + // Warn if --testnet was given but we're using DB state + if testnet_given { eprintln!( - " If --testnet is given, then testnet bootcode and block-limits are used instead of mainnet." + "WARN: ignoring --testnet in favor of DB state in {vm_filename:?}. Re-instantiate the DB to change." ); - panic_test!(); - }; + } - debug!("Initialize {db_name}"); - let mut header_db = CLIHeadersDB::new(db_name, mainnet); - let mut marf_kv = friendly_expect( - MarfedKV::open(db_name, None, None), + // Use a persisted MARF + let header_db = + friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); + let marf_kv = friendly_expect( + MarfedKV::open(vm_filename, None, None), "Failed to open VM database.", ); - // install bootcode - let state = in_block(header_db, marf_kv, |header_db, mut marf| { - install_boot_code(&header_db, &mut marf, epoch); - (header_db, marf, ()) - }); - - header_db = state.0; - marf_kv = state.1; - - // set initial balances - in_block(header_db, marf_kv, |header_db, mut kv| { - { - let mut db = kv.as_clarity_db(&header_db, &NULL_BURN_STATE_DB); - db.begin(); - for (principal, amount) in allocations.iter() { - let balance = STXBalance::initial(*amount as u128); - let total_balance = balance.get_total_balance().unwrap(); - - let mut snapshot = db.get_stx_balance_snapshot_genesis(principal).unwrap(); - snapshot.set_balance(balance); - snapshot.save().unwrap(); - - println!("{principal} credited: {total_balance} uSTX"); - } - db.commit().unwrap(); - }; - (header_db, kv, ()) - }); + at_chaintip(vm_filename, marf_kv, |mut marf| { + let result = run_analysis( + contract_id, + &mut ast, + &header_db, + &mut marf, + false, + clarity_version, + epoch, + ); + (marf, result) + }) + } else { + // Use in-memory analysis + let header_db = CLIHeadersDB::new_memory(mainnet); + let mut analysis_marf = MemoryBackingStore::new(); - if mainnet { - ( - 0, - Some(json!({ - "message": "Database created.", - "network": "mainnet" - })), - ) - } else { - ( - 0, - Some(json!({ - "message": "Database created.", - "network": "testnet" - })), - ) - } + install_boot_code(&header_db, &mut analysis_marf, epoch); + run_analysis( + contract_id, + &mut ast, + &header_db, + &mut analysis_marf, + false, + clarity_version, + epoch, + ) } - "generate_address" => { - if args.len() != 1 { - eprintln!("Usage: {} {}", invoked_by, args[0]); - panic_test!(); - } - // random 20 bytes - let random_bytes = rand::thread_rng().r#gen::<[u8; 20]>(); - // version = 22 - let addr = - friendly_expect(c32_address(22, &random_bytes), "Failed to generate address"); + }; - (0, Some(json!({ "address": format!("{addr}") }))) + // Handle analysis result + let mut contract_analysis = match contract_analysis_res { + Ok(contract_analysis) => contract_analysis, + Err(boxed) => { + let (e, cost_tracker) = *boxed; + let mut result = json!({ + "message": "Checks failed.", + "error": { + "analysis": serde_json::to_value(&e.diagnostic).unwrap(), + }, + }); + add_costs(&mut result, costs, cost_tracker.get_total()); + return (1, Some(result)); } - "check" => { - if args.len() < 2 { - eprintln!( - "Usage: {invoked_by} {} [program-file.clar] [--contract_id CONTRACT_ID] [--output_analysis] [--costs] [--testnet] [--clarity_version N] [--epoch E] (vm-state.db)", - args[0] - ); - panic_test!(); - } + }; - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); - let contract_id = if let Ok(optarg) = consume_arg(&mut argv, &["--contract_id"], true) { - optarg - .map(|optarg_str| { - friendly_expect( - QualifiedContractIdentifier::parse(&optarg_str), - &format!("Error parsing contract identifier '{optarg_str}"), - ) - }) - .unwrap_or(QualifiedContractIdentifier::transient()) - } else { - eprintln!("Expected argument for --contract-id"); - panic_test!(); - }; + // Build success result + let mut result = json!({ + "message": "Checks passed." + }); - let output_analysis = - if let Ok(optarg) = consume_arg(&mut argv, &["--output_analysis"], false) { - optarg.is_some() - } else { - eprintln!("BUG: failed to parse arguments for --output_analysis"); - panic_test!(); - }; + add_costs( + &mut result, + costs, + contract_analysis.take_contract_cost_tracker().get_total(), + ); - let costs = matches!(consume_arg(&mut argv, &["--costs"], false), Ok(Some(_))); + if output_analysis { + result["analysis"] = + serde_json::to_value(build_contract_interface(&contract_analysis).unwrap()).unwrap(); + } - // NOTE: ignored if we're using a DB - let mut testnet_given = false; - let mainnet = if let Ok(Some(_)) = consume_arg(&mut argv, &["--testnet"], false) { - testnet_given = true; - false - } else { - true - }; - - let content: String = if &argv[1] == "-" { - let mut buffer = String::new(); - friendly_expect( - io::stdin().read_to_string(&mut buffer), - "Error reading from stdin.", - ); - buffer - } else { - friendly_expect( - fs::read_to_string(&argv[1]), - &format!("Error reading file: {}", argv[1]), - ) - }; - - let mut ast = friendly_expect( - parse(&contract_id, &content, clarity_version, epoch), - "Failed to parse program", - ); + (0, Some(result)) +} - let contract_analysis_res = { - if argv.len() >= 3 { - // use a persisted marf - if testnet_given { - eprintln!( - "WARN: ignoring --testnet in favor of DB state in {:?}. Re-instantiate the DB to change.", - &argv[2] - ); - } +/// Typecheck and evaluate expressions in a stdin/stdout REPL loop +pub fn execute_repl( + mainnet: bool, + epoch: StacksEpochId, + clarity_version: ClarityVersion, +) -> (i32, Option) { + let mut marf = MemoryBackingStore::new(); + let mut vm_env = OwnedEnvironment::new_free( + mainnet, + default_chain_id(mainnet), + marf.as_clarity_db(), + epoch, + ); + let placeholder_context = + ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); + let mut exec_env = vm_env.get_exec_environment(None, None, &placeholder_context); + let mut analysis_marf = MemoryBackingStore::new(); - let vm_filename = &argv[2]; - let header_db = - friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - - at_chaintip(&argv[2], marf_kv, |mut marf| { - let result = run_analysis( - &contract_id, - &mut ast, - &header_db, - &mut marf, - false, - clarity_version, - epoch, - ); - (marf, result) - }) - } else { - let header_db = CLIHeadersDB::new_memory(mainnet); - let mut analysis_marf = MemoryBackingStore::new(); - - install_boot_code(&header_db, &mut analysis_marf, epoch); - run_analysis( - &contract_id, - &mut ast, - &header_db, - &mut analysis_marf, - false, - clarity_version, - epoch, - ) - } - }; + let contract_id = QualifiedContractIdentifier::transient(); - let mut contract_analysis = match contract_analysis_res { - Ok(contract_analysis) => contract_analysis, - Err(boxed) => { - let (e, cost_tracker) = *boxed; - let mut result = json!({ - "message": "Checks failed.", - "error": { - "analysis": serde_json::to_value(&e.diagnostic).unwrap(), - }, - }); - add_costs(&mut result, costs, cost_tracker.get_total()); - return (1, Some(result)); - } - }; + let mut stdout = io::stdout(); - let mut result = json!({ - "message": "Checks passed." + loop { + // Read input line + let content: String = { + let mut buffer = String::new(); + stdout.write_all(b"> ").unwrap_or_else(|e| { + panic!("Failed to write stdout prompt string:\n{e}"); }); + stdout.flush().unwrap_or_else(|e| { + panic!("Failed to flush stdout prompt string:\n{e}"); + }); + match io::stdin().read_line(&mut buffer) { + Ok(_) => buffer, + Err(error) => { + eprintln!("Error reading from stdin:\n{error}"); + panic_test!(); + } + } + }; - add_costs( - &mut result, - costs, - contract_analysis.take_contract_cost_tracker().get_total(), - ); + // Parse the expression + let mut ast = match parse(&contract_id, &content, clarity_version, epoch) { + Ok(val) => val, + Err(error) => { + println!("Parse error:\n{error}"); + continue; + } + }; - if output_analysis { - result["analysis"] = - serde_json::to_value(build_contract_interface(&contract_analysis).unwrap()) - .unwrap(); + // Type-check the expression + match run_analysis_free( + &contract_id, + &mut ast, + &mut analysis_marf, + true, + clarity_version, + epoch, + ) { + Ok(_) => (), + Err(boxed) => { + let (error, _) = *boxed; + println!("Type check error:\n{error}"); + continue; } - (0, Some(result)) } - "repl" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); - let mainnet = !matches!(consume_arg(&mut argv, &["--testnet"], false), Ok(Some(_))); - if argv.len() != 1 { - eprintln!( - "Usage: {} {} [--testnet] [--epoch E] [--clarity_version N]", - invoked_by, args[0] - ); - panic_test!(); + // Evaluate the expression + let eval_result = match exec_env.eval_raw(&content) { + Ok(val) => val, + Err(error) => { + println!("Execution error:\n{error}"); + continue; } + }; - let mut marf = MemoryBackingStore::new(); - let mut vm_env = OwnedEnvironment::new_free( - mainnet, - default_chain_id(mainnet), - marf.as_clarity_db(), - epoch, - ); - let placeholder_context = - ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); - let mut exec_env = vm_env.get_exec_environment(None, None, &placeholder_context); - let mut analysis_marf = MemoryBackingStore::new(); + println!("{eval_result}"); + } +} - let contract_id = QualifiedContractIdentifier::transient(); +/// Typecheck and evaluate an expression without a contract or database context. +pub fn execute_eval_raw( + content: &str, + mainnet: bool, + epoch: StacksEpochId, + clarity_version: ClarityVersion, +) -> (i32, Option) { + let mut analysis_marf = MemoryBackingStore::new(); + let mut marf = MemoryBackingStore::new(); + let mut vm_env = OwnedEnvironment::new_free( + mainnet, + default_chain_id(mainnet), + marf.as_clarity_db(), + epoch, + ); - let mut stdout = io::stdout(); + let contract_id = QualifiedContractIdentifier::transient(); + let placeholder_context = + ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); - loop { - let content: String = { - let mut buffer = String::new(); - stdout.write_all(b"> ").unwrap_or_else(|e| { - panic!("Failed to write stdout prompt string:\n{e}"); - }); - stdout.flush().unwrap_or_else(|e| { - panic!("Failed to flush stdout prompt string:\n{e}"); - }); - match io::stdin().read_line(&mut buffer) { - Ok(_) => buffer, - Err(error) => { - eprintln!("Error reading from stdin:\n{error}"); - panic_test!(); + // Parse the expression + let mut ast = friendly_expect( + parse(&contract_id, content, clarity_version, epoch), + "Failed to parse program.", + ); + + // Type-check and evaluate + match run_analysis_free( + &contract_id, + &mut ast, + &mut analysis_marf, + true, + clarity_version, + epoch, + ) { + Ok(_) => { + // Analysis passed, now evaluate + let result = vm_env + .get_exec_environment(None, None, &placeholder_context) + .eval_raw(content); + match result { + Ok(x) => ( + 0, + Some(json!({ + "output": serde_json::to_value(&x).unwrap() + })), + ), + Err(error) => ( + 1, + Some(json!({ + "error": { + "runtime": serde_json::to_value(format!("{error}")).unwrap() } + })), + ), + } + } + Err(boxed) => { + let (error, _) = *boxed; + ( + 1, + Some(json!({ + "error": { + "analysis": serde_json::to_value(format!("{error}")).unwrap() } - }; + })), + ) + } + } +} - let mut ast = match parse(&contract_id, &content, clarity_version, epoch) { - Ok(val) => val, - Err(error) => { - println!("Parse error:\n{error}"); - continue; - } - }; +/// Evaluate (in read-only mode) a program in a given contract context +/// This advances to a new block before evaluation. +pub fn execute_eval( + contract_identifier: &QualifiedContractIdentifier, + content: &str, + costs: bool, + epoch: StacksEpochId, + clarity_version: ClarityVersion, + vm_filename: &str, +) -> (i32, Option) { + // Open database + let header_db = friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); + let marf_kv = friendly_expect( + MarfedKV::open(vm_filename, None, None), + "Failed to open VM database.", + ); + let mainnet = header_db.is_mainnet(); + let placeholder_context = + ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); + + // Evaluate in a new block + let (_, _, result_and_cost) = in_block(header_db, marf_kv, |header_db, mut marf| { + let result_and_cost = with_env_costs(mainnet, epoch, &header_db, &mut marf, |vm_env| { + vm_env + .get_exec_environment(None, None, &placeholder_context) + .eval_read_only(contract_identifier, content) + }); + (header_db, marf, result_and_cost) + }); + + // Return success or error with costs + match result_and_cost { + (Ok(result), cost) => { + let mut result_json = json!({ + "output": serde_json::to_value(&result).unwrap(), + "success": true, + }); - match run_analysis_free( - &contract_id, - &mut ast, - &mut analysis_marf, - true, - clarity_version, - epoch, - ) { - Ok(_) => (), - Err(boxed) => { - let (error, _) = *boxed; - println!("Type check error:\n{error}"); - continue; - } - } + add_serialized_output(&mut result_json, result); + add_costs(&mut result_json, costs, cost); - let eval_result = match exec_env.eval_raw(&content) { - Ok(val) => val, - Err(error) => { - println!("Execution error:\n{error}"); - continue; - } - }; - - println!("{eval_result}"); - } + (0, Some(result_json)) } - "eval_raw" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); - - if argv.len() != 1 { - eprintln!( - "Usage: {} {} [--epoch E] [--clarity_version N]", - invoked_by, args[0] - ); - eprintln!(" Examples:"); - eprintln!(" echo \"(+ 1 2)\" | {} {}", invoked_by, args[0]); - eprintln!(" {} {} < input.clar", invoked_by, args[0]); - panic_test!(); - } - - let content: String = { - let mut buffer = String::new(); - friendly_expect( - io::stdin().read_to_string(&mut buffer), - "Error reading from stdin.", - ); - buffer - }; - - let mut analysis_marf = MemoryBackingStore::new(); - let mut marf = MemoryBackingStore::new(); - let mut vm_env = OwnedEnvironment::new_free( - true, - default_chain_id(true), - marf.as_clarity_db(), - epoch, - ); + (Err(error), cost) => { + let mut result_json = json!({ + "error": { + "runtime": serde_json::to_value(format!("{error}")).unwrap() + }, + "success": false, + }); - let contract_id = QualifiedContractIdentifier::transient(); - let placeholder_context = - ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); + add_costs(&mut result_json, costs, cost); - let mut ast = friendly_expect( - parse(&contract_id, &content, clarity_version, epoch), - "Failed to parse program.", - ); - match run_analysis_free( - &contract_id, - &mut ast, - &mut analysis_marf, - true, - clarity_version, - epoch, - ) { - Ok(_) => { - let result = vm_env - .get_exec_environment(None, None, &placeholder_context) - .eval_raw(&content); - match result { - Ok(x) => ( - 0, - Some(json!({ - "output": serde_json::to_value(&x).unwrap() - })), - ), - Err(error) => ( - 1, - Some(json!({ - "error": { - "runtime": serde_json::to_value(format!("{error}")).unwrap() - } - })), - ), - } - } - Err(boxed) => { - let (error, _) = *boxed; - ( - 1, - Some(json!({ - "error": { - "analysis": serde_json::to_value(format!("{error}")).unwrap() - } - })), - ) - } - } + (1, Some(result_json)) } - "eval" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); - - let costs = matches!(consume_arg(&mut argv, &["--costs"], false), Ok(Some(_))); + } +} - let eval_input = get_eval_input(invoked_by, &argv); - let vm_filename = if argv.len() == 3 { &argv[2] } else { &argv[3] }; - let header_db = - friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - let mainnet = header_db.is_mainnet(); - let placeholder_context = - ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); +/// Like eval, but does not advance to a new block +/// Evaluates at the current chaintip without advancing the block height. +pub fn execute_eval_at_chaintip( + contract_identifier: &QualifiedContractIdentifier, + content: &str, + costs: bool, + epoch: StacksEpochId, + clarity_version: ClarityVersion, + vm_filename: &str, +) -> (i32, Option) { + // Open database + let header_db = friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); + let marf_kv = friendly_expect( + MarfedKV::open(vm_filename, None, None), + "Failed to open VM database.", + ); - let (_, _, result_and_cost) = in_block(header_db, marf_kv, |header_db, mut marf| { - let result_and_cost = - with_env_costs(mainnet, epoch, &header_db, &mut marf, None, |vm_env| { - vm_env - .get_exec_environment(None, None, &placeholder_context) - .eval_read_only(&eval_input.contract_identifier, &eval_input.content) - }); - (header_db, marf, result_and_cost) + let mainnet = header_db.is_mainnet(); + let placeholder_context = + ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); + + // Evaluate at chaintip (no block advance) + let result_and_cost = at_chaintip(vm_filename, marf_kv, |mut marf| { + let result_and_cost = with_env_costs(mainnet, epoch, &header_db, &mut marf, |vm_env| { + vm_env + .get_exec_environment(None, None, &placeholder_context) + .eval_read_only(contract_identifier, content) + }); + let (result, cost) = result_and_cost; + + (marf, (result, cost)) + }); + + // Return success or error with costs + match result_and_cost { + (Ok(result), cost) => { + let mut result_json = json!({ + "output": serde_json::to_value(&result).unwrap(), + "success": true, }); - match result_and_cost { - (Ok(result), cost) => { - let mut result_json = json!({ - "output": serde_json::to_value(&result).unwrap(), - "success": true, - }); - - add_serialized_output(&mut result_json, result); - add_costs(&mut result_json, costs, cost); - - (0, Some(result_json)) - } - (Err(error), cost) => { - let mut result_json = json!({ - "error": { - "runtime": serde_json::to_value(format!("{error}")).unwrap() - }, - "success": false, - }); - - add_costs(&mut result_json, costs, cost); + add_serialized_output(&mut result_json, result); + add_costs(&mut result_json, costs, cost); - (1, Some(result_json)) - } - } + (0, Some(result_json)) } - "eval_at_chaintip" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); + (Err(error), cost) => { + let mut result_json = json!({ + "error": { + "runtime": serde_json::to_value(format!("{error}")).unwrap() + }, + "success": false, + }); - let costs = matches!(consume_arg(&mut argv, &["--costs"], false), Ok(Some(_))); - let coverage_folder = consume_arg(&mut argv, &["--c"], true).unwrap_or(None); + add_costs(&mut result_json, costs, cost); - let eval_input = get_eval_input(invoked_by, &argv); - let vm_filename = if argv.len() == 3 { - &argv[2].clone() - } else { - &argv[3].clone() - }; - let header_db = - friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - - let mainnet = header_db.is_mainnet(); - let placeholder_context = - ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); - let mut coverage = if coverage_folder.is_some() { - Some(CoverageReporter::new()) - } else { - None - }; - let result_and_cost = at_chaintip(vm_filename, marf_kv, |mut marf| { - let result_and_cost = with_env_costs( - mainnet, - epoch, - &header_db, - &mut marf, - coverage.as_mut(), - |vm_env| { - vm_env - .get_exec_environment(None, None, &placeholder_context) - .eval_read_only(&eval_input.contract_identifier, &eval_input.content) - }, - ); - let (result, cost) = result_and_cost; + (1, Some(result_json)) + } + } +} - (marf, (result, cost)) +/// Like eval-at-chaintip, but accepts an index-block-hash to evaluate at +/// Evaluates at a specific block height identified by the index block hash. +/// Reads code from stdin. +pub fn execute_eval_at_block( + chain_tip: &str, + contract_identifier: &QualifiedContractIdentifier, + content: &str, + costs: bool, + epoch: StacksEpochId, + clarity_version: ClarityVersion, + vm_filename: &str, +) -> (i32, Option) { + let header_db = friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); + let marf_kv = friendly_expect( + MarfedKV::open(vm_filename, None, None), + "Failed to open VM database.", + ); + let mainnet = header_db.is_mainnet(); + let placeholder_context = + ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); + + // Evaluate at specific block + let result_and_cost = at_block(chain_tip, marf_kv, |mut marf| { + let result_and_cost = with_env_costs(mainnet, epoch, &header_db, &mut marf, |vm_env| { + vm_env + .get_exec_environment(None, None, &placeholder_context) + .eval_read_only(contract_identifier, content) + }); + (marf, result_and_cost) + }); + + // Return success or error with costs + match result_and_cost { + (Ok(result), cost) => { + let mut result_json = json!({ + "output": serde_json::to_value(&result).unwrap(), + "success": true, }); - match result_and_cost { - (Ok(result), cost) => { - save_coverage(coverage_folder, coverage, "eval"); - let mut result_json = json!({ - "output": serde_json::to_value(&result).unwrap(), - "success": true, - }); - - add_serialized_output(&mut result_json, result); - add_costs(&mut result_json, costs, cost); + add_serialized_output(&mut result_json, result); + add_costs(&mut result_json, costs, cost); - (0, Some(result_json)) - } - (Err(error), cost) => { - save_coverage(coverage_folder, coverage, "eval"); - let mut result_json = json!({ - "error": { - "runtime": serde_json::to_value(format!("{error}")).unwrap() - }, - "success": false, - }); + (0, Some(result_json)) + } + (Err(error), cost) => { + let mut result_json = json!({ + "error": { + "runtime": serde_json::to_value(format!("{error}")).unwrap() + }, + "success": false, + }); - add_costs(&mut result_json, costs, cost); + add_costs(&mut result_json, costs, cost); - (1, Some(result_json)) - } - } + (1, Some(result_json)) } - "eval_at_block" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); + } +} - let costs = matches!(consume_arg(&mut argv, &["--costs"], false), Ok(Some(_))); +/// Initialize a new contract in the local state database +/// Parses, analyzes, and initializes a contract in the database. +#[allow(clippy::too_many_arguments)] +pub fn execute_launch( + contract_identifier: &QualifiedContractIdentifier, + contract_content: &str, + costs: bool, + assets: bool, + output_analysis: bool, + epoch: StacksEpochId, + clarity_version: ClarityVersion, + vm_filename: &str, +) -> (i32, Option) { + // Parse the contract + let mut ast = friendly_expect( + parse( + contract_identifier, + contract_content, + clarity_version, + epoch, + ), + "Failed to parse program.", + ); - if argv.len() != 4 { - eprintln!( - "Usage: {invoked_by} {} [--costs] [--epoch E] [index-block-hash] [contract-identifier] [--clarity_version N] [vm/clarity dir]", - &argv[0] - ); - panic_test!(); - } - let chain_tip = &argv[1].clone(); - let contract_identifier = friendly_expect( - QualifiedContractIdentifier::parse(&argv[2]), - "Failed to parse contract identifier.", - ); - let content: String = { - let mut buffer = String::new(); - friendly_expect( - io::stdin().read_to_string(&mut buffer), - "Error reading from stdin.", - ); - buffer - }; + // Open database + let header_db = friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); + let marf_kv = friendly_expect( + MarfedKV::open(vm_filename, None, None), + "Failed to open VM database.", + ); + let mainnet = header_db.is_mainnet(); - let vm_filename = &argv[3]; - let header_db = - friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - let mainnet = header_db.is_mainnet(); - let placeholder_context = - ContractContext::new(QualifiedContractIdentifier::transient(), clarity_version); - let result_and_cost = at_block(chain_tip, marf_kv, |mut marf| { + // Run analysis and initialize contract in a new block + let (_, _, analysis_result_and_cost) = in_block(header_db, marf_kv, |header_db, mut marf| { + let analysis_result = run_analysis( + contract_identifier, + &mut ast, + &header_db, + &mut marf, + true, + clarity_version, + epoch, + ); + match analysis_result { + Err(e) => (header_db, marf, Err(e)), + Ok(analysis) => { let result_and_cost = - with_env_costs(mainnet, epoch, &header_db, &mut marf, None, |vm_env| { - vm_env - .get_exec_environment(None, None, &placeholder_context) - .eval_read_only(&contract_identifier, &content) - }); - (marf, result_and_cost) - }); - - match result_and_cost { - (Ok(result), cost) => { - let mut result_json = json!({ - "output": serde_json::to_value(&result).unwrap(), - "success": true, - }); - - add_serialized_output(&mut result_json, result); - add_costs(&mut result_json, costs, cost); - - (0, Some(result_json)) - } - (Err(error), cost) => { - let mut result_json = json!({ - "error": { - "runtime": serde_json::to_value(format!("{error}")).unwrap() - }, - "success": false, + with_env_costs(mainnet, epoch, &header_db, &mut marf, |vm_env| { + vm_env.initialize_versioned_contract( + contract_identifier.clone(), + clarity_version, + contract_content, + None, + ) }); - - add_costs(&mut result_json, costs, cost); - - (1, Some(result_json)) - } + let (result, cost) = result_and_cost; + (header_db, marf, Ok((analysis, (result, cost)))) } } - "launch" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); - let coverage_folder = consume_arg(&mut argv, &["--c"], true).unwrap_or(None); - - let costs = matches!(consume_arg(&mut argv, &["--costs"], false), Ok(Some(_))); - let assets = matches!(consume_arg(&mut argv, &["--assets"], false), Ok(Some(_))); - let output_analysis = matches!( - consume_arg(&mut argv, &["--output_analysis"], false), - Ok(Some(_)) - ); + }); - if argv.len() < 4 { - eprintln!( - "Usage: {invoked_by} {} [--costs] [--assets] [--output_analysis] [contract-identifier] [contract-definition.clar] [--clarity_version N] [--epoch E] [vm-state.db]", - argv[0] - ); - panic_test!(); - } - - let vm_filename = &argv[3].clone(); - let contract_src_file = &args[2]; - let contract_identifier = friendly_expect( - QualifiedContractIdentifier::parse(&argv[1]), - "Failed to parse contract identifier.", - ); - - let contract_content: String = friendly_expect( - fs::read_to_string(contract_src_file), - &format!("Error reading file: {contract_src_file}"), - ); + // Return success or error with costs, assets, analysis, and events + match analysis_result_and_cost { + Ok((contract_analysis, (Ok((_x, asset_map, events)), cost))) => { + let mut result = json!({ + "message": "Contract initialized!" + }); - let mut ast = friendly_expect( - parse( - &contract_identifier, - &contract_content, - clarity_version, - epoch, - ), - "Failed to parse program.", - ); + add_costs(&mut result, costs, cost); + add_assets(&mut result, assets, asset_map); - if let Some(ref coverage_folder) = coverage_folder { - let mut coverage_file = PathBuf::from(coverage_folder); - coverage_file.push(format!("launch_{}", get_epoch_time_ms())); - coverage_file.set_extension("clarcovref"); - CoverageReporter::register_src_file( - &contract_identifier, - contract_src_file, - &ast, - &coverage_file, - ) - .expect("Coverage reference file generation failure"); + if output_analysis { + result["analysis"] = + serde_json::to_value(build_contract_interface(&contract_analysis).unwrap()) + .unwrap(); } + let events_json: Vec<_> = events + .into_iter() + .map(|event| event.json_serialize(0, &Txid([0u8; 32]), true).unwrap()) + .collect(); + + result["events"] = serde_json::Value::Array(events_json); + (0, Some(result)) + } + Err(boxed) => { + let (error, cost_tracker) = *boxed; + let mut result = json!({ + "error": { + "initialization": serde_json::to_value(format!("{error}")).unwrap() + } + }); - // let header_db = CLIHeadersDB::new(vm_filename, false); + add_costs(&mut result, costs, cost_tracker.get_total()); - let header_db = - friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - let mainnet = header_db.is_mainnet(); + (1, Some(result)) + } + Ok((_, (Err(error), ..))) => ( + 1, + Some(json!({ + "error": { + "initialization": serde_json::to_value(format!("{error}")).unwrap() + } + })), + ), + } +} - let mut coverage = if coverage_folder.is_some() { - Some(CoverageReporter::new()) - } else { - None - }; - let (_, _, analysis_result_and_cost) = - in_block(header_db, marf_kv, |header_db, mut marf| { - let analysis_result = run_analysis( - &contract_identifier, - &mut ast, - &header_db, - &mut marf, - true, - clarity_version, - epoch, - ); - match analysis_result { - Err(e) => (header_db, marf, Err(e)), - Ok(analysis) => { - let result_and_cost = with_env_costs( - mainnet, - epoch, - &header_db, - &mut marf, - coverage.as_mut(), - |vm_env| { - vm_env.initialize_versioned_contract( - contract_identifier, - clarity_version, - &contract_content, - None, - ) - }, - ); - let (result, cost) = result_and_cost; - (header_db, marf, Ok((analysis, (result, cost)))) - } - } - }); +/// Execute a public function of a defined contract +/// Executes a public function on an initialized contract. +#[allow(clippy::too_many_arguments)] +pub fn execute_execute( + vm_filename: &str, + contract_identifier: &QualifiedContractIdentifier, + tx_name: &str, + sender: PrincipalData, + arguments: &[SymbolicExpression], + costs: bool, + assets: bool, + epoch: StacksEpochId, +) -> (i32, Option) { + // Open database + let header_db = friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); + let marf_kv = friendly_expect( + MarfedKV::open(vm_filename, None, None), + "Failed to open VM database.", + ); + let mainnet = header_db.is_mainnet(); - match analysis_result_and_cost { - Ok((contract_analysis, (Ok((_x, asset_map, events)), cost))) => { + // Execute transaction in a new block + let (_, _, result_and_cost) = in_block(header_db, marf_kv, |header_db, mut marf| { + let result_and_cost = with_env_costs(mainnet, epoch, &header_db, &mut marf, |vm_env| { + vm_env.execute_transaction( + sender, + None, + contract_identifier.clone(), + tx_name, + arguments, + ) + }); + let (result, cost) = result_and_cost; + (header_db, marf, (result, cost)) + }); + + // Return success or error with costs, assets, and events + match result_and_cost { + (Ok((x, asset_map, events)), cost) => { + if let Value::Response(data) = x { + if data.committed { let mut result = json!({ - "message": "Contract initialized!" + "message": "Transaction executed and committed.", + "output": serde_json::to_value(&data.data).unwrap(), + "success": true, }); + add_serialized_output(&mut result, *data.data); add_costs(&mut result, costs, cost); add_assets(&mut result, assets, asset_map); - save_coverage(coverage_folder, coverage, "launch"); - - if output_analysis { - result["analysis"] = serde_json::to_value( - build_contract_interface(&contract_analysis).unwrap(), - ) - .unwrap(); - } let events_json: Vec<_> = events .into_iter() .map(|event| event.json_serialize(0, &Txid([0u8; 32]), true).unwrap()) @@ -1801,175 +1516,39 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option { - let (error, cost_tracker) = *boxed; + } else { let mut result = json!({ - "error": { - "initialization": serde_json::to_value(format!("{error}")).unwrap() - } + "message": "Aborted.", + "output": serde_json::to_value(&data.data).unwrap(), + "success": false, }); - add_costs(&mut result, costs, cost_tracker.get_total()); - - (1, Some(result)) - } - Ok((_, (Err(error), ..))) => ( - 1, - Some(json!({ - "error": { - "initialization": serde_json::to_value(format!("{error}")).unwrap() - } - })), - ), - } - } - "execute" => { - let mut argv = args.to_vec(); - let epoch = parse_epoch_flag(&mut argv); - let clarity_version = parse_clarity_version_flag(&mut argv, epoch); - let coverage_folder = consume_arg(&mut argv, &["--c"], true).unwrap_or(None); - - let costs = matches!(consume_arg(&mut argv, &["--costs"], false), Ok(Some(_))); - let assets = matches!(consume_arg(&mut argv, &["--assets"], false), Ok(Some(_))); - - if argv.len() < 5 { - eprintln!( - "Usage: {invoked_by} {} [--costs] [--assets] [--clarity_version N] [--epoch E] [vm-state.db] [contract-identifier] [public-function-name] [sender-address] [args...]", - argv[0] - ); - panic_test!(); - } - - let vm_filename = &argv[1]; - let header_db = - friendly_expect(CLIHeadersDB::resume(vm_filename), "Failed to open CLI DB"); - let marf_kv = friendly_expect( - MarfedKV::open(vm_filename, None, None), - "Failed to open VM database.", - ); - let mainnet = header_db.is_mainnet(); - let contract_identifier = friendly_expect( - QualifiedContractIdentifier::parse(&argv[2]), - "Failed to parse contract identifier.", - ); - - let tx_name = &argv[3]; - let sender_in = &argv[4]; + add_costs(&mut result, costs, cost); + add_serialized_output(&mut result, *data.data); + add_assets(&mut result, assets, asset_map); - let sender = { - if let Ok(sender) = PrincipalData::parse_standard_principal(sender_in) { - PrincipalData::Standard(sender) - } else { - eprintln!("Unexpected result parsing sender: {sender_in}"); - panic_test!(); + (0, Some(result)) } - }; - - let arguments: Vec<_> = argv[5..] - .iter() - .map(|argument| { - let argument_parsed = friendly_expect( - vm_execute_in_epoch(argument, clarity_version, epoch), - &format!("Error parsing argument \"{argument}\""), - ); - let argument_value = friendly_expect_opt( - argument_parsed, - &format!("Failed to parse a value from the argument: {argument}"), - ); - SymbolicExpression::atom_value(argument_value) - }) - .collect(); - - let mut coverage = if coverage_folder.is_some() { - Some(CoverageReporter::new()) } else { - None - }; - let (_, _, result_and_cost) = in_block(header_db, marf_kv, |header_db, mut marf| { - let result_and_cost = with_env_costs( - mainnet, - epoch, - &header_db, - &mut marf, - coverage.as_mut(), - |vm_env| { - vm_env.execute_transaction( - sender, - None, - contract_identifier, - tx_name, - &arguments, - ) + let result = json!({ + "error": { + "runtime": "Expected a ResponseType result from transaction.", + "output": serde_json::to_value(&x).unwrap() }, - ); - let (result, cost) = result_and_cost; - (header_db, marf, (result, cost)) - }); - - match result_and_cost { - (Ok((x, asset_map, events)), cost) => { - if let Value::Response(data) = x { - save_coverage(coverage_folder, coverage, "execute"); - if data.committed { - let mut result = json!({ - "message": "Transaction executed and committed.", - "output": serde_json::to_value(&data.data).unwrap(), - "success": true, - }); - - add_serialized_output(&mut result, *data.data); - add_costs(&mut result, costs, cost); - add_assets(&mut result, assets, asset_map); - - let events_json: Vec<_> = events - .into_iter() - .map(|event| { - event.json_serialize(0, &Txid([0u8; 32]), true).unwrap() - }) - .collect(); - - result["events"] = serde_json::Value::Array(events_json); - (0, Some(result)) - } else { - let mut result = json!({ - "message": "Aborted.", - "output": serde_json::to_value(&data.data).unwrap(), - "success": false, - }); - - add_costs(&mut result, costs, cost); - add_serialized_output(&mut result, *data.data); - add_assets(&mut result, assets, asset_map); - - (0, Some(result)) - } - } else { - let result = json!({ - "error": { - "runtime": "Expected a ResponseType result from transaction.", - "output": serde_json::to_value(&x).unwrap() - }, - "success": false, - }); - (1, Some(result)) - } - } - (Err(error), ..) => { - let result = json!({ - "error": { - "runtime": "Transaction execution error.", - "error": serde_json::to_value(format!("{error}")).unwrap() - }, - "success": false, - }); - (1, Some(result)) - } + "success": false, + }); + (1, Some(result)) } } - _ => { - print_usage(invoked_by); - (1, None) + (Err(error), ..) => { + let result = json!({ + "error": { + "runtime": "Transaction execution error.", + "error": serde_json::to_value(format!("{error}")).unwrap() + }, + "success": false, + }); + (1, Some(result)) } } } @@ -1999,32 +1578,34 @@ mod test { ) .unwrap(); - fs::write(&clar_name, r#" + let contract_code = r#" (unwrap-panic (if (is-eq (stx-get-balance 'S1G2081040G2081040G2081040G208105NK8PE5) u1000) (ok 1) (err 2))) (unwrap-panic (if (is-eq (stx-get-balance 'S1G2081040G2081040G2081040G208105NK8PE5.names) u2000) (ok 1) (err 2))) -"#).unwrap(); +"#; + fs::write(&clar_name, contract_code).unwrap(); - let invoked = invoke_command( - "test", - &["initialize".to_string(), json_name, db_name.clone()], - ); - let exit = invoked.0; - let result = invoked.1.unwrap(); + let json_content = fs::read_to_string(&json_name).unwrap(); + let allocations = parse_allocations_json(&json_content).unwrap(); + + let (exit, result) = execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, allocations); assert_eq!(exit, 0); - assert_eq!(result["network"], "mainnet"); + assert_eq!(result.unwrap()["network"], "mainnet"); + + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .unwrap(); - let invoked = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - clar_name, - db_name, - ], + let (exit, _result) = execute_launch( + &contract_id, + contract_code, + false, + false, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let _ = invoked.1.unwrap(); assert_eq!(exit, 0); } @@ -2032,13 +1613,16 @@ mod test { #[test] fn test_init_mainnet() { let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); - let invoked = invoke_command("test", &["initialize".to_string(), db_name.clone()]); - let exit = invoked.0; - let result = invoked.1.unwrap(); + let (exit, result) = execute_initialize( + &db_name, + true, + DEFAULT_CLI_EPOCH, + vec![], // no allocations + ); assert_eq!(exit, 0); - assert_eq!(result["network"], "mainnet"); + assert_eq!(result.unwrap()["network"], "mainnet"); let header_db = CLIHeadersDB::new(&db_name, true); assert!(header_db.is_mainnet()); @@ -2047,20 +1631,16 @@ mod test { #[test] fn test_init_testnet() { let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); - let invoked = invoke_command( - "test", - &[ - "initialize".to_string(), - "--testnet".to_string(), - db_name.clone(), - ], - ); - let exit = invoked.0; - let result = invoked.1.unwrap(); + let (exit, result) = execute_initialize( + &db_name, + false, // testnet + DEFAULT_CLI_EPOCH, + vec![], // no allocations + ); assert_eq!(exit, 0); - assert_eq!(result["network"], "testnet"); + assert_eq!(result.unwrap()["network"], "testnet"); let header_db = CLIHeadersDB::new(&db_name, true); assert!(!header_db.is_mainnet()); @@ -2078,183 +1658,223 @@ mod test { let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); eprintln!("initialize"); - invoke_command("test", &["initialize".to_string(), db_name.clone()]); + execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, vec![]); eprintln!("check tokens"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - cargo_workspace_as_string("sample/contracts/tokens.clar"), - ], + let content = fs::read_to_string(cargo_workspace_as_string("sample/contracts/tokens.clar")) + .expect("Failed to read tokens.clar"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit, result) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + None, // no db_path + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - assert_eq!(exit, 0); - assert!(!result["message"].as_str().unwrap().is_empty()); + assert!(!result.unwrap()["message"].as_str().unwrap().is_empty()); eprintln!("check tokens (idempotency)"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - cargo_workspace_as_string("sample/contracts/tokens.clar"), - db_name.clone(), - ], + let content = fs::read_to_string(cargo_workspace_as_string("sample/contracts/tokens.clar")) + .expect("Failed to read tokens.clar"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit, result) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + Some(&db_name), + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - assert_eq!(exit, 0); - assert!(!result["message"].as_str().unwrap().is_empty()); + assert!(!result.unwrap()["message"].as_str().unwrap().is_empty()); eprintln!("launch tokens"); - let invoked = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - cargo_workspace_as_string("sample/contracts/tokens.clar"), - db_name.clone(), - ], + let file_path = cargo_workspace_as_string("sample/contracts/tokens.clar"); + let content = fs::read_to_string(&file_path).expect("Failed to read tokens.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_launch( + &contract_id, + &content, + false, + false, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - assert_eq!(exit, 0); - assert!(!result["message"].as_str().unwrap().is_empty()); + assert!(!result.unwrap()["message"].as_str().unwrap().is_empty()); eprintln!("check names"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - cargo_workspace_as_string("sample/contracts/names.clar"), - db_name.clone(), - ], + let content = fs::read_to_string(cargo_workspace_as_string("sample/contracts/names.clar")) + .expect("Failed to read names.clar"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit, result) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + Some(&db_name), + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - assert_eq!(exit, 0); - assert!(!result["message"].as_str().unwrap().is_empty()); + assert!(!result.unwrap()["message"].as_str().unwrap().is_empty()); eprintln!("check names with different contract ID"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - cargo_workspace_as_string("sample/contracts/names.clar"), - db_name.clone(), - "--contract_id".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - ], + let content = fs::read_to_string(cargo_workspace_as_string("sample/contracts/names.clar")) + .expect("Failed to read names.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + Some(&db_name), + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - assert_eq!(exit, 0); - assert!(!result["message"].as_str().unwrap().is_empty()); + assert!(!result.unwrap()["message"].as_str().unwrap().is_empty()); eprintln!("check names with analysis"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - "--output_analysis".to_string(), - cargo_workspace_as_string("sample/contracts/names.clar"), - db_name.clone(), - ], + let content = fs::read_to_string(cargo_workspace_as_string("sample/contracts/names.clar")) + .expect("Failed to read names.clar"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit, result) = execute_check( + &content, + &contract_id, + true, + false, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + Some(&db_name), + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert!(!result["message"].as_str().unwrap().is_empty()); assert!(result["analysis"] != json!(null)); eprintln!("check names with cost"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - "--costs".to_string(), - cargo_workspace_as_string("sample/contracts/names.clar"), - db_name.clone(), - ], + let content = fs::read_to_string(cargo_workspace_as_string("sample/contracts/names.clar")) + .expect("Failed to read names.clar"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit, result) = execute_check( + &content, + &contract_id, + false, + true, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + Some(&db_name), + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert!(!result["message"].as_str().unwrap().is_empty()); assert!(result["costs"] != json!(null)); assert!(result["assets"] == json!(null)); eprintln!("launch names with costs and assets"); - let invoked = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.names".to_string(), - cargo_workspace_as_string("sample/contracts/names.clar"), - "--costs".to_string(), - "--assets".to_string(), - db_name.clone(), - ], + let file_path = cargo_workspace_as_string("sample/contracts/names.clar"); + let content = fs::read_to_string(&file_path).expect("Failed to read names.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.names") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_launch( + &contract_id, + &content, + true, + true, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert!(!result["message"].as_str().unwrap().is_empty()); assert!(result["costs"] != json!(null)); assert!(result["assets"] != json!(null)); eprintln!("execute tokens"); - let invoked = invoke_command( - "test", - &[ - "execute".to_string(), - db_name.clone(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - "mint!".to_string(), - "SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR".to_string(), - "(+ u900 u100)".to_string(), - ], + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let sender = + PrincipalData::parse_standard_principal("SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR") + .map(PrincipalData::Standard) + .expect("Failed to parse sender"); + let arg_parsed = vm_execute_in_epoch( + "(+ u900 u100)", + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + ) + .expect("Failed to parse argument") + .expect("Failed to get value from argument"); + let arguments = vec![SymbolicExpression::atom_value(arg_parsed)]; + let (exit, result) = execute_execute( + &db_name, + &contract_id, + "mint!", + sender, + &arguments, + false, + false, + DEFAULT_CLI_EPOCH, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert!(!result["message"].as_str().unwrap().is_empty()); assert!(result["events"].as_array().unwrap().is_empty()); assert_eq!(result["output"], json!({"UInt": 1000})); eprintln!("eval tokens"); - let invoked = invoke_command( - "test", - &[ - "eval".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - cargo_workspace_as_string("sample/contracts/tokens-mint.clar"), - db_name.clone(), - ], + let snippet = fs::read_to_string(cargo_workspace_as_string( + "sample/contracts/tokens-mint.clar", + )) + .expect("Failed to read tokens-mint.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_eval( + &contract_id, + &snippet, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert_eq!( result["output"], @@ -2269,20 +1889,23 @@ mod test { ); eprintln!("eval tokens with cost"); - let invoked = invoke_command( - "test", - &[ - "eval".to_string(), - "--costs".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - cargo_workspace_as_string("sample/contracts/tokens-mint.clar"), - db_name.clone(), - ], + let snippet = fs::read_to_string(cargo_workspace_as_string( + "sample/contracts/tokens-mint.clar", + )) + .expect("Failed to read tokens-mint.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_eval( + &contract_id, + &snippet, + true, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert_eq!( result["output"], @@ -2298,19 +1921,23 @@ mod test { assert!(result["costs"] != json!(null)); eprintln!("eval_at_chaintip tokens"); - let invoked = invoke_command( - "test", - &[ - "eval_at_chaintip".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - cargo_workspace_as_string("sample/contracts/tokens-mint.clar"), - db_name.clone(), - ], + let snippet = fs::read_to_string(cargo_workspace_as_string( + "sample/contracts/tokens-mint.clar", + )) + .expect("Failed to read tokens-mint.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_eval_at_chaintip( + &contract_id, + &snippet, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert_eq!( result["output"], @@ -2325,20 +1952,23 @@ mod test { ); eprintln!("eval_at_chaintip tokens with cost"); - let invoked = invoke_command( - "test", - &[ - "eval_at_chaintip".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens".to_string(), - cargo_workspace_as_string("sample/contracts/tokens-mint.clar"), - db_name, - "--costs".to_string(), - ], + let snippet = fs::read_to_string(cargo_workspace_as_string( + "sample/contracts/tokens-mint.clar", + )) + .expect("Failed to read tokens-mint.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_eval_at_chaintip( + &contract_id, + &snippet, + true, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); assert_eq!(exit, 0); assert_eq!( result["output"], @@ -2359,38 +1989,46 @@ mod test { let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); eprintln!("initialize"); - invoke_command("test", &["initialize".to_string(), db_name.clone()]); + execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, vec![]); eprintln!("check tokens"); - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - cargo_workspace_as_string("sample/contracts/tokens-ft.clar"), - ], + let content = + fs::read_to_string(cargo_workspace_as_string("sample/contracts/tokens-ft.clar")) + .expect("Failed to read tokens-ft.clar"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit, result) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + DEFAULT_CLI_EPOCH, + None, + false, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - assert_eq!(exit, 0); - assert!(!result["message"].as_str().unwrap().is_empty()); + assert!(!result.unwrap()["message"].as_str().unwrap().is_empty()); eprintln!("launch tokens"); - let invoked = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tokens-ft".to_string(), - cargo_workspace_as_string("sample/contracts/tokens-ft.clar"), - db_name, - "--assets".to_string(), - ], + let file_path = cargo_workspace_as_string("sample/contracts/tokens-ft.clar"); + let content = fs::read_to_string(&file_path).expect("Failed to read tokens-ft.clar"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tokens-ft") + .expect("Failed to parse contract ID"); + let (exit, result) = execute_launch( + &contract_id, + &content, + false, + true, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); - let exit = invoked.0; - let result = invoked.1.unwrap(); - + let result = result.unwrap(); eprintln!("{}", serde_json::to_string(&result).unwrap()); assert_eq!(exit, 0); @@ -2469,19 +2107,22 @@ mod test { .unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - clar_path, - "--clarity_version".to_string(), - "clarity3".to_string(), - ], + let content = fs::read_to_string(&clar_path).expect("Failed to read test file"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit_code, result_json) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::Clarity3, + DEFAULT_CLI_EPOCH, + None, + false, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 0, "expected check to pass under Clarity 3, got: {}", @@ -2513,19 +2154,22 @@ mod test { .unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - clar_path, - "--clarity_version".to_string(), - "clarity2".to_string(), - ], + let content = fs::read_to_string(&clar_path).expect("Failed to read test file"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit_code, result_json) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::Clarity2, + DEFAULT_CLI_EPOCH, + None, + false, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 1, "expected check to fail under Clarity 2, got: {}", @@ -2558,19 +2202,22 @@ mod test { .unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "check".to_string(), - clar_path, - "--epoch".to_string(), - "2.1".to_string(), - ], + let content = fs::read_to_string(&clar_path).expect("Failed to read test file"); + let contract_id = QualifiedContractIdentifier::transient(); + let (exit_code, result_json) = execute_check( + &content, + &contract_id, + false, + false, + true, + ClarityVersion::Clarity2, // Epoch 2.1 defaults to Clarity2 + StacksEpochId::Epoch21, + None, + false, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 1, "expected check to fail under Clarity 2, got: {}", @@ -2584,7 +2231,7 @@ mod test { fn test_launch_clarity3_contract_passes_with_clarity3_flag() { // Arrange let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); - invoke_command("test", &["initialize".to_string(), db_name.clone()]); + execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, vec![]); let clar_path = format!( "/tmp/version-flag-launch-c3-{}.clar", @@ -2606,21 +2253,23 @@ mod test { .unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tenure".to_string(), - clar_path, - db_name, - "--clarity_version".to_string(), - "clarity3".to_string(), - ], + let content = fs::read_to_string(&clar_path).expect("Failed to read test file"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tenure") + .expect("Failed to parse contract ID"); + let (exit_code, result_json) = execute_launch( + &contract_id, + &content, + false, + false, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::Clarity3, + &db_name, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 0, "expected launch to pass under Clarity 3, got: {}", @@ -2633,7 +2282,7 @@ mod test { fn test_launch_clarity3_contract_fails_with_clarity2_flag() { // Arrange let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); - invoke_command("test", &["initialize".to_string(), db_name.clone()]); + execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, vec![]); let clar_path = format!( "/tmp/version-flag-launch-c2-{}.clar", @@ -2655,21 +2304,23 @@ mod test { .unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tenure".to_string(), - clar_path, - db_name, - "--clarity_version".to_string(), - "clarity2".to_string(), - ], + let content = fs::read_to_string(&clar_path).expect("Failed to read test file"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tenure") + .expect("Failed to parse contract ID"); + let (exit_code, result_json) = execute_launch( + &contract_id, + &content, + false, + false, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::Clarity2, + &db_name, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 1, "expected launch to fail under Clarity 2, got: {}", @@ -2682,7 +2333,7 @@ mod test { fn test_eval_clarity3_contract_passes_with_clarity3_flag() { // Arrange let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); - invoke_command("test", &["initialize".to_string(), db_name.clone()]); + execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, vec![]); // Launch minimal contract at target for eval context. let launch_src = format!( @@ -2690,14 +2341,19 @@ mod test { rand::thread_rng().r#gen::() ); fs::write(&launch_src, "(define-read-only (dummy) true)").unwrap(); - let _ = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tenure".to_string(), - launch_src, - db_name.clone(), - ], + let launch_content = fs::read_to_string(&launch_src).expect("Failed to read launch file"); + let launch_contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tenure") + .expect("Failed to parse contract ID"); + let _ = execute_launch( + &launch_contract_id, + &launch_content, + false, + false, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::default_for_epoch(DEFAULT_CLI_EPOCH), + &db_name, ); // Use a Clarity3-only native expression. @@ -2708,21 +2364,21 @@ mod test { fs::write(&clar_path, "(get-tenure-info? time u1)").unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "eval".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tenure".to_string(), - clar_path, - db_name, - "--clarity_version".to_string(), - "clarity3".to_string(), - ], + let snippet = fs::read_to_string(&clar_path).expect("Failed to read eval file"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tenure") + .expect("Failed to parse contract ID"); + let (exit_code, result_json) = execute_eval( + &contract_id, + &snippet, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::Clarity3, + &db_name, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 0, "expected eval to pass under Clarity 3, got: {}", @@ -2735,7 +2391,7 @@ mod test { fn test_eval_clarity3_contract_fails_with_clarity2_flag() { // Arrange let db_name = format!("/tmp/db_{}", rand::thread_rng().r#gen::()); - invoke_command("test", &["initialize".to_string(), db_name.clone()]); + execute_initialize(&db_name, true, DEFAULT_CLI_EPOCH, vec![]); // Launch minimal contract at target for eval context. let launch_src = format!( @@ -2743,16 +2399,19 @@ mod test { rand::thread_rng().r#gen::() ); fs::write(&launch_src, "(define-read-only (dummy) true)").unwrap(); - let _ = invoke_command( - "test", - &[ - "launch".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tenure".to_string(), - launch_src, - db_name.clone(), - "--clarity_version".to_string(), - "clarity2".to_string(), - ], + let launch_content = fs::read_to_string(&launch_src).expect("Failed to read launch file"); + let launch_contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tenure") + .expect("Failed to parse contract ID"); + let _ = execute_launch( + &launch_contract_id, + &launch_content, + false, + false, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::Clarity2, + &db_name, ); // Use a Clarity3-only native expression. @@ -2763,21 +2422,21 @@ mod test { fs::write(&clar_path, "(get-tenure-info? time u1)").unwrap(); // Act - let invoked = invoke_command( - "test", - &[ - "eval".to_string(), - "S1G2081040G2081040G2081040G208105NK8PE5.tenure".to_string(), - clar_path, - db_name, - "--clarity_version".to_string(), - "clarity2".to_string(), - ], + let snippet = fs::read_to_string(&clar_path).expect("Failed to read eval file"); + let contract_id = + QualifiedContractIdentifier::parse("S1G2081040G2081040G2081040G208105NK8PE5.tenure") + .expect("Failed to parse contract ID"); + let (exit_code, result_json) = execute_eval( + &contract_id, + &snippet, + false, + DEFAULT_CLI_EPOCH, + ClarityVersion::Clarity2, + &db_name, ); // Assert - let exit_code = invoked.0; - let result_json = invoked.1.unwrap(); + let result_json = result_json.unwrap(); assert_eq!( exit_code, 1, "expected eval to fail under Clarity 2, got: {}", diff --git a/contrib/clarity-cli/src/main.rs b/contrib/clarity-cli/src/main.rs index f6d9d480c74..e248fed9850 100644 --- a/contrib/clarity-cli/src/main.rs +++ b/contrib/clarity-cli/src/main.rs @@ -14,24 +14,696 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -extern crate serde_json; +use std::io::Read; +use std::path::PathBuf; +use std::{fs, io, process}; -use std::{env, process}; +use clap::{Parser, Subcommand}; +use clarity::vm::types::{PrincipalData, QualifiedContractIdentifier}; +use clarity::vm::{ClarityVersion, SymbolicExpression}; +use clarity_cli::{ + DEFAULT_CLI_EPOCH, execute_check, execute_eval, execute_eval_at_block, + execute_eval_at_chaintip, execute_eval_raw, execute_execute, execute_generate_address, + execute_initialize, execute_launch, execute_repl, vm_execute_in_epoch, +}; +use stacks_common::types::StacksEpochId; -use clarity_cli::invoke_command; +/// Read content from a file path or stdin if path is "-" +fn read_file_or_stdin(path: &str) -> String { + if path == "-" { + let mut buffer = String::new(); + io::stdin() + .read_to_string(&mut buffer) + .expect("Error reading from stdin"); + buffer + } else { + fs::read_to_string(path).unwrap_or_else(|e| panic!("Error reading file {path}: {e}")) + } +} + +/// Read content from an optional file path, defaulting to stdin if None or "-" +fn read_optional_file_or_stdin(path: Option<&PathBuf>) -> String { + match path { + Some(p) => read_file_or_stdin(p.to_str().expect("Invalid UTF-8 in path")), + None => { + let mut buffer = String::new(); + io::stdin() + .read_to_string(&mut buffer) + .expect("Error reading from stdin"); + buffer + } + } +} + +/// Parse epoch string to StacksEpochId +fn parse_epoch(epoch_str: Option<&String>) -> StacksEpochId { + if let Some(s) = epoch_str { + s.parse::() + .unwrap_or_else(|_| panic!("Invalid epoch: {s}")) + } else { + DEFAULT_CLI_EPOCH + } +} + +/// Parse clarity_version string. Defaults to version for epoch if not specified. +fn parse_clarity_version(cv_str: Option<&String>, epoch: StacksEpochId) -> ClarityVersion { + if let Some(s) = cv_str { + s.parse::() + .unwrap_or_else(|_| panic!("Invalid clarity version: {s}")) + } else { + ClarityVersion::default_for_epoch(epoch) + } +} + +/// Parse allocations from JSON file or stdin +fn parse_allocations(allocations_file: &Option) -> Vec<(PrincipalData, u64)> { + if let Some(filename) = allocations_file { + let json_in = read_file_or_stdin(filename.to_str().expect("Invalid UTF-8 in path")); + clarity_cli::parse_allocations_json(&json_in).unwrap_or_else(|e| panic!("{e}")) + } else { + vec![] + } +} + +#[derive(Parser)] +#[command(name = "clarity-cli")] +#[command(about = "Clarity smart contract command-line interface", long_about = None)] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand, Debug)] +enum Commands { + /// Initialize a local VM state database + #[command(name = "initialize")] + Initialize { + /// Use testnet bootcode and block-limits instead of mainnet + #[arg(long)] + testnet: bool, + + /// Stacks epoch to use + #[arg(long)] + epoch: Option, + + /// Path to VM state database + #[arg(value_name = "DB_PATH")] + db_path: PathBuf, + + /// Initial allocations JSON file (or "-" for stdin) + #[arg(value_name = "ALLOCATIONS_FILE")] + allocations_file: Option, + }, + + /// Generate a random Stacks public address + #[command(name = "generate-address")] + GenerateAddress, + + /// Typecheck a potential contract definition + #[command(name = "check")] + Check { + /// Contract source file (or "-" for stdin) + #[arg(value_name = "CONTRACT_FILE")] + contract_file: PathBuf, + + /// Contract identifier + #[arg(long)] + contract_id: Option, + + /// Output contract analysis + #[arg(long)] + output_analysis: bool, + + /// Output cost information + #[arg(long)] + costs: bool, + + /// Use testnet configuration + #[arg(long)] + testnet: bool, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Path to VM state database (optional; if omitted, uses in-memory analysis) + #[arg(value_name = "DB_PATH")] + db_path: Option, + }, + + /// Typecheck and evaluate expressions in a stdin/stdout loop + #[command(name = "repl")] + Repl { + /// Use testnet configuration + #[arg(long)] + testnet: bool, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + }, + + /// Typecheck and evaluate an expression without a contract or database context. + /// + /// Stdin examples: + /// + /// echo "(+ 1 2)" | clarity-cli eval-raw + /// + /// clarity-cli eval-raw <<< "(+ 1 2)" + #[command(name = "eval-raw")] + EvalRaw { + /// Use testnet configuration + #[arg(long)] + testnet: bool, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Program file (or "-" for stdin; if omitted, reads from stdin) + #[arg(value_name = "PROGRAM_FILE")] + program_file: Option, + }, + + /// Evaluate (in read-only mode) a program in a given contract context. + /// + /// Stdin examples: + /// + /// echo "(+ 1 2)" | clarity-cli eval ... + /// + /// clarity-cli eval ... <<< "(+ 1 2)" + #[command(name = "eval")] + Eval { + /// Output cost information + #[arg(long)] + costs: bool, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Contract identifier + #[arg(value_name = "CONTRACT_ID")] + contract_id: String, + + /// Path to VM state database + #[arg(value_name = "DB_PATH")] + db_path: PathBuf, + + /// Program file (or "-" for stdin; if omitted, reads from stdin) + #[arg(value_name = "PROGRAM_FILE")] + program_file: Option, + }, + + /// Like eval, but does not advance to a new block. + /// + /// Stdin examples: + /// + /// echo "(+ 1 2)" | clarity-cli eval-at-chaintip ... + /// + /// clarity-cli eval-at-chaintip ... <<< "(+ 1 2)" + #[command(name = "eval-at-chaintip")] + EvalAtChaintip { + /// Output cost information + #[arg(long)] + costs: bool, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Contract identifier + #[arg(value_name = "CONTRACT_ID")] + contract_id: String, + + /// Path to VM state database + #[arg(value_name = "DB_PATH")] + db_path: PathBuf, + + /// Program file (or "-" for stdin; if omitted, reads from stdin) + #[arg(value_name = "PROGRAM_FILE")] + program_file: Option, + }, + + /// Like eval-at-chaintip, but accepts an index-block-hash to evaluate at. + /// + /// Stdin examples: + /// + /// echo "(+ 1 2)" | clarity-cli eval-at-block ... + /// + /// clarity-cli eval-at-block ... <<< "(+ 1 2)" + #[command(name = "eval-at-block")] + EvalAtBlock { + /// Output cost information + #[arg(long)] + costs: bool, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Index block hash + #[arg(value_name = "INDEX_BLOCK_HASH")] + index_block_hash: String, + + /// Contract identifier + #[arg(value_name = "CONTRACT_ID")] + contract_id: String, + + /// Path to VM/clarity directory + #[arg(value_name = "VM_DIR")] + vm_dir: PathBuf, + + /// Program file (or "-" for stdin; if omitted, reads from stdin) + #[arg(value_name = "PROGRAM_FILE")] + program_file: Option, + }, + + /// Deploy a new contract in the local state database + #[command(name = "launch")] + Launch { + /// Output cost information + #[arg(long)] + costs: bool, + + /// Output asset changes + #[arg(long)] + assets: bool, + + /// Output contract analysis + #[arg(long)] + output_analysis: bool, + + /// Contract identifier + #[arg(value_name = "CONTRACT_ID")] + contract_id: String, + + /// Contract definition file (or "-" for stdin) + #[arg(value_name = "CONTRACT_FILE")] + contract_file: PathBuf, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Path to VM state database + #[arg(value_name = "DB_PATH")] + db_path: PathBuf, + }, + + /// Execute a public function of a defined contract. + /// + /// Arguments must be valid Clarity values (e.g., "u10" for uint, "'ST1..." for principal). + /// Note: Principals require the Clarity quote prefix ('). + #[command(name = "execute")] + Execute { + /// Output cost information + #[arg(long)] + costs: bool, + + /// Output asset changes + #[arg(long)] + assets: bool, + + /// Clarity version + #[arg(long)] + clarity_version: Option, + + /// Stacks epoch + #[arg(long)] + epoch: Option, + + /// Contract identifier + #[arg(value_name = "CONTRACT_ID")] + contract_id: String, + + /// Public function name + #[arg(value_name = "FUNCTION_NAME")] + function_name: String, + + /// Sender address + #[arg(value_name = "SENDER")] + sender: String, + + /// Path to VM state database + #[arg(value_name = "DB_PATH")] + db_path: PathBuf, + + /// Function arguments + #[arg(value_name = "ARGS")] + args: Vec, + }, +} -#[allow(clippy::indexing_slicing)] fn main() { - let argv: Vec = env::args().collect(); + let cli = Cli::parse(); + + let (exit_code, output) = match &cli.command { + Commands::GenerateAddress => execute_generate_address(), + + Commands::Initialize { + testnet, + epoch, + db_path, + allocations_file, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let mainnet = !testnet; + let allocations = parse_allocations(allocations_file); + let db_name = db_path.to_str().expect("Invalid UTF-8 in db_path"); + + execute_initialize(db_name, mainnet, epoch_id, allocations) + } + + Commands::Check { + contract_file, + contract_id, + output_analysis, + costs, + testnet, + clarity_version, + epoch, + db_path, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + let mainnet = !testnet; + + let content = read_file_or_stdin( + contract_file + .to_str() + .expect("Invalid UTF-8 in contract_file"), + ); + + let cid = if let Some(cid_str) = contract_id { + QualifiedContractIdentifier::parse(cid_str).unwrap_or_else(|e| { + panic!("Error parsing contract identifier '{cid_str}': {e}") + }) + } else { + QualifiedContractIdentifier::transient() + }; + + let db_path_str = db_path + .as_ref() + .map(|p| p.to_str().expect("Invalid UTF-8 in db_path")); + + execute_check( + &content, + &cid, + *output_analysis, + *costs, + mainnet, + clarity_ver, + epoch_id, + db_path_str, + *testnet, + ) + } + + Commands::Repl { + testnet, + epoch, + clarity_version, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + let mainnet = !testnet; + execute_repl(mainnet, epoch_id, clarity_ver) + } + + Commands::EvalRaw { + testnet, + epoch, + clarity_version, + program_file, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + let mainnet = !testnet; + + let content = read_optional_file_or_stdin(program_file.as_ref()); + + execute_eval_raw(&content, mainnet, epoch_id, clarity_ver) + } + + Commands::Eval { + costs, + epoch, + clarity_version, + contract_id, + program_file, + db_path, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + + let cid = QualifiedContractIdentifier::parse(contract_id) + .unwrap_or_else(|e| panic!("Failed to parse contract identifier: {e}")); + + let content = read_optional_file_or_stdin(program_file.as_ref()); + + let db_path_str = db_path.to_str().expect("Invalid UTF-8 in db_path"); + + execute_eval(&cid, &content, *costs, epoch_id, clarity_ver, db_path_str) + } + + Commands::EvalAtChaintip { + costs, + epoch, + clarity_version, + contract_id, + program_file, + db_path, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + + let cid = QualifiedContractIdentifier::parse(contract_id) + .unwrap_or_else(|e| panic!("Failed to parse contract identifier: {e}")); + + let content = read_optional_file_or_stdin(program_file.as_ref()); + + let db_path_str = db_path.to_str().expect("Invalid UTF-8 in db_path"); + + execute_eval_at_chaintip(&cid, &content, *costs, epoch_id, clarity_ver, db_path_str) + } - let result = invoke_command(&argv[0], &argv[1..]); - match result { - (exit_code, Some(output)) => { - println!("{}", &serde_json::to_string(&output).unwrap()); - process::exit(exit_code); + Commands::EvalAtBlock { + costs, + epoch, + index_block_hash, + contract_id, + program_file, + clarity_version, + vm_dir, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + + let cid = QualifiedContractIdentifier::parse(contract_id) + .unwrap_or_else(|e| panic!("Failed to parse contract identifier: {e}")); + + let content = read_optional_file_or_stdin(program_file.as_ref()); + + let vm_dir_str = vm_dir.to_str().expect("Invalid UTF-8 in vm_dir"); + + execute_eval_at_block( + index_block_hash, + &cid, + &content, + *costs, + epoch_id, + clarity_ver, + vm_dir_str, + ) + } + + Commands::Launch { + costs, + assets, + output_analysis, + contract_id, + contract_file, + clarity_version, + epoch, + db_path, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + + let cid = QualifiedContractIdentifier::parse(contract_id) + .unwrap_or_else(|e| panic!("Failed to parse contract identifier: {e}")); + + let contract_src_file = contract_file + .to_str() + .expect("Invalid UTF-8 in contract_file"); + let contract_content = read_file_or_stdin(contract_src_file); + + let db_path_str = db_path.to_str().expect("Invalid UTF-8 in db_path"); + + execute_launch( + &cid, + &contract_content, + *costs, + *assets, + *output_analysis, + epoch_id, + clarity_ver, + db_path_str, + ) + } + + Commands::Execute { + costs, + assets, + clarity_version, + epoch, + db_path, + contract_id, + function_name, + sender, + args: fn_args, + } => { + let epoch_id = parse_epoch(epoch.as_ref()); + let clarity_ver = parse_clarity_version(clarity_version.as_ref(), epoch_id); + + let cid = QualifiedContractIdentifier::parse(contract_id) + .unwrap_or_else(|e| panic!("Failed to parse contract identifier: {e}")); + + let sender_principal = PrincipalData::parse_standard_principal(sender) + .map(PrincipalData::Standard) + .unwrap_or_else(|e| panic!("Unexpected result parsing sender {sender}: {e}")); + + let arguments: Vec<_> = fn_args + .iter() + .map(|argument| { + let argument_parsed = vm_execute_in_epoch(argument, clarity_ver, epoch_id) + .unwrap_or_else(|e| panic!("Error parsing argument '{argument}': {e}")); + let argument_value = argument_parsed.unwrap_or_else(|| { + panic!("Failed to parse a value from the argument: {argument}") + }); + SymbolicExpression::atom_value(argument_value) + }) + .collect(); + + let db_path_str = db_path.to_str().expect("Invalid UTF-8 in db_path"); + + execute_execute( + db_path_str, + &cid, + function_name, + sender_principal, + &arguments, + *costs, + *assets, + epoch_id, + ) } - (exit_code, None) => { - process::exit(exit_code); + }; + + // Output JSON result if present + if let Some(json_output) = output { + println!("{}", serde_json::to_string(&json_output).unwrap()); + } + + process::exit(exit_code); +} + +#[cfg(test)] +mod tests { + use clap::CommandFactory; + + use super::*; + + /// Validates the clap CLI structure has no configuration errors + #[test] + fn verify_cli_structure() { + Cli::command().debug_assert(); + } + + /// Tests that variadic arguments after positional args are collected correctly. + #[test] + fn test_execute_variadic_args() { + let cli = Cli::try_parse_from([ + "clarity-cli", + "execute", + "ST1.contract", + "transfer", + "ST1SENDER", + "/tmp/db", + "u100", + "'ST1RECIPIENT", + "(list u1 u2 u3)", + ]) + .unwrap(); + match cli.command { + Commands::Execute { args, .. } => { + assert_eq!(args, vec!["u100", "'ST1RECIPIENT", "(list u1 u2 u3)"]); + } + _ => panic!("Expected Execute command"), } } + + /// Tests that commands with many required positional args fail appropriately + /// when args are missing. Execute has the most complex arg structure. + #[test] + fn test_execute_missing_required_args() { + assert!(Cli::try_parse_from(["clarity-cli", "execute"]).is_err()); + assert!(Cli::try_parse_from(["clarity-cli", "execute", "ST1.contract"]).is_err()); + assert!(Cli::try_parse_from(["clarity-cli", "execute", "ST1.contract", "func"]).is_err()); + assert!( + Cli::try_parse_from(["clarity-cli", "execute", "ST1.contract", "func", "SENDER"]) + .is_err() + ); + } + + /// Tests that launch (another command with multiple required args) validates correctly + #[test] + fn test_launch_missing_required_args() { + assert!(Cli::try_parse_from(["clarity-cli", "launch"]).is_err()); + assert!(Cli::try_parse_from(["clarity-cli", "launch", "ST1.contract"]).is_err()); + assert!( + Cli::try_parse_from(["clarity-cli", "launch", "ST1.contract", "file.clar"]).is_err() + ); + } + + /// Verifies unknown subcommands are rejected + #[test] + fn test_unknown_command_rejected() { + assert!(Cli::try_parse_from(["clarity-cli", "unknown-command"]).is_err()); + } + + /// Verifies running with no subcommand is rejected + #[test] + fn test_no_command_rejected() { + assert!(Cli::try_parse_from(["clarity-cli"]).is_err()); + } } diff --git a/contrib/stacks-inspect/src/main.rs b/contrib/stacks-inspect/src/main.rs index 032eee97941..c66b298fb21 100644 --- a/contrib/stacks-inspect/src/main.rs +++ b/contrib/stacks-inspect/src/main.rs @@ -975,11 +975,6 @@ check if the associated microblocks can be downloaded return; } - if argv[1] == "local" { - clarity_cli::invoke_command(&format!("{} {}", argv[0], argv[1]), &argv[2..]); - return; - } - if argv[1] == "deserialize-db" { if argv.len() < 4 { eprintln!("Usage: {} clarity_sqlite_db [byte-prefix]", &argv[0]); diff --git a/docs/property-testing.md b/docs/property-testing.md new file mode 100644 index 00000000000..866aa13e3fa --- /dev/null +++ b/docs/property-testing.md @@ -0,0 +1,218 @@ +# Property Testing + +In the stacks-core repo, we want every new consensus-critical feature to be thoroughly tested: we want unit tests with tight assertions, test fixtures, integration tests, and end-to-end tests. In order to ensure that the new functions are sufficiently tested, we also want to have *property tests* in place. + +Property testing incorporates a few different concepts, but fundamentally, property testing means: + +1. Writing tests which accept only an input for the function being tested (i.e., there's no "expected" result, like in a fixture test). +2. The test executes the function being tested on the input and then asserts that the output matches certain properties. +3. The test harness has the ability to generate new inputs for the function being tested + +The goal is that every new feature and function in the stacks-core repo supplies property tests for the new feature. + +## `proptest-rs` + +The test harness we'll use for this will be [`proptest-rs`](https://proptest-rs.github.io/proptest/). There's a bit of a learning curve to using this library, but once you get used to it (and we develop enough strategies for input generation in our codebase) it shouldn't pose too much of a burden. + +We recommend perusing the [`proptest-rs`](https://proptest-rs.github.io/proptest/) tutorial as it contains a lot of useful theory and information. At a high-level, though, to use the library, you'll define testing functions which return proptest error types indicating whether or not the test failed or the input was invalid for the test (panics also work like a normal rust test). Then, you'll use macros provided by the library to define input-generation *strategies* for your test function. `proptest` defines strategies for many standard types in rust, and also provides macros for combining/mapping strategies into new ones (examples discussed below may be useful). Once you've done this, your new proptest will run like any other rust unit test during `cargo test`. During the test execution, `proptest-rs` generates and runs 250 cases for the property test before marking the test as *passed*. + +## Examples + +There are a couple examples of proptest in action in our codebase. The first is a set of property tests for new clarity functions in Epoch 3.3 (Clarity4). These tests generate clarity code (as strings) for property tests that assert the new clarity functions behave as expected ([vm::tests::post_conditions](https://github.com/stacks-network/stacks-core/blob/9c6a2ff42bfb50da65b2d3a8f9fde33283f2e090/clarity/src/vm/tests/post_conditions.rs#L1870)). The second is a property test for `make_reward_set`, which is used to translate data pulled from the `pox` contracts into the actual reward set ([chainstate::stacks::tests::reward_set](https://github.com/stacks-network/stacks-core/blob/9c6a2ff42bfb50da65b2d3a8f9fde33283f2e090/stackslib/src/chainstate/stacks/tests/reward_set.rs)). +### Reward Set Example + +The reward set example can be thought of as two major pieces: the test itself and the input generation. Let's first look at the test: + +```rust +pub fn check_make_reward_set( + pox_settings: PoxConstants, + addresses: &[RawRewardSetEntry], + unstacked_ustx: u128, +) -> Result<(), TestCaseError> { + let total_stacked = addresses.iter().try_fold(0_u128, |total, entry| { + total + .checked_add(entry.amount_stacked) + .ok_or_else(|| TestCaseError::Reject("Reward set entries must be summable".into())) + })?; + + let liquid_ustx = total_stacked + .checked_add(unstacked_ustx) + .ok_or_else(|| TestCaseError::Reject("Total ustx must be summable".into()))?; + + prop_assume!(total_stacked <= liquid_ustx); + + let (threshold, participation) = StacksChainState::get_reward_threshold_and_participation( + &pox_settings, + addresses, + liquid_ustx, + ); + + let reward_set = + StacksChainState::make_reward_set(threshold, addresses.to_vec(), StacksEpochId::Epoch33); + + prop_assert_eq!(Some(threshold), reward_set.pox_ustx_threshold); + + let mut sum_by_addresses: HashMap = HashMap::new(); + for addr in addresses.iter() { + let entry = sum_by_addresses + .entry(addr.reward_address.clone()) + .or_default(); + *entry += addr.amount_stacked; + } + + for (addr, stacked_amount) in sum_by_addresses.iter() { + let slot_count: u128 = reward_set + .rewarded_addresses + .iter() + .filter(|x| *x == addr) + .count() + .try_into() + .unwrap(); + + prop_assert_eq!(slot_count, stacked_amount / threshold); + } + + Ok(()) +} +``` + +This test essentially just takes the raw PoX entries, computes the PoX stacking threshold, and then feeds that data into `make_reward_set`. Afterwards, it checks that each PoX entry has the expected number of slots (i.e., the sum of all of that address's entries floor-divided by the threshold). The one "proptest hack" in this function is the way total liquid ustx is computed. Rather than allowing total liquid ustx to be a free argument and then just "prop assuming" that it is greater than the sum of the reward set entries, we make total liquid ustx a derived variable. The reason to do this is that it makes input generation easier if it doesn't have to worry too much about generating invalid data. + +Now, the part of the test that becomes more complex (and proptest-specific) is the actual input generation. We need strategies for generating the inputs to that function. For `PoxConstants`, we're really only interested in the number of slots, so we can just generate uints and construct `PoxConstants` from that. Similarly, `unstacked_ustx` is just a `u128`. However, we do have to write a strategy for the reward set entries themselves. + +To write a strategy for `RawRewardSetEntry`, we'll start by writing a strategy for `PoxAddress`: + +```rust +pub fn pox_address_standard() -> impl Strategy { + ( + prop::sample::select(&[20u8, 21, 22, 26]), + uniform20(any::()), + ) + .prop_map(|(version, bytes)| { + PoxAddress::Standard(StacksAddress::new(version, Hash160(bytes)).unwrap(), None) + }) +} + +pub fn pox_address_addr20() -> impl Strategy { + ( + any::(), + prop::sample::select(&[PoxAddressType20::P2WPKH]), + uniform20(any::()), + ) + .prop_map(|(mainnet, addr_ty, bytes)| PoxAddress::Addr20(mainnet, addr_ty, bytes)) +} + +pub fn pox_address_addr32() -> impl Strategy { + ( + any::(), + prop::sample::select(&[PoxAddressType32::P2TR, PoxAddressType32::P2WSH]), + uniform32(any::()), + ) + .prop_map(|(mainnet, addr_ty, bytes)| PoxAddress::Addr32(mainnet, addr_ty, bytes)) +} + +pub fn pox_address_strategy() -> impl Strategy { + prop_oneof![ + pox_address_standard(), + pox_address_addr32(), + pox_address_addr20() + ] +} +``` + +The way we do this is by writing a strategy for each variant of `PoxAddress`, and then using a `proptest` macro to combine the three of them into a single strategy that picks one of the substrategies. When writing strategies for the composite types (like `PoxAddress::Standard`), the `prop_map` function is very useful. It basically lets you take a strategy for generating something like a `[u8; 20]` into a strategy for generating `StacksAddress`. In the examples above, we generate tuples which can be mapped into the various address types. + +Once we've done that, we can map that strategy into one for generated reward set entries by including an amount stacked as well: + +```rust +pub fn reward_set_entry_strategy() -> impl Strategy { + (pox_address_strategy(), 1..100_000_000_000_000u128).prop_map( + |(reward_address, amount_stacked)| RawRewardSetEntry { + reward_address, + amount_stacked, + stacker: None, + signer: None, + }, + ) +} +``` + +Finally, we can actually write the property test: + +```rust + +proptest! { + #[test] + fn make_reward_set( + pox_slots in 1..4_000u32, + unstacked_ustx in 0..100_000_000_000_000u128, + addrs in prop::collection::vec(reward_set_entry_strategy(), 1..50_000), + ) { + let prepare_length = 10; + let reward_length = pox_slots * 2; + let cycle_length = reward_length + prepare_length; + let pox_settings = PoxConstants::new( + cycle_length, + prepare_length, + prepare_length / 2 + 1, + 10, + 10, + u64::MAX, + u64::MAX, + u32::MAX, + u32::MAX, + u32::MAX, + u32::MAX, + ); + + check_make_reward_set(pox_settings, addrs.as_slice(), unstacked_ustx)?; + } +} +``` + +This uses `proptest`'s vec generation to generate a vec of reward set entries for each case to be tested. + +This works great, but one downside of property testing is that it doesn't necessarily surface corner cases very well: random input generation is great, but if corner cases are low probability, they won't get caught in 250 random cases. + +For the above example, one thing we really want to be sure of is that multiple entries from the same address are handled effectively. `proptest` *should* eventually generate cases with multiple entries for the same address, but if you comment out the duplicate entry handling lines in the `make_reward_set` function, you can see that the property test still often passes! + +So to deal with this, we can alter our input generation so that we're getting more interesting test cases: + +```rust + #[test] + fn make_reward_set( + pox_slots in 1..4_000u32, + unstacked_ustx in 0..1_000_000_000u128, + mut addrs in prop::collection::vec(reward_set_entry_strategy(), 1..25_000), + to_duplicate in prop::collection::vec((0..25_000usize, 0..100_000_000u128), 0..25_000) + ) { + ... + + let _ = addrs.try_reserve(to_duplicate.len()); + for (to_dup_ix, duplicated_amount) in to_duplicate.into_iter() { + let mut new_entry = addrs[to_dup_ix % addrs.len()].clone(); + new_entry.amount_stacked = duplicated_amount; + addrs.push(new_entry); + } + + check_make_reward_set(pox_settings, addrs.as_slice(), unstacked_ustx)?; + } +``` + +This technique allows to be sure that proptest generates a lot of cases where there are multiple entries for the same reward address. Unfortunately, this kind of thing tends to be more art than science, which means that PR authors and reviewers will need to be careful about the input strategies for property tests (this should also be aided by the CI task for PRs). This is one of the reasons that property tests can't totally supplant unit tests. However, a lot of the work of property tests helps with writing unit tests: many unit tests can be essentially fixed inputs to the property test. + +## Reusing Strategies + +Writing new input strategies may be the most tedious part of writing property tests, so it is worthwhile figuring out if the input you are looking for (or maybe a component of the input you're looking for) already has a strategy in the codebase. If you search for functions that return `impl Strategy` in the codebase, you should find the set of functions that have already been written. + +Except in cases where input strategies are highly tailored to a particular test, strategy functions should be placed in common `proptest_utils` modules for the crate you are working in. For the examples discussed in this PR, those are in `stackslib::proptest_utils`. This makes discovery a bit easier for later consumers of those input strategies. + +## Continuous Integration + +By default, we'll get some CI integration from `proptest` automatically: the new property tests will run with 250 randomly generated inputs on every execution of the unit test job in CI. This is great. However, we want some additional support for executing *new* property tests extra amounts before PRs merge. + +The environment variable `PROPTEST_CASES` can be set to a higher number (e.g., `PROPTEST_CASES=2500`) to explore more test cases before declaring success. From the CI, what we want is a job which: + +1. Executes once a PR has been approved. +2. Discovers the set of new tests (this is probably easiest to achieve by running `cargo nextest list` on the source and target branches and then diffing the outputs). +3. Executes only the new tests with the environment variable `PROPTEST_CASES` set to 2500. diff --git a/docs/rpc/components/examples/account-data.example.json b/docs/rpc/components/examples/account-data.example.json index f4cececc9ba..3b40a2c440d 100644 --- a/docs/rpc/components/examples/account-data.example.json +++ b/docs/rpc/components/examples/account-data.example.json @@ -1,8 +1,11 @@ { - "balance": "0x0000000000000000000000000007a120", - "locked": "0x0000000000000000000000000007a120", - "unlock_height": 126, - "nonce": 2867, - "balance_proof": "0xabce", - "nonce_proof": "0xabcd" + "summary": "Account data with balance and nonce", + "value": { + "balance": "0x0000000000000000000000000007a120", + "locked": "0x0000000000000000000000000007a120", + "unlock_height": 126, + "nonce": 2867, + "balance_proof": "0xabce", + "nonce_proof": "0xabcd" + } } diff --git a/docs/rpc/components/examples/block-replay.example.json b/docs/rpc/components/examples/block-replay.example.json index e01fa2fbe60..0046e6c39eb 100644 --- a/docs/rpc/components/examples/block-replay.example.json +++ b/docs/rpc/components/examples/block-replay.example.json @@ -1,110 +1,113 @@ { - "block_hash": "732f57eefc4dbfb015c9988d9943c47273d25fbe039220d53f311b307609c83f", - "block_id": "856f6b08f338164df7422f66337c8ce916b6b0301fcaa09de06c61cfb79e2a45", - "block_height": 123, - "consensus_hash": "33dffda027e2ca3aaf278855c59a8a0b2d2dd51f", - "fees": 1, - "miner_signature": "004b2878d7639060c4d183b1338447c06ceb0ad55424856c550a4c988401fdf8cf1fe6e8c05cc0e3ff8d4383590bf700cb5dd1a8bb3269f7125f6e0704b66eade8", - "parent_block_id": "3ac36fc1acfc86ba80ea27cd26017c675f75bc07fb042814b72e74cd7d331503", - "signer_signature": [ - "00d4e08331db614d18d7b5af53cf9bc03add9c7a2dcb6f0448721de7ea98f662cf7dc43ee73e14d18dfae3d3d349ff67e0fd773a446fb8c949c93ae4676f4d34bc", - "01619c6e69bad5b43e11bae3eb4d4626e5cf19d595923b0b5d2053e8883a266b41315fdaefd1eca03c5c0580b0f7fd28053c3f34eb0a12220b61392d342f5afb0d", - "0078fa352e0e4d2d94b25d4070ae24a819f268b2260a1e4d0d867415dbdc39e2cf75e57de69375794073e22a75873a5e1ca33ed96eadd8086415e934f697b78fdb", - "00b8d9b0d0cdfabe3c65237801e714185777f60507c773fcd2a72ed00b9d4c59cb5ab96e0e8d545bd562b5ca3de6db1d3b9fccd8f41c3bfa7de3528deb1acd30d6" - ], - "state_index_root": "839b826290027e5b92de415495be7bab2eab2ad4e2f8c371a1a773ae552fedba", - "timestamp": 1758284349, - "transactions": [ - { - "data": { - "anchor_mode": "OnChainOnly", - "auth": { - "Standard": { - "Singlesig": { - "hash_mode": "P2PKH", - "key_encoding": "Compressed", - "nonce": 99, - "signature": "01e29229b386e1f69ffd91e339c878246235ec1cd4771b42a7f45e1ed108643bc9417d43dd96a02c93314ef4cf5bcbcc5642df2e1f5a177333ff983c8719d80661", - "signer": "2965a4e6e4226868fa3ae88b2b9bb9e937d77fba", - "tx_fee": 1 + "summary": "Block replay response", + "value": { + "block_hash": "732f57eefc4dbfb015c9988d9943c47273d25fbe039220d53f311b307609c83f", + "block_id": "856f6b08f338164df7422f66337c8ce916b6b0301fcaa09de06c61cfb79e2a45", + "block_height": 123, + "consensus_hash": "33dffda027e2ca3aaf278855c59a8a0b2d2dd51f", + "fees": 1, + "miner_signature": "004b2878d7639060c4d183b1338447c06ceb0ad55424856c550a4c988401fdf8cf1fe6e8c05cc0e3ff8d4383590bf700cb5dd1a8bb3269f7125f6e0704b66eade8", + "parent_block_id": "3ac36fc1acfc86ba80ea27cd26017c675f75bc07fb042814b72e74cd7d331503", + "signer_signature": [ + "00d4e08331db614d18d7b5af53cf9bc03add9c7a2dcb6f0448721de7ea98f662cf7dc43ee73e14d18dfae3d3d349ff67e0fd773a446fb8c949c93ae4676f4d34bc", + "01619c6e69bad5b43e11bae3eb4d4626e5cf19d595923b0b5d2053e8883a266b41315fdaefd1eca03c5c0580b0f7fd28053c3f34eb0a12220b61392d342f5afb0d", + "0078fa352e0e4d2d94b25d4070ae24a819f268b2260a1e4d0d867415dbdc39e2cf75e57de69375794073e22a75873a5e1ca33ed96eadd8086415e934f697b78fdb", + "00b8d9b0d0cdfabe3c65237801e714185777f60507c773fcd2a72ed00b9d4c59cb5ab96e0e8d545bd562b5ca3de6db1d3b9fccd8f41c3bfa7de3528deb1acd30d6" + ], + "state_index_root": "839b826290027e5b92de415495be7bab2eab2ad4e2f8c371a1a773ae552fedba", + "timestamp": 1758284349, + "transactions": [ + { + "data": { + "anchor_mode": "OnChainOnly", + "auth": { + "Standard": { + "Singlesig": { + "hash_mode": "P2PKH", + "key_encoding": "Compressed", + "nonce": 99, + "signature": "01e29229b386e1f69ffd91e339c878246235ec1cd4771b42a7f45e1ed108643bc9417d43dd96a02c93314ef4cf5bcbcc5642df2e1f5a177333ff983c8719d80661", + "signer": "2965a4e6e4226868fa3ae88b2b9bb9e937d77fba", + "tx_fee": 1 + } } - } - }, - "chain_id": 2147483648, - "payload": { - "TokenTransfer": [ - { - "Standard": [ - 26, - [ - 189, - 65, - 200, - 147, - 188, - 192, - 157, - 152, - 224, - 211, - 77, - 255, - 135, - 190, - 175, - 153, - 88, - 51, - 140, - 222 + }, + "chain_id": 2147483648, + "payload": { + "TokenTransfer": [ + { + "Standard": [ + 26, + [ + 189, + 65, + 200, + 147, + 188, + 192, + 157, + 152, + 224, + 211, + 77, + 255, + 135, + 190, + 175, + 153, + 88, + 51, + 140, + 222 + ] ] - ] + }, + 1, + "00000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "post_condition_mode": "Deny", + "post_conditions": [], + "version": "Testnet" + }, + "events": [ + { + "committed": true, + "event_index": 0, + "stx_transfer_event": { + "amount": "1", + "memo": "00000000000000000000000000000000000000000000000000000000000000000000", + "recipient": "ST2YM3J4KQK09V670TD6ZZ1XYNYCNGCWCVTASN5VM", + "sender": "STMPB976WGH6GT7T7BM8PAWVQ7MKFNVZQAXS4BFS" }, - 1, - "00000000000000000000000000000000000000000000000000000000000000000000" - ] + "txid": "0xf14dd7dec56405fd7dac69c3080fb569fae4c49c591f9ad0e5cf5c797add9005", + "type": "stx_transfer_event" + } + ], + "execution_cost": { + "read_count": 0, + "read_length": 0, + "runtime": 0, + "write_count": 0, + "write_length": 0 }, - "post_condition_mode": "Deny", - "post_conditions": [], - "version": "Testnet" - }, - "events": [ - { - "committed": true, - "event_index": 0, - "stx_transfer_event": { - "amount": "1", - "memo": "00000000000000000000000000000000000000000000000000000000000000000000", - "recipient": "ST2YM3J4KQK09V670TD6ZZ1XYNYCNGCWCVTASN5VM", - "sender": "STMPB976WGH6GT7T7BM8PAWVQ7MKFNVZQAXS4BFS" - }, - "txid": "0xf14dd7dec56405fd7dac69c3080fb569fae4c49c591f9ad0e5cf5c797add9005", - "type": "stx_transfer_event" - } - ], - "execution_cost": { - "read_count": 0, - "read_length": 0, - "runtime": 0, - "write_count": 0, - "write_length": 0 - }, - "hex": "808000000004002965a4e6e4226868fa3ae88b2b9bb9e937d77fba000000000000006300000000000000010001e29229b386e1f69ffd91e339c878246235ec1cd4771b42a7f45e1ed108643bc9417d43dd96a02c93314ef4cf5bcbcc5642df2e1f5a177333ff983c8719d8066101020000000000051abd41c893bcc09d98e0d34dff87beaf9958338cde000000000000000100000000000000000000000000000000000000000000000000000000000000000000", - "result": { - "Response": { - "committed": true, - "data": { - "Bool": true + "hex": "808000000004002965a4e6e4226868fa3ae88b2b9bb9e937d77fba000000000000006300000000000000010001e29229b386e1f69ffd91e339c878246235ec1cd4771b42a7f45e1ed108643bc9417d43dd96a02c93314ef4cf5bcbcc5642df2e1f5a177333ff983c8719d8066101020000000000051abd41c893bcc09d98e0d34dff87beaf9958338cde000000000000000100000000000000000000000000000000000000000000000000000000000000000000", + "result": { + "Response": { + "committed": true, + "data": { + "Bool": true + } } - } - }, - "result_hex": "0x0703", - "post_condition_aborted": false, - "stx_burned": 0, - "tx_index": 0, - "txid": "f14dd7dec56405fd7dac69c3080fb569fae4c49c591f9ad0e5cf5c797add9005" - } - ], - "tx_merkle_root": "a68e3c76471d9e66b71a14165c4c9a2b980c51efb5b313425cffcef7172d6080", - "valid_merkle_root": true -} \ No newline at end of file + }, + "result_hex": "0x0703", + "post_condition_aborted": false, + "stx_burned": 0, + "tx_index": 0, + "txid": "f14dd7dec56405fd7dac69c3080fb569fae4c49c591f9ad0e5cf5c797add9005" + } + ], + "tx_merkle_root": "a68e3c76471d9e66b71a14165c4c9a2b980c51efb5b313425cffcef7172d6080", + "valid_merkle_root": true + } +} diff --git a/docs/rpc/components/examples/clarity-data.example.json b/docs/rpc/components/examples/clarity-data.example.json index cf54898ab0d..04caf16e829 100644 --- a/docs/rpc/components/examples/clarity-data.example.json +++ b/docs/rpc/components/examples/clarity-data.example.json @@ -1,4 +1,7 @@ { - "data": "0x0a0c000000010a6d6f6e737465722d69640100000000000000000000000000000001", - "proof": "0x123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + "summary": "Clarity data map lookup result", + "value": { + "data": "0x0a0c000000010a6d6f6e737465722d69640100000000000000000000000000000001", + "proof": "0x123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + } } diff --git a/docs/rpc/components/examples/clarity-metadata.example.json b/docs/rpc/components/examples/clarity-metadata.example.json index 5bb4bd5c478..50fbd153188 100644 --- a/docs/rpc/components/examples/clarity-metadata.example.json +++ b/docs/rpc/components/examples/clarity-metadata.example.json @@ -1,3 +1,6 @@ { - "data": "'{\"contract_identifier\":{...}, \"private_function_types\":{...}'" + "summary": "Clarity contract metadata", + "value": { + "data": "'{\"contract_identifier\":{...}, \"private_function_types\":{...}'" + } } diff --git a/docs/rpc/components/examples/constant-value.example.json b/docs/rpc/components/examples/constant-value.example.json index 4c188b2a154..581b16bd029 100644 --- a/docs/rpc/components/examples/constant-value.example.json +++ b/docs/rpc/components/examples/constant-value.example.json @@ -1,3 +1,6 @@ { - "data": "0x01ce0123456789abcdef" + "summary": "Constant value lookup result", + "value": { + "data": "0x01ce0123456789abcdef" + } } diff --git a/docs/rpc/components/examples/contract-interface.example.json b/docs/rpc/components/examples/contract-interface.example.json index 729f1e6335c..d606053f37f 100644 --- a/docs/rpc/components/examples/contract-interface.example.json +++ b/docs/rpc/components/examples/contract-interface.example.json @@ -1,659 +1,662 @@ { - "functions": [ - { - "name": "protocol-mint-many-iter", - "access": "private", - "args": [ - { - "name": "item", - "type": { - "tuple": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "recipient", - "type": "principal" - } - ] - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "transfer-many-iter", - "access": "private", - "args": [ - { - "name": "individual-transfer", - "type": { - "tuple": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "memo", - "type": { - "optional": { - "buffer": { - "length": 34 + "summary": "Contract interface details", + "value": { + "functions": [ + { + "name": "protocol-mint-many-iter", + "access": "private", + "args": [ + { + "name": "item", + "type": { + "tuple": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "recipient", + "type": "principal" + } + ] + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "transfer-many-iter", + "access": "private", + "args": [ + { + "name": "individual-transfer", + "type": { + "tuple": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "memo", + "type": { + "optional": { + "buffer": { + "length": 34 + } + } + } + }, + { + "name": "sender", + "type": "principal" + }, + { + "name": "to", + "type": "principal" + } + ] + } + }, + { + "name": "result", + "type": { + "response": { + "ok": "uint128", + "error": "uint128" + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-burn", + "access": "public", + "args": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "owner", + "type": "principal" + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-burn-locked", + "access": "public", + "args": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "owner", + "type": "principal" + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-lock", + "access": "public", + "args": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "owner", + "type": "principal" + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-mint", + "access": "public", + "args": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "recipient", + "type": "principal" + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-mint-many", + "access": "public", + "args": [ + { + "name": "recipients", + "type": { + "list": { + "type": { + "tuple": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "recipient", + "type": "principal" + } + ] + }, + "length": 200 + } + } + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": { + "list": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + }, + "length": 200 + } + }, + "error": "uint128" + } + } + } + }, + { + "name": "protocol-set-name", + "access": "public", + "args": [ + { + "name": "new-name", + "type": { + "string-ascii": { + "length": 32 + } + } + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-set-symbol", + "access": "public", + "args": [ + { + "name": "new-symbol", + "type": { + "string-ascii": { + "length": 10 + } + } + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-set-token-uri", + "access": "public", + "args": [ + { + "name": "new-uri", + "type": { + "optional": { + "string-utf8": { + "length": 256 + } + } + } + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "protocol-unlock", + "access": "public", + "args": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "owner", + "type": "principal" + }, + { + "name": "contract-flag", + "type": { + "buffer": { + "length": 1 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "transfer", + "access": "public", + "args": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "sender", + "type": "principal" + }, + { + "name": "recipient", + "type": "principal" + }, + { + "name": "memo", + "type": { + "optional": { + "buffer": { + "length": 34 + } + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "bool", + "error": "uint128" + } + } + } + }, + { + "name": "transfer-many", + "access": "public", + "args": [ + { + "name": "recipients", + "type": { + "list": { + "type": { + "tuple": [ + { + "name": "amount", + "type": "uint128" + }, + { + "name": "memo", + "type": { + "optional": { + "buffer": { + "length": 34 + } + } + } + }, + { + "name": "sender", + "type": "principal" + }, + { + "name": "to", + "type": "principal" + } + ] + }, + "length": 200 + } + } + } + ], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "uint128" + } + } + } + }, + { + "name": "get-balance", + "access": "read_only", + "args": [ + { + "name": "who", + "type": "principal" + } + ], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "none" + } + } + } + }, + { + "name": "get-balance-available", + "access": "read_only", + "args": [ + { + "name": "who", + "type": "principal" + } + ], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "none" + } + } + } + }, + { + "name": "get-balance-locked", + "access": "read_only", + "args": [ + { + "name": "who", + "type": "principal" + } + ], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "none" + } + } + } + }, + { + "name": "get-decimals", + "access": "read_only", + "args": [], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "none" + } + } + } + }, + { + "name": "get-name", + "access": "read_only", + "args": [], + "outputs": { + "type": { + "response": { + "ok": { + "string-ascii": { + "length": 32 + } + }, + "error": "none" + } + } + } + }, + { + "name": "get-symbol", + "access": "read_only", + "args": [], + "outputs": { + "type": { + "response": { + "ok": { + "string-ascii": { + "length": 10 + } + }, + "error": "none" + } + } + } + }, + { + "name": "get-token-uri", + "access": "read_only", + "args": [], + "outputs": { + "type": { + "response": { + "ok": { + "optional": { + "string-utf8": { + "length": 256 + } + } + }, + "error": "none" + } + } + } + }, + { + "name": "get-total-supply", + "access": "read_only", + "args": [], + "outputs": { + "type": { + "response": { + "ok": "uint128", + "error": "none" + } } - } } - }, - { - "name": "sender", - "type": "principal" - }, - { - "name": "to", - "type": "principal" - } - ] - } - }, - { - "name": "result", - "type": { - "response": { - "ok": "uint128", - "error": "uint128" - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-burn", - "access": "public", - "args": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "owner", - "type": "principal" - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-burn-locked", - "access": "public", - "args": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "owner", - "type": "principal" - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-lock", - "access": "public", - "args": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "owner", - "type": "principal" - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-mint", - "access": "public", - "args": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "recipient", - "type": "principal" - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-mint-many", - "access": "public", - "args": [ - { - "name": "recipients", - "type": { - "list": { - "type": { - "tuple": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "recipient", - "type": "principal" - } - ] - }, - "length": 200 - } - } - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": { - "list": { + ], + "variables": [ + { + "name": "ERR_NOT_OWNER", "type": { - "response": { - "ok": "bool", - "error": "uint128" - } + "response": { + "ok": "none", + "error": "uint128" + } }, - "length": 200 - } + "access": "constant" }, - "error": "uint128" - } - } - } - }, - { - "name": "protocol-set-name", - "access": "public", - "args": [ - { - "name": "new-name", - "type": { - "string-ascii": { - "length": 32 - } - } - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-set-symbol", - "access": "public", - "args": [ - { - "name": "new-symbol", - "type": { - "string-ascii": { - "length": 10 - } - } - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-set-token-uri", - "access": "public", - "args": [ - { - "name": "new-uri", - "type": { - "optional": { - "string-utf8": { - "length": 256 - } - } - } - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "protocol-unlock", - "access": "public", - "args": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "owner", - "type": "principal" - }, - { - "name": "contract-flag", - "type": { - "buffer": { - "length": 1 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "transfer", - "access": "public", - "args": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "sender", - "type": "principal" - }, - { - "name": "recipient", - "type": "principal" - }, - { - "name": "memo", - "type": { - "optional": { - "buffer": { - "length": 34 - } - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "bool", - "error": "uint128" - } - } - } - }, - { - "name": "transfer-many", - "access": "public", - "args": [ - { - "name": "recipients", - "type": { - "list": { - "type": { - "tuple": [ - { - "name": "amount", - "type": "uint128" - }, - { - "name": "memo", - "type": { - "optional": { - "buffer": { - "length": 34 - } - } - } - }, - { - "name": "sender", - "type": "principal" - }, - { - "name": "to", - "type": "principal" - } - ] - }, - "length": 200 - } - } - } - ], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "uint128" - } - } - } - }, - { - "name": "get-balance", - "access": "read_only", - "args": [ - { - "name": "who", - "type": "principal" - } - ], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "none" - } - } - } - }, - { - "name": "get-balance-available", - "access": "read_only", - "args": [ - { - "name": "who", - "type": "principal" - } - ], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "none" - } - } - } - }, - { - "name": "get-balance-locked", - "access": "read_only", - "args": [ - { - "name": "who", - "type": "principal" - } - ], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "none" - } - } - } - }, - { - "name": "get-decimals", - "access": "read_only", - "args": [], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "none" - } - } - } - }, - { - "name": "get-name", - "access": "read_only", - "args": [], - "outputs": { - "type": { - "response": { - "ok": { - "string-ascii": { - "length": 32 - } + { + "name": "ERR_TRANSFER_INDEX_PREFIX", + "type": "uint128", + "access": "constant" }, - "error": "none" - } - } - } - }, - { - "name": "get-symbol", - "access": "read_only", - "args": [], - "outputs": { - "type": { - "response": { - "ok": { - "string-ascii": { - "length": 10 - } + { + "name": "token-decimals", + "type": "uint128", + "access": "constant" }, - "error": "none" - } - } - } - }, - { - "name": "get-token-uri", - "access": "read_only", - "args": [], - "outputs": { - "type": { - "response": { - "ok": { - "optional": { - "string-utf8": { - "length": 256 - } - } + { + "name": "token-name", + "type": { + "string-ascii": { + "length": 32 + } + }, + "access": "variable" }, - "error": "none" - } - } - } - }, - { - "name": "get-total-supply", - "access": "read_only", - "args": [], - "outputs": { - "type": { - "response": { - "ok": "uint128", - "error": "none" - } - } - } - } - ], - "variables": [ - { - "name": "ERR_NOT_OWNER", - "type": { - "response": { - "ok": "none", - "error": "uint128" - } - }, - "access": "constant" - }, - { - "name": "ERR_TRANSFER_INDEX_PREFIX", - "type": "uint128", - "access": "constant" - }, - { - "name": "token-decimals", - "type": "uint128", - "access": "constant" - }, - { - "name": "token-name", - "type": { - "string-ascii": { - "length": 32 - } - }, - "access": "variable" - }, - { - "name": "token-symbol", - "type": { - "string-ascii": { - "length": 10 - } - }, - "access": "variable" - }, - { - "name": "token-uri", - "type": { - "optional": { - "string-utf8": { - "length": 256 - } - } - }, - "access": "variable" - } - ], - "maps": [], - "fungible_tokens": [ - { - "name": "sbtc-token" - }, - { - "name": "sbtc-token-locked" + { + "name": "token-symbol", + "type": { + "string-ascii": { + "length": 10 + } + }, + "access": "variable" + }, + { + "name": "token-uri", + "type": { + "optional": { + "string-utf8": { + "length": 256 + } + } + }, + "access": "variable" + } + ], + "maps": [], + "fungible_tokens": [ + { + "name": "sbtc-token" + }, + { + "name": "sbtc-token-locked" + } + ], + "non_fungible_tokens": [], + "epoch": "Epoch30", + "clarity_version": "Clarity3" } - ], - "non_fungible_tokens": [], - "epoch": "Epoch30", - "clarity_version": "Clarity3" } diff --git a/docs/rpc/components/examples/contract-source.example.json b/docs/rpc/components/examples/contract-source.example.json index 97a3f819b9e..205e2b038db 100644 --- a/docs/rpc/components/examples/contract-source.example.json +++ b/docs/rpc/components/examples/contract-source.example.json @@ -1,5 +1,8 @@ { - "source": "(define-constant sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)\n(define-constant recipient 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)\n\n(define-fungible-token novel-token-19)\n(begin (ft-mint? novel-token-19 u12 sender))\n(begin (ft-transfer? novel-token-19 u2 sender recipient))\n\n(define-non-fungible-token hello-nft uint)\n(begin (nft-mint? hello-nft u1 sender))\n(begin (nft-mint? hello-nft u2 sender))\n(begin (nft-transfer? hello-nft u1 sender recipient))\n\n(define-public (test-emit-event)\n (begin\n (print \"Event! Hello world\")\n (ok u1)))\n(begin (test-emit-event))\n\n(define-public (test-event-types)\n (begin\n (unwrap-panic (ft-mint? novel-token-19 u3 recipient))\n (unwrap-panic (nft-mint? hello-nft u2 recipient))\n (unwrap-panic (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR))\n (unwrap-panic (stx-burn? u20 tx-sender))\n (ok u1)))\n\n(define-map store ((key (buff 32))) ((value (buff 32))))\n(define-public (get-value (key (buff 32)))\n (begin\n (match (map-get? store ((key key)))\n entry (ok (get value entry))\n (err 0))))\n(define-public (set-value (key (buff 32)) (value (buff 32)))\n (begin\n (map-set store ((key key)) ((value value)))\n (ok u1)))", - "publish_height": 3196, - "proof": "0x000000110406000000123456789abcdef" + "summary": "Contract source code", + "value": { + "source": "(define-constant sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)\n(define-constant recipient 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)\n\n(define-fungible-token novel-token-19)\n(begin (ft-mint? novel-token-19 u12 sender))\n(begin (ft-transfer? novel-token-19 u2 sender recipient))\n\n(define-non-fungible-token hello-nft uint)\n(begin (nft-mint? hello-nft u1 sender))\n(begin (nft-mint? hello-nft u2 sender))\n(begin (nft-transfer? hello-nft u1 sender recipient))\n\n(define-public (test-emit-event)\n (begin\n (print \"Event! Hello world\")\n (ok u1)))\n(begin (test-emit-event))\n\n(define-public (test-event-types)\n (begin\n (unwrap-panic (ft-mint? novel-token-19 u3 recipient))\n (unwrap-panic (nft-mint? hello-nft u2 recipient))\n (unwrap-panic (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR))\n (unwrap-panic (stx-burn? u20 tx-sender))\n (ok u1)))\n\n(define-map store ((key (buff 32))) ((value (buff 32))))\n(define-public (get-value (key (buff 32)))\n (begin\n (match (map-get? store ((key key)))\n entry (ok (get value entry))\n (err 0))))\n(define-public (set-value (key (buff 32)) (value (buff 32)))\n (begin\n (map-set store ((key key)) ((value value)))\n (ok u1)))", + "publish_height": 3196, + "proof": "0x000000110406000000123456789abcdef" + } } diff --git a/docs/rpc/components/examples/fee-transaction-request.example.json b/docs/rpc/components/examples/fee-transaction-request.example.json index daa4dfd486a..1c05e696560 100644 --- a/docs/rpc/components/examples/fee-transaction-request.example.json +++ b/docs/rpc/components/examples/fee-transaction-request.example.json @@ -1,4 +1,7 @@ { - "estimated_len": 350, - "transaction_payload": "021af942874ce525e87f21bbe8c121b12fac831d02f4086765742d696e666f0b7570646174652d696e666f00000000" + "summary": "Fee estimation request", + "value": { + "estimated_len": 350, + "transaction_payload": "021af942874ce525e87f21bbe8c121b12fac831d02f4086765742d696e666f0b7570646174652d696e666f00000000" + } } diff --git a/docs/rpc/components/examples/fee-transaction-response.example.json b/docs/rpc/components/examples/fee-transaction-response.example.json index e82274974e3..4685e0551e5 100644 --- a/docs/rpc/components/examples/fee-transaction-response.example.json +++ b/docs/rpc/components/examples/fee-transaction-response.example.json @@ -1,25 +1,28 @@ { - "cost_scalar_change_by_byte": 0.00476837158203125, - "estimated_cost": { - "read_count": 19, - "read_length": 4814, - "runtime": 7175000, - "write_count": 2, - "write_length": 1020 - }, - "estimated_cost_scalar": 14, - "estimations": [ - { - "fee": 17, - "fee_rate": 1.2410714285714286 - }, - { - "fee": 125, - "fee_rate": 8.958333333333332 - }, - { - "fee": 140, - "fee_rate": 10 + "summary": "Fee estimation response", + "value": { + "cost_scalar_change_by_byte": 0.00476837158203125, + "estimated_cost": { + "read_count": 19, + "read_length": 4814, + "runtime": 7175000, + "write_count": 2, + "write_length": 1020 + }, + "estimated_cost_scalar": 14, + "estimations": [ + { + "fee": 17, + "fee_rate": 1.2410714285714286 + }, + { + "fee": 125, + "fee_rate": 8.958333333333332 + }, + { + "fee": 140, + "fee_rate": 10 + } + ] } - ] } diff --git a/docs/rpc/components/examples/get-sortitions-latest-and-prior.example.json b/docs/rpc/components/examples/get-sortitions-latest-and-prior.example.json index db970637ed3..873a2705fc3 100644 --- a/docs/rpc/components/examples/get-sortitions-latest-and-prior.example.json +++ b/docs/rpc/components/examples/get-sortitions-latest-and-prior.example.json @@ -1,28 +1,31 @@ -[ - { - "burn_block_hash": "0x046f54cd1924a5d80fc3b8186d0334b7521acae90f9e136e2bee680c720d0e83", - "burn_block_height": 231, - "burn_header_timestamp": 1726797570, - "sortition_id": "0x8a5116b7b4306dc4f6db290d1adfff9e1347f3e921bb793fc4c33e2ff05056e2", - "parent_sortition_id": "0xdaf479110cf859e58c56b6ae941f8a14e7c7992c57027183dfbda4a4b820897c", - "consensus_hash": "0x8d2c51db737597a93191f49bcdc9c7bb44b90892", - "was_sortition": true, - "miner_pk_hash160": "0x6bc51b33e9f3626944eb879147e18111581f8f9b", - "stacks_parent_ch": "0x697357c72da55b759b1d6b721676c92c69f0b490", - "last_sortition_ch": "0x697357c72da55b759b1d6b721676c92c69f0b490", - "committed_block_hash": "0xeea47d6d639c565027110e192e308fb11656183d5c077bcd718d830652800183" - }, - { - "burn_block_hash": "0x496ff02cb63a4850d0bdee5fab69284b6eb0392b4538e1c462f82362c5becfa4", - "burn_block_height": 230, - "burn_header_timestamp": 1726797570, - "sortition_id": "0xdaf479110cf859e58c56b6ae941f8a14e7c7992c57027183dfbda4a4b820897c", - "parent_sortition_id": "0xf9058692055cbd879d7f71e566e44b905a887b2b182407ed596b5d6499ceae2a", - "consensus_hash": "0x697357c72da55b759b1d6b721676c92c69f0b490", - "was_sortition": true, - "miner_pk_hash160": "0x6bc51b33e9f3626944eb879147e18111581f8f9b", - "stacks_parent_ch": "0xf7d1bd7d9d5c5a5c368402b6ef9510bd014d70f7", - "last_sortition_ch": "0xf7d1bd7d9d5c5a5c368402b6ef9510bd014d70f7", - "committed_block_hash": "0x36ee5f7f7271de1c1d4cd830e36320b51e01605547621267ae6e9b4e9b10f95e" - } -] +{ + "summary": "Latest and prior sortitions", + "value": [ + { + "burn_block_hash": "0x046f54cd1924a5d80fc3b8186d0334b7521acae90f9e136e2bee680c720d0e83", + "burn_block_height": 231, + "burn_header_timestamp": 1726797570, + "sortition_id": "0x8a5116b7b4306dc4f6db290d1adfff9e1347f3e921bb793fc4c33e2ff05056e2", + "parent_sortition_id": "0xdaf479110cf859e58c56b6ae941f8a14e7c7992c57027183dfbda4a4b820897c", + "consensus_hash": "0x8d2c51db737597a93191f49bcdc9c7bb44b90892", + "was_sortition": true, + "miner_pk_hash160": "0x6bc51b33e9f3626944eb879147e18111581f8f9b", + "stacks_parent_ch": "0x697357c72da55b759b1d6b721676c92c69f0b490", + "last_sortition_ch": "0x697357c72da55b759b1d6b721676c92c69f0b490", + "committed_block_hash": "0xeea47d6d639c565027110e192e308fb11656183d5c077bcd718d830652800183" + }, + { + "burn_block_hash": "0x496ff02cb63a4850d0bdee5fab69284b6eb0392b4538e1c462f82362c5becfa4", + "burn_block_height": 230, + "burn_header_timestamp": 1726797570, + "sortition_id": "0xdaf479110cf859e58c56b6ae941f8a14e7c7992c57027183dfbda4a4b820897c", + "parent_sortition_id": "0xf9058692055cbd879d7f71e566e44b905a887b2b182407ed596b5d6499ceae2a", + "consensus_hash": "0x697357c72da55b759b1d6b721676c92c69f0b490", + "was_sortition": true, + "miner_pk_hash160": "0x6bc51b33e9f3626944eb879147e18111581f8f9b", + "stacks_parent_ch": "0xf7d1bd7d9d5c5a5c368402b6ef9510bd014d70f7", + "last_sortition_ch": "0xf7d1bd7d9d5c5a5c368402b6ef9510bd014d70f7", + "committed_block_hash": "0x36ee5f7f7271de1c1d4cd830e36320b51e01605547621267ae6e9b4e9b10f95e" + } + ] +} diff --git a/docs/rpc/components/examples/get-sortitions.example.json b/docs/rpc/components/examples/get-sortitions.example.json index 7fcc0cff7b0..b4da666c2bd 100644 --- a/docs/rpc/components/examples/get-sortitions.example.json +++ b/docs/rpc/components/examples/get-sortitions.example.json @@ -1,16 +1,19 @@ -[ - { - "burn_block_hash": "0x00000000000000000002173857dc821186d17c6aee85e545a74625b6bc9c3656", - "burn_block_height": 902499, - "burn_header_timestamp": 1750747303, - "sortition_id": "0x7ae9066d4c3cf4a5c5f5f89d30bd012317be1c10f520af6b8f35d169c3a424ba", - "parent_sortition_id": "0x04d40e2ee2a9ee79c59c2e85b2f742c57bdeed5a2c32bb3bf659a77e892d8234", - "consensus_hash": "0xe4a00a6c88722c7812ba0a2f780c42247c1d2d4c", - "was_sortition": true, - "miner_pk_hash160": "0x37e79a837b4071a1fc6c1b49208e7d2141a25905", - "stacks_parent_ch": "0x7d3094294fabc1948d15fca4566ee2175a1e9808", - "last_sortition_ch": "0x7d3094294fabc1948d15fca4566ee2175a1e9808", - "committed_block_hash": "0xdeb48fe0b0600092968fb7de1b6d586b111be7cd61bf52a666d14d41d6835ded", - "vrf_seed": "0x49b75b824fcf765264d6ec91889a146bf52d46e2688f1b7ae7f7e5187765e99d" - } -] +{ + "summary": "Sortition information", + "value": [ + { + "burn_block_hash": "0x00000000000000000002173857dc821186d17c6aee85e545a74625b6bc9c3656", + "burn_block_height": 902499, + "burn_header_timestamp": 1750747303, + "sortition_id": "0x7ae9066d4c3cf4a5c5f5f89d30bd012317be1c10f520af6b8f35d169c3a424ba", + "parent_sortition_id": "0x04d40e2ee2a9ee79c59c2e85b2f742c57bdeed5a2c32bb3bf659a77e892d8234", + "consensus_hash": "0xe4a00a6c88722c7812ba0a2f780c42247c1d2d4c", + "was_sortition": true, + "miner_pk_hash160": "0x37e79a837b4071a1fc6c1b49208e7d2141a25905", + "stacks_parent_ch": "0x7d3094294fabc1948d15fca4566ee2175a1e9808", + "last_sortition_ch": "0x7d3094294fabc1948d15fca4566ee2175a1e9808", + "committed_block_hash": "0xdeb48fe0b0600092968fb7de1b6d586b111be7cd61bf52a666d14d41d6835ded", + "vrf_seed": "0x49b75b824fcf765264d6ec91889a146bf52d46e2688f1b7ae7f7e5187765e99d" + } + ] +} diff --git a/docs/rpc/components/examples/get-stacker-set-400.example.json b/docs/rpc/components/examples/get-stacker-set-400.example.json index 6650f7b7718..031e41b402f 100644 --- a/docs/rpc/components/examples/get-stacker-set-400.example.json +++ b/docs/rpc/components/examples/get-stacker-set-400.example.json @@ -1,5 +1,8 @@ { - "response": "error", - "err_type": "not_available_try_again", - "err_msg": "Could not read reward set. Prepare phase may not have started for this cycle yet. Cycle = 22, Err = PoXAnchorBlockRequired" + "summary": "Stacker set error response", + "value": { + "response": "error", + "err_type": "not_available_try_again", + "err_msg": "Could not read reward set. Prepare phase may not have started for this cycle yet. Cycle = 22, Err = PoXAnchorBlockRequired" + } } diff --git a/docs/rpc/components/examples/get-stacker-set.example.json b/docs/rpc/components/examples/get-stacker-set.example.json index 322fa4225fa..1392af0c148 100644 --- a/docs/rpc/components/examples/get-stacker-set.example.json +++ b/docs/rpc/components/examples/get-stacker-set.example.json @@ -1,26 +1,29 @@ { - "stacker_set": { - "rewarded_addresses": [ - { - "Standard": [ - { - "bytes": "dc5f18421006ee2b98ab972edfa7268a981e3f00", - "version": 26 - }, - "SerializeP2PKH" - ] - } - ], - "signers": [ - { - "signing_key": "02d0a27e4f1bf186b4391eecfcc4d4a0d403684ad089b477b8548a69dd6378bf26", - "weight": 1, - "stacked_amt": 2143020000000000 - } - ], - "start_cycle_state": { - "missed_reward_slots": [] - }, - "pox_ustx_threshold": 110000000000 - } + "summary": "Stacker set response", + "value": { + "stacker_set": { + "rewarded_addresses": [ + { + "Standard": [ + { + "bytes": "dc5f18421006ee2b98ab972edfa7268a981e3f00", + "version": 26 + }, + "SerializeP2PKH" + ] + } + ], + "signers": [ + { + "signing_key": "02d0a27e4f1bf186b4391eecfcc4d4a0d403684ad089b477b8548a69dd6378bf26", + "weight": 1, + "stacked_amt": 2143020000000000 + } + ], + "start_cycle_state": { + "missed_reward_slots": [] + }, + "pox_ustx_threshold": 110000000000 + } + } } diff --git a/docs/rpc/components/examples/get-tenure-info.example.json b/docs/rpc/components/examples/get-tenure-info.example.json index 052f5bc6148..ebbc9e1cefd 100644 --- a/docs/rpc/components/examples/get-tenure-info.example.json +++ b/docs/rpc/components/examples/get-tenure-info.example.json @@ -1,9 +1,12 @@ { - "consensus_hash": "4c5a49be0e34dc603b66f090fd07d28a2f76a2ad", - "parent_consensus_hash": "fa8a04af41957499afdd4082b9b702ffca9a4370", - "parent_tenure_start_block_id": "0cfec8433849d353ad6b2fe1173da143e3d4a3ab452588a14eb074d0181ac202", - "reward_cycle": 8, - "tenure_start_block_id": "0425099d51547c714df6a7864c040c1a605b198ff07f71d19a823139c88a35f8", - "tip_block_id": "52d64f5e47abc7666c4fed3fe850f381f93f2d588ee2a92a4e07b44f14588d5e", - "tip_height": 416 + "summary": "Tenure information", + "value": { + "consensus_hash": "4c5a49be0e34dc603b66f090fd07d28a2f76a2ad", + "parent_consensus_hash": "fa8a04af41957499afdd4082b9b702ffca9a4370", + "parent_tenure_start_block_id": "0cfec8433849d353ad6b2fe1173da143e3d4a3ab452588a14eb074d0181ac202", + "reward_cycle": 8, + "tenure_start_block_id": "0425099d51547c714df6a7864c040c1a605b198ff07f71d19a823139c88a35f8", + "tip_block_id": "52d64f5e47abc7666c4fed3fe850f381f93f2d588ee2a92a4e07b44f14588d5e", + "tip_height": 416 + } } diff --git a/docs/rpc/components/examples/get-tenure-tip.example.json b/docs/rpc/components/examples/get-tenure-tip.example.json index 453de454091..cbae17cdf7d 100644 --- a/docs/rpc/components/examples/get-tenure-tip.example.json +++ b/docs/rpc/components/examples/get-tenure-tip.example.json @@ -1,47 +1,50 @@ { - "Nakamoto": { - "version": 0, - "chain_length": 1827432, - "burn_spent": 417647583456, - "consensus_hash": "16707a8b6d73e69605f37eab9917d83806035de1", - "parent_block_id": "28abb89ad887807b74b7b1493080450d3a2af8f4799422b9191c83b0da50d046", - "tx_merkle_root": "2661ea27ab74956a517f0239044511575c99230f635f19747671604db83fc4d7", - "state_index_root": "dcf3d34ff3e599088c28ae45b781efa00a79eeae49972b5a526b46502092ca91", - "timestamp": 1750774427, - "miner_signature": "01ee6027b7388d8e1d543f0df5ed97c8a84898867c1f77405979bfeb70e6ed4b7579e9f134d9b99eba65bf6099b7e6631296cb629ac5520d679f63336dcff4d105", - "signer_signature": [ - "00fb29e01245c97dad8d42b599437b68932b85279dd316a5a0616373e41293a9cf7fe48962252245cc3de8fa8772c2b0b13e014b3a49504eaba333c5577a1b61e6", - "01d5148eb9512e695c32ab9ad08e5057df87e050bcd1fa8c14adb9ae46510663c072c869671a946add8006948d058d8ce8e8405cbe0a615e322a3c5754df61fab5", - "006078e054d9b53a12ac729718be42b073674c07fbd000d557fced6e6a4030339f141c95761e9d15ab9781a85819bce21885fc712e82b771284f5c04fb47a42c36", - "0007432cee54e945eace6b34dc7d55d8fbbefd22f0fbb89e133ecd9005fddefaaf2a8ad6a56d3ff8cb8e1d7db6dbf33e096d4e3b8ed03c4811e264f4686619053f", - "00c207d4709ae3dbd56fdfbb6e719a32332d183fa5bd8cd3dd290e0333d3dffcf115f4b5ca5bad338557601c975ea82f31787351f9ad375058fe5d8232b8b41fd5", - "01daea2a0f838407b2120d6a96c58daa2dbf65af27d4b46e43f467183a4ed46d67387f66acb64c6e9cd41520f006bed6dbd333b5153f501affe7d77b4951029c95", - "003ac14920d3c37669ec185feb4c18789030de1fdcc1d7cec50c8c525120d1266a2928c0d9b820501b61540e349fece714d5fccddc73eab74243bbe0d3d7c70550", - "005a60b091799388a6af8a61d9322323979d296678603500e1113d9fd42379a3a9041ea1bc396fbe47635356dfccaf804b95c42e67db2bdfbc6395a0a9244bdd43", - "0148442563da3fbec0b40b631f6f421091afb03b628b089500e2f9d11d9d1689680d61687fa01f7cce286e55068f600311dea652040693985efeeb4bd4942a0106", - "00094f3caf8a332788dba5e586fc366e1622340e335565b15521d0d6819eca1ffe588caa77d57fdc92fae4eb4800244e723bb845d4eafbc58a35f7ce6e4fb83497", - "007647c92930d4a9517884e3c2a8060315e0e63d011bbcf87f03c47e7b384689a605b3e4a52052e3c34f37987631dcc7ef3ca935f17737e6c0dcee416f2da9c94f", - "016f1ff69b141a0d4aec4c437db2a683c99430594d61cdb3e69f846b8021850bf86906fed631fc0954418a26002dfda3263a4955d2f8ea093a6d6de0008b22e219", - "00a1694159603297b076c90050d784724373bf75bcfaa24d03b68587a98a4ab97267ec95f8ded366e63792880e8f45aeb5b9c752759e080248563e5a035488e188", - "00dbd71a18855f323e6a9dc7a558d2469ea53c0ec7cae20e6e9eccad97c4bd93083a04d4ca3888575f4818037876902fbe79adfecafdee2046d16936f8f3044777", - "008a797e8322470a68a74f4e3d4562d4c3b8c41ab9a50e7a13056e708935c2cf6c03c90a882ba4cb6b720eb41c1f7ced8400b44330dcf245ef44a48e66d7589207", - "007cc0376eceb67c305aa4ca3c1ce90d78462223dbf30b6e5152e44dc827604e480082057df1bac7e2f7b44c10d5d0d26d0b300498eb4d2bad1076b53a55399b33", - "0188d81d2dd3a071a9e4d802ddccdf5469892e69cfa3419acda8405eceaed6eb6d368b16f324ed252ad6364d8027f227fc5946fc498adde55c8f2753c597b6d85f", - "00eb8bbc18b9c07a9f48607b1b04d61673b5db1fad81ffcdc2049bd7f75217369a66d47f2366af006931d0800cf90a048f6722d726403bc876024ec64b4fa04f77", - "00ce98a988c8de55cda5a424cab99cd51a63b426e28f7fd7b6d0c0048bf0a16c7078ef30044e708da87e9a61105c1560aef6f4ed2678602abdf7671795c5812e2b", - "01fa10444944f58aa58fed5f023ae083254b13b579b25f5cbf2c79692bda52da7e4cce4c34bb1105a8cb79e437a35ed71588d0275bb45e541cc534b4102858ffbc", - "00d4bc9429e665b872ff973cbad786d4d5bbac9a68e8d6f4c010ab047c6e67ca3f7a59370b5e141c819235fcf2231ef6b20b3abd6a65e17b8771fafe7b485c3dd7", - "002262beb4bb0c7002f6d94ed4529a98ce186037a7466e8890e8bda6963b8859cd0ecb70a5f03f9fc5ba91d1cf661c1a588882c857dfa9d9334f1ca5979b1d3dd4", - "01bcd2139b34bebce77298c067941255fa433394660dc61f9a8d1cdca0787e8709191fe86e4224a03b2ce36f2b7e15b8ecf79edc9ef46dfac27b1c6bed550b0f47", - "0125f2fe864f413570a5b671b368b161f0ca645433ecc0666c46435a0a5f0ef4123ddad0b013f194b68cb685ac91f2e4fc76b39f09cd7f2af97fc4170fc319b20c", - "00c2460dbde6bd6ee5d02ab58b4180736ec307e1971d9cd98d72b5e5cdd88c654374f6f3939d07076b9d7c51b73c72e946fad918a0654a206bb1ee6fad7baffb99", - "01d4eef757e133bc7caebe505cbdd9443e55827ca9f46981fab6a2b504b33543801d62784103a8ec986fd74f5b486f01790d83eb8294ee972bf79ee8233cf94486", - "018b182276517c5c086ed2908baa5e914946d60124ea2787330dc271f7dd9769de7537f6d93910446b732085aac70c4f3c8b7de68498fe350f115d7ad079f08bef", - "019b5d53ad14817d2723bb263a1df4892e0a381b4673c9c33dffaf07855d3ee4ea540cc1d9ab7e990da5d35e8ab6dffcbac965f0b2b17ec96ea8bcbe7e467297f8", - "0136c976917663b492b0838fad3db0592de1a6237140e5b3e16800569dcb76a85707c32134bcea23ff5b9be6ee9cd2b359f07741d83ed59de3196f49c4b4af2c60", - "008f0d59da1833e60fb30984710882ac6159faf12773aa982bf3482f9519d9dd003d1d3e843e76d48cca90aece2bb44fb504d0bcc9aae0d8fd003aeed53dc4d52c", - "01d77eaf449638d33c92f346c0464aef2a678458f96cd1a4cc1e8b53155b8952b16ff72e1bc942c29deaee40900f8b00ab3c6ba7f0e91700881edbf53ef095ae6b" - ], - "pox_treatment": "0e7d000001d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f" + "summary": "Tenure tip block header", + "value": { + "Nakamoto": { + "version": 0, + "chain_length": 1827432, + "burn_spent": 417647583456, + "consensus_hash": "16707a8b6d73e69605f37eab9917d83806035de1", + "parent_block_id": "28abb89ad887807b74b7b1493080450d3a2af8f4799422b9191c83b0da50d046", + "tx_merkle_root": "2661ea27ab74956a517f0239044511575c99230f635f19747671604db83fc4d7", + "state_index_root": "dcf3d34ff3e599088c28ae45b781efa00a79eeae49972b5a526b46502092ca91", + "timestamp": 1750774427, + "miner_signature": "01ee6027b7388d8e1d543f0df5ed97c8a84898867c1f77405979bfeb70e6ed4b7579e9f134d9b99eba65bf6099b7e6631296cb629ac5520d679f63336dcff4d105", + "signer_signature": [ + "00fb29e01245c97dad8d42b599437b68932b85279dd316a5a0616373e41293a9cf7fe48962252245cc3de8fa8772c2b0b13e014b3a49504eaba333c5577a1b61e6", + "01d5148eb9512e695c32ab9ad08e5057df87e050bcd1fa8c14adb9ae46510663c072c869671a946add8006948d058d8ce8e8405cbe0a615e322a3c5754df61fab5", + "006078e054d9b53a12ac729718be42b073674c07fbd000d557fced6e6a4030339f141c95761e9d15ab9781a85819bce21885fc712e82b771284f5c04fb47a42c36", + "0007432cee54e945eace6b34dc7d55d8fbbefd22f0fbb89e133ecd9005fddefaaf2a8ad6a56d3ff8cb8e1d7db6dbf33e096d4e3b8ed03c4811e264f4686619053f", + "00c207d4709ae3dbd56fdfbb6e719a32332d183fa5bd8cd3dd290e0333d3dffcf115f4b5ca5bad338557601c975ea82f31787351f9ad375058fe5d8232b8b41fd5", + "01daea2a0f838407b2120d6a96c58daa2dbf65af27d4b46e43f467183a4ed46d67387f66acb64c6e9cd41520f006bed6dbd333b5153f501affe7d77b4951029c95", + "003ac14920d3c37669ec185feb4c18789030de1fdcc1d7cec50c8c525120d1266a2928c0d9b820501b61540e349fece714d5fccddc73eab74243bbe0d3d7c70550", + "005a60b091799388a6af8a61d9322323979d296678603500e1113d9fd42379a3a9041ea1bc396fbe47635356dfccaf804b95c42e67db2bdfbc6395a0a9244bdd43", + "0148442563da3fbec0b40b631f6f421091afb03b628b089500e2f9d11d9d1689680d61687fa01f7cce286e55068f600311dea652040693985efeeb4bd4942a0106", + "00094f3caf8a332788dba5e586fc366e1622340e335565b15521d0d6819eca1ffe588caa77d57fdc92fae4eb4800244e723bb845d4eafbc58a35f7ce6e4fb83497", + "007647c92930d4a9517884e3c2a8060315e0e63d011bbcf87f03c47e7b384689a605b3e4a52052e3c34f37987631dcc7ef3ca935f17737e6c0dcee416f2da9c94f", + "016f1ff69b141a0d4aec4c437db2a683c99430594d61cdb3e69f846b8021850bf86906fed631fc0954418a26002dfda3263a4955d2f8ea093a6d6de0008b22e219", + "00a1694159603297b076c90050d784724373bf75bcfaa24d03b68587a98a4ab97267ec95f8ded366e63792880e8f45aeb5b9c752759e080248563e5a035488e188", + "00dbd71a18855f323e6a9dc7a558d2469ea53c0ec7cae20e6e9eccad97c4bd93083a04d4ca3888575f4818037876902fbe79adfecafdee2046d16936f8f3044777", + "008a797e8322470a68a74f4e3d4562d4c3b8c41ab9a50e7a13056e708935c2cf6c03c90a882ba4cb6b720eb41c1f7ced8400b44330dcf245ef44a48e66d7589207", + "007cc0376eceb67c305aa4ca3c1ce90d78462223dbf30b6e5152e44dc827604e480082057df1bac7e2f7b44c10d5d0d26d0b300498eb4d2bad1076b53a55399b33", + "0188d81d2dd3a071a9e4d802ddccdf5469892e69cfa3419acda8405eceaed6eb6d368b16f324ed252ad6364d8027f227fc5946fc498adde55c8f2753c597b6d85f", + "00eb8bbc18b9c07a9f48607b1b04d61673b5db1fad81ffcdc2049bd7f75217369a66d47f2366af006931d0800cf90a048f6722d726403bc876024ec64b4fa04f77", + "00ce98a988c8de55cda5a424cab99cd51a63b426e28f7fd7b6d0c0048bf0a16c7078ef30044e708da87e9a61105c1560aef6f4ed2678602abdf7671795c5812e2b", + "01fa10444944f58aa58fed5f023ae083254b13b579b25f5cbf2c79692bda52da7e4cce4c34bb1105a8cb79e437a35ed71588d0275bb45e541cc534b4102858ffbc", + "00d4bc9429e665b872ff973cbad786d4d5bbac9a68e8d6f4c010ab047c6e67ca3f7a59370b5e141c819235fcf2231ef6b20b3abd6a65e17b8771fafe7b485c3dd7", + "002262beb4bb0c7002f6d94ed4529a98ce186037a7466e8890e8bda6963b8859cd0ecb70a5f03f9fc5ba91d1cf661c1a588882c857dfa9d9334f1ca5979b1d3dd4", + "01bcd2139b34bebce77298c067941255fa433394660dc61f9a8d1cdca0787e8709191fe86e4224a03b2ce36f2b7e15b8ecf79edc9ef46dfac27b1c6bed550b0f47", + "0125f2fe864f413570a5b671b368b161f0ca645433ecc0666c46435a0a5f0ef4123ddad0b013f194b68cb685ac91f2e4fc76b39f09cd7f2af97fc4170fc319b20c", + "00c2460dbde6bd6ee5d02ab58b4180736ec307e1971d9cd98d72b5e5cdd88c654374f6f3939d07076b9d7c51b73c72e946fad918a0654a206bb1ee6fad7baffb99", + "01d4eef757e133bc7caebe505cbdd9443e55827ca9f46981fab6a2b504b33543801d62784103a8ec986fd74f5b486f01790d83eb8294ee972bf79ee8233cf94486", + "018b182276517c5c086ed2908baa5e914946d60124ea2787330dc271f7dd9769de7537f6d93910446b732085aac70c4f3c8b7de68498fe350f115d7ad079f08bef", + "019b5d53ad14817d2723bb263a1df4892e0a381b4673c9c33dffaf07855d3ee4ea540cc1d9ab7e990da5d35e8ab6dffcbac965f0b2b17ec96ea8bcbe7e467297f8", + "0136c976917663b492b0838fad3db0592de1a6237140e5b3e16800569dcb76a85707c32134bcea23ff5b9be6ee9cd2b359f07741d83ed59de3196f49c4b4af2c60", + "008f0d59da1833e60fb30984710882ac6159faf12773aa982bf3482f9519d9dd003d1d3e843e76d48cca90aece2bb44fb504d0bcc9aae0d8fd003aeed53dc4d52c", + "01d77eaf449638d33c92f346c0464aef2a678458f96cd1a4cc1e8b53155b8952b16ff72e1bc942c29deaee40900f8b00ab3c6ba7f0e91700881edbf53ef095ae6b" + ], + "pox_treatment": "0e7d000001d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f" + } } } diff --git a/docs/rpc/components/examples/get-transaction.example.json b/docs/rpc/components/examples/get-transaction.example.json index 7520a8f9a74..a69bf367290 100644 --- a/docs/rpc/components/examples/get-transaction.example.json +++ b/docs/rpc/components/examples/get-transaction.example.json @@ -1,5 +1,8 @@ { - "index_block_hash": "e0b6c25b1dac0c0e1c75e41ab46bd6d70d9a2d02ffed8f2c0733b6e686289c38", - "result": "(ok true)", - "tx": "808000000004008bc5147525b8f477f0bc4522a88c8339b2494db5000000000000001a0000000000000000010123eab800bc9f639c5aa05d154148a981c89fd21064a6f8cafd8649800a56c9ea77e2e46bed8bd9ef0f173b19b20d6c43e2a9f37b078df5c74b9e6f9be75b650e01020000000007588687edeb02248d402c316ed33e22ea0e73af8703ce5011f3e25f5ce12f00f903ca504742117ee0588687edeb02248d402c316ed33e22ea0e73af87c54e0d94e4dd298cf19778352906a2fcf0af74582b07dfb57c710288874f71ca00000001006bc51b33e9f3626944eb879147e18111581f8f9b" + "summary": "Transaction information", + "value": { + "index_block_hash": "e0b6c25b1dac0c0e1c75e41ab46bd6d70d9a2d02ffed8f2c0733b6e686289c38", + "result": "(ok true)", + "tx": "808000000004008bc5147525b8f477f0bc4522a88c8339b2494db5000000000000001a0000000000000000010123eab800bc9f639c5aa05d154148a981c89fd21064a6f8cafd8649800a56c9ea77e2e46bed8bd9ef0f173b19b20d6c43e2a9f37b078df5c74b9e6f9be75b650e01020000000007588687edeb02248d402c316ed33e22ea0e73af8703ce5011f3e25f5ce12f00f903ca504742117ee0588687edeb02248d402c316ed33e22ea0e73af87c54e0d94e4dd298cf19778352906a2fcf0af74582b07dfb57c710288874f71ca00000001006bc51b33e9f3626944eb879147e18111581f8f9b" + } } diff --git a/docs/rpc/components/examples/is-trait-implemented.example.json b/docs/rpc/components/examples/is-trait-implemented.example.json index b5b6fb7cd97..dad3f9d5a76 100644 --- a/docs/rpc/components/examples/is-trait-implemented.example.json +++ b/docs/rpc/components/examples/is-trait-implemented.example.json @@ -1,3 +1,6 @@ { - "is_implemented": true + "summary": "Trait implementation check", + "value": { + "is_implemented": true + } } diff --git a/docs/rpc/components/examples/network-peers.example.json b/docs/rpc/components/examples/network-peers.example.json index b258fdf48f3..d3f7056178c 100644 --- a/docs/rpc/components/examples/network-peers.example.json +++ b/docs/rpc/components/examples/network-peers.example.json @@ -1,54 +1,57 @@ { - "bootstrap": [ - { - "network_id": 1, - "peer_version": 24000000, - "ip": "172.20.0.3", - "port": 20444, - "public_key_hash": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2", - "authenticated": true, - "stackerdbs": [ - "SP000000000000000000002Q6VF78.my-stacker-db-1" - ], - "age": null - } - ], - "sample": [ - { - "network_id": 1, - "peer_version": 24000000, - "ip": "88.99.100.123", - "port": 20444, - "public_key_hash": "b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3", - "authenticated": true, - "stackerdbs": [], - "age": null - } - ], - "inbound": [ - { - "network_id": 1, - "peer_version": 24000000, - "ip": "192.168.1.10", - "port": 54321, - "public_key_hash": "c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", - "authenticated": true, - "stackerdbs": [], - "age": 3600 - } - ], - "outbound": [ - { - "network_id": 1, - "peer_version": 24000000, - "ip": "10.0.0.5", - "port": 20444, - "public_key_hash": "d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5", - "authenticated": true, - "stackerdbs": [ - "SP000000000000000000002Q6VF78.my-stacker-db-2" - ], - "age": 120 - } - ] + "summary": "Network peer list", + "value": { + "bootstrap": [ + { + "network_id": 1, + "peer_version": 24000000, + "ip": "172.20.0.3", + "port": 20444, + "public_key_hash": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2", + "authenticated": true, + "stackerdbs": [ + "SP000000000000000000002Q6VF78.my-stacker-db-1" + ], + "age": null + } + ], + "sample": [ + { + "network_id": 1, + "peer_version": 24000000, + "ip": "88.99.100.123", + "port": 20444, + "public_key_hash": "b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3", + "authenticated": true, + "stackerdbs": [], + "age": null + } + ], + "inbound": [ + { + "network_id": 1, + "peer_version": 24000000, + "ip": "192.168.1.10", + "port": 54321, + "public_key_hash": "c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", + "authenticated": true, + "stackerdbs": [], + "age": 3600 + } + ], + "outbound": [ + { + "network_id": 1, + "peer_version": 24000000, + "ip": "10.0.0.5", + "port": 20444, + "public_key_hash": "d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5", + "authenticated": true, + "stackerdbs": [ + "SP000000000000000000002Q6VF78.my-stacker-db-2" + ], + "age": 120 + } + ] + } } diff --git a/docs/rpc/components/examples/node-health.example.json b/docs/rpc/components/examples/node-health.example.json index 285f5eb9ff0..9651f20a67b 100644 --- a/docs/rpc/components/examples/node-health.example.json +++ b/docs/rpc/components/examples/node-health.example.json @@ -1,6 +1,9 @@ { - "difference_from_max_peer": 0, - "node_stacks_tip_height": 12345, - "max_stacks_height_of_neighbors": 12345, - "max_stacks_neighbor_address": "127.0.0.1:8080" + "summary": "Node health status", + "value": { + "difference_from_max_peer": 0, + "node_stacks_tip_height": 12345, + "max_stacks_height_of_neighbors": 12345, + "max_stacks_neighbor_address": "127.0.0.1:8080" + } } diff --git a/docs/rpc/components/examples/node-info.example.json b/docs/rpc/components/examples/node-info.example.json index fa8ae8dd747..004050f8688 100644 --- a/docs/rpc/components/examples/node-info.example.json +++ b/docs/rpc/components/examples/node-info.example.json @@ -1,25 +1,28 @@ { - "peer_version": 385875968, - "pox_consensus": "17f76e597bab45646956f38dd39573085d72cbc0", - "burn_block_height": 16, - "stable_pox_consensus": "8e0561978fc5506b68a589c402dad97e862edb59", - "stable_burn_block_height": 15, - "server_version": "stacks-node 3.1.0.0.12 (release/3.1.0.0.12:ae969ca+, release build, linux [x86_64])", - "network_id": 1, - "parent_network_id": 3652501241, - "stacks_tip_height": 1832097, - "stacks_tip": "b1807a2d3f7f8c7922f7c1d60d7c34145ade05d789640dc7dc9ec1021e07bb54", - "stacks_tip_consensus_hash": "17f76e597bab45646956f38dd39573085d72cbc0", - "genesis_chainstate_hash": "74237aa39aa50a83de11a4f3e9a0b9c89a0b1a2f2a6a11b8a7e1e9a0b1c2d3e4f", - "unanchored_tip": "0000000000000000000000000000000000000000000000000000000000000000", - "tenure_height": 523, - "exit_at_block_height": null, - "is_fully_synced": false, - "node_public_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01", - "node_public_key_hash": "1328af7c4f96eee8fdbb1e023e48ba11e255d1c8", - "last_pox_anchor": { - "anchor_block_hash": "47c20352492e1647127d6f6275fa5abfe90157f6a64e6a175ff45ed0c1fb3f4e", - "anchor_block_txid": "5b5d678c658525122fa73a8699b5810325ce9412bf0dc3762fb7518699be3d4d" - }, - "stackerdbs": [] + "summary": "Node information response", + "value": { + "peer_version": 385875968, + "pox_consensus": "17f76e597bab45646956f38dd39573085d72cbc0", + "burn_block_height": 16, + "stable_pox_consensus": "8e0561978fc5506b68a589c402dad97e862edb59", + "stable_burn_block_height": 15, + "server_version": "stacks-node 3.1.0.0.12 (release/3.1.0.0.12:ae969ca+, release build, linux [x86_64])", + "network_id": 1, + "parent_network_id": 3652501241, + "stacks_tip_height": 1832097, + "stacks_tip": "b1807a2d3f7f8c7922f7c1d60d7c34145ade05d789640dc7dc9ec1021e07bb54", + "stacks_tip_consensus_hash": "17f76e597bab45646956f38dd39573085d72cbc0", + "genesis_chainstate_hash": "74237aa39aa50a83de11a4f3e9a0b9c89a0b1a2f2a6a11b8a7e1e9a0b1c2d3e4f", + "unanchored_tip": "0000000000000000000000000000000000000000000000000000000000000000", + "tenure_height": 523, + "exit_at_block_height": null, + "is_fully_synced": false, + "node_public_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01", + "node_public_key_hash": "1328af7c4f96eee8fdbb1e023e48ba11e255d1c8", + "last_pox_anchor": { + "anchor_block_hash": "47c20352492e1647127d6f6275fa5abfe90157f6a64e6a175ff45ed0c1fb3f4e", + "anchor_block_txid": "5b5d678c658525122fa73a8699b5810325ce9412bf0dc3762fb7518699be3d4d" + }, + "stackerdbs": [] + } } diff --git a/docs/rpc/components/examples/post-block-proposal-request.example.json b/docs/rpc/components/examples/post-block-proposal-request.example.json index d32f2b6e53a..bf011ac96fd 100644 --- a/docs/rpc/components/examples/post-block-proposal-request.example.json +++ b/docs/rpc/components/examples/post-block-proposal-request.example.json @@ -1,4 +1,7 @@ { - "block": "00000000000000001f00000000000927c08fb5ae5bf80e39e4168f6a3fddb0407a069d21ee68465e6856393254d2a66194f44bb01070666d5effcfb2436e209a75878fe80a04b4258a8cd34ab97c38a8dde331a2a509dd7e4b90590726866172cc138c18e80567737667f55d3f9817ce4714c91d1adfd36101141829dc0b5ea0c4944668c0005ddb6f9e2718f60014f21932a42a36ffaf58e88e77b217b2af366c15dd59e6b136ca773729832dcfc5875ec0830d04012dd5a4fa77a196646ea2b356289116fd02558c034b62d63f8a65bdd20d7ffc3fec6c266cd974be776a9e92759b90f288dcc2525b6b6bd5622c5f02e0922440e9ad1095c19b4467fd94566caa9755669d8e0000000180800000000400f64081ae6209dce9245753a4f764d6f168aae1af00000000000000000000000000000064000041dbcc7391991c1a18371eb49b879240247a3ec7f281328f53976c1218ffd65421dbb101e59370e2c972b29f48dc674b2de5e1b65acbd41d5d2689124d42c16c01010000000000051a346048df62be3a52bb6236e11394e8600229e27b000000000000271000000000000000000000000000000000000000000000000000000000000000000000", - "chain_id": 2147483648 + "summary": "Block proposal request", + "value": { + "block": "00000000000000001f00000000000927c08fb5ae5bf80e39e4168f6a3fddb0407a069d21ee68465e6856393254d2a66194f44bb01070666d5effcfb2436e209a75878fe80a04b4258a8cd34ab97c38a8dde331a2a509dd7e4b90590726866172cc138c18e80567737667f55d3f9817ce4714c91d1adfd36101141829dc0b5ea0c4944668c0005ddb6f9e2718f60014f21932a42a36ffaf58e88e77b217b2af366c15dd59e6b136ca773729832dcfc5875ec0830d04012dd5a4fa77a196646ea2b356289116fd02558c034b62d63f8a65bdd20d7ffc3fec6c266cd974be776a9e92759b90f288dcc2525b6b6bd5622c5f02e0922440e9ad1095c19b4467fd94566caa9755669d8e0000000180800000000400f64081ae6209dce9245753a4f764d6f168aae1af00000000000000000000000000000064000041dbcc7391991c1a18371eb49b879240247a3ec7f281328f53976c1218ffd65421dbb101e59370e2c972b29f48dc674b2de5e1b65acbd41d5d2689124d42c16c01010000000000051a346048df62be3a52bb6236e11394e8600229e27b000000000000271000000000000000000000000000000000000000000000000000000000000000000000", + "chain_id": 2147483648 + } } diff --git a/docs/rpc/components/examples/post-block-proposal-response.429.example.json b/docs/rpc/components/examples/post-block-proposal-response.429.example.json index f6e5b850704..1df6903c9cb 100644 --- a/docs/rpc/components/examples/post-block-proposal-response.429.example.json +++ b/docs/rpc/components/examples/post-block-proposal-response.429.example.json @@ -1,4 +1,7 @@ { - "message": "Could not process block proposal request: Proposal currently being evaluated", - "result": "Error" + "summary": "Block proposal rate limit error", + "value": { + "message": "Could not process block proposal request: Proposal currently being evaluated", + "result": "Error" + } } diff --git a/docs/rpc/components/examples/post-block-proposal-response.example.json b/docs/rpc/components/examples/post-block-proposal-response.example.json index d74c45eb51d..6899d0e0dab 100644 --- a/docs/rpc/components/examples/post-block-proposal-response.example.json +++ b/docs/rpc/components/examples/post-block-proposal-response.example.json @@ -1,4 +1,7 @@ { - "message": "Block proposal is processing, result will be returned via the event observer", - "result": "Accepted" + "summary": "Block proposal accepted response", + "value": { + "message": "Block proposal is processing, result will be returned via the event observer", + "result": "Accepted" + } } diff --git a/docs/rpc/components/examples/pox-info.example.json b/docs/rpc/components/examples/pox-info.example.json index 1659052c829..cc33aec7797 100644 --- a/docs/rpc/components/examples/pox-info.example.json +++ b/docs/rpc/components/examples/pox-info.example.json @@ -1,74 +1,78 @@ { - "contract_id": "SP000000000000000000002Q6VF78.pox", - "pox_activation_threshold_ustx": 52329761604388, - "first_burnchain_block_height": 666050, - "current_burnchain_block_height": 812345, - "prepare_phase_block_length": 100, - "reward_phase_block_length": 2000, - "reward_slots": 4000, - "rejection_fraction": 25, - "total_liquid_supply_ustx": 1046595232087772, - "current_cycle": { - "id": 2, - "min_threshold_ustx": 70000000000, - "stacked_ustx": 202157971547640, - "is_pox_active": true - }, - "next_cycle": { - "id": 3, - "min_threshold_ustx": 70000000000, - "min_increment_ustx": 52329761604, - "stacked_ustx": 162057034977640, - "prepare_phase_start_block_height": 672250, - "blocks_until_prepare_phase": 407, - "reward_phase_start_block_height": 672350, - "blocks_until_reward_phase": 507, - "ustx_until_pox_rejection": 261648808021925 - }, - "min_amount_ustx": 70000000000, - "prepare_cycle_length": 100, - "reward_cycle_id": 2, - "reward_cycle_length": 2100, - "rejection_votes_left_required": 261648808021925, - "next_reward_cycle_in": 507, - "contract_versions": [ - { - "contract_id": "SP000000000000000000002Q6VF78.pox", - "activation_burnchain_block_height": 666050, - "first_reward_cycle_id": 0 - }, - { - "contract_id": "SP000000000000000000002Q6VF78.pox-2", - "activation_burnchain_block_height": 712345, - "first_reward_cycle_id": 123 + "summary": "PoX information response", + "value": { + "contract_id": "SP000000000000000000002Q6VF78.pox", + "current_epoch": "Epoch30", + "pox_activation_threshold_ustx": 52329761604388, + "first_burnchain_block_height": 666050, + "current_burnchain_block_height": 812345, + "prepare_phase_block_length": 100, + "reward_phase_block_length": 2000, + "reward_slots": 4000, + "rejection_fraction": 25, + "total_liquid_supply_ustx": 1046595232087772, + "current_cycle": { + "id": 2, + "min_threshold_ustx": 70000000000, + "stacked_ustx": 202157971547640, + "is_pox_active": true + }, + "next_cycle": { + "id": 3, + "min_threshold_ustx": 70000000000, + "min_increment_ustx": 52329761604, + "stacked_ustx": 162057034977640, + "prepare_phase_start_block_height": 672250, + "blocks_until_prepare_phase": 407, + "reward_phase_start_block_height": 672350, + "blocks_until_reward_phase": 507, + "ustx_until_pox_rejection": 261648808021925 + }, + "min_amount_ustx": 70000000000, + "prepare_cycle_length": 100, + "reward_cycle_id": 2, + "reward_cycle_length": 2100, + "rejection_votes_left_required": 261648808021925, + "next_reward_cycle_in": 507, + "contract_versions": [ + { + "contract_id": "SP000000000000000000002Q6VF78.pox", + "activation_burnchain_block_height": 666050, + "first_reward_cycle_id": 0 + }, + { + "contract_id": "SP000000000000000000002Q6VF78.pox-2", + "activation_burnchain_block_height": 712345, + "first_reward_cycle_id": 123 + } + ], + "epochs": [ + { + "epoch_id": "Epoch0", + "start_height": 0, + "end_height": 200000, + "block_limit": { + "read_count": 15000, + "read_length": 100000000, + "write_count": 15000, + "write_length": 15000000, + "runtime": 5000000000 + }, + "network_epoch": 0 + }, + { + "epoch_id": "Epoch1", + "start_height": 200000, + "end_height": 300000, + "block_limit": { + "read_count": 15000, + "read_length": 100000000, + "write_count": 15000, + "write_length": 15000000, + "runtime": 5000000000 + }, + "network_epoch": 1 + } + ] } - ], - "epochs": [ - { - "epoch_id": "Epoch0", - "start_height": 0, - "end_height": 200000, - "block_limit": { - "read_count": 15000, - "read_length": 100000000, - "write_count": 15000, - "write_length": 15000000, - "runtime": 5000000000 - }, - "network_epoch": 0 - }, - { - "epoch_id": "Epoch1", - "start_height": 200000, - "end_height": 300000, - "block_limit": { - "read_count": 15000, - "read_length": 100000000, - "write_count": 15000, - "write_length": 15000000, - "runtime": 5000000000 - }, - "network_epoch": 1 - } - ] } diff --git a/docs/rpc/components/examples/read-only-function-failure.example.json b/docs/rpc/components/examples/read-only-function-failure.example.json index 43f998d0afe..70f4bb863d9 100644 --- a/docs/rpc/components/examples/read-only-function-failure.example.json +++ b/docs/rpc/components/examples/read-only-function-failure.example.json @@ -1,4 +1,7 @@ { - "okay": false, - "cause": "NotReadOnly" + "summary": "Read-only function failure response", + "value": { + "okay": false, + "cause": "NotReadOnly" + } } diff --git a/docs/rpc/components/examples/read-only-function-success.example.json b/docs/rpc/components/examples/read-only-function-success.example.json index 0aef730e372..c1f1a8fc75c 100644 --- a/docs/rpc/components/examples/read-only-function-success.example.json +++ b/docs/rpc/components/examples/read-only-function-success.example.json @@ -1,4 +1,7 @@ { - "okay": true, - "result": "0x0100000000000000000000000000000001" + "summary": "Read-only function success response", + "value": { + "okay": true, + "result": "0x0100000000000000000000000000000001" + } } diff --git a/docs/rpc/components/examples/stackerdb-chunk-ack-failure.example.json b/docs/rpc/components/examples/stackerdb-chunk-ack-failure.example.json index 5d6e97ed30f..29522f23e5e 100644 --- a/docs/rpc/components/examples/stackerdb-chunk-ack-failure.example.json +++ b/docs/rpc/components/examples/stackerdb-chunk-ack-failure.example.json @@ -1,11 +1,14 @@ { - "accepted": false, - "reason": "{\"code\": 1, \"message\": \"NoSuchSlot\", \"reason\": \"No such StackerDB slot\"}", - "metadata": { - "slot_id": 1, - "slot_version": 1, - "data_hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", - "signature": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01" - }, - "code": 1 + "summary": "StackerDB chunk acknowledgment failure", + "value": { + "accepted": false, + "reason": "{\"code\": 1, \"message\": \"NoSuchSlot\", \"reason\": \"No such StackerDB slot\"}", + "metadata": { + "slot_id": 1, + "slot_version": 1, + "data_hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "signature": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01" + }, + "code": 1 + } } diff --git a/docs/rpc/components/examples/stackerdb-chunk-ack-success.example.json b/docs/rpc/components/examples/stackerdb-chunk-ack-success.example.json index b63934f64b0..a580b1062d7 100644 --- a/docs/rpc/components/examples/stackerdb-chunk-ack-success.example.json +++ b/docs/rpc/components/examples/stackerdb-chunk-ack-success.example.json @@ -1,11 +1,14 @@ { - "accepted": true, - "reason": null, - "metadata": { - "slot_id": 1, - "slot_version": 2, - "data_hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", - "signature": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01" - }, - "code": null + "summary": "StackerDB chunk acknowledgment success", + "value": { + "accepted": true, + "reason": null, + "metadata": { + "slot_id": 1, + "slot_version": 2, + "data_hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "signature": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01" + }, + "code": null + } } diff --git a/docs/rpc/components/examples/stackerdb-chunk-data-request.example.json b/docs/rpc/components/examples/stackerdb-chunk-data-request.example.json index b5de8f43b1c..aa97578d7a0 100644 --- a/docs/rpc/components/examples/stackerdb-chunk-data-request.example.json +++ b/docs/rpc/components/examples/stackerdb-chunk-data-request.example.json @@ -1,6 +1,9 @@ { - "slot_id": 1, - "slot_version": 2, - "sig": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01", - "data": "deadbeefcafebabe" + "summary": "StackerDB chunk data request", + "value": { + "slot_id": 1, + "slot_version": 2, + "sig": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01", + "data": "deadbeefcafebabe" + } } diff --git a/docs/rpc/components/examples/tenure-blocks.example.json b/docs/rpc/components/examples/tenure-blocks.example.json index 73b3a5f3841..5431a8f457d 100644 --- a/docs/rpc/components/examples/tenure-blocks.example.json +++ b/docs/rpc/components/examples/tenure-blocks.example.json @@ -1,77 +1,80 @@ { - "burn_block_hash": "dff0aba3d65209225e365692ac46d26fa64ca9760bd7c244fc27e2022f7cb90d", - "burn_block_height": 51, - "consensus_hash": "90b360130732dd83a165a7fa34386ae547512300", - "stacks_blocks": [ - { - "block_hash": "a9f3d8bca7d766a2022528e27c52f39ba77192f0712ea5515cc9d06b97821a11", - "block_id": "67c795896b4c2940b3eb759871661a72e78458ba591dc63979d689d23695891f", - "header_type": "nakamoto", - "height": 116, - "parent_block_id": "fb7102c45bb2f07a6dd86b6672cb39133861fc7d38087e82cb04d4faccfcab82" - }, - { - "block_hash": "3e81505acaa3d386e15256921dd1193e479fd9d7f81d993b1c2b327b9bfb05cc", - "block_id": "fb7102c45bb2f07a6dd86b6672cb39133861fc7d38087e82cb04d4faccfcab82", - "header_type": "nakamoto", - "height": 115, - "parent_block_id": "5d51f815bc71508768b71258d8bc2adc68c129428101a418083f5b5ab30d525e" - }, - { - "block_hash": "c6f427503dcbe8bf187c7ce523c7a239328b2ab4ec87d6013895b2bd9ed23604", - "block_id": "5d51f815bc71508768b71258d8bc2adc68c129428101a418083f5b5ab30d525e", - "header_type": "nakamoto", - "height": 114, - "parent_block_id": "7d1c89f57a467f888fed171a5b3a2e51a7652f862189710df7db814ef84a29e2" - }, - { - "block_hash": "f0665d1dd419e949d68c4e85b7f79e078d6c36d929820b9cd9c794a60c0505b4", - "block_id": "7d1c89f57a467f888fed171a5b3a2e51a7652f862189710df7db814ef84a29e2", - "header_type": "nakamoto", - "height": 113, - "parent_block_id": "b65ab3b6d113285390c1d99c09a62d940f5b55c1cbc10bdc1b478c395fc435f9" - }, - { - "block_hash": "0486701e4eed06b74c3d93b82ffc0f3700b3cb2bea41aea1a30e00a5669ec0b7", - "block_id": "b65ab3b6d113285390c1d99c09a62d940f5b55c1cbc10bdc1b478c395fc435f9", - "header_type": "nakamoto", - "height": 112, - "parent_block_id": "c711415e6eedffcb6be16e33eb5c5cf62c3f51047f9528a51e21cbd83b25c185" - }, - { - "block_hash": "6724170340a2e507dbe7b21b691412e196c7c8900a597786aa991c1429ae6b58", - "block_id": "c711415e6eedffcb6be16e33eb5c5cf62c3f51047f9528a51e21cbd83b25c185", - "header_type": "nakamoto", - "height": 111, - "parent_block_id": "b11d631ef1b052942973cac88527a56f6e00c51fd57f9b7a710713f58ddc2393" - }, - { - "block_hash": "2114066e4446242e558847f552ca839f65ae769ab59000087677007e52b0dab7", - "block_id": "b11d631ef1b052942973cac88527a56f6e00c51fd57f9b7a710713f58ddc2393", - "header_type": "nakamoto", - "height": 110, - "parent_block_id": "2ef1973e95ba622479e59e87251d35c1eaaa9cb7f99f3dd3a8a79359624c38eb" - }, - { - "block_hash": "2345d34722cb07e908c5dab7f89ec0756f34d7fe34c86e40881c29c6aa202601", - "block_id": "2ef1973e95ba622479e59e87251d35c1eaaa9cb7f99f3dd3a8a79359624c38eb", - "header_type": "nakamoto", - "height": 109, - "parent_block_id": "9c1f844267819dc7349ff0aff6e6c6f60d8c41b531e304cd89df022ca4d147bf" - }, - { - "block_hash": "6b904297fdd045e2d18b93083f9d36592fa6915a53e8461fc3b4c59f6c91bc6d", - "block_id": "9c1f844267819dc7349ff0aff6e6c6f60d8c41b531e304cd89df022ca4d147bf", - "header_type": "nakamoto", - "height": 108, - "parent_block_id": "335596dd153bfc155863a2d439940816cd5095a3b36e2738fb89d715c28ac6c5" - }, - { - "block_hash": "cd748c67a9b7e685c52f388cc1d5e334b3dbe2509535caaf9f7ea7b6e5bbad77", - "block_id": "335596dd153bfc155863a2d439940816cd5095a3b36e2738fb89d715c28ac6c5", - "header_type": "nakamoto", - "height": 107, - "parent_block_id": "45cb658a80897117c2cfa6191a7623344ed1079117ad8bb30113019278bac028" - } - ] -} \ No newline at end of file + "summary": "List of blocks in a tenure", + "value": { + "burn_block_hash": "dff0aba3d65209225e365692ac46d26fa64ca9760bd7c244fc27e2022f7cb90d", + "burn_block_height": 51, + "consensus_hash": "90b360130732dd83a165a7fa34386ae547512300", + "stacks_blocks": [ + { + "block_hash": "a9f3d8bca7d766a2022528e27c52f39ba77192f0712ea5515cc9d06b97821a11", + "block_id": "67c795896b4c2940b3eb759871661a72e78458ba591dc63979d689d23695891f", + "header_type": "nakamoto", + "height": 116, + "parent_block_id": "fb7102c45bb2f07a6dd86b6672cb39133861fc7d38087e82cb04d4faccfcab82" + }, + { + "block_hash": "3e81505acaa3d386e15256921dd1193e479fd9d7f81d993b1c2b327b9bfb05cc", + "block_id": "fb7102c45bb2f07a6dd86b6672cb39133861fc7d38087e82cb04d4faccfcab82", + "header_type": "nakamoto", + "height": 115, + "parent_block_id": "5d51f815bc71508768b71258d8bc2adc68c129428101a418083f5b5ab30d525e" + }, + { + "block_hash": "c6f427503dcbe8bf187c7ce523c7a239328b2ab4ec87d6013895b2bd9ed23604", + "block_id": "5d51f815bc71508768b71258d8bc2adc68c129428101a418083f5b5ab30d525e", + "header_type": "nakamoto", + "height": 114, + "parent_block_id": "7d1c89f57a467f888fed171a5b3a2e51a7652f862189710df7db814ef84a29e2" + }, + { + "block_hash": "f0665d1dd419e949d68c4e85b7f79e078d6c36d929820b9cd9c794a60c0505b4", + "block_id": "7d1c89f57a467f888fed171a5b3a2e51a7652f862189710df7db814ef84a29e2", + "header_type": "nakamoto", + "height": 113, + "parent_block_id": "b65ab3b6d113285390c1d99c09a62d940f5b55c1cbc10bdc1b478c395fc435f9" + }, + { + "block_hash": "0486701e4eed06b74c3d93b82ffc0f3700b3cb2bea41aea1a30e00a5669ec0b7", + "block_id": "b65ab3b6d113285390c1d99c09a62d940f5b55c1cbc10bdc1b478c395fc435f9", + "header_type": "nakamoto", + "height": 112, + "parent_block_id": "c711415e6eedffcb6be16e33eb5c5cf62c3f51047f9528a51e21cbd83b25c185" + }, + { + "block_hash": "6724170340a2e507dbe7b21b691412e196c7c8900a597786aa991c1429ae6b58", + "block_id": "c711415e6eedffcb6be16e33eb5c5cf62c3f51047f9528a51e21cbd83b25c185", + "header_type": "nakamoto", + "height": 111, + "parent_block_id": "b11d631ef1b052942973cac88527a56f6e00c51fd57f9b7a710713f58ddc2393" + }, + { + "block_hash": "2114066e4446242e558847f552ca839f65ae769ab59000087677007e52b0dab7", + "block_id": "b11d631ef1b052942973cac88527a56f6e00c51fd57f9b7a710713f58ddc2393", + "header_type": "nakamoto", + "height": 110, + "parent_block_id": "2ef1973e95ba622479e59e87251d35c1eaaa9cb7f99f3dd3a8a79359624c38eb" + }, + { + "block_hash": "2345d34722cb07e908c5dab7f89ec0756f34d7fe34c86e40881c29c6aa202601", + "block_id": "2ef1973e95ba622479e59e87251d35c1eaaa9cb7f99f3dd3a8a79359624c38eb", + "header_type": "nakamoto", + "height": 109, + "parent_block_id": "9c1f844267819dc7349ff0aff6e6c6f60d8c41b531e304cd89df022ca4d147bf" + }, + { + "block_hash": "6b904297fdd045e2d18b93083f9d36592fa6915a53e8461fc3b4c59f6c91bc6d", + "block_id": "9c1f844267819dc7349ff0aff6e6c6f60d8c41b531e304cd89df022ca4d147bf", + "header_type": "nakamoto", + "height": 108, + "parent_block_id": "335596dd153bfc155863a2d439940816cd5095a3b36e2738fb89d715c28ac6c5" + }, + { + "block_hash": "cd748c67a9b7e685c52f388cc1d5e334b3dbe2509535caaf9f7ea7b6e5bbad77", + "block_id": "335596dd153bfc155863a2d439940816cd5095a3b36e2738fb89d715c28ac6c5", + "header_type": "nakamoto", + "height": 107, + "parent_block_id": "45cb658a80897117c2cfa6191a7623344ed1079117ad8bb30113019278bac028" + } + ] + } +} diff --git a/docs/rpc/components/examples/transaction-submission-error.example.json b/docs/rpc/components/examples/transaction-submission-error.example.json index 3cab6ce2188..1c923033475 100644 --- a/docs/rpc/components/examples/transaction-submission-error.example.json +++ b/docs/rpc/components/examples/transaction-submission-error.example.json @@ -1,11 +1,14 @@ { - "error": "transaction rejected", - "reason": "BadNonce", - "reason_data": { - "actual": 4, - "expected": 0, - "is_origin": true, - "principal": "ST2ZRX0K27GW0SP3GJCEMHD95TQGJMKB7G9Y0X1MH" - }, - "txid": "caf6fd60ae05b0c2d19ef14ab6a7670b1095d117fa7c80224c74e76214d0a791" + "summary": "Transaction submission error response", + "value": { + "error": "transaction rejected", + "reason": "BadNonce", + "reason_data": { + "actual": 4, + "expected": 0, + "is_origin": true, + "principal": "ST2ZRX0K27GW0SP3GJCEMHD95TQGJMKB7G9Y0X1MH" + }, + "txid": "caf6fd60ae05b0c2d19ef14ab6a7670b1095d117fa7c80224c74e76214d0a791" + } } diff --git a/docs/rpc/components/schemas/get-transaction.schema.yaml b/docs/rpc/components/schemas/get-transaction.schema.yaml index 3e30e6a24ea..bed3832540a 100644 --- a/docs/rpc/components/schemas/get-transaction.schema.yaml +++ b/docs/rpc/components/schemas/get-transaction.schema.yaml @@ -14,3 +14,9 @@ properties: result: type: string description: Transaction execution result (Clarity value) + block_height: + type: [integer, "null"] + description: Height of the block where the transaction was included + is_canonical: + type: boolean + description: Whether the block where this transaction was included is in the canonical chain tip diff --git a/docs/rpc/components/schemas/tenure-tip-metadata.schema.yaml b/docs/rpc/components/schemas/tenure-tip-metadata.schema.yaml new file mode 100644 index 00000000000..08fc53401fe --- /dev/null +++ b/docs/rpc/components/schemas/tenure-tip-metadata.schema.yaml @@ -0,0 +1,124 @@ +description: | + JSON encoding of `BlockHeaderWithMetadata` returned by /v3/tenures/tip_metadata. + Exactly one variant property will be present: either `Epoch2` or `Nakamoto`. +type: object +required: + - anchored_header +properties: + burn_view: + type: string + description: Hex-encoded bitcoin block hash + anchored_header: + oneOf: + - title: Epoch2HeaderVariant + type: object + required: [Epoch2] + additionalProperties: false + properties: + Epoch2: + type: object + description: Header structure for a Stacks 2.x anchored block. + required: + - version + - total_work + - proof + - parent_block + - parent_microblock + - parent_microblock_sequence + - tx_merkle_root + - state_index_root + - microblock_pubkey_hash + properties: + version: + type: integer + minimum: 0 + total_work: + type: object + required: [burn, work] + properties: + burn: + type: integer + format: uint64 + work: + type: integer + format: uint64 + proof: + type: string + description: Hex-encoded VRF proof + parent_block: + type: string + description: 32-byte hex of the parent block header hash + parent_microblock: + type: string + description: 32-byte hex of the parent microblock header hash + parent_microblock_sequence: + type: integer + tx_merkle_root: + type: string + description: Hex-encoded merkle root of the transactions in the block + state_index_root: + type: string + description: Hex-encoded MARF trie root after this block + microblock_pubkey_hash: + type: string + description: Hash160 (20-byte hex) of the microblock public key + additionalProperties: false + - title: NakamotoHeaderVariant + type: object + required: [Nakamoto] + additionalProperties: false + properties: + Nakamoto: + type: object + description: Header structure for a Nakamoto-epoch Stacks block. + required: + - version + - chain_length + - burn_spent + - consensus_hash + - parent_block_id + - tx_merkle_root + - state_index_root + - timestamp + - miner_signature + - signer_signature + - pox_treatment + properties: + version: + type: integer + minimum: 0 + chain_length: + type: integer + format: uint64 + description: Number of ancestor blocks including Stacks 2.x blocks + burn_spent: + type: integer + format: uint64 + description: Total BTC spent by the sortition that elected this block + consensus_hash: + type: string + description: 20-byte hex consensus hash that identifies the tenure + parent_block_id: + type: string + description: 32-byte hex identifier of the parent block (hash+consensus) + tx_merkle_root: + type: string + description: Hex-encoded merkle root of all transactions in the block + state_index_root: + type: string + description: Hex-encoded MARF trie root after this block + timestamp: + type: integer + description: Unix timestamp (seconds) + miner_signature: + type: string + description: Recoverable ECDSA signature from the miner + signer_signature: + type: array + description: Signer-set signatures over the block header + items: + type: string + pox_treatment: + type: string + description: Bit-vector, hex-encoded, indicating PoX reward treatment + additionalProperties: false diff --git a/docs/rpc/openapi.yaml b/docs/rpc/openapi.yaml index d70875a00ec..22876be7837 100644 --- a/docs/rpc/openapi.yaml +++ b/docs/rpc/openapi.yaml @@ -156,6 +156,8 @@ components: $ref: ./components/schemas/tenure-info.schema.yaml TenureTip: $ref: ./components/schemas/tenure-tip.schema.yaml + TenureTipMetadata: + $ref: ./components/schemas/tenure-tip-metadata.schema.yaml GetStackerSet: $ref: ./components/schemas/get-stacker-set.schema.yaml TenureBlocks: @@ -219,8 +221,9 @@ paths: application/json: schema: $ref: "#/components/schemas/TransactionSubmissionError" - example: - $ref: "./components/examples/transaction-submission-error.example.json" + examples: + transaction-submission-error: + $ref: "./components/examples/transaction-submission-error.example.json" "500": $ref: "#/components/responses/InternalServerError" @@ -243,8 +246,9 @@ paths: application/json: schema: $ref: "#/components/schemas/ContractInterface" - example: - $ref: "./components/examples/contract-interface.example.json" + examples: + contract-interface: + $ref: "./components/examples/contract-interface.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -300,8 +304,9 @@ paths: application/json: schema: $ref: "#/components/schemas/ClarityData" - example: - $ref: "./components/examples/clarity-data.example.json" + examples: + clarity-data: + $ref: "./components/examples/clarity-data.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -331,8 +336,9 @@ paths: application/json: schema: $ref: "#/components/schemas/ContractSource" - example: - $ref: "./components/examples/contract-source.example.json" + examples: + contract-source: + $ref: "./components/examples/contract-source.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -381,11 +387,9 @@ paths: $ref: "#/components/schemas/ReadOnlyFunctionResult" examples: success: - summary: Successful function call - externalValue: "./components/examples/read-only-function-success.example.json" + $ref: "./components/examples/read-only-function-success.example.json" failure: - summary: Failed function call - externalValue: "./components/examples/read-only-function-failure.example.json" + $ref: "./components/examples/read-only-function-failure.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -429,11 +433,14 @@ paths: application/json: schema: $ref: "#/components/schemas/ReadOnlyFunctionArgs" - example: - sender: "SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0.get-info" - arguments: - - "0x0011..." - - "0x00231..." + examples: + fast-call-request: + summary: Fast call read-only function request + value: + sender: "SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0.get-info" + arguments: + - "0x0011..." + - "0x00231..." responses: "200": description: Function executed successfully @@ -443,11 +450,9 @@ paths: $ref: "#/components/schemas/ReadOnlyFunctionResult" examples: success: - summary: Successful function call - externalValue: "./components/examples/read-only-function-success.example.json" + $ref: "./components/examples/read-only-function-success.example.json" failure: - summary: Failed function call - externalValue: "./components/examples/read-only-function-failure.example.json" + $ref: "./components/examples/read-only-function-failure.example.json" "400": $ref: "#/components/responses/BadRequest" "401": @@ -483,8 +488,9 @@ paths: application/json: schema: $ref: "#/components/schemas/AccountData" - example: - $ref: "./components/examples/account-data.example.json" + examples: + account-data: + $ref: "./components/examples/account-data.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -571,8 +577,9 @@ paths: application/json: schema: $ref: "#/components/schemas/FeeTransactionRequest" - example: - $ref: "./components/examples/fee-transaction-request.example.json" + examples: + fee-transaction-request: + $ref: "./components/examples/fee-transaction-request.example.json" responses: "200": description: Estimated fees for the transaction @@ -580,8 +587,9 @@ paths: application/json: schema: $ref: "#/components/schemas/FeeTransactionResponse" - example: - $ref: "./components/examples/fee-transaction-response.example.json" + examples: + fee-transaction-response: + $ref: "./components/examples/fee-transaction-response.example.json" "400": description: Fee estimation error content: @@ -629,8 +637,9 @@ paths: application/json: schema: $ref: "#/components/schemas/NodeInfo" - example: - $ref: "./components/examples/node-info.example.json" + examples: + node-info: + $ref: "./components/examples/node-info.example.json" "500": $ref: "#/components/responses/InternalServerError" @@ -649,8 +658,9 @@ paths: application/json: schema: $ref: "#/components/schemas/PoxInfo" - example: - $ref: "./components/examples/pox-info.example.json" + examples: + pox-info: + $ref: "./components/examples/pox-info.example.json" parameters: - $ref: ./components/parameters/tip.yaml @@ -702,8 +712,9 @@ paths: application/json: schema: $ref: "#/components/schemas/IsTraitImplemented" - example: - $ref: "./components/examples/is-trait-implemented.example.json" + examples: + is-trait-implemented: + $ref: "./components/examples/is-trait-implemented.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -726,8 +737,9 @@ paths: application/json: schema: $ref: "#/components/schemas/ClarityData" - example: - $ref: "./components/examples/clarity-data.example.json" + examples: + clarity-data: + $ref: "./components/examples/clarity-data.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -765,8 +777,9 @@ paths: application/json: schema: $ref: "#/components/schemas/ClarityMetadata" - example: - $ref: "./components/examples/clarity-metadata.example.json" + examples: + clarity-metadata: + $ref: "./components/examples/clarity-metadata.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -804,8 +817,9 @@ paths: application/json: schema: $ref: "#/components/schemas/ConstantValue" - example: - $ref: "./components/examples/constant-value.example.json" + examples: + constant-value: + $ref: "./components/examples/constant-value.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -847,8 +861,9 @@ paths: chain_id: type: integer description: Chain ID for the block - example: - $ref: "./components/examples/post-block-proposal-request.example.json" + examples: + block-proposal-request: + $ref: "./components/examples/post-block-proposal-request.example.json" responses: "202": description: | @@ -858,8 +873,9 @@ paths: application/json: schema: $ref: "#/components/schemas/BlockProposalResponse" - example: - $ref: "./components/examples/post-block-proposal-response.example.json" + examples: + block-proposal-accepted: + $ref: "./components/examples/post-block-proposal-response.example.json" "400": description: Bad Request content: @@ -883,8 +899,9 @@ paths: application/json: schema: $ref: "#/components/schemas/BlockProposalResponse" - example: - $ref: "./components/examples/post-block-proposal-response.429.example.json" + examples: + too-many-requests: + $ref: "./components/examples/post-block-proposal-response.429.example.json" "500": $ref: "#/components/responses/InternalServerError" @@ -915,8 +932,9 @@ paths: application/json: schema: $ref: "#/components/schemas/GetStackerSet" - example: - $ref: "./components/examples/get-stacker-set.example.json" + examples: + stacker-set: + $ref: "./components/examples/get-stacker-set.example.json" "400": description: Could not fetch the given reward set content: @@ -937,8 +955,9 @@ paths: err_msg: type: string description: Detailed error message - example: - $ref: "./components/examples/get-stacker-set-400.example.json" + examples: + stacker-set-error: + $ref: "./components/examples/get-stacker-set-400.example.json" /v3/blocks/{block_id}: get: @@ -1024,8 +1043,9 @@ paths: application/json: schema: $ref: "#/components/schemas/TenureInfo" - example: - $ref: "./components/examples/get-tenure-info.example.json" + examples: + tenure-info: + $ref: "./components/examples/get-tenure-info.example.json" /v3/tenures/{block_id}: get: @@ -1089,8 +1109,9 @@ paths: application/json: schema: $ref: "#/components/schemas/TenureBlocks" - example: - $ref: "./components/examples/tenure-blocks.example.json" + examples: + tenure-blocks: + $ref: "./components/examples/tenure-blocks.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1123,8 +1144,9 @@ paths: application/json: schema: $ref: "#/components/schemas/TenureBlocks" - example: - $ref: "./components/examples/tenure-blocks.example.json" + examples: + tenure-blocks: + $ref: "./components/examples/tenure-blocks.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1156,8 +1178,9 @@ paths: application/json: schema: $ref: "#/components/schemas/TenureBlocks" - example: - $ref: "./components/examples/tenure-blocks.example.json" + examples: + tenure-blocks: + $ref: "./components/examples/tenure-blocks.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1182,8 +1205,9 @@ paths: application/json: schema: $ref: "#/components/schemas/Sortitions" - example: - $ref: "./components/examples/get-sortitions.example.json" + examples: + latest-sortition: + $ref: "./components/examples/get-sortitions.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1208,8 +1232,9 @@ paths: application/json: schema: $ref: "#/components/schemas/Sortitions" - example: - $ref: "./components/examples/get-sortitions-latest-and-prior.example.json" + examples: + latest-and-last-sortitions: + $ref: "./components/examples/get-sortitions-latest-and-prior.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1242,8 +1267,9 @@ paths: application/json: schema: $ref: "#/components/schemas/Sortitions" - example: - $ref: "./components/examples/get-sortitions.example.json" + examples: + sortition-by-consensus: + $ref: "./components/examples/get-sortitions.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1276,8 +1302,9 @@ paths: application/json: schema: $ref: "#/components/schemas/Sortitions" - example: - $ref: "./components/examples/get-sortitions.example.json" + examples: + sortition-by-burn-hash: + $ref: "./components/examples/get-sortitions.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1310,8 +1337,9 @@ paths: application/json: schema: $ref: "#/components/schemas/Sortitions" - example: - $ref: "./components/examples/get-sortitions.example.json" + examples: + sortition-by-height: + $ref: "./components/examples/get-sortitions.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1379,8 +1407,9 @@ paths: application/json: schema: $ref: "#/components/schemas/TransactionInfo" - example: - $ref: "./components/examples/get-transaction.example.json" + examples: + transaction-info: + $ref: "./components/examples/get-transaction.example.json" "404": $ref: "#/components/responses/NotFound" "500": @@ -1415,8 +1444,9 @@ paths: application/json: schema: $ref: "#/components/schemas/GetHealth" - example: - $ref: "./components/examples/node-health.example.json" + examples: + node-health: + $ref: "./components/examples/node-health.example.json" "400": $ref: "#/components/responses/BadRequest" "500": @@ -1487,13 +1517,16 @@ paths: application/json: schema: $ref: "#/components/schemas/AttachmentInventory" - example: - block_id: "0123456789abcdef0123456789abcdef0123456789abcdef" - pages: - - index: 1 - inventory: [255, 0, 255, 0] - - index: 2 - inventory: [0, 255, 0, 255] + examples: + attachment-inventory: + summary: Attachment inventory response + value: + block_id: "0123456789abcdef0123456789abcdef0123456789abcdef" + pages: + - index: 1 + inventory: [255, 0, 255, 0] + - index: 2 + inventory: [0, 255, 0, 255] "400": $ref: "#/components/responses/BadRequest" "404": @@ -1735,11 +1768,14 @@ paths: application/json: schema: $ref: "#/components/schemas/StackerDbMetadata" - example: - - slot_id: 0 - slot_version: 1 - data_hash: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - signature: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + examples: + stackerdb-metadata: + summary: StackerDB metadata response + value: + - slot_id: 0 + slot_version: 1 + data_hash: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + signature: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1772,8 +1808,9 @@ paths: application/json: schema: $ref: "#/components/schemas/StackerDbChunkData" - example: - $ref: "./components/examples/stackerdb-chunk-data-request.example.json" + examples: + stackerdb-chunk-request: + $ref: "./components/examples/stackerdb-chunk-data-request.example.json" responses: "200": description: Chunk submission result (both success and failure cases) @@ -1783,11 +1820,9 @@ paths: $ref: "#/components/schemas/StackerDbChunkAckData" examples: success: - summary: Successful chunk write - externalValue: "./components/examples/stackerdb-chunk-ack-success.example.json" + $ref: "./components/examples/stackerdb-chunk-ack-success.example.json" failure: - summary: Failed chunk write - externalValue: "./components/examples/stackerdb-chunk-ack-failure.example.json" + $ref: "./components/examples/stackerdb-chunk-ack-failure.example.json" "400": $ref: "#/components/responses/BadRequest" "404": @@ -1814,10 +1849,13 @@ paths: application/json: schema: $ref: "#/components/schemas/StackerDbReplicas" - example: - - ip: "127.0.0.1" - port: 20444 - public_key_hash: "03abc123..." + examples: + stackerdb-replicas: + summary: List of StackerDB replicas + value: + - ip: "127.0.0.1" + port: 20444 + public_key_hash: "03abc123..." "400": $ref: "#/components/responses/BadRequest" "404": @@ -1853,7 +1891,8 @@ paths: application/json: schema: $ref: "#/components/schemas/ClarityData" - example: + examples: + clarity-data: $ref: "./components/examples/clarity-data.example.json" "400": $ref: "#/components/responses/BadRequest" @@ -1946,8 +1985,9 @@ paths: application/json: schema: $ref: "#/components/schemas/NetworkPeers" - example: - $ref: ./components/examples/network-peers.example.json + examples: + network-peers: + $ref: "./components/examples/network-peers.example.json" /v3/tenures/fork_info/{start}/{stop}: get: @@ -2014,8 +2054,40 @@ paths: application/json: schema: $ref: "#/components/schemas/TenureTip" - example: - $ref: "./components/examples/get-tenure-tip.example.json" + examples: + tenure-tip: + $ref: "./components/examples/get-tenure-tip.example.json" + "400": + $ref: "#/components/responses/BadRequest" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/InternalServerError" + + /v3/tenures/tip_metadata/{consensus_hash}: + get: + summary: Get tenure tip with metadata + tags: + - Blocks + security: [] + operationId: getTenureTipMetadata + description: | + Get the tip block and associated metadata of a tenure identified by consensus hash. + parameters: + - name: consensus_hash + in: path + required: true + description: Consensus hash (40 characters) + schema: + type: string + pattern: "^[0-9a-f]{40}$" + responses: + "200": + description: Tenure tip block information + content: + application/json: + schema: + $ref: "#/components/schemas/TenureTipMetadata" "400": $ref: "#/components/responses/BadRequest" "404": @@ -2048,9 +2120,12 @@ paths: application/json: schema: $ref: "#/components/schemas/UnconfirmedTransaction" - example: - tx: "800000000004..." - status: "Mempool" + examples: + unconfirmed-transaction: + summary: Unconfirmed transaction in mempool + value: + tx: "800000000004..." + status: "Mempool" "400": $ref: "#/components/responses/BadRequest" "404": @@ -2091,9 +2166,12 @@ paths: application/json: schema: $ref: "#/components/schemas/BlockUploadResponse" - example: - stacks_block_id: "abc123..." - accepted: true + examples: + block-upload-success: + summary: Block upload accepted + value: + stacks_block_id: "abc123..." + accepted: true "400": $ref: "#/components/responses/BadRequest" "404": @@ -2193,9 +2271,12 @@ paths: application/json: schema: $ref: "#/components/schemas/BlockUploadResponse" - example: - stacks_block_id: "abc123..." - accepted: true + examples: + nakamoto-block-upload-success: + summary: Nakamoto block upload accepted + value: + stacks_block_id: "abc123..." + accepted: true "400": $ref: "#/components/responses/BadRequest" "401": @@ -2228,8 +2309,9 @@ paths: application/json: schema: $ref: "#/components/schemas/BlockReplay" - example: - $ref: "./components/examples/block-replay.example.json" + examples: + block-replay: + $ref: "./components/examples/block-replay.example.json" "400": $ref: "#/components/responses/BadRequest" "401": diff --git a/pox-locking/Cargo.toml b/pox-locking/Cargo.toml index 9863c2b5c45..1dd71ec9c43 100644 --- a/pox-locking/Cargo.toml +++ b/pox-locking/Cargo.toml @@ -25,6 +25,7 @@ slog = { version = "2.5.2", features = [ "max_level_trace" ] } [dev-dependencies] mutants = "0.0.3" +clarity = { package = "clarity", path = "../clarity", features = ["rusqlite"]} [features] slog_json = ["stacks_common/slog_json", "clarity/slog_json"] diff --git a/pox-locking/src/events.rs b/pox-locking/src/events.rs index cc4fc8f539e..40a97e149d2 100644 --- a/pox-locking/src/events.rs +++ b/pox-locking/src/events.rs @@ -678,11 +678,7 @@ fn inner_synthesize_pox_event_info( let data_tuple = data_event_info .expect_tuple() .expect("FATAL: unexpected clarity value"); - let event_tuple = - TupleData::shallow_merge(base_event_tuple, data_tuple).map_err(|e| { - error!("Failed to merge data-info and event-info: {e:?}"); - e - })?; + let event_tuple = TupleData::shallow_merge(base_event_tuple, data_tuple); Ok(Value::Tuple(event_tuple)) }, diff --git a/pox-locking/src/events_24.rs b/pox-locking/src/events_24.rs index 0a7e2b4397b..eca38adeffb 100644 --- a/pox-locking/src/events_24.rs +++ b/pox-locking/src/events_24.rs @@ -410,11 +410,7 @@ pub fn synthesize_pox_2_or_3_event_info( let data_tuple = data_event_info .expect_tuple() .expect("FATAL: unexpected clarity value"); - let event_tuple = - TupleData::shallow_merge(base_event_tuple, data_tuple).map_err(|e| { - error!("Failed to merge data-info and event-info: {e:?}"); - e - })?; + let event_tuple = TupleData::shallow_merge(base_event_tuple, data_tuple); Ok(Value::Tuple(event_tuple)) }, diff --git a/pox-locking/src/pox_4.rs b/pox-locking/src/pox_4.rs index abd4e47f54c..d9f0a9a411d 100644 --- a/pox-locking/src/pox_4.rs +++ b/pox-locking/src/pox_4.rs @@ -427,3 +427,108 @@ pub fn handle_contract_call( Ok(()) } + +#[cfg(test)] +mod tests { + use clarity::boot_util::boot_code_id; + use clarity::consts::CHAIN_ID_TESTNET; + use clarity::types::StacksEpochId; + use clarity::vm::contexts::GlobalContext; + use clarity::vm::costs::LimitedCostTracker; + use clarity::vm::database::MemoryBackingStore; + use clarity::vm::errors::{RuntimeError, VmExecutionError}; + use clarity::vm::types::{StandardPrincipalData, TupleData}; + use clarity::vm::Value; + + use crate::pox_4::{handle_contract_call, POX_4_NAME}; + + #[test] + fn pox_already_locked_error_when_locking_across_pox_versions() { + // Setup in-memory database + let mut store = MemoryBackingStore::new(); + let db = store.as_clarity_db(); + let mut global_context = GlobalContext::new( + false, + CHAIN_ID_TESTNET, + db, + LimitedCostTracker::new_free(), + StacksEpochId::Epoch33, + ); + + let total_amount = 1_000_000_000_000; + let locked_amount = 500_000_000; + // Account that will try to lock + let stacker = StandardPrincipalData::transient().into(); + let pox4_contract = boot_code_id(POX_4_NAME, false); + + global_context.begin(); + // Simulate the account already having locked tokens in PoX-3 + { + let mut snapshot = global_context + .database + .get_stx_balance_snapshot(&stacker) + .unwrap(); + // Give the account plenty of unlocked STX + snapshot + .credit(total_amount) + .expect("Failed to credit account"); + // Manually lock 500 STX until some future burn height (simulating PoX-3 lock) + snapshot + .lock_tokens_v3(locked_amount, 10_000) + .expect("Failed to pre-lock"); + snapshot.save().expect("Failed to save pre-locked balance"); + } + + // Verify it really is locked + let balance = global_context + .database + .get_account_stx_balance(&stacker) + .expect("Failed to get balance"); + assert_eq!(balance.amount_locked(), locked_amount); + + // Simulate a successful response from pox-4.stack-stx + // (stacker, lock-amount, unlock-height) tuple + let stack_stx_response = Value::okay(Value::Tuple( + TupleData::from_data(vec![ + ("stacker".into(), Value::Principal(stacker.clone())), + ("lock-amount".into(), Value::UInt(100_000_000)), // trying to lock 100 more STX + ("unlock-burn-height".into(), Value::UInt(15_000)), + ]) + .unwrap(), + )) + .unwrap(); + + // Call into the special handler via handle_contract_call + let result = handle_contract_call( + &mut global_context, + Some(&stacker), // sender + &pox4_contract, + "stack-stx", // function name + &[ + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + ], // We don't care about the actual args for this test. Just that we have 4. + &stack_stx_response, + ); + + assert!( + matches!( + result, + Err(VmExecutionError::Runtime(RuntimeError::PoxAlreadyLocked, _)) + ), + "Expected PoxAlreadyLocked. Got: {result:?}" + ); + // Verify no lock was applied (balance unchanged) + let final_balance = global_context + .database + .get_account_stx_balance(&stacker) + .expect("Failed to get final balance"); + assert_eq!(final_balance.amount_locked(), locked_amount); // still the original lock + assert_eq!( + final_balance.amount_unlocked(), + total_amount - locked_amount + ); + } +} diff --git a/stacks-common/src/types/mod.rs b/stacks-common/src/types/mod.rs index 3544646dd2b..26fa440e3ff 100644 --- a/stacks-common/src/types/mod.rs +++ b/stacks-common/src/types/mod.rs @@ -132,26 +132,6 @@ define_stacks_epochs! { Epoch33 = 0x03003, } -impl StacksEpochId { - /// Return the network epoch associated with the StacksEpochId - pub fn network_epoch(epoch: StacksEpochId) -> u8 { - match epoch { - StacksEpochId::Epoch10 => PEER_VERSION_EPOCH_1_0, - StacksEpochId::Epoch20 => PEER_VERSION_EPOCH_2_0, - StacksEpochId::Epoch2_05 => PEER_VERSION_EPOCH_2_05, - StacksEpochId::Epoch21 => PEER_VERSION_EPOCH_2_1, - StacksEpochId::Epoch22 => PEER_VERSION_EPOCH_2_2, - StacksEpochId::Epoch23 => PEER_VERSION_EPOCH_2_3, - StacksEpochId::Epoch24 => PEER_VERSION_EPOCH_2_4, - StacksEpochId::Epoch25 => PEER_VERSION_EPOCH_2_5, - StacksEpochId::Epoch30 => PEER_VERSION_EPOCH_3_0, - StacksEpochId::Epoch31 => PEER_VERSION_EPOCH_3_1, - StacksEpochId::Epoch32 => PEER_VERSION_EPOCH_3_2, - StacksEpochId::Epoch33 => PEER_VERSION_EPOCH_3_3, - } - } -} - #[derive(Debug)] pub enum MempoolCollectionBehavior { ByStacksHeight, @@ -879,6 +859,34 @@ impl StacksEpochId { StacksEpochId::Epoch33 => true, } } + + /// Return the network epoch associated with the StacksEpochId + pub fn network_epoch(epoch: StacksEpochId) -> u8 { + match epoch { + StacksEpochId::Epoch10 => PEER_VERSION_EPOCH_1_0, + StacksEpochId::Epoch20 => PEER_VERSION_EPOCH_2_0, + StacksEpochId::Epoch2_05 => PEER_VERSION_EPOCH_2_05, + StacksEpochId::Epoch21 => PEER_VERSION_EPOCH_2_1, + StacksEpochId::Epoch22 => PEER_VERSION_EPOCH_2_2, + StacksEpochId::Epoch23 => PEER_VERSION_EPOCH_2_3, + StacksEpochId::Epoch24 => PEER_VERSION_EPOCH_2_4, + StacksEpochId::Epoch25 => PEER_VERSION_EPOCH_2_5, + StacksEpochId::Epoch30 => PEER_VERSION_EPOCH_3_0, + StacksEpochId::Epoch31 => PEER_VERSION_EPOCH_3_1, + StacksEpochId::Epoch32 => PEER_VERSION_EPOCH_3_2, + StacksEpochId::Epoch33 => PEER_VERSION_EPOCH_3_3, + } + } + + #[cfg(any(test, feature = "testing"))] + pub fn since(epoch: StacksEpochId) -> &'static [StacksEpochId] { + let idx = Self::ALL + .iter() + .position(|&e| e == epoch) + .expect("epoch not found in ALL"); + + &Self::ALL[idx..] + } } impl std::fmt::Display for StacksEpochId { diff --git a/stacks-common/src/util/macros.rs b/stacks-common/src/util/macros.rs index cbf602cfa1c..ac3d6f94ab8 100644 --- a/stacks-common/src/util/macros.rs +++ b/stacks-common/src/util/macros.rs @@ -426,8 +426,8 @@ macro_rules! impl_array_newtype { } } + #[allow(clippy::non_canonical_clone_impl)] impl Clone for $thing { - #[allow(clippy::non_canonical_clone_impl)] fn clone(&self) -> Self { $thing(self.0.clone()) } diff --git a/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs b/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs index bef521be80d..fc025b69b5e 100644 --- a/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs +++ b/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs @@ -56,7 +56,7 @@ mod tests; /// Additional fields can be added in the future as needed. #[derive(Debug, Clone, Deserialize)] pub struct GetTransactionResponse { - pub confirmations: u32, + pub confirmations: i32, } /// Response returned by the `getdescriptorinfo` RPC call. diff --git a/stacks-node/src/event_dispatcher.rs b/stacks-node/src/event_dispatcher.rs index 87fea966a87..e7aaff025db 100644 --- a/stacks-node/src/event_dispatcher.rs +++ b/stacks-node/src/event_dispatcher.rs @@ -1,5 +1,5 @@ // Copyright (C) 2013-2020 Blockstack PBC, a public benefit corporation -// Copyright (C) 2020-2024 Stacks Open Internet Foundation +// Copyright (C) 2020-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 @@ -17,47 +17,35 @@ use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; -use std::sync::mpsc::{channel, Receiver, Sender}; +#[cfg(test)] +use std::sync::mpsc::channel; #[cfg(test)] use std::sync::LazyLock; use std::sync::{Arc, Mutex}; use std::thread::sleep; use std::time::Duration; -use clarity::vm::analysis::contract_interface_builder::{ - build_contract_interface, ContractInterface, -}; use clarity::vm::costs::ExecutionCost; use clarity::vm::events::{FTEventType, NFTEventType, STXEventType}; -use clarity::vm::types::{AssetIdentifier, QualifiedContractIdentifier, Value}; +use clarity::vm::types::{AssetIdentifier, QualifiedContractIdentifier}; #[cfg(any(test, feature = "testing"))] use lazy_static::lazy_static; use rand::Rng; -use rusqlite::{params, Connection}; use serde_json::json; use stacks::burnchains::{PoxConstants, Txid}; -use stacks::chainstate::burn::operations::{ - blockstack_op_extended_deserialize, blockstack_op_extended_serialize_opt, - BlockstackOperationType, -}; use stacks::chainstate::burn::ConsensusHash; use stacks::chainstate::coordinator::BlockEventDispatcher; use stacks::chainstate::nakamoto::NakamotoBlock; use stacks::chainstate::stacks::address::PoxAddress; -use stacks::chainstate::stacks::boot::{ - NakamotoSignerEntry, PoxStartCycleInfo, RewardSet, RewardSetData, SIGNERS_NAME, -}; +use stacks::chainstate::stacks::boot::RewardSetData; use stacks::chainstate::stacks::db::accounts::MinerReward; use stacks::chainstate::stacks::db::unconfirmed::ProcessedUnconfirmedState; -use stacks::chainstate::stacks::db::{MinerRewardInfo, StacksBlockHeaderTypes, StacksHeaderInfo}; +use stacks::chainstate::stacks::db::{MinerRewardInfo, StacksHeaderInfo}; use stacks::chainstate::stacks::events::{ StackerDBChunksEvent, StacksBlockEventData, StacksTransactionEvent, StacksTransactionReceipt, - TransactionOrigin, }; use stacks::chainstate::stacks::miner::TransactionEvent; -use stacks::chainstate::stacks::{ - StacksBlock, StacksMicroblock, StacksTransaction, TransactionPayload, -}; +use stacks::chainstate::stacks::{StacksBlock, StacksMicroblock, StacksTransaction}; use stacks::config::{EventKeyType, EventObserverConfig}; use stacks::core::mempool::{MemPoolDropReason, MemPoolEventDispatcher, ProposalCallbackReceiver}; use stacks::libstackerdb::StackerDBChunkData; @@ -68,21 +56,28 @@ use stacks::net::atlas::{Attachment, AttachmentInstance}; use stacks::net::http::HttpRequestContents; use stacks::net::httpcore::{send_http_request, StacksHttpRequest}; use stacks::net::stackerdb::StackerDBEventDispatcher; -use stacks::util::hash::{to_hex, to_hex_prefixed}; #[cfg(any(test, feature = "testing"))] use stacks::util::tests::TestFlag; -use stacks::util_lib::db::Error as db_error; use stacks_common::bitvec::BitVec; -use stacks_common::codec::StacksMessageCodec; use stacks_common::types::chainstate::{BlockHeaderHash, BurnchainHeaderHash, StacksBlockId}; use stacks_common::types::net::PeerHost; -use stacks_common::util::hash::Sha512Trunc256Sum; -use stacks_common::util::secp256k1::MessageSignature; -use stacks_common::util::serde_serializers::{ - prefix_hex, prefix_hex_codec, prefix_opt_hex, prefix_string_0x, -}; use url::Url; +mod db; +mod payloads; +mod stacker_db; + +use db::EventDispatcherDbConnection; +use payloads::*; +pub use payloads::{ + MinedBlockEvent, MinedMicroblockEvent, MinedNakamotoBlockEvent, NakamotoSignerEntryPayload, + RewardSetEventPayload, TransactionEventPayload, +}; +pub use stacker_db::StackerDBChannel; + +#[cfg(test)] +mod tests; + #[cfg(any(test, feature = "testing"))] lazy_static! { /// Do not announce a signed/mined block to the network when set to true. @@ -90,23 +85,16 @@ lazy_static! { } #[derive(Debug, Clone)] -pub struct EventObserver { - /// Path to the database where pending payloads are stored. If `None`, then - /// the database is not used and events are not recoverable across restarts. - pub db_path: Option, +struct EventObserver { /// URL to which events will be sent - pub endpoint: String, + endpoint: String, /// Timeout for sending events to this observer - pub timeout: Duration, + timeout: Duration, /// If true, the stacks-node will not retry if event delivery fails for any reason. /// WARNING: This should not be set on observers that require successful delivery of all events. - pub disable_retries: bool, + disable_retries: bool, } -const STATUS_RESP_TRUE: &str = "success"; -const STATUS_RESP_NOT_COMMITTED: &str = "abort_by_response"; -const STATUS_RESP_POST_CONDITION: &str = "abort_by_post_condition"; - /// Update `serve()` in `neon_integrations.rs` with any new paths that need to be tested pub const PATH_MICROBLOCK_SUBMIT: &str = "new_microblocks"; pub const PATH_MEMPOOL_TX_SUBMIT: &str = "new_mempool_tx"; @@ -120,1039 +108,263 @@ pub const PATH_BLOCK_PROCESSED: &str = "new_block"; pub const PATH_ATTACHMENT_PROCESSED: &str = "attachments/new"; pub const PATH_PROPOSAL_RESPONSE: &str = "proposal_response"; -/// This struct receives StackerDB event callbacks without registering -/// over the JSON/RPC interface. -pub struct StackerDBChannel { - sender_info: Mutex>, -} - -#[derive(Clone)] -struct InnerStackerDBChannel { - /// A channel for sending the chunk events to the listener - sender: Sender, - /// Does the listener want to receive `.signers` chunks? - interested_in_signers: bool, - /// Which StackerDB contracts is the listener interested in? - other_interests: Vec, -} +#[cfg(test)] +static TEST_EVENT_OBSERVER_SKIP_RETRY: LazyLock> = LazyLock::new(TestFlag::default); -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct MinedBlockEvent { - pub target_burn_height: u64, - pub block_hash: String, - pub stacks_height: u64, - pub block_size: u64, - pub anchored_cost: ExecutionCost, - pub confirmed_microblocks_cost: ExecutionCost, - pub tx_events: Vec, +impl EventObserver { + fn new(endpoint: String, timeout: Duration, disable_retries: bool) -> Self { + EventObserver { + endpoint, + timeout, + disable_retries, + } + } } -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct MinedMicroblockEvent { - pub block_hash: String, - pub sequence: u16, - pub tx_events: Vec, - pub anchor_block_consensus_hash: ConsensusHash, - pub anchor_block: BlockHeaderHash, +/// Events received from block-processing. +/// Stacks events are structured as JSON, and are grouped by topic. An event observer can +/// subscribe to one or more specific event streams, or the "any" stream to receive all of them. +#[derive(Clone)] +pub struct EventDispatcher { + /// List of configured event observers to which events will be posted. + /// The fields below this contain indexes into this list. + registered_observers: Vec, + /// Smart contract-specific events, keyed by (contract-id, event-name). Values are indexes into `registered_observers`. + contract_events_observers_lookup: HashMap<(QualifiedContractIdentifier, String), HashSet>, + /// Asset event observers, keyed by fully-qualified asset identifier. Values are indexes into + /// `registered_observers. + assets_observers_lookup: HashMap>, + /// Index into `registered_observers` that will receive burn block events + burn_block_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive mempool events + mempool_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive microblock events + microblock_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive STX events + stx_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive all events + any_event_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive block miner events (Stacks 2.5 and + /// lower) + miner_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive microblock miner events (Stacks 2.5 and + /// lower) + mined_microblocks_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive StackerDB events + stackerdb_observers_lookup: HashSet, + /// Index into `registered_observers` that will receive block proposal events (Nakamoto and + /// later) + block_proposal_observers_lookup: HashSet, + /// Channel for sending StackerDB events to the miner coordinator + pub stackerdb_channel: Arc>, + /// Path to the database where pending payloads are stored. If `None`, then + /// the database is not used and events are not recoverable across restarts. + db_path: Option, } -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -pub struct MinedNakamotoBlockEvent { - pub target_burn_height: u64, - pub parent_block_id: String, - pub block_hash: String, - pub block_id: String, - pub stacks_height: u64, - pub block_size: u64, - pub cost: ExecutionCost, - pub miner_signature: MessageSignature, - pub miner_signature_hash: Sha512Trunc256Sum, - pub signer_signature_hash: Sha512Trunc256Sum, - pub tx_events: Vec, - pub signer_bitvec: String, - pub signer_signature: Vec, +/// This struct is used specifically for receiving proposal responses. +/// It's constructed separately to play nicely with threading. +struct ProposalCallbackHandler { + observers: Vec, + db_path: Option, } -impl InnerStackerDBChannel { - pub fn new_miner_receiver() -> (Receiver, Self) { - let (sender, recv) = channel(); - let sender_info = Self { - sender, - interested_in_signers: true, - other_interests: vec![], +impl ProposalCallbackReceiver for ProposalCallbackHandler { + fn notify_proposal_result(&self, result: Result) { + let response = match serde_json::to_value(BlockValidateResponse::from(result)) { + Ok(x) => x, + Err(e) => { + error!( + "Failed to serialize block proposal validation response, will not notify over event observer"; + "error" => ?e + ); + return; + } }; - (recv, sender_info) - } -} - -impl Default for StackerDBChannel { - fn default() -> Self { - Self::new() + for observer in self.observers.iter() { + EventDispatcher::send_payload_given_db_path( + &self.db_path, + observer, + &response, + PATH_PROPOSAL_RESPONSE, + None, + ); + } } } -impl StackerDBChannel { - pub const fn new() -> Self { - Self { - sender_info: Mutex::new(None), +impl MemPoolEventDispatcher for EventDispatcher { + fn mempool_txs_dropped( + &self, + txids: Vec, + new_txid: Option, + reason: MemPoolDropReason, + ) { + if !txids.is_empty() { + self.process_dropped_mempool_txs(txids, new_txid, reason) } } - /// Consume the receiver for the StackerDBChannel and drop the senders. This should be done - /// before another interested thread can subscribe to events, but it is not absolutely necessary - /// to do so (it would just result in temporary over-use of memory while the prior channel is still - /// open). - /// - /// The StackerDBChnnel's receiver is guarded with a Mutex, so that ownership can - /// be taken by different threads without unsafety. - pub fn replace_receiver(&self, receiver: Receiver) { - // not strictly necessary, but do this rather than mark the `receiver` argument as unused - // so that we're explicit about the fact that `replace_receiver` consumes. - drop(receiver); - let mut guard = self - .sender_info - .lock() - .expect("FATAL: poisoned StackerDBChannel lock"); - guard.take(); + fn mined_block_event( + &self, + target_burn_height: u64, + block: &StacksBlock, + block_size_bytes: u64, + consumed: &ExecutionCost, + confirmed_microblock_cost: &ExecutionCost, + tx_events: Vec, + ) { + self.process_mined_block_event( + target_burn_height, + block, + block_size_bytes, + consumed, + confirmed_microblock_cost, + tx_events, + ) } - /// Create a new event receiver channel for receiving events relevant to the miner coordinator, - /// dropping the old StackerDB event sender channels if they are still registered. - /// Returns the new receiver channel and a bool indicating whether or not sender channels were - /// still in place. - /// - /// The StackerDBChannel senders are guarded by mutexes so that they can be replaced - /// by different threads without unsafety. - pub fn register_miner_coordinator(&self) -> (Receiver, bool) { - let mut sender_info = self - .sender_info - .lock() - .expect("FATAL: poisoned StackerDBChannel lock"); - let (recv, new_sender) = InnerStackerDBChannel::new_miner_receiver(); - let replaced_receiver = sender_info.replace(new_sender).is_some(); - - (recv, replaced_receiver) + fn mined_microblock_event( + &self, + microblock: &StacksMicroblock, + tx_events: Vec, + anchor_block_consensus_hash: ConsensusHash, + anchor_block: BlockHeaderHash, + ) { + self.process_mined_microblock_event( + microblock, + tx_events, + anchor_block_consensus_hash, + anchor_block, + ); } - /// Is there a thread holding the receiver, and is it interested in chunks events from `stackerdb`? - /// Returns the a sending channel to broadcast the event to if so, and `None` if not. - pub fn is_active( + fn mined_nakamoto_block_event( &self, - stackerdb: &QualifiedContractIdentifier, - ) -> Option> { - // if the receiver field is empty (i.e., None), then there is no listening thread, return None - let guard = self - .sender_info - .lock() - .expect("FATAL: poisoned StackerDBChannel lock"); - let sender_info = guard.as_ref()?; - if sender_info.interested_in_signers - && stackerdb.is_boot() - && stackerdb.name.starts_with(SIGNERS_NAME) - { - return Some(sender_info.sender.clone()); - } - if sender_info.other_interests.contains(stackerdb) { - return Some(sender_info.sender.clone()); - } - None + target_burn_height: u64, + block: &NakamotoBlock, + block_size_bytes: u64, + consumed: &ExecutionCost, + tx_events: Vec, + ) { + self.process_mined_nakamoto_block_event( + target_burn_height, + block, + block_size_bytes, + consumed, + tx_events, + ) } -} - -fn serialize_u128_as_string(value: &u128, serializer: S) -> Result -where - S: serde::Serializer, -{ - serializer.serialize_str(&value.to_string()) -} -fn serialize_pox_addresses(value: &[PoxAddress], serializer: S) -> Result -where - S: serde::Serializer, -{ - serializer.collect_seq(value.iter().cloned().map(|a| a.to_b58())) + fn get_proposal_callback_receiver(&self) -> Option> { + let callback_receivers: Vec<_> = self + .block_proposal_observers_lookup + .iter() + .filter_map(|observer_ix| + match self.registered_observers.get(usize::from(*observer_ix)) { + Some(x) => Some(x.clone()), + None => { + warn!( + "Event observer index not found in registered observers. Ignoring that index."; + "index" => observer_ix, + "observers_len" => self.registered_observers.len() + ); + None + } + } + ) + .collect(); + if callback_receivers.is_empty() { + return None; + } + let handler = ProposalCallbackHandler { + observers: callback_receivers, + db_path: self.db_path.clone(), + }; + Some(Box::new(handler)) + } } -fn serialize_optional_u128_as_string( - value: &Option, - serializer: S, -) -> Result -where - S: serde::Serializer, -{ - match value { - Some(v) => serializer.serialize_str(&v.to_string()), - None => serializer.serialize_none(), +impl StackerDBEventDispatcher for EventDispatcher { + /// Relay new StackerDB chunks + fn new_stackerdb_chunks( + &self, + contract_id: QualifiedContractIdentifier, + chunks: Vec, + ) { + self.process_new_stackerdb_chunks(contract_id, chunks); } } -fn hex_serialize(addr: &[u8; 33], s: S) -> Result { - s.serialize_str(&to_hex(addr)) -} +impl BlockEventDispatcher for EventDispatcher { + fn announce_block( + &self, + block: &StacksBlockEventData, + metadata: &StacksHeaderInfo, + receipts: &[StacksTransactionReceipt], + parent: &StacksBlockId, + winner_txid: &Txid, + mature_rewards: &[MinerReward], + mature_rewards_info: Option<&MinerRewardInfo>, + parent_burn_block_hash: &BurnchainHeaderHash, + parent_burn_block_height: u32, + parent_burn_block_timestamp: u64, + anchored_consumed: &ExecutionCost, + mblock_confirmed_consumed: &ExecutionCost, + pox_constants: &PoxConstants, + reward_set_data: &Option, + signer_bitvec: &Option>, + block_timestamp: Option, + coinbase_height: u64, + ) { + self.process_chain_tip( + block, + metadata, + receipts, + parent, + winner_txid, + mature_rewards, + mature_rewards_info, + parent_burn_block_hash, + parent_burn_block_height, + parent_burn_block_timestamp, + anchored_consumed, + mblock_confirmed_consumed, + pox_constants, + reward_set_data, + signer_bitvec, + block_timestamp, + coinbase_height, + ); + } -#[derive(Debug, PartialEq, Clone, Serialize)] -pub struct RewardSetEventPayload { - #[serde(serialize_with = "serialize_pox_addresses")] - pub rewarded_addresses: Vec, - pub start_cycle_state: PoxStartCycleInfo, - #[serde(skip_serializing_if = "Option::is_none", default)] - // only generated for nakamoto reward sets - pub signers: Option>, - #[serde(serialize_with = "serialize_optional_u128_as_string")] - pub pox_ustx_threshold: Option, + fn announce_burn_block( + &self, + burn_block: &BurnchainHeaderHash, + burn_block_height: u64, + rewards: Vec<(PoxAddress, u64)>, + burns: u64, + recipient_info: Vec, + consensus_hash: &ConsensusHash, + parent_burn_block_hash: &BurnchainHeaderHash, + ) { + self.process_burn_block( + burn_block, + burn_block_height, + rewards, + burns, + recipient_info, + consensus_hash, + parent_burn_block_hash, + ) + } } -#[derive(Debug, PartialEq, Clone, Serialize)] -pub struct NakamotoSignerEntryPayload { - #[serde(serialize_with = "hex_serialize")] - pub signing_key: [u8; 33], - #[serde(serialize_with = "serialize_u128_as_string")] - pub stacked_amt: u128, - pub weight: u32, -} - -impl RewardSetEventPayload { - pub fn signer_entry_to_payload(entry: &NakamotoSignerEntry) -> NakamotoSignerEntryPayload { - NakamotoSignerEntryPayload { - signing_key: entry.signing_key, - stacked_amt: entry.stacked_amt, - weight: entry.weight, - } - } - pub fn from_reward_set(reward_set: &RewardSet) -> Self { - Self { - rewarded_addresses: reward_set.rewarded_addresses.clone(), - start_cycle_state: reward_set.start_cycle_state.clone(), - signers: reward_set - .signers - .as_ref() - .map(|signers| signers.iter().map(Self::signer_entry_to_payload).collect()), - pox_ustx_threshold: reward_set.pox_ustx_threshold, - } - } -} - -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -pub struct TransactionEventPayload<'a> { - #[serde(with = "prefix_hex")] - /// The transaction id - pub txid: Txid, - /// The transaction index - pub tx_index: u32, - /// The transaction status - pub status: &'a str, - #[serde(with = "prefix_hex_codec")] - /// The raw transaction result - pub raw_result: Value, - /// The hex encoded raw transaction - #[serde(with = "prefix_string_0x")] - pub raw_tx: String, - /// The contract interface - pub contract_interface: Option, - /// The burnchain op - #[serde( - serialize_with = "blockstack_op_extended_serialize_opt", - deserialize_with = "blockstack_op_extended_deserialize" - )] - pub burnchain_op: Option, - /// The transaction execution cost - pub execution_cost: ExecutionCost, - /// The microblock sequence - pub microblock_sequence: Option, - #[serde(with = "prefix_opt_hex")] - /// The microblock hash - pub microblock_hash: Option, - #[serde(with = "prefix_opt_hex")] - /// The microblock parent hash - pub microblock_parent_hash: Option, - /// Error information if one occurred in the Clarity VM - pub vm_error: Option, -} - -#[cfg(test)] -static TEST_EVENT_OBSERVER_SKIP_RETRY: LazyLock> = LazyLock::new(TestFlag::default); - -impl EventObserver { - fn get_payload_column_type(conn: &Connection) -> Result, db_error> { - let mut stmt = conn.prepare("PRAGMA table_info(pending_payloads)")?; - let rows = stmt.query_map([], |row| { - let name: String = row.get(1)?; - let col_type: String = row.get(2)?; - Ok((name, col_type)) - })?; - - for row in rows { - let (name, col_type) = row?; - if name == "payload" { - return Ok(Some(col_type)); - } - } - - Ok(None) - } - - fn migrate_payload_column_to_blob(conn: &mut Connection) -> Result<(), db_error> { - let tx = conn.transaction()?; - tx.execute( - "ALTER TABLE pending_payloads RENAME TO pending_payloads_old", - [], - )?; - tx.execute( - "CREATE TABLE pending_payloads ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - url TEXT NOT NULL, - payload BLOB NOT NULL, - timeout INTEGER NOT NULL - )", - [], - )?; - tx.execute( - "INSERT INTO pending_payloads (id, url, payload, timeout) - SELECT id, url, CAST(payload AS BLOB), timeout FROM pending_payloads_old", - [], - )?; - tx.execute("DROP TABLE pending_payloads_old", [])?; - tx.commit()?; - Ok(()) - } - - fn insert_payload( - conn: &Connection, - url: &str, - payload_bytes: &[u8], - timeout: Duration, - ) -> Result<(), db_error> { - let timeout_ms: u64 = timeout.as_millis().try_into().expect("Timeout too large"); - conn.execute( - "INSERT INTO pending_payloads (url, payload, timeout) VALUES (?1, ?2, ?3)", - params![url, payload_bytes, timeout_ms], - )?; - Ok(()) - } - - /// Insert a payload into the database, retrying on failure. - fn insert_payload_with_retry( - conn: &Connection, - url: &str, - payload_bytes: &[u8], - timeout: Duration, - ) { - let mut attempts = 0i64; - let mut backoff = Duration::from_millis(100); // Initial backoff duration - let max_backoff = Duration::from_secs(5); // Cap the backoff duration - - loop { - match Self::insert_payload(conn, url, payload_bytes, timeout) { - Ok(_) => { - // Successful insert, break the loop - return; - } - Err(err) => { - // Log the error, then retry after a delay - warn!("Failed to insert payload into event observer database: {err:?}"; - "backoff" => ?backoff, - "attempts" => attempts - ); - - // Wait for the backoff duration - sleep(backoff); - - // Increase the backoff duration (with exponential backoff) - backoff = std::cmp::min(backoff.saturating_mul(2), max_backoff); - - attempts = attempts.saturating_add(1); - } - } - } - } - - fn delete_payload(conn: &Connection, id: i64) -> Result<(), db_error> { - conn.execute("DELETE FROM pending_payloads WHERE id = ?1", params![id])?; - Ok(()) - } - - fn send_payload_directly( - payload_bytes: &Arc<[u8]>, - full_url: &str, - timeout: Duration, - disable_retries: bool, - ) -> bool { - debug!( - "Event dispatcher: Sending payload"; "url" => %full_url, "bytes" => payload_bytes.len() - ); - - let url = Url::parse(full_url) - .unwrap_or_else(|_| panic!("Event dispatcher: unable to parse {full_url} as a URL")); - - let host = url.host_str().expect("Invalid URL: missing host"); - let port = url.port_or_known_default().unwrap_or(80); - let peerhost: PeerHost = format!("{host}:{port}") - .parse() - .unwrap_or(PeerHost::DNS(host.to_string(), port)); - - let mut backoff = Duration::from_millis(100); - let mut attempts: i32 = 0; - // Cap the backoff at 3x the timeout - let max_backoff = timeout.saturating_mul(3); - - loop { - let mut request = StacksHttpRequest::new_for_peer( - peerhost.clone(), - "POST".into(), - url.path().into(), - HttpRequestContents::new().payload_json_bytes(Arc::clone(payload_bytes)), - ) - .unwrap_or_else(|_| panic!("FATAL: failed to encode infallible data as HTTP request")); - request.add_header("Connection".into(), "close".into()); - match send_http_request(host, port, request, timeout) { - Ok(response) => { - if response.preamble().status_code == 200 { - debug!( - "Event dispatcher: Successful POST"; "url" => %url - ); - break; - } else { - error!( - "Event dispatcher: Failed POST"; "url" => %url, "response" => ?response.preamble() - ); - } - } - Err(err) => { - warn!( - "Event dispatcher: connection or request failed to {host}:{port} - {err:?}"; - "backoff" => ?backoff, - "attempts" => attempts - ); - } - } - - if disable_retries { - warn!("Observer is configured in disable_retries mode: skipping retry of payload"); - return false; - } - - #[cfg(test)] - if TEST_EVENT_OBSERVER_SKIP_RETRY.get() { - warn!("Fault injection: skipping retry of payload"); - return false; - } - - sleep(backoff); - let jitter: u64 = rand::thread_rng().gen_range(0..100); - backoff = std::cmp::min( - backoff.saturating_mul(2) + Duration::from_millis(jitter), - max_backoff, - ); - attempts = attempts.saturating_add(1); - } - true - } - - fn new( - db_path: Option, - endpoint: String, - timeout: Duration, - disable_retries: bool, - ) -> Self { - EventObserver { - db_path, - endpoint, - timeout, - disable_retries, - } - } - - /// Send the payload to the given URL. - /// Before sending this payload, any pending payloads in the database will be sent first. - pub fn send_payload(&self, payload: &serde_json::Value, path: &str, id: Option) { - let payload_bytes = match serde_json::to_vec(payload) { - Ok(bytes) => Arc::<[u8]>::from(bytes), - Err(err) => { - error!( - "Event dispatcher: failed to serialize payload"; "path" => path, "error" => ?err - ); - return; - } - }; - self.send_payload_with_bytes(payload_bytes, path, id); - } - - fn send_payload_with_bytes(&self, payload_bytes: Arc<[u8]>, path: &str, id: Option) { - // Construct the full URL - let url_str = if path.starts_with('/') { - format!("{}{path}", &self.endpoint) - } else { - format!("{}/{path}", &self.endpoint) - }; - let full_url = format!("http://{url_str}"); - - // if the observer is in "disable_retries" mode quickly send the payload without checking for the db - if self.disable_retries { - Self::send_payload_directly(&payload_bytes, &full_url, self.timeout, true); - } else if let Some(db_path) = &self.db_path { - let conn = - Connection::open(db_path).expect("Failed to open database for event observer"); - - let id = match id { - Some(id) => id, - None => { - Self::insert_payload_with_retry( - &conn, - &full_url, - payload_bytes.as_ref(), - self.timeout, - ); - conn.last_insert_rowid() - } - }; - - let success = - Self::send_payload_directly(&payload_bytes, &full_url, self.timeout, false); - // This is only `false` when the TestFlag is set to skip retries - if !success { - return; - } - - if let Err(e) = Self::delete_payload(&conn, id) { - error!( - "Event observer: failed to delete pending payload from database"; - "error" => ?e - ); - } - } else { - // No database, just send the payload - Self::send_payload_directly(&payload_bytes, &full_url, self.timeout, false); - } - } - - fn make_new_mempool_txs_payload(transactions: Vec) -> serde_json::Value { - let raw_txs = transactions - .into_iter() - .map(|tx| serde_json::Value::String(to_hex_prefixed(&tx.serialize_to_vec(), true))) - .collect(); - - serde_json::Value::Array(raw_txs) - } - - fn make_new_burn_block_payload( - burn_block: &BurnchainHeaderHash, - burn_block_height: u64, - rewards: Vec<(PoxAddress, u64)>, - burns: u64, - slot_holders: Vec, - consensus_hash: &ConsensusHash, - parent_burn_block_hash: &BurnchainHeaderHash, - ) -> serde_json::Value { - let reward_recipients = rewards - .into_iter() - .map(|(pox_addr, amt)| { - json!({ - "recipient": pox_addr.to_b58(), - "amt": amt, - }) - }) - .collect(); - - let reward_slot_holders = slot_holders - .into_iter() - .map(|pox_addr| json!(pox_addr.to_b58())) - .collect(); - - json!({ - "burn_block_hash": format!("0x{burn_block}"), - "burn_block_height": burn_block_height, - "reward_recipients": serde_json::Value::Array(reward_recipients), - "reward_slot_holders": serde_json::Value::Array(reward_slot_holders), - "burn_amount": burns, - "consensus_hash": format!("0x{consensus_hash}"), - "parent_burn_block_hash": format!("0x{parent_burn_block_hash}"), - }) - } - - /// Returns transaction event payload to send for new block or microblock event - fn make_new_block_txs_payload( - receipt: &StacksTransactionReceipt, - tx_index: u32, - ) -> TransactionEventPayload<'_> { - let tx = &receipt.transaction; - - let status = match (receipt.post_condition_aborted, &receipt.result) { - (false, Value::Response(response_data)) => { - if response_data.committed { - STATUS_RESP_TRUE - } else { - STATUS_RESP_NOT_COMMITTED - } - } - (true, Value::Response(_)) => STATUS_RESP_POST_CONDITION, - _ => { - if !matches!( - tx, - TransactionOrigin::Stacks(StacksTransaction { - payload: TransactionPayload::PoisonMicroblock(_, _), - .. - }) - ) { - unreachable!("Unexpected transaction result type"); - } - STATUS_RESP_TRUE - } - }; - - let (txid, raw_tx, burnchain_op) = match tx { - TransactionOrigin::Burn(op) => (op.txid(), "00".to_string(), Some(op.clone())), - TransactionOrigin::Stacks(ref tx) => { - let txid = tx.txid(); - let bytes = to_hex(&tx.serialize_to_vec()); - (txid, bytes, None) - } - }; - - TransactionEventPayload { - txid, - tx_index, - status, - raw_result: receipt.result.clone(), - raw_tx, - contract_interface: receipt.contract_analysis.as_ref().map(|analysis| { - build_contract_interface(analysis) - .expect("FATAL: failed to serialize contract publish receipt") - }), - burnchain_op, - execution_cost: receipt.execution_cost.clone(), - microblock_sequence: receipt.microblock_header.as_ref().map(|x| x.sequence), - microblock_hash: receipt.microblock_header.as_ref().map(|x| x.block_hash()), - microblock_parent_hash: receipt - .microblock_header - .as_ref() - .map(|x| x.prev_block.clone()), - vm_error: receipt.vm_error.clone(), - } - } - - fn make_new_attachment_payload( - attachment: &(AttachmentInstance, Attachment), - ) -> serde_json::Value { - json!({ - "attachment_index": attachment.0.attachment_index, - "index_block_hash": format!("0x{}", attachment.0.index_block_hash), - "block_height": attachment.0.stacks_block_height, - "content_hash": format!("0x{}", attachment.0.content_hash), - "contract_id": format!("{}", attachment.0.contract_id), - "metadata": format!("0x{}", attachment.0.metadata), - "tx_id": format!("0x{}", attachment.0.tx_id), - "content": to_hex_prefixed(&attachment.1.content, true), - }) - } - - fn send_new_attachments(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_ATTACHMENT_PROCESSED, None); - } - - fn send_new_mempool_txs(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_MEMPOOL_TX_SUBMIT, None); - } - - /// Serializes new microblocks data into a JSON payload and sends it off to the correct path - fn send_new_microblocks( - &self, - parent_index_block_hash: &StacksBlockId, - filtered_events: &[(usize, &(bool, Txid, &StacksTransactionEvent))], - serialized_txs: &[TransactionEventPayload], - burn_block_hash: &BurnchainHeaderHash, - burn_block_height: u32, - burn_block_timestamp: u64, - ) { - // Serialize events to JSON - let serialized_events: Vec = filtered_events - .iter() - .map(|(event_index, (committed, txid, event))| { - event - .json_serialize(*event_index, txid, *committed) - .unwrap() - }) - .collect(); - - let payload = json!({ - "parent_index_block_hash": format!("0x{parent_index_block_hash}"), - "events": serialized_events, - "transactions": serialized_txs, - "burn_block_hash": format!("0x{burn_block_hash}"), - "burn_block_height": burn_block_height, - "burn_block_timestamp": burn_block_timestamp, - }); - - self.send_payload(&payload, PATH_MICROBLOCK_SUBMIT, None); - } - - fn send_dropped_mempool_txs(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_MEMPOOL_TX_DROP, None); - } - - fn send_mined_block(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_MINED_BLOCK, None); - } - - fn send_mined_microblock(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_MINED_MICROBLOCK, None); - } - - fn send_mined_nakamoto_block(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_MINED_NAKAMOTO_BLOCK, None); - } - - pub fn send_stackerdb_chunks(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_STACKERDB_CHUNKS, None); - } - - fn send_new_burn_block(&self, payload: &serde_json::Value) { - self.send_payload(payload, PATH_BURN_BLOCK_SUBMIT, None); - } - - #[allow(clippy::too_many_arguments)] - fn make_new_block_processed_payload( - &self, - filtered_events: Vec<(usize, &(bool, Txid, &StacksTransactionEvent))>, - block: &StacksBlockEventData, - metadata: &StacksHeaderInfo, - receipts: &[StacksTransactionReceipt], - parent_index_hash: &StacksBlockId, - winner_txid: &Txid, - mature_rewards: &serde_json::Value, - parent_burn_block_hash: &BurnchainHeaderHash, - parent_burn_block_height: u32, - parent_burn_block_timestamp: u64, - anchored_consumed: &ExecutionCost, - mblock_confirmed_consumed: &ExecutionCost, - pox_constants: &PoxConstants, - reward_set_data: &Option, - signer_bitvec_opt: &Option>, - block_timestamp: Option, - coinbase_height: u64, - ) -> serde_json::Value { - // Serialize events to JSON - let serialized_events: Vec = filtered_events - .iter() - .map(|(event_index, (committed, txid, event))| { - event - .json_serialize(*event_index, txid, *committed) - .unwrap() - }) - .collect(); - - let mut serialized_txs = vec![]; - for (tx_index, receipt) in receipts.iter().enumerate() { - let payload = EventObserver::make_new_block_txs_payload( - receipt, - tx_index - .try_into() - .expect("BUG: more receipts than U32::MAX"), - ); - serialized_txs.push(payload); - } - - let signer_bitvec_value = signer_bitvec_opt - .as_ref() - .map(|bitvec| serde_json::to_value(bitvec).unwrap_or_default()) - .unwrap_or_default(); - - let (reward_set_value, cycle_number_value) = match &reward_set_data { - Some(data) => ( - serde_json::to_value(RewardSetEventPayload::from_reward_set(&data.reward_set)) - .unwrap_or_default(), - serde_json::to_value(data.cycle_number).unwrap_or_default(), - ), - None => (serde_json::Value::Null, serde_json::Value::Null), - }; - - // Wrap events - let mut payload = json!({ - "block_hash": format!("0x{}", block.block_hash), - "block_height": metadata.stacks_block_height, - "block_time": block_timestamp, - "burn_block_hash": format!("0x{}", metadata.burn_header_hash), - "burn_block_height": metadata.burn_header_height, - "miner_txid": format!("0x{winner_txid}"), - "burn_block_time": metadata.burn_header_timestamp, - "index_block_hash": format!("0x{}", metadata.index_block_hash()), - "parent_block_hash": format!("0x{}", block.parent_block_hash), - "parent_index_block_hash": format!("0x{parent_index_hash}"), - "parent_microblock": format!("0x{}", block.parent_microblock_hash), - "parent_microblock_sequence": block.parent_microblock_sequence, - "matured_miner_rewards": mature_rewards.clone(), - "events": serialized_events, - "transactions": serialized_txs, - "parent_burn_block_hash": format!("0x{parent_burn_block_hash}"), - "parent_burn_block_height": parent_burn_block_height, - "parent_burn_block_timestamp": parent_burn_block_timestamp, - "anchored_cost": anchored_consumed, - "confirmed_microblocks_cost": mblock_confirmed_consumed, - "pox_v1_unlock_height": pox_constants.v1_unlock_height, - "pox_v2_unlock_height": pox_constants.v2_unlock_height, - "pox_v3_unlock_height": pox_constants.v3_unlock_height, - "signer_bitvec": signer_bitvec_value, - "reward_set": reward_set_value, - "cycle_number": cycle_number_value, - "tenure_height": coinbase_height, - "consensus_hash": format!("0x{}", metadata.consensus_hash), - }); - - let as_object_mut = payload.as_object_mut().unwrap(); - - if let StacksBlockHeaderTypes::Nakamoto(ref header) = &metadata.anchored_header { - as_object_mut.insert( - "signer_signature_hash".into(), - format!("0x{}", header.signer_signature_hash()).into(), - ); - as_object_mut.insert( - "miner_signature".into(), - format!("0x{}", &header.miner_signature).into(), - ); - as_object_mut.insert( - "signer_signature".into(), - serde_json::to_value(&header.signer_signature).unwrap_or_default(), - ); - } - - payload - } -} - -/// Events received from block-processing. -/// Stacks events are structured as JSON, and are grouped by topic. An event observer can -/// subscribe to one or more specific event streams, or the "any" stream to receive all of them. -#[derive(Clone)] -pub struct EventDispatcher { - /// List of configured event observers to which events will be posted. - /// The fields below this contain indexes into this list. - registered_observers: Vec, - /// Smart contract-specific events, keyed by (contract-id, event-name). Values are indexes into `registered_observers`. - contract_events_observers_lookup: HashMap<(QualifiedContractIdentifier, String), HashSet>, - /// Asset event observers, keyed by fully-qualified asset identifier. Values are indexes into - /// `registered_observers. - assets_observers_lookup: HashMap>, - /// Index into `registered_observers` that will receive burn block events - burn_block_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive mempool events - mempool_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive microblock events - microblock_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive STX events - stx_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive all events - any_event_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive block miner events (Stacks 2.5 and - /// lower) - miner_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive microblock miner events (Stacks 2.5 and - /// lower) - mined_microblocks_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive StackerDB events - stackerdb_observers_lookup: HashSet, - /// Index into `registered_observers` that will receive block proposal events (Nakamoto and - /// later) - block_proposal_observers_lookup: HashSet, - /// Channel for sending StackerDB events to the miner coordinator - pub stackerdb_channel: Arc>, - /// Database path for pending payloads - db_path: Option, -} - -/// This struct is used specifically for receiving proposal responses. -/// It's constructed separately to play nicely with threading. -struct ProposalCallbackHandler { - observers: Vec, -} - -impl ProposalCallbackReceiver for ProposalCallbackHandler { - fn notify_proposal_result(&self, result: Result) { - let response = match serde_json::to_value(BlockValidateResponse::from(result)) { - Ok(x) => x, - Err(e) => { - error!( - "Failed to serialize block proposal validation response, will not notify over event observer"; - "error" => ?e - ); - return; - } - }; - for observer in self.observers.iter() { - observer.send_payload(&response, PATH_PROPOSAL_RESPONSE, None); - } - } -} - -impl MemPoolEventDispatcher for EventDispatcher { - fn mempool_txs_dropped( - &self, - txids: Vec, - new_txid: Option, - reason: MemPoolDropReason, - ) { - if !txids.is_empty() { - self.process_dropped_mempool_txs(txids, new_txid, reason) - } - } - - fn mined_block_event( - &self, - target_burn_height: u64, - block: &StacksBlock, - block_size_bytes: u64, - consumed: &ExecutionCost, - confirmed_microblock_cost: &ExecutionCost, - tx_events: Vec, - ) { - self.process_mined_block_event( - target_burn_height, - block, - block_size_bytes, - consumed, - confirmed_microblock_cost, - tx_events, - ) - } - - fn mined_microblock_event( - &self, - microblock: &StacksMicroblock, - tx_events: Vec, - anchor_block_consensus_hash: ConsensusHash, - anchor_block: BlockHeaderHash, - ) { - self.process_mined_microblock_event( - microblock, - tx_events, - anchor_block_consensus_hash, - anchor_block, - ); - } - - fn mined_nakamoto_block_event( - &self, - target_burn_height: u64, - block: &NakamotoBlock, - block_size_bytes: u64, - consumed: &ExecutionCost, - tx_events: Vec, - ) { - self.process_mined_nakamoto_block_event( - target_burn_height, - block, - block_size_bytes, - consumed, - tx_events, - ) - } - - fn get_proposal_callback_receiver(&self) -> Option> { - let callback_receivers: Vec<_> = self - .block_proposal_observers_lookup - .iter() - .filter_map(|observer_ix| - match self.registered_observers.get(usize::from(*observer_ix)) { - Some(x) => Some(x.clone()), - None => { - warn!( - "Event observer index not found in registered observers. Ignoring that index."; - "index" => observer_ix, - "observers_len" => self.registered_observers.len() - ); - None - } - } - ) - .collect(); - if callback_receivers.is_empty() { - return None; - } - let handler = ProposalCallbackHandler { - observers: callback_receivers, - }; - Some(Box::new(handler)) - } -} - -impl StackerDBEventDispatcher for EventDispatcher { - /// Relay new StackerDB chunks - fn new_stackerdb_chunks( - &self, - contract_id: QualifiedContractIdentifier, - chunks: Vec, - ) { - self.process_new_stackerdb_chunks(contract_id, chunks); - } -} - -impl BlockEventDispatcher for EventDispatcher { - fn announce_block( - &self, - block: &StacksBlockEventData, - metadata: &StacksHeaderInfo, - receipts: &[StacksTransactionReceipt], - parent: &StacksBlockId, - winner_txid: &Txid, - mature_rewards: &[MinerReward], - mature_rewards_info: Option<&MinerRewardInfo>, - parent_burn_block_hash: &BurnchainHeaderHash, - parent_burn_block_height: u32, - parent_burn_block_timestamp: u64, - anchored_consumed: &ExecutionCost, - mblock_confirmed_consumed: &ExecutionCost, - pox_constants: &PoxConstants, - reward_set_data: &Option, - signer_bitvec: &Option>, - block_timestamp: Option, - coinbase_height: u64, - ) { - self.process_chain_tip( - block, - metadata, - receipts, - parent, - winner_txid, - mature_rewards, - mature_rewards_info, - parent_burn_block_hash, - parent_burn_block_height, - parent_burn_block_timestamp, - anchored_consumed, - mblock_confirmed_consumed, - pox_constants, - reward_set_data, - signer_bitvec, - block_timestamp, - coinbase_height, - ); - } - - fn announce_burn_block( - &self, - burn_block: &BurnchainHeaderHash, - burn_block_height: u64, - rewards: Vec<(PoxAddress, u64)>, - burns: u64, - recipient_info: Vec, - consensus_hash: &ConsensusHash, - parent_burn_block_hash: &BurnchainHeaderHash, - ) { - self.process_burn_block( - burn_block, - burn_block_height, - rewards, - burns, - recipient_info, - consensus_hash, - parent_burn_block_hash, - ) - } -} - -impl Default for EventDispatcher { - fn default() -> Self { - EventDispatcher::new(None) - } +impl Default for EventDispatcher { + fn default() -> Self { + EventDispatcher::new(None) + } } impl EventDispatcher { @@ -1197,7 +409,7 @@ impl EventDispatcher { return; } - let payload = EventObserver::make_new_burn_block_payload( + let payload = make_new_burn_block_payload( burn_block, burn_block_height, rewards, @@ -1208,7 +420,7 @@ impl EventDispatcher { ); for observer in interested_observers.iter() { - observer.send_new_burn_block(&payload); + self.send_new_burn_block(&observer, &payload); } } @@ -1370,29 +582,29 @@ impl EventDispatcher { .map(|event_id| (*event_id, &events[*event_id])) .collect(); - let payload = self.registered_observers[observer_id] - .make_new_block_processed_payload( - filtered_events, - block, - metadata, - receipts, - parent_index_hash, - &winner_txid, - &mature_rewards, - parent_burn_block_hash, - parent_burn_block_height, - parent_burn_block_timestamp, - anchored_consumed, - mblock_confirmed_consumed, - pox_constants, - reward_set_data, - signer_bitvec, - block_timestamp, - coinbase_height, - ); + let payload = make_new_block_processed_payload( + filtered_events, + block, + metadata, + receipts, + parent_index_hash, + &winner_txid, + &mature_rewards, + parent_burn_block_hash, + parent_burn_block_height, + parent_burn_block_timestamp, + anchored_consumed, + mblock_confirmed_consumed, + pox_constants, + reward_set_data, + signer_bitvec, + block_timestamp, + coinbase_height, + ); // Send payload - self.registered_observers[observer_id].send_payload( + self.send_payload( + &self.registered_observers[observer_id], &payload, PATH_BLOCK_PROCESSED, None, @@ -1440,7 +652,7 @@ impl EventDispatcher { for (_, _, receipts) in processed_unconfirmed_state.receipts.iter() { tx_index = 0; for receipt in receipts.iter() { - let payload = EventObserver::make_new_block_txs_payload(receipt, tx_index); + let payload = make_new_block_txs_payload(receipt, tx_index); serialized_txs.push(payload); tx_index += 1; } @@ -1453,7 +665,8 @@ impl EventDispatcher { .map(|event_id| (*event_id, &events[*event_id])) .collect(); - observer.send_new_microblocks( + self.send_new_microblocks( + observer, &parent_index_block_hash, &filtered_events, &serialized_txs, @@ -1489,10 +702,10 @@ impl EventDispatcher { return; } - let payload = EventObserver::make_new_mempool_txs_payload(txs); + let payload = make_new_mempool_txs_payload(txs); for observer in interested_observers.iter() { - observer.send_new_mempool_txs(&payload); + self.send_new_mempool_txs(observer, &payload); } } @@ -1523,7 +736,7 @@ impl EventDispatcher { .unwrap(); for observer in interested_observers.iter() { - observer.send_mined_block(&payload); + self.send_mined_block(observer, &payload); } } @@ -1550,7 +763,7 @@ impl EventDispatcher { .unwrap(); for observer in interested_observers.iter() { - observer.send_mined_microblock(&payload); + self.send_mined_microblock(observer, &payload); } } @@ -1591,7 +804,7 @@ impl EventDispatcher { .unwrap(); for observer in interested_observers.iter() { - observer.send_mined_nakamoto_block(&payload); + self.send_mined_nakamoto_block(observer, &payload); } } @@ -1634,7 +847,7 @@ impl EventDispatcher { } for observer in interested_observers.iter() { - observer.send_stackerdb_chunks(&payload); + self.send_stackerdb_chunks(observer, &payload); } } @@ -1674,7 +887,7 @@ impl EventDispatcher { }; for observer in interested_observers.iter() { - observer.send_dropped_mempool_txs(&payload); + self.send_dropped_mempool_txs(observer, &payload); } } @@ -1686,12 +899,12 @@ impl EventDispatcher { let mut serialized_attachments = vec![]; for attachment in attachments.iter() { - let payload = EventObserver::make_new_attachment_payload(attachment); + let payload = make_new_attachment_payload(attachment); serialized_attachments.push(payload); } for (_, observer) in interested_observers.iter() { - observer.send_new_attachments(&json!(serialized_attachments)); + self.send_new_attachments(observer, &json!(serialized_attachments)); } } @@ -1708,10 +921,13 @@ impl EventDispatcher { } } - pub fn register_observer(&mut self, conf: &EventObserverConfig) -> EventObserver { + pub fn register_observer(&mut self, conf: &EventObserverConfig) { + self.register_observer_private(conf); + } + + fn register_observer_private(&mut self, conf: &EventObserverConfig) -> EventObserver { info!("Registering event observer at: {}", conf.endpoint); let event_observer = EventObserver::new( - self.db_path.clone(), conf.endpoint.clone(), Duration::from_millis(conf.timeout_ms), conf.disable_retries, @@ -1783,1203 +999,341 @@ impl EventDispatcher { EventKeyType::BlockProposal => { self.block_proposal_observers_lookup.insert(observer_index); } - } - } - - self.registered_observers.push(event_observer.clone()); - - event_observer - } - - fn init_db(db_path: &PathBuf) -> Result { - let mut conn = Connection::open(db_path.to_str().unwrap())?; - conn.execute( - "CREATE TABLE IF NOT EXISTS pending_payloads ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - url TEXT NOT NULL, - payload BLOB NOT NULL, - timeout INTEGER NOT NULL - )", - [], - )?; - if let Some(col_type) = EventObserver::get_payload_column_type(&conn)? { - if col_type.eq_ignore_ascii_case("TEXT") { - info!("Event observer: migrating pending_payloads.payload from TEXT to BLOB"); - EventObserver::migrate_payload_column_to_blob(&mut conn)?; - } - } - Ok(conn) - } - - fn get_pending_payloads( - conn: &Connection, - ) -> Result, u64)>, db_error> { - let mut stmt = - conn.prepare("SELECT id, url, payload, timeout FROM pending_payloads ORDER BY id")?; - let payload_iter = stmt.query_and_then( - [], - |row| -> Result<(i64, String, Arc<[u8]>, u64), db_error> { - let id: i64 = row.get(0)?; - let url: String = row.get(1)?; - let payload_bytes: Vec = row.get(2)?; - let payload_bytes = Arc::<[u8]>::from(payload_bytes); - let timeout_ms: u64 = row.get(3)?; - Ok((id, url, payload_bytes, timeout_ms)) - }, - )?; - payload_iter.collect() - } - - fn delete_payload(conn: &Connection, id: i64) -> Result<(), db_error> { - conn.execute("DELETE FROM pending_payloads WHERE id = ?1", params![id])?; - Ok(()) - } - - /// Process any pending payloads in the database. - /// This is called when the event dispatcher is first instantiated. - pub fn process_pending_payloads(&self) { - let Some(db_path) = &self.db_path else { - return; - }; - let conn = EventDispatcher::init_db(db_path).expect("Failed to initialize database"); - let pending_payloads = match Self::get_pending_payloads(&conn) { - Ok(payloads) => payloads, - Err(e) => { - error!( - "Event observer: failed to retrieve pending payloads from database"; - "error" => ?e - ); - return; - } - }; - - info!( - "Event dispatcher: processing {} pending payloads", - pending_payloads.len() - ); - - for (id, url, payload_bytes, _timeout_ms) in pending_payloads { - info!("Event dispatcher: processing pending payload: {url}"); - let full_url = Url::parse(url.as_str()) - .unwrap_or_else(|_| panic!("Event dispatcher: unable to parse {url} as a URL")); - // find the right observer - let observer = self.registered_observers.iter().find(|observer| { - let endpoint_url = Url::parse(format!("http://{}", &observer.endpoint).as_str()) - .unwrap_or_else(|_| { - panic!( - "Event dispatcher: unable to parse {} as a URL", - observer.endpoint - ) - }); - full_url.origin() == endpoint_url.origin() - }); - - let Some(observer) = observer else { - // This observer is no longer registered, skip and delete - info!( - "Event dispatcher: observer {} no longer registered, skipping", - url - ); - if let Err(e) = Self::delete_payload(&conn, id) { - error!( - "Event observer: failed to delete pending payload from database"; - "error" => ?e - ); - } - continue; - }; - - observer.send_payload_with_bytes(payload_bytes, full_url.path(), Some(id)); - - #[cfg(test)] - if TEST_EVENT_OBSERVER_SKIP_RETRY.get() { - warn!("Fault injection: delete_payload"); - return; - } - - if let Err(e) = Self::delete_payload(&conn, id) { - error!( - "Event observer: failed to delete pending payload from database"; - "error" => ?e - ); - } - } - } -} - -#[cfg(any(test, feature = "testing"))] -fn test_skip_block_announcement(block: &StacksBlockEventData) -> bool { - if TEST_SKIP_BLOCK_ANNOUNCEMENT.get() { - warn!( - "Skipping new block announcement due to testing directive"; - "block_hash" => %block.block_hash - ); - return true; - } - false -} - -#[cfg(test)] -mod test { - use std::net::TcpListener; - use std::thread; - use std::time::Instant; - - use clarity::boot_util::boot_code_id; - use clarity::vm::costs::ExecutionCost; - use clarity::vm::events::SmartContractEventData; - use clarity::vm::types::StacksAddressExtensions; - use serial_test::serial; - use stacks::address::{AddressHashMode, C32_ADDRESS_VERSION_TESTNET_SINGLESIG}; - use stacks::burnchains::{PoxConstants, Txid}; - use stacks::chainstate::burn::operations::PreStxOp; - use stacks::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader}; - use stacks::chainstate::stacks::db::{StacksBlockHeaderTypes, StacksHeaderInfo}; - use stacks::chainstate::stacks::events::StacksBlockEventData; - use stacks::chainstate::stacks::{ - SinglesigHashMode, SinglesigSpendingCondition, StacksBlock, TenureChangeCause, - TenureChangePayload, TokenTransferMemo, TransactionAnchorMode, TransactionAuth, - TransactionPostConditionMode, TransactionPublicKeyEncoding, TransactionSpendingCondition, - TransactionVersion, - }; - use stacks::types::chainstate::{ - BlockHeaderHash, StacksAddress, StacksPrivateKey, StacksPublicKey, - }; - use stacks::util::hash::Hash160; - use stacks::util::secp256k1::MessageSignature; - use stacks_common::bitvec::BitVec; - use stacks_common::types::chainstate::{BurnchainHeaderHash, StacksBlockId}; - use tempfile::tempdir; - use tiny_http::{Method, Response, Server, StatusCode}; - - use super::*; - - #[test] - fn build_block_processed_event() { - let observer = - EventObserver::new(None, "nowhere".to_string(), Duration::from_secs(3), false); - - let filtered_events = vec![]; - let block = StacksBlock::genesis_block(); - let metadata = StacksHeaderInfo::regtest_genesis(); - let receipts = vec![]; - let parent_index_hash = StacksBlockId([0; 32]); - let winner_txid = Txid([0; 32]); - let mature_rewards = serde_json::Value::Array(vec![]); - let parent_burn_block_hash = BurnchainHeaderHash([0; 32]); - let parent_burn_block_height = 0; - let parent_burn_block_timestamp = 0; - let anchored_consumed = ExecutionCost::ZERO; - let mblock_confirmed_consumed = ExecutionCost::ZERO; - let pox_constants = PoxConstants::testnet_default(); - let signer_bitvec = BitVec::zeros(2).expect("Failed to create BitVec with length 2"); - let block_timestamp = Some(123456); - let coinbase_height = 1234; - - let payload = observer.make_new_block_processed_payload( - filtered_events, - &block.into(), - &metadata, - &receipts, - &parent_index_hash, - &winner_txid, - &mature_rewards, - &parent_burn_block_hash, - parent_burn_block_height, - parent_burn_block_timestamp, - &anchored_consumed, - &mblock_confirmed_consumed, - &pox_constants, - &None, - &Some(signer_bitvec.clone()), - block_timestamp, - coinbase_height, - ); - assert_eq!( - payload - .get("pox_v1_unlock_height") - .unwrap() - .as_u64() - .unwrap(), - pox_constants.v1_unlock_height as u64 - ); - - let expected_bitvec_str = serde_json::to_value(signer_bitvec) - .unwrap_or_default() - .as_str() - .unwrap() - .to_string(); - assert_eq!( - payload.get("signer_bitvec").unwrap().as_str().unwrap(), - expected_bitvec_str - ); - } - - #[test] - fn test_block_processed_event_nakamoto() { - let observer = - EventObserver::new(None, "nowhere".to_string(), Duration::from_secs(3), false); - - let filtered_events = vec![]; - let mut block_header = NakamotoBlockHeader::empty(); - let signer_signature = vec![ - MessageSignature::from_bytes(&[0; 65]).unwrap(), - MessageSignature::from_bytes(&[1; 65]).unwrap(), - ]; - block_header.signer_signature = signer_signature.clone(); - let block = NakamotoBlock { - header: block_header.clone(), - txs: vec![], - }; - let mut metadata = StacksHeaderInfo::regtest_genesis(); - metadata.anchored_header = StacksBlockHeaderTypes::Nakamoto(block_header); - let receipts = vec![]; - let parent_index_hash = StacksBlockId([0; 32]); - let winner_txid = Txid([0; 32]); - let mature_rewards = serde_json::Value::Array(vec![]); - let parent_burn_block_hash = BurnchainHeaderHash([0; 32]); - let parent_burn_block_height = 0; - let parent_burn_block_timestamp = 0; - let anchored_consumed = ExecutionCost::ZERO; - let mblock_confirmed_consumed = ExecutionCost::ZERO; - let pox_constants = PoxConstants::testnet_default(); - let signer_bitvec = BitVec::zeros(2).expect("Failed to create BitVec with length 2"); - let block_timestamp = Some(123456); - let coinbase_height = 1234; - - let payload = observer.make_new_block_processed_payload( - filtered_events, - &StacksBlockEventData::from((block, BlockHeaderHash([0; 32]))), - &metadata, - &receipts, - &parent_index_hash, - &winner_txid, - &mature_rewards, - &parent_burn_block_hash, - parent_burn_block_height, - parent_burn_block_timestamp, - &anchored_consumed, - &mblock_confirmed_consumed, - &pox_constants, - &None, - &Some(signer_bitvec), - block_timestamp, - coinbase_height, - ); - - let event_signer_signature = payload - .get("signer_signature") - .unwrap() - .as_array() - .expect("Expected signer_signature to be an array") - .iter() - .cloned() - .map(serde_json::from_value::) - .collect::, _>>() - .expect("Unable to deserialize array of MessageSignature"); - assert_eq!(event_signer_signature, signer_signature); - } - - #[test] - fn test_send_request_connect_timeout() { - let timeout_duration = Duration::from_secs(3); - - // Start measuring time - let start_time = Instant::now(); - - let host = "10.255.255.1"; // non-routable IP for timeout - let port = 80; - - let peerhost: PeerHost = format!("{host}:{port}") - .parse() - .unwrap_or(PeerHost::DNS(host.to_string(), port)); - let mut request = StacksHttpRequest::new_for_peer( - peerhost, - "POST".into(), - "/".into(), - HttpRequestContents::new().payload_json(serde_json::from_slice(b"{}").unwrap()), - ) - .unwrap_or_else(|_| panic!("FATAL: failed to encode infallible data as HTTP request")); - request.add_header("Connection".into(), "close".into()); - - // Attempt to send a request with a timeout - let result = send_http_request(host, port, request, timeout_duration); - - // Measure the elapsed time - let elapsed_time = start_time.elapsed(); - - // Assert that the connection attempt timed out - assert!( - result.is_err(), - "Expected a timeout error, but got {result:?}" - ); - assert_eq!( - result.unwrap_err().kind(), - std::io::ErrorKind::TimedOut, - "Expected a TimedOut error" - ); - - // Assert that the elapsed time is within an acceptable range - assert!( - elapsed_time >= timeout_duration, - "Timeout occurred too quickly" - ); - assert!( - elapsed_time < timeout_duration + Duration::from_secs(1), - "Timeout took too long" - ); - } - - fn get_random_port() -> u16 { - // Bind to a random port by specifying port 0, then retrieve the port assigned by the OS - let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to a random port"); - listener.local_addr().unwrap().port() - } - - #[test] - fn test_init_db() { - let dir = tempdir().unwrap(); - let db_path = dir.path().join("test_init_db.sqlite"); - - // Call init_db - let conn_result = EventDispatcher::init_db(&db_path); - assert!(conn_result.is_ok(), "Failed to initialize the database"); - - // Check that the database file exists - assert!(db_path.exists(), "Database file was not created"); - - // Check that the table exists - let conn = conn_result.unwrap(); - let mut stmt = conn - .prepare( - "SELECT name FROM sqlite_master WHERE type='table' AND name='pending_payloads'", - ) - .unwrap(); - let table_exists = stmt.exists([]).unwrap(); - assert!(table_exists, "Table 'pending_payloads' does not exist"); - } - - #[test] - fn test_migrate_payload_column_to_blob() { - let dir = tempdir().unwrap(); - let db_path = dir.path().join("test_payload_migration.sqlite"); - - // Simulate old schema with TEXT payloads. - let conn = Connection::open(&db_path).unwrap(); - conn.execute( - "CREATE TABLE pending_payloads ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - url TEXT NOT NULL, - payload TEXT NOT NULL, - timeout INTEGER NOT NULL - )", - [], - ) - .unwrap(); - let payload_str = "{\"key\":\"value\"}"; - conn.execute( - "INSERT INTO pending_payloads (url, payload, timeout) VALUES (?1, ?2, ?3)", - params!["http://example.com/api", payload_str, 5000i64], - ) - .unwrap(); - drop(conn); - - let conn = EventDispatcher::init_db(&db_path).expect("Failed to initialize the database"); - - let col_type: String = conn - .query_row( - "SELECT type FROM pragma_table_info('pending_payloads') WHERE name = 'payload'", - [], - |row| row.get(0), - ) - .unwrap(); - assert!( - col_type.eq_ignore_ascii_case("BLOB"), - "Payload column was not migrated to BLOB" - ); - - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - assert_eq!(pending_payloads.len(), 1, "Expected one pending payload"); - assert_eq!( - pending_payloads[0].2.as_ref(), - payload_str.as_bytes(), - "Payload contents did not survive migration" - ); - } - - #[test] - fn test_insert_and_get_pending_payloads() { - let dir = tempdir().unwrap(); - let db_path = dir.path().join("test_payloads.sqlite"); - - let conn = EventDispatcher::init_db(&db_path).expect("Failed to initialize the database"); - - let url = "http://example.com/api"; - let payload = json!({"key": "value"}); - let timeout = Duration::from_secs(5); - let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); - - // Insert payload - let insert_result = - EventObserver::insert_payload(&conn, url, payload_bytes.as_slice(), timeout); - assert!(insert_result.is_ok(), "Failed to insert payload"); - - // Get pending payloads - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - assert_eq!(pending_payloads.len(), 1, "Expected one pending payload"); - - let (_id, retrieved_url, stored_bytes, timeout_ms) = &pending_payloads[0]; - assert_eq!(retrieved_url, url, "URL does not match"); - assert_eq!( - stored_bytes.as_ref(), - payload_bytes.as_slice(), - "Serialized payload does not match" - ); - assert_eq!( - *timeout_ms, - timeout.as_millis() as u64, - "Timeout does not match" - ); - } - - #[test] - fn test_delete_payload() { - let dir = tempdir().unwrap(); - let db_path = dir.path().join("test_delete_payload.sqlite"); - - let conn = EventDispatcher::init_db(&db_path).expect("Failed to initialize the database"); - - let url = "http://example.com/api"; - let payload = json!({"key": "value"}); - let timeout = Duration::from_secs(5); - let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); - - // Insert payload - EventObserver::insert_payload(&conn, url, payload_bytes.as_slice(), timeout) - .expect("Failed to insert payload"); - - // Get pending payloads - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - assert_eq!(pending_payloads.len(), 1, "Expected one pending payload"); - - let (id, _, _, _) = pending_payloads[0]; - - // Delete payload - let delete_result = EventObserver::delete_payload(&conn, id); - assert!(delete_result.is_ok(), "Failed to delete payload"); - - // Verify that the pending payloads list is empty - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - assert_eq!(pending_payloads.len(), 0, "Expected no pending payloads"); - } - - #[test] - #[serial] - fn test_process_pending_payloads() { - use mockito::Matcher; - - let dir = tempdir().unwrap(); - let db_path = dir.path().join("event_observers.sqlite"); - let mut server = mockito::Server::new(); - let endpoint = server.host_with_port(); - info!("endpoint: {}", endpoint); - let timeout = Duration::from_secs(5); - - let mut dispatcher = EventDispatcher::new(Some(dir.path().to_path_buf())); - - dispatcher.register_observer(&EventObserverConfig { - endpoint: endpoint.clone(), - events_keys: vec![EventKeyType::AnyEvent], - timeout_ms: timeout.as_millis() as u64, - disable_retries: false, - }); - - let conn = EventDispatcher::init_db(&db_path).expect("Failed to initialize the database"); - - let payload = json!({"key": "value"}); - let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); - let timeout = Duration::from_secs(5); - - let _m = server - .mock("POST", "/api") - .match_header("content-type", Matcher::Regex("application/json.*".into())) - .match_body(Matcher::Json(payload.clone())) - .with_status(200) - .create(); - - let url = &format!("{}/api", &server.url()); - - TEST_EVENT_OBSERVER_SKIP_RETRY.set(false); - - // Insert payload - EventObserver::insert_payload(&conn, url, payload_bytes.as_slice(), timeout) - .expect("Failed to insert payload"); - - // Process pending payloads - dispatcher.process_pending_payloads(); - - // Verify that the pending payloads list is empty - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - assert_eq!(pending_payloads.len(), 0, "Expected no pending payloads"); - - // Verify that the mock was called - _m.assert(); - } - - #[test] - fn pending_payloads_are_skipped_if_url_does_not_match() { - let dir = tempdir().unwrap(); - let db_path = dir.path().join("event_observers.sqlite"); - - let mut server = mockito::Server::new(); - let endpoint = server.host_with_port(); - let timeout = Duration::from_secs(5); - let mut dispatcher = EventDispatcher::new(Some(dir.path().to_path_buf())); - - dispatcher.register_observer(&EventObserverConfig { - endpoint: endpoint.clone(), - events_keys: vec![EventKeyType::AnyEvent], - timeout_ms: timeout.as_millis() as u64, - disable_retries: false, - }); - - let conn = EventDispatcher::init_db(&db_path).expect("Failed to initialize the database"); - - let payload = json!({"key": "value"}); - let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); - let timeout = Duration::from_secs(5); - - let mock = server - .mock("POST", "/api") - .match_header( - "content-type", - mockito::Matcher::Regex("application/json.*".into()), - ) - .match_body(mockito::Matcher::Json(payload.clone())) - .with_status(200) - .expect(0) // Expect 0 calls to this endpoint - .create(); - - // Use a different URL than the observer's endpoint - let url = "http://different-domain.com/api"; - - EventObserver::insert_payload(&conn, url, payload_bytes.as_slice(), timeout) - .expect("Failed to insert payload"); - - dispatcher.process_pending_payloads(); - - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - // Verify that the pending payload is no longer in the database, - // because this observer is no longer registered. - assert_eq!( - pending_payloads.len(), - 0, - "Expected payload to be removed from database since URL didn't match" - ); - - mock.assert(); - } - - #[test] - fn test_new_event_dispatcher_with_db() { - let dir = tempdir().unwrap(); - let working_dir = dir.path().to_path_buf(); - - let dispatcher = EventDispatcher::new(Some(working_dir.clone())); - - let expected_db_path = working_dir.join("event_observers.sqlite"); - assert_eq!(dispatcher.db_path, Some(expected_db_path.clone())); - - assert!( - !expected_db_path.exists(), - "Database file was created too soon" - ); - - EventDispatcher::init_db(&expected_db_path).expect("Failed to initialize the database"); - - // Verify that the database was initialized - assert!(expected_db_path.exists(), "Database file was not created"); - } - - #[test] - fn test_new_event_observer_without_db() { - let endpoint = "http://example.com".to_string(); - let timeout = Duration::from_secs(5); - - let observer = EventObserver::new(None, endpoint.clone(), timeout, false); - - // Verify fields - assert_eq!(observer.endpoint, endpoint); - assert_eq!(observer.timeout, timeout); - assert!(observer.db_path.is_none(), "Expected db_path to be None"); - } - - #[test] - #[serial] - fn test_send_payload_with_db() { - use mockito::Matcher; - - let dir = tempdir().unwrap(); - let working_dir = dir.path().to_path_buf(); - let payload = json!({"key": "value"}); - - let dispatcher = EventDispatcher::new(Some(working_dir.clone())); - let db_path = dispatcher.clone().db_path.clone().unwrap(); - EventDispatcher::init_db(&db_path).expect("Failed to initialize the database"); - - // Create a mock server - let mut server = mockito::Server::new(); - let _m = server - .mock("POST", "/test") - .match_header("content-type", Matcher::Regex("application/json.*".into())) - .match_body(Matcher::Json(payload.clone())) - .with_status(200) - .create(); - - let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); - let timeout = Duration::from_secs(5); - - let observer = EventObserver::new(Some(db_path.clone()), endpoint, timeout, false); - - TEST_EVENT_OBSERVER_SKIP_RETRY.set(false); - - // Call send_payload - observer.send_payload(&payload, "/test", None); - - // Verify that the payload was sent and database is empty - _m.assert(); - - // Verify that the database is empty - let db_path = observer.db_path.unwrap(); - let db_path_str = db_path.to_str().unwrap(); - let conn = Connection::open(db_path_str).expect("Failed to open database"); - let pending_payloads = - EventDispatcher::get_pending_payloads(&conn).expect("Failed to get pending payloads"); - assert_eq!(pending_payloads.len(), 0, "Expected no pending payloads"); - } - - #[test] - fn test_send_payload_without_db() { - use mockito::Matcher; - - let timeout = Duration::from_secs(5); - let payload = json!({"key": "value"}); - - // Create a mock server - let mut server = mockito::Server::new(); - let _m = server - .mock("POST", "/test") - .match_header("content-type", Matcher::Regex("application/json.*".into())) - .match_body(Matcher::Json(payload.clone())) - .with_status(200) - .create(); - - let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); - - let observer = EventObserver::new(None, endpoint, timeout, false); - - // Call send_payload - observer.send_payload(&payload, "/test", None); - - // Verify that the payload was sent - _m.assert(); - } - - #[test] - fn test_send_payload_success() { - let port = get_random_port(); - - // Set up a channel to notify when the server has processed the request - let (tx, rx) = channel(); - - // Start a mock server in a separate thread - let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); - thread::spawn(move || { - let request = server.recv().unwrap(); - assert_eq!(request.url(), "/test"); - assert_eq!(request.method(), &Method::Post); - - // Simulate a successful response - let response = Response::from_string("HTTP/1.1 200 OK"); - request.respond(response).unwrap(); - - // Notify the test that the request was processed - tx.send(()).unwrap(); - }); - - let observer = EventObserver::new( - None, - format!("127.0.0.1:{port}"), - Duration::from_secs(3), - false, - ); - - let payload = json!({"key": "value"}); + } + } - observer.send_payload(&payload, "/test", None); + self.registered_observers.push(event_observer.clone()); - // Wait for the server to process the request - rx.recv_timeout(Duration::from_secs(5)) - .expect("Server did not receive request in time"); + event_observer } - #[test] - fn test_send_payload_retry() { - let port = get_random_port(); - - // Set up a channel to notify when the server has processed the request - let (tx, rx) = channel(); - - // Start a mock server in a separate thread - let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); - thread::spawn(move || { - let mut attempt = 0; - while let Ok(request) = server.recv() { - attempt += 1; - if attempt == 1 { - debug!("Mock server received request attempt 1"); - // Simulate a failure on the first attempt - let response = Response::new( - StatusCode(500), - vec![], - "Internal Server Error".as_bytes(), - Some(21), - None, - ); - request.respond(response).unwrap(); - } else { - debug!("Mock server received request attempt 2"); - // Simulate a successful response on the second attempt - let response = Response::from_string("HTTP/1.1 200 OK"); - request.respond(response).unwrap(); - - // Notify the test that the request was processed successfully - tx.send(()).unwrap(); - break; - } + /// Process any pending payloads in the database. + /// This is called when the event dispatcher is first instantiated. + pub fn process_pending_payloads(&self) { + let Some(db_path) = &self.db_path else { + return; + }; + let conn = + EventDispatcherDbConnection::new(db_path).expect("Failed to initialize database"); + let pending_payloads = match conn.get_pending_payloads() { + Ok(payloads) => payloads, + Err(e) => { + error!( + "Event observer: failed to retrieve pending payloads from database"; + "error" => ?e + ); + return; } - }); + }; - let observer = EventObserver::new( - None, - format!("127.0.0.1:{port}"), - Duration::from_secs(3), - false, + info!( + "Event dispatcher: processing {} pending payloads", + pending_payloads.len() ); - let payload = json!({"key": "value"}); - - observer.send_payload(&payload, "/test", None); - - // Wait for the server to process the request - rx.recv_timeout(Duration::from_secs(5)) - .expect("Server did not receive request in time"); - } + for (id, url, payload_bytes, _timeout_ms) in pending_payloads { + info!("Event dispatcher: processing pending payload: {url}"); + let full_url = Url::parse(url.as_str()) + .unwrap_or_else(|_| panic!("Event dispatcher: unable to parse {url} as a URL")); + // find the right observer + let observer = self.registered_observers.iter().find(|observer| { + let endpoint_url = Url::parse(format!("http://{}", &observer.endpoint).as_str()) + .unwrap_or_else(|_| { + panic!( + "Event dispatcher: unable to parse {} as a URL", + observer.endpoint + ) + }); + full_url.origin() == endpoint_url.origin() + }); - #[test] - #[serial] - fn test_send_payload_timeout() { - let port = get_random_port(); - let timeout = Duration::from_secs(3); - - // Set up a channel to notify when the server has processed the request - let (tx, rx) = channel(); - - // Start a mock server in a separate thread - let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); - thread::spawn(move || { - let mut attempt = 0; - // This exists to only keep request from being dropped - #[allow(clippy::collection_is_never_read)] - let mut _request_holder = None; - while let Ok(request) = server.recv() { - attempt += 1; - if attempt == 1 { - debug!("Mock server received request attempt 1"); - // Do not reply, forcing the sender to timeout and retry, - // but don't drop the request or it will receive a 500 error, - _request_holder = Some(request); - } else { - debug!("Mock server received request attempt 2"); - // Simulate a successful response on the second attempt - let response = Response::from_string("HTTP/1.1 200 OK"); - request.respond(response).unwrap(); - - // Notify the test that the request was processed successfully - tx.send(()).unwrap(); - break; + let Some(observer) = observer else { + // This observer is no longer registered, skip and delete + info!( + "Event dispatcher: observer {} no longer registered, skipping", + url + ); + if let Err(e) = conn.delete_payload(id) { + error!( + "Event observer: failed to delete pending payload from database"; + "error" => ?e + ); } - } - }); - - let observer = EventObserver::new(None, format!("127.0.0.1:{port}"), timeout, false); - - let payload = json!({"key": "value"}); + continue; + }; - // Record the time before sending the payload - let start_time = Instant::now(); + Self::send_payload_with_bytes( + &self.db_path, + observer, + payload_bytes, + full_url.path(), + Some(id), + ); - // Call the function being tested - observer.send_payload(&payload, "/test", None); + #[cfg(test)] + if TEST_EVENT_OBSERVER_SKIP_RETRY.get() { + warn!("Fault injection: delete_payload"); + return; + } - // Record the time after the function returns - let elapsed_time = start_time.elapsed(); + if let Err(e) = conn.delete_payload(id) { + error!( + "Event observer: failed to delete pending payload from database"; + "error" => ?e + ); + } + } + } - println!("Elapsed time: {elapsed_time:?}"); - assert!( - elapsed_time >= timeout, - "Expected a timeout, but the function returned too quickly" + fn send_payload_directly( + payload_bytes: &Arc<[u8]>, + full_url: &str, + timeout: Duration, + disable_retries: bool, + ) -> bool { + debug!( + "Event dispatcher: Sending payload"; "url" => %full_url, "bytes" => payload_bytes.len() ); - assert!( - elapsed_time < timeout + Duration::from_secs(1), - "Expected a timeout, but the function took too long" - ); + let url = Url::parse(full_url) + .unwrap_or_else(|_| panic!("Event dispatcher: unable to parse {full_url} as a URL")); - // Wait for the server to process the request - rx.recv_timeout(Duration::from_secs(5)) - .expect("Server did not receive request in time"); - } + let host = url.host_str().expect("Invalid URL: missing host"); + let port = url.port_or_known_default().unwrap_or(80); + let peerhost: PeerHost = format!("{host}:{port}") + .parse() + .unwrap_or(PeerHost::DNS(host.to_string(), port)); - #[test] - #[serial] - fn test_send_payload_with_db_force_restart() { - let port = get_random_port(); - let timeout = Duration::from_secs(3); - let dir = tempdir().unwrap(); - let working_dir = dir.path().to_path_buf(); - - // Set up a channel to notify when the server has processed the request - let (tx, rx) = channel(); - - info!("Starting mock server on port {port}"); - // Start a mock server in a separate thread - let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); - thread::spawn(move || { - let mut attempt = 0; - // This exists to only keep request from being dropped - #[allow(clippy::collection_is_never_read)] - let mut _request_holder = None; - while let Ok(mut request) = server.recv() { - attempt += 1; - match attempt { - 1 => { - info!("Mock server received request attempt 1"); - // Do not reply, forcing the sender to timeout and retry, - // but don't drop the request or it will receive a 500 error, - _request_holder = Some(request); - } - 2 => { - info!("Mock server received request attempt 2"); - - // Verify the payload - let mut payload = String::new(); - request.as_reader().read_to_string(&mut payload).unwrap(); - let expected_payload = r#"{"key":"value"}"#; - assert_eq!(payload, expected_payload); - - // Simulate a successful response on the second attempt - let response = Response::from_string("HTTP/1.1 200 OK"); - request.respond(response).unwrap(); - } - 3 => { - info!("Mock server received request attempt 3"); - - // Verify the payload - let mut payload = String::new(); - request.as_reader().read_to_string(&mut payload).unwrap(); - let expected_payload = r#"{"key":"value2"}"#; - assert_eq!(payload, expected_payload); - - // Simulate a successful response on the second attempt - let response = Response::from_string("HTTP/1.1 200 OK"); - request.respond(response).unwrap(); - - // When we receive attempt 3 (message 1, re-sent message 1, message 2), - // notify the test that the request was processed successfully - tx.send(()).unwrap(); + let mut backoff = Duration::from_millis(100); + let mut attempts: i32 = 0; + // Cap the backoff at 3x the timeout + let max_backoff = timeout.saturating_mul(3); + + loop { + let mut request = StacksHttpRequest::new_for_peer( + peerhost.clone(), + "POST".into(), + url.path().into(), + HttpRequestContents::new().payload_json_bytes(Arc::clone(payload_bytes)), + ) + .unwrap_or_else(|_| panic!("FATAL: failed to encode infallible data as HTTP request")); + request.add_header("Connection".into(), "close".into()); + match send_http_request(host, port, request, timeout) { + Ok(response) => { + if response.preamble().status_code == 200 { + debug!( + "Event dispatcher: Successful POST"; "url" => %url + ); break; + } else { + error!( + "Event dispatcher: Failed POST"; "url" => %url, "response" => ?response.preamble() + ); } - _ => panic!("Unexpected request attempt"), + } + Err(err) => { + warn!( + "Event dispatcher: connection or request failed to {host}:{port} - {err:?}"; + "backoff" => ?backoff, + "attempts" => attempts + ); } } - }); - - let mut dispatcher = EventDispatcher::new(Some(working_dir.clone())); - - let observer = dispatcher.register_observer(&EventObserverConfig { - endpoint: format!("127.0.0.1:{port}"), - timeout_ms: timeout.as_millis() as u64, - events_keys: vec![EventKeyType::AnyEvent], - disable_retries: false, - }); - - EventDispatcher::init_db(&dispatcher.clone().db_path.unwrap()).unwrap(); - let payload = json!({"key": "value"}); - let payload2 = json!({"key": "value2"}); - - // Disable retrying so that it sends the payload only once - // and that payload will be ignored by the test server. - TEST_EVENT_OBSERVER_SKIP_RETRY.set(true); - - info!("Sending payload 1"); - - // Send the payload - observer.send_payload(&payload, "/test", None); - - // Re-enable retrying - TEST_EVENT_OBSERVER_SKIP_RETRY.set(false); - - dispatcher.process_pending_payloads(); + if disable_retries { + warn!("Observer is configured in disable_retries mode: skipping retry of payload"); + return false; + } - info!("Sending payload 2"); + #[cfg(test)] + if TEST_EVENT_OBSERVER_SKIP_RETRY.get() { + warn!("Fault injection: skipping retry of payload"); + return false; + } - // Send another payload - observer.send_payload(&payload2, "/test", None); + sleep(backoff); + let jitter: u64 = rand::thread_rng().gen_range(0..100); + backoff = std::cmp::min( + backoff.saturating_mul(2) + Duration::from_millis(jitter), + max_backoff, + ); + attempts = attempts.saturating_add(1); + } + true + } - // Wait for the server to process the requests - rx.recv_timeout(Duration::from_secs(5)) - .expect("Server did not receive request in time"); + fn send_payload( + &self, + event_observer: &EventObserver, + payload: &serde_json::Value, + path: &str, + id: Option, + ) { + Self::send_payload_given_db_path(&self.db_path, event_observer, payload, path, id); } - #[test] - fn test_event_dispatcher_disable_retries() { - let timeout = Duration::from_secs(5); - let payload = json!({"key": "value"}); + fn send_payload_given_db_path( + db_path: &Option, + event_observer: &EventObserver, + payload: &serde_json::Value, + path: &str, + id: Option, + ) { + let payload_bytes = match serde_json::to_vec(payload) { + Ok(bytes) => Arc::<[u8]>::from(bytes), + Err(err) => { + error!( + "Event dispatcher: failed to serialize payload"; "path" => path, "error" => ?err + ); + return; + } + }; + Self::send_payload_with_bytes(db_path, event_observer, payload_bytes, path, id); + } - // Create a mock server returning error 500 - let mut server = mockito::Server::new(); - let _m = server.mock("POST", "/test").with_status(500).create(); + fn send_payload_with_bytes( + db_path: &Option, + event_observer: &EventObserver, + payload_bytes: Arc<[u8]>, + path: &str, + id: Option, + ) { + // Construct the full URL + let url_str = if path.starts_with('/') { + format!("{}{path}", &event_observer.endpoint) + } else { + format!("{}/{path}", &event_observer.endpoint) + }; + let full_url = format!("http://{url_str}"); - let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); + // if the observer is in "disable_retries" mode quickly send the payload without checking for the db + if event_observer.disable_retries { + Self::send_payload_directly(&payload_bytes, &full_url, event_observer.timeout, true); + } else if let Some(db_path) = db_path { + // Because the DB is initialized in the call to process_pending_payloads() during startup, + // it is *probably* ok to skip initialization here. That said, at the time of writing this is the + // only call to new_without_init(), and we might want to revisit the question whether it's + // really worth it. + let conn = EventDispatcherDbConnection::new_without_init(db_path) + .expect("Failed to open database for event observer"); - let observer = EventObserver::new(None, endpoint, timeout, true); + let id = match id { + Some(id) => id, + None => { + conn.insert_payload_with_retry( + &full_url, + payload_bytes.as_ref(), + event_observer.timeout, + ); + conn.last_insert_rowid() + } + }; - // in non "disable_retries" mode this will run forever - observer.send_payload(&payload, "/test", None); + let success = Self::send_payload_directly( + &payload_bytes, + &full_url, + event_observer.timeout, + false, + ); + // This is only `false` when the TestFlag is set to skip retries + if !success { + return; + } - // Verify that the payload was sent - _m.assert(); + if let Err(e) = conn.delete_payload(id) { + error!( + "Event observer: failed to delete pending payload from database"; + "error" => ?e + ); + } + } else { + // No database, just send the payload + Self::send_payload_directly(&payload_bytes, &full_url, event_observer.timeout, false); + } } - #[test] - fn test_event_dispatcher_disable_retries_invalid_url() { - let timeout = Duration::from_secs(5); - let payload = json!({"key": "value"}); - - let endpoint = String::from("255.255.255.255"); - - let observer = EventObserver::new(None, endpoint, timeout, true); - - // in non "disable_retries" mode this will run forever - observer.send_payload(&payload, "/test", None); + fn send_new_attachments(&self, event_observer: &EventObserver, payload: &serde_json::Value) { + self.send_payload(event_observer, payload, PATH_ATTACHMENT_PROCESSED, None); } - #[test] - #[ignore] - /// This test generates a new block and ensures the "disable_retries" events_observer will not block. - fn block_event_with_disable_retries_observer() { - let dir = tempdir().unwrap(); - let working_dir = dir.path().to_path_buf(); - - let mut event_dispatcher = EventDispatcher::new(Some(working_dir.clone())); - let config = EventObserverConfig { - endpoint: String::from("255.255.255.255"), - events_keys: vec![EventKeyType::MinedBlocks], - timeout_ms: 1000, - disable_retries: true, - }; - event_dispatcher.register_observer(&config); + fn send_new_mempool_txs(&self, event_observer: &EventObserver, payload: &serde_json::Value) { + self.send_payload(event_observer, payload, PATH_MEMPOOL_TX_SUBMIT, None); + } - let nakamoto_block = NakamotoBlock { - header: NakamotoBlockHeader::empty(), - txs: vec![], - }; + /// Serializes new microblocks data into a JSON payload and sends it off to the correct path + fn send_new_microblocks( + &self, + event_observer: &EventObserver, + parent_index_block_hash: &StacksBlockId, + filtered_events: &[(usize, &(bool, Txid, &StacksTransactionEvent))], + serialized_txs: &[TransactionEventPayload], + burn_block_hash: &BurnchainHeaderHash, + burn_block_height: u32, + burn_block_timestamp: u64, + ) { + // Serialize events to JSON + let serialized_events: Vec = filtered_events + .iter() + .map(|(event_index, (committed, txid, event))| { + event + .json_serialize(*event_index, txid, *committed) + .unwrap() + }) + .collect(); - // this will block forever in non "disable_retries" mode - event_dispatcher.process_mined_nakamoto_block_event( - 0, - &nakamoto_block, - 0, - &ExecutionCost::max_value(), - vec![], - ); + let payload = json!({ + "parent_index_block_hash": format!("0x{parent_index_block_hash}"), + "events": serialized_events, + "transactions": serialized_txs, + "burn_block_hash": format!("0x{burn_block_hash}"), + "burn_block_height": burn_block_height, + "burn_block_timestamp": burn_block_timestamp, + }); - assert_eq!(event_dispatcher.registered_observers.len(), 1); + self.send_payload(event_observer, &payload, PATH_MICROBLOCK_SUBMIT, None); } - #[test] - /// This test checks that tx payloads properly convert the stacks transaction receipt regardless of the presence of the vm_error - fn make_new_block_txs_payload_vm_error() { - let privkey = StacksPrivateKey::random(); - let pubkey = StacksPublicKey::from_private(&privkey); - let addr = StacksAddress::from_public_keys( - C32_ADDRESS_VERSION_TESTNET_SINGLESIG, - &AddressHashMode::SerializeP2PKH, - 1, - &vec![pubkey], - ) - .unwrap(); - - let tx = StacksTransaction { - version: TransactionVersion::Testnet, - chain_id: 0x80000000, - auth: TransactionAuth::from_p2pkh(&privkey).unwrap(), - anchor_mode: TransactionAnchorMode::Any, - post_condition_mode: TransactionPostConditionMode::Allow, - post_conditions: vec![], - payload: TransactionPayload::TokenTransfer( - addr.to_account_principal(), - 123, - TokenTransferMemo([0u8; 34]), - ), - }; - - let mut receipt = StacksTransactionReceipt { - transaction: TransactionOrigin::Burn(BlockstackOperationType::PreStx(PreStxOp { - output: StacksAddress::new(0, Hash160([1; 20])).unwrap(), - txid: tx.txid(), - vtxindex: 0, - block_height: 1, - burn_header_hash: BurnchainHeaderHash([5u8; 32]), - })), - events: vec![], - post_condition_aborted: true, - result: Value::okay_true(), - contract_analysis: None, - execution_cost: ExecutionCost { - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 0, - }, - microblock_header: None, - vm_error: None, - stx_burned: 0u128, - tx_index: 0, - }; + fn send_dropped_mempool_txs( + &self, + event_observer: &EventObserver, + payload: &serde_json::Value, + ) { + self.send_payload(event_observer, payload, PATH_MEMPOOL_TX_DROP, None); + } - let payload_no_error = EventObserver::make_new_block_txs_payload(&receipt, 0); - assert_eq!(payload_no_error.vm_error, receipt.vm_error); + fn send_mined_block(&self, event_observer: &EventObserver, payload: &serde_json::Value) { + self.send_payload(event_observer, payload, PATH_MINED_BLOCK, None); + } - receipt.vm_error = Some("Inconceivable!".into()); + fn send_mined_microblock(&self, event_observer: &EventObserver, payload: &serde_json::Value) { + self.send_payload(event_observer, payload, PATH_MINED_MICROBLOCK, None); + } - let payload_with_error = EventObserver::make_new_block_txs_payload(&receipt, 0); - assert_eq!(payload_with_error.vm_error, receipt.vm_error); + fn send_mined_nakamoto_block( + &self, + event_observer: &EventObserver, + payload: &serde_json::Value, + ) { + self.send_payload(event_observer, payload, PATH_MINED_NAKAMOTO_BLOCK, None); } - fn make_tenure_change_payload() -> TenureChangePayload { - TenureChangePayload { - tenure_consensus_hash: ConsensusHash([0; 20]), - prev_tenure_consensus_hash: ConsensusHash([0; 20]), - burn_view_consensus_hash: ConsensusHash([0; 20]), - previous_tenure_end: StacksBlockId([0; 32]), - previous_tenure_blocks: 1, - cause: TenureChangeCause::Extended, - pubkey_hash: Hash160([0; 20]), - } + fn send_stackerdb_chunks(&self, event_observer: &EventObserver, payload: &serde_json::Value) { + self.send_payload(event_observer, payload, PATH_STACKERDB_CHUNKS, None); } - fn make_tenure_change_tx(payload: TenureChangePayload) -> StacksTransaction { - StacksTransaction { - version: TransactionVersion::Testnet, - chain_id: 1, - auth: TransactionAuth::Standard(TransactionSpendingCondition::Singlesig( - SinglesigSpendingCondition { - hash_mode: SinglesigHashMode::P2PKH, - signer: Hash160([0; 20]), - nonce: 0, - tx_fee: 0, - key_encoding: TransactionPublicKeyEncoding::Compressed, - signature: MessageSignature([0; 65]), - }, - )), - anchor_mode: TransactionAnchorMode::Any, - post_condition_mode: TransactionPostConditionMode::Allow, - post_conditions: vec![], - payload: TransactionPayload::TenureChange(payload), - } + fn send_new_burn_block(&self, event_observer: &EventObserver, payload: &serde_json::Value) { + self.send_payload(event_observer, payload, PATH_BURN_BLOCK_SUBMIT, None); } +} - #[test] - fn backwards_compatibility_transaction_event_payload() { - let tx = make_tenure_change_tx(make_tenure_change_payload()); - let receipt = StacksTransactionReceipt { - transaction: TransactionOrigin::Burn(BlockstackOperationType::PreStx(PreStxOp { - output: StacksAddress::new(0, Hash160([1; 20])).unwrap(), - txid: tx.txid(), - vtxindex: 0, - block_height: 1, - burn_header_hash: BurnchainHeaderHash([5u8; 32]), - })), - events: vec![StacksTransactionEvent::SmartContractEvent( - SmartContractEventData { - key: (boot_code_id("some-contract", false), "some string".into()), - value: Value::Bool(false), - }, - )], - post_condition_aborted: false, - result: Value::okay_true(), - stx_burned: 100, - contract_analysis: None, - execution_cost: ExecutionCost { - write_length: 1, - write_count: 2, - read_length: 3, - read_count: 4, - runtime: 5, - }, - microblock_header: None, - tx_index: 1, - vm_error: None, - }; - let payload = EventObserver::make_new_block_txs_payload(&receipt, 0); - let new_serialized_data = serde_json::to_string_pretty(&payload).expect("Failed"); - let old_serialized_data = r#" - { - "burnchain_op": { - "pre_stx": { - "burn_block_height": 1, - "burn_header_hash": "0505050505050505050505050505050505050505050505050505050505050505", - "burn_txid": "ace70e63009a2c2d22c0f948b146d8a28df13a2900f3b5f3cc78b56459ffef05", - "output": { - "address": "S0G2081040G2081040G2081040G2081054GYN98", - "address_hash_bytes": "0x0101010101010101010101010101010101010101", - "address_version": 0 - }, - "vtxindex": 0 - } - }, - "contract_abi": null, - "execution_cost": { - "read_count": 4, - "read_length": 3, - "runtime": 5, - "write_count": 2, - "write_length": 1 - }, - "microblock_hash": null, - "microblock_parent_hash": null, - "microblock_sequence": null, - "raw_result": "0x0703", - "raw_tx": "0x00", - "status": "success", - "tx_index": 0, - "txid": "0xace70e63009a2c2d22c0f948b146d8a28df13a2900f3b5f3cc78b56459ffef05" - } - "#; - let new_value: TransactionEventPayload = serde_json::from_str(&new_serialized_data) - .expect("Failed to deserialize new data as TransactionEventPayload"); - let old_value: TransactionEventPayload = serde_json::from_str(&old_serialized_data) - .expect("Failed to deserialize old data as TransactionEventPayload"); - assert_eq!(new_value, old_value); +#[cfg(any(test, feature = "testing"))] +fn test_skip_block_announcement(block: &StacksBlockEventData) -> bool { + if TEST_SKIP_BLOCK_ANNOUNCEMENT.get() { + warn!( + "Skipping new block announcement due to testing directive"; + "block_hash" => %block.block_hash + ); + return true; } + false } diff --git a/stacks-node/src/event_dispatcher/db.rs b/stacks-node/src/event_dispatcher/db.rs new file mode 100644 index 00000000000..122812592c8 --- /dev/null +++ b/stacks-node/src/event_dispatcher/db.rs @@ -0,0 +1,338 @@ +// Copyright (C) 2013-2020 Blockstack PBC, a public benefit corporation +// Copyright (C) 2020-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 std::path::PathBuf; +use std::sync::Arc; +use std::thread::sleep; +use std::time::Duration; + +use rusqlite::{params, Connection}; +use stacks::util_lib::db::Error as db_error; + +/// Wraps a SQlite connection to the database in which pending event payloads are stored +pub struct EventDispatcherDbConnection { + connection: Connection, +} + +impl EventDispatcherDbConnection { + pub fn new_without_init(db_path: &PathBuf) -> Result { + let connection = Connection::open(db_path.to_str().unwrap())?; + Ok(EventDispatcherDbConnection { connection }) + } + + pub fn new(db_path: &PathBuf) -> Result { + let connection = Connection::open(db_path.to_str().unwrap())?; + connection.execute( + "CREATE TABLE IF NOT EXISTS pending_payloads ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + url TEXT NOT NULL, + payload BLOB NOT NULL, + timeout INTEGER NOT NULL + )", + [], + )?; + let mut connection = EventDispatcherDbConnection { connection }; + if let Some(col_type) = connection.get_payload_column_type()? { + if col_type.eq_ignore_ascii_case("TEXT") { + info!("Event observer: migrating pending_payloads.payload from TEXT to BLOB"); + connection.migrate_payload_column_to_blob()?; + } + } + Ok(connection) + } + + #[cfg(test)] + pub fn new_from_exisiting_connection(connection: Connection) -> EventDispatcherDbConnection { + EventDispatcherDbConnection { connection } + } + + /// Insert a payload into the database, retrying on failure. + pub fn insert_payload_with_retry(&self, url: &str, payload_bytes: &[u8], timeout: Duration) { + let mut attempts = 0i64; + let mut backoff = Duration::from_millis(100); // Initial backoff duration + let max_backoff = Duration::from_secs(5); // Cap the backoff duration + + loop { + match self.insert_payload(url, payload_bytes, timeout) { + Ok(_) => { + // Successful insert, break the loop + return; + } + Err(err) => { + // Log the error, then retry after a delay + warn!("Failed to insert payload into event observer database: {err:?}"; + "backoff" => ?backoff, + "attempts" => attempts + ); + + // Wait for the backoff duration + sleep(backoff); + + // Increase the backoff duration (with exponential backoff) + backoff = std::cmp::min(backoff.saturating_mul(2), max_backoff); + + attempts = attempts.saturating_add(1); + } + } + } + } + + pub fn insert_payload( + &self, + url: &str, + payload_bytes: &[u8], + timeout: Duration, + ) -> Result<(), db_error> { + let timeout_ms: u64 = timeout.as_millis().try_into().expect("Timeout too large"); + self.connection.execute( + "INSERT INTO pending_payloads (url, payload, timeout) VALUES (?1, ?2, ?3)", + params![url, payload_bytes, timeout_ms], + )?; + Ok(()) + } + + // TODO: change this to get the id from the insertion directly, because that's more reliable + pub fn last_insert_rowid(&self) -> i64 { + self.connection.last_insert_rowid() + } + + pub fn get_pending_payloads(&self) -> Result, u64)>, db_error> { + let mut stmt = self + .connection + .prepare("SELECT id, url, payload, timeout FROM pending_payloads ORDER BY id")?; + let payload_iter = stmt.query_and_then( + [], + |row| -> Result<(i64, String, Arc<[u8]>, u64), db_error> { + let id: i64 = row.get(0)?; + let url: String = row.get(1)?; + let payload_bytes: Vec = row.get(2)?; + let payload_bytes = Arc::<[u8]>::from(payload_bytes); + let timeout_ms: u64 = row.get(3)?; + Ok((id, url, payload_bytes, timeout_ms)) + }, + )?; + payload_iter.collect() + } + + pub fn delete_payload(&self, id: i64) -> Result<(), db_error> { + self.connection + .execute("DELETE FROM pending_payloads WHERE id = ?1", params![id])?; + Ok(()) + } + + fn get_payload_column_type(&self) -> Result, db_error> { + let mut stmt = self + .connection + .prepare("PRAGMA table_info(pending_payloads)")?; + + let rows = stmt.query_map([], |row| { + let name: String = row.get(1)?; + let col_type: String = row.get(2)?; + Ok((name, col_type)) + })?; + + for row in rows { + let (name, col_type) = row?; + if name == "payload" { + return Ok(Some(col_type)); + } + } + + Ok(None) + } + + fn migrate_payload_column_to_blob(&mut self) -> Result<(), db_error> { + let tx = self.connection.transaction()?; + tx.execute( + "ALTER TABLE pending_payloads RENAME TO pending_payloads_old", + [], + )?; + tx.execute( + "CREATE TABLE pending_payloads ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + url TEXT NOT NULL, + payload BLOB NOT NULL, + timeout INTEGER NOT NULL + )", + [], + )?; + tx.execute( + "INSERT INTO pending_payloads (id, url, payload, timeout) + SELECT id, url, CAST(payload AS BLOB), timeout FROM pending_payloads_old", + [], + )?; + tx.execute("DROP TABLE pending_payloads_old", [])?; + tx.commit()?; + Ok(()) + } +} + +#[cfg(test)] +mod test { + use serde_json::json; + use tempfile::tempdir; + + use super::*; + + #[test] + fn test_init_db() { + let dir = tempdir().unwrap(); + let db_path = dir.path().join("test_init_db.sqlite"); + + // Call init_db + let conn_result = EventDispatcherDbConnection::new(&db_path); + assert!(conn_result.is_ok(), "Failed to initialize the database"); + + // Check that the database file exists + assert!(db_path.exists(), "Database file was not created"); + + // Check that the table exists + let conn = conn_result.unwrap(); + let mut stmt = conn + .connection + .prepare( + "SELECT name FROM sqlite_master WHERE type='table' AND name='pending_payloads'", + ) + .unwrap(); + let table_exists = stmt.exists([]).unwrap(); + assert!(table_exists, "Table 'pending_payloads' does not exist"); + } + + #[test] + fn test_migrate_payload_column_to_blob() { + let dir = tempdir().unwrap(); + let db_path = dir.path().join("test_payload_migration.sqlite"); + + // Simulate old schema with TEXT payloads. + let conn = Connection::open(&db_path).unwrap(); + conn.execute( + "CREATE TABLE pending_payloads ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + url TEXT NOT NULL, + payload TEXT NOT NULL, + timeout INTEGER NOT NULL + )", + [], + ) + .unwrap(); + let payload_str = "{\"key\":\"value\"}"; + conn.execute( + "INSERT INTO pending_payloads (url, payload, timeout) VALUES (?1, ?2, ?3)", + params!["http://example.com/api", payload_str, 5000i64], + ) + .unwrap(); + drop(conn); + + let conn = + EventDispatcherDbConnection::new(&db_path).expect("Failed to initialize the database"); + + let col_type: String = conn + .connection + .query_row( + "SELECT type FROM pragma_table_info('pending_payloads') WHERE name = 'payload'", + [], + |row| row.get(0), + ) + .unwrap(); + assert!( + col_type.eq_ignore_ascii_case("BLOB"), + "Payload column was not migrated to BLOB" + ); + + let pending_payloads = conn + .get_pending_payloads() + .expect("Failed to get pending payloads"); + assert_eq!(pending_payloads.len(), 1, "Expected one pending payload"); + assert_eq!( + pending_payloads[0].2.as_ref(), + payload_str.as_bytes(), + "Payload contents did not survive migration" + ); + } + + #[test] + fn test_insert_and_get_pending_payloads() { + let dir = tempdir().unwrap(); + let db_path = dir.path().join("test_payloads.sqlite"); + + let conn = + EventDispatcherDbConnection::new(&db_path).expect("Failed to initialize the database"); + + let url = "http://example.com/api"; + let payload = json!({"key": "value"}); + let timeout = Duration::from_secs(5); + let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); + + // Insert payload + let insert_result = conn.insert_payload(url, payload_bytes.as_slice(), timeout); + assert!(insert_result.is_ok(), "Failed to insert payload"); + + // Get pending payloads + let pending_payloads = conn + .get_pending_payloads() + .expect("Failed to get pending payloads"); + assert_eq!(pending_payloads.len(), 1, "Expected one pending payload"); + + let (_id, retrieved_url, stored_bytes, timeout_ms) = &pending_payloads[0]; + assert_eq!(retrieved_url, url, "URL does not match"); + assert_eq!( + stored_bytes.as_ref(), + payload_bytes.as_slice(), + "Serialized payload does not match" + ); + assert_eq!( + *timeout_ms, + timeout.as_millis() as u64, + "Timeout does not match" + ); + } + + #[test] + fn test_delete_payload() { + let dir = tempdir().unwrap(); + let db_path = dir.path().join("test_delete_payload.sqlite"); + + let conn = + EventDispatcherDbConnection::new(&db_path).expect("Failed to initialize the database"); + + let url = "http://example.com/api"; + let payload = json!({"key": "value"}); + let timeout = Duration::from_secs(5); + let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); + + // Insert payload + conn.insert_payload(url, payload_bytes.as_slice(), timeout) + .expect("Failed to insert payload"); + + // Get pending payloads + let pending_payloads = conn + .get_pending_payloads() + .expect("Failed to get pending payloads"); + assert_eq!(pending_payloads.len(), 1, "Expected one pending payload"); + + let (id, _, _, _) = pending_payloads[0]; + + // Delete payload + let delete_result = conn.delete_payload(id); + assert!(delete_result.is_ok(), "Failed to delete payload"); + + // Verify that the pending payloads list is empty + let pending_payloads = conn + .get_pending_payloads() + .expect("Failed to get pending payloads"); + assert_eq!(pending_payloads.len(), 0, "Expected no pending payloads"); + } +} diff --git a/stacks-node/src/event_dispatcher/payloads.rs b/stacks-node/src/event_dispatcher/payloads.rs new file mode 100644 index 00000000000..7e9d6e471d3 --- /dev/null +++ b/stacks-node/src/event_dispatcher/payloads.rs @@ -0,0 +1,426 @@ +// Copyright (C) 2013-2020 Blockstack PBC, a public benefit corporation +// Copyright (C) 2020-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::analysis::contract_interface_builder::{ + build_contract_interface, ContractInterface, +}; +use clarity::vm::costs::ExecutionCost; +use clarity::vm::types::Value; +use serde_json::json; +use stacks::burnchains::{PoxConstants, Txid}; +use stacks::chainstate::burn::operations::{ + blockstack_op_extended_deserialize, blockstack_op_extended_serialize_opt, + BlockstackOperationType, +}; +use stacks::chainstate::burn::ConsensusHash; +use stacks::chainstate::stacks::address::PoxAddress; +use stacks::chainstate::stacks::boot::{ + NakamotoSignerEntry, PoxStartCycleInfo, RewardSet, RewardSetData, +}; +use stacks::chainstate::stacks::db::{StacksBlockHeaderTypes, StacksHeaderInfo}; +use stacks::chainstate::stacks::events::{ + StacksBlockEventData, StacksTransactionEvent, StacksTransactionReceipt, TransactionOrigin, +}; +use stacks::chainstate::stacks::miner::TransactionEvent; +use stacks::chainstate::stacks::{StacksTransaction, TransactionPayload}; +use stacks::net::atlas::{Attachment, AttachmentInstance}; +use stacks::types::chainstate::{BlockHeaderHash, BurnchainHeaderHash, StacksBlockId}; +use stacks::util::hash::{to_hex, to_hex_prefixed}; +use stacks_common::bitvec::BitVec; +use stacks_common::codec::StacksMessageCodec; +use stacks_common::util::hash::Sha512Trunc256Sum; +use stacks_common::util::secp256k1::MessageSignature; +use stacks_common::util::serde_serializers::{ + prefix_hex, prefix_hex_codec, prefix_opt_hex, prefix_string_0x, +}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct MinedBlockEvent { + pub target_burn_height: u64, + pub block_hash: String, + pub stacks_height: u64, + pub block_size: u64, + pub anchored_cost: ExecutionCost, + pub confirmed_microblocks_cost: ExecutionCost, + pub tx_events: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct MinedMicroblockEvent { + pub block_hash: String, + pub sequence: u16, + pub tx_events: Vec, + pub anchor_block_consensus_hash: ConsensusHash, + pub anchor_block: BlockHeaderHash, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct MinedNakamotoBlockEvent { + pub target_burn_height: u64, + pub parent_block_id: String, + pub block_hash: String, + pub block_id: String, + pub stacks_height: u64, + pub block_size: u64, + pub cost: ExecutionCost, + pub miner_signature: MessageSignature, + pub miner_signature_hash: Sha512Trunc256Sum, + pub signer_signature_hash: Sha512Trunc256Sum, + pub tx_events: Vec, + pub signer_bitvec: String, + pub signer_signature: Vec, +} + +#[derive(Debug, PartialEq, Clone, Serialize)] +pub struct RewardSetEventPayload { + #[serde(serialize_with = "serialize_pox_addresses")] + pub rewarded_addresses: Vec, + pub start_cycle_state: PoxStartCycleInfo, + #[serde(skip_serializing_if = "Option::is_none", default)] + // only generated for nakamoto reward sets + pub signers: Option>, + #[serde(serialize_with = "serialize_optional_u128_as_string")] + pub pox_ustx_threshold: Option, +} + +#[derive(Debug, PartialEq, Clone, Serialize)] +pub struct NakamotoSignerEntryPayload { + #[serde(serialize_with = "hex_serialize")] + pub signing_key: [u8; 33], + #[serde(serialize_with = "serialize_u128_as_string")] + pub stacked_amt: u128, + pub weight: u32, +} + +fn serialize_u128_as_string(value: &u128, serializer: S) -> Result +where + S: serde::Serializer, +{ + serializer.serialize_str(&value.to_string()) +} + +fn serialize_pox_addresses(value: &[PoxAddress], serializer: S) -> Result +where + S: serde::Serializer, +{ + serializer.collect_seq(value.iter().cloned().map(|a| a.to_b58())) +} + +fn serialize_optional_u128_as_string( + value: &Option, + serializer: S, +) -> Result +where + S: serde::Serializer, +{ + match value { + Some(v) => serializer.serialize_str(&v.to_string()), + None => serializer.serialize_none(), + } +} + +fn hex_serialize(addr: &[u8; 33], s: S) -> Result { + s.serialize_str(&to_hex(addr)) +} + +impl RewardSetEventPayload { + pub fn signer_entry_to_payload(entry: &NakamotoSignerEntry) -> NakamotoSignerEntryPayload { + NakamotoSignerEntryPayload { + signing_key: entry.signing_key, + stacked_amt: entry.stacked_amt, + weight: entry.weight, + } + } + pub fn from_reward_set(reward_set: &RewardSet) -> Self { + Self { + rewarded_addresses: reward_set.rewarded_addresses.clone(), + start_cycle_state: reward_set.start_cycle_state.clone(), + signers: reward_set + .signers + .as_ref() + .map(|signers| signers.iter().map(Self::signer_entry_to_payload).collect()), + pox_ustx_threshold: reward_set.pox_ustx_threshold, + } + } +} + +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] +pub struct TransactionEventPayload<'a> { + #[serde(with = "prefix_hex")] + /// The transaction id + pub txid: Txid, + /// The transaction index + pub tx_index: u32, + /// The transaction status + pub status: &'a str, + #[serde(with = "prefix_hex_codec")] + /// The raw transaction result + pub raw_result: Value, + /// The hex encoded raw transaction + #[serde(with = "prefix_string_0x")] + pub raw_tx: String, + /// The contract interface + pub contract_interface: Option, + /// The burnchain op + #[serde( + serialize_with = "blockstack_op_extended_serialize_opt", + deserialize_with = "blockstack_op_extended_deserialize" + )] + pub burnchain_op: Option, + /// The transaction execution cost + pub execution_cost: ExecutionCost, + /// The microblock sequence + pub microblock_sequence: Option, + #[serde(with = "prefix_opt_hex")] + /// The microblock hash + pub microblock_hash: Option, + #[serde(with = "prefix_opt_hex")] + /// The microblock parent hash + pub microblock_parent_hash: Option, + /// Error information if one occurred in the Clarity VM + pub vm_error: Option, +} + +pub fn make_new_mempool_txs_payload(transactions: Vec) -> serde_json::Value { + let raw_txs = transactions + .into_iter() + .map(|tx| serde_json::Value::String(to_hex_prefixed(&tx.serialize_to_vec(), true))) + .collect(); + + serde_json::Value::Array(raw_txs) +} + +pub fn make_new_burn_block_payload( + burn_block: &BurnchainHeaderHash, + burn_block_height: u64, + rewards: Vec<(PoxAddress, u64)>, + burns: u64, + slot_holders: Vec, + consensus_hash: &ConsensusHash, + parent_burn_block_hash: &BurnchainHeaderHash, +) -> serde_json::Value { + let reward_recipients = rewards + .into_iter() + .map(|(pox_addr, amt)| { + json!({ + "recipient": pox_addr.to_b58(), + "amt": amt, + }) + }) + .collect(); + + let reward_slot_holders = slot_holders + .into_iter() + .map(|pox_addr| json!(pox_addr.to_b58())) + .collect(); + + json!({ + "burn_block_hash": format!("0x{burn_block}"), + "burn_block_height": burn_block_height, + "reward_recipients": serde_json::Value::Array(reward_recipients), + "reward_slot_holders": serde_json::Value::Array(reward_slot_holders), + "burn_amount": burns, + "consensus_hash": format!("0x{consensus_hash}"), + "parent_burn_block_hash": format!("0x{parent_burn_block_hash}"), + }) +} + +const STATUS_RESP_TRUE: &str = "success"; +const STATUS_RESP_NOT_COMMITTED: &str = "abort_by_response"; +const STATUS_RESP_POST_CONDITION: &str = "abort_by_post_condition"; + +/// Returns transaction event payload to send for new block or microblock event +pub fn make_new_block_txs_payload( + receipt: &StacksTransactionReceipt, + tx_index: u32, +) -> TransactionEventPayload<'_> { + let tx = &receipt.transaction; + + let status = match (receipt.post_condition_aborted, &receipt.result) { + (false, Value::Response(response_data)) => { + if response_data.committed { + STATUS_RESP_TRUE + } else { + STATUS_RESP_NOT_COMMITTED + } + } + (true, Value::Response(_)) => STATUS_RESP_POST_CONDITION, + _ => { + if !matches!( + tx, + TransactionOrigin::Stacks(StacksTransaction { + payload: TransactionPayload::PoisonMicroblock(_, _), + .. + }) + ) { + unreachable!("Unexpected transaction result type"); + } + STATUS_RESP_TRUE + } + }; + + let (txid, raw_tx, burnchain_op) = match tx { + TransactionOrigin::Burn(op) => (op.txid(), "00".to_string(), Some(op.clone())), + TransactionOrigin::Stacks(ref tx) => { + let txid = tx.txid(); + let bytes = to_hex(&tx.serialize_to_vec()); + (txid, bytes, None) + } + }; + + TransactionEventPayload { + txid, + tx_index, + status, + raw_result: receipt.result.clone(), + raw_tx, + contract_interface: receipt.contract_analysis.as_ref().map(|analysis| { + build_contract_interface(analysis) + .expect("FATAL: failed to serialize contract publish receipt") + }), + burnchain_op, + execution_cost: receipt.execution_cost.clone(), + microblock_sequence: receipt.microblock_header.as_ref().map(|x| x.sequence), + microblock_hash: receipt.microblock_header.as_ref().map(|x| x.block_hash()), + microblock_parent_hash: receipt + .microblock_header + .as_ref() + .map(|x| x.prev_block.clone()), + vm_error: receipt.vm_error.clone(), + } +} + +pub fn make_new_attachment_payload( + attachment: &(AttachmentInstance, Attachment), +) -> serde_json::Value { + json!({ + "attachment_index": attachment.0.attachment_index, + "index_block_hash": format!("0x{}", attachment.0.index_block_hash), + "block_height": attachment.0.stacks_block_height, + "content_hash": format!("0x{}", attachment.0.content_hash), + "contract_id": format!("{}", attachment.0.contract_id), + "metadata": format!("0x{}", attachment.0.metadata), + "tx_id": format!("0x{}", attachment.0.tx_id), + "content": to_hex_prefixed(&attachment.1.content, true), + }) +} + +#[allow(clippy::too_many_arguments)] +pub fn make_new_block_processed_payload( + filtered_events: Vec<(usize, &(bool, Txid, &StacksTransactionEvent))>, + block: &StacksBlockEventData, + metadata: &StacksHeaderInfo, + receipts: &[StacksTransactionReceipt], + parent_index_hash: &StacksBlockId, + winner_txid: &Txid, + mature_rewards: &serde_json::Value, + parent_burn_block_hash: &BurnchainHeaderHash, + parent_burn_block_height: u32, + parent_burn_block_timestamp: u64, + anchored_consumed: &ExecutionCost, + mblock_confirmed_consumed: &ExecutionCost, + pox_constants: &PoxConstants, + reward_set_data: &Option, + signer_bitvec_opt: &Option>, + block_timestamp: Option, + coinbase_height: u64, +) -> serde_json::Value { + // Serialize events to JSON + let serialized_events: Vec = filtered_events + .iter() + .map(|(event_index, (committed, txid, event))| { + event + .json_serialize(*event_index, txid, *committed) + .unwrap() + }) + .collect(); + + let mut serialized_txs = vec![]; + for (tx_index, receipt) in receipts.iter().enumerate() { + let payload = make_new_block_txs_payload( + receipt, + tx_index + .try_into() + .expect("BUG: more receipts than U32::MAX"), + ); + serialized_txs.push(payload); + } + + let signer_bitvec_value = signer_bitvec_opt + .as_ref() + .map(|bitvec| serde_json::to_value(bitvec).unwrap_or_default()) + .unwrap_or_default(); + + let (reward_set_value, cycle_number_value) = match &reward_set_data { + Some(data) => ( + serde_json::to_value(RewardSetEventPayload::from_reward_set(&data.reward_set)) + .unwrap_or_default(), + serde_json::to_value(data.cycle_number).unwrap_or_default(), + ), + None => (serde_json::Value::Null, serde_json::Value::Null), + }; + + // Wrap events + let mut payload = json!({ + "block_hash": format!("0x{}", block.block_hash), + "block_height": metadata.stacks_block_height, + "block_time": block_timestamp, + "burn_block_hash": format!("0x{}", metadata.burn_header_hash), + "burn_block_height": metadata.burn_header_height, + "miner_txid": format!("0x{winner_txid}"), + "burn_block_time": metadata.burn_header_timestamp, + "index_block_hash": format!("0x{}", metadata.index_block_hash()), + "parent_block_hash": format!("0x{}", block.parent_block_hash), + "parent_index_block_hash": format!("0x{parent_index_hash}"), + "parent_microblock": format!("0x{}", block.parent_microblock_hash), + "parent_microblock_sequence": block.parent_microblock_sequence, + "matured_miner_rewards": mature_rewards.clone(), + "events": serialized_events, + "transactions": serialized_txs, + "parent_burn_block_hash": format!("0x{parent_burn_block_hash}"), + "parent_burn_block_height": parent_burn_block_height, + "parent_burn_block_timestamp": parent_burn_block_timestamp, + "anchored_cost": anchored_consumed, + "confirmed_microblocks_cost": mblock_confirmed_consumed, + "pox_v1_unlock_height": pox_constants.v1_unlock_height, + "pox_v2_unlock_height": pox_constants.v2_unlock_height, + "pox_v3_unlock_height": pox_constants.v3_unlock_height, + "signer_bitvec": signer_bitvec_value, + "reward_set": reward_set_value, + "cycle_number": cycle_number_value, + "tenure_height": coinbase_height, + "consensus_hash": format!("0x{}", metadata.consensus_hash), + }); + + let as_object_mut = payload.as_object_mut().unwrap(); + + if let StacksBlockHeaderTypes::Nakamoto(ref header) = &metadata.anchored_header { + as_object_mut.insert( + "signer_signature_hash".into(), + format!("0x{}", header.signer_signature_hash()).into(), + ); + as_object_mut.insert( + "miner_signature".into(), + format!("0x{}", &header.miner_signature).into(), + ); + as_object_mut.insert( + "signer_signature".into(), + serde_json::to_value(&header.signer_signature).unwrap_or_default(), + ); + } + + payload +} diff --git a/stacks-node/src/event_dispatcher/stacker_db.rs b/stacks-node/src/event_dispatcher/stacker_db.rs new file mode 100644 index 00000000000..886ddbe3131 --- /dev/null +++ b/stacks-node/src/event_dispatcher/stacker_db.rs @@ -0,0 +1,125 @@ +// Copyright (C) 2013-2020 Blockstack PBC, a public benefit corporation +// Copyright (C) 2020-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 std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::Mutex; + +use clarity::vm::types::QualifiedContractIdentifier; +use stacks::chainstate::stacks::boot::SIGNERS_NAME; +use stacks::chainstate::stacks::events::StackerDBChunksEvent; + +/// This struct receives StackerDB event callbacks without registering +/// over the JSON/RPC interface. +pub struct StackerDBChannel { + sender_info: Mutex>, +} + +#[derive(Clone)] +struct InnerStackerDBChannel { + /// A channel for sending the chunk events to the listener + sender: Sender, + /// Does the listener want to receive `.signers` chunks? + interested_in_signers: bool, + /// Which StackerDB contracts is the listener interested in? + other_interests: Vec, +} + +impl InnerStackerDBChannel { + pub fn new_miner_receiver() -> (Receiver, Self) { + let (sender, recv) = channel(); + let sender_info = Self { + sender, + interested_in_signers: true, + other_interests: vec![], + }; + + (recv, sender_info) + } +} + +impl Default for StackerDBChannel { + fn default() -> Self { + Self::new() + } +} + +impl StackerDBChannel { + pub const fn new() -> Self { + Self { + sender_info: Mutex::new(None), + } + } + + /// Consume the receiver for the StackerDBChannel and drop the senders. This should be done + /// before another interested thread can subscribe to events, but it is not absolutely necessary + /// to do so (it would just result in temporary over-use of memory while the prior channel is still + /// open). + /// + /// The StackerDBChnnel's receiver is guarded with a Mutex, so that ownership can + /// be taken by different threads without unsafety. + pub fn replace_receiver(&self, receiver: Receiver) { + // not strictly necessary, but do this rather than mark the `receiver` argument as unused + // so that we're explicit about the fact that `replace_receiver` consumes. + drop(receiver); + let mut guard = self + .sender_info + .lock() + .expect("FATAL: poisoned StackerDBChannel lock"); + guard.take(); + } + + /// Create a new event receiver channel for receiving events relevant to the miner coordinator, + /// dropping the old StackerDB event sender channels if they are still registered. + /// Returns the new receiver channel and a bool indicating whether or not sender channels were + /// still in place. + /// + /// The StackerDBChannel senders are guarded by mutexes so that they can be replaced + /// by different threads without unsafety. + pub fn register_miner_coordinator(&self) -> (Receiver, bool) { + let mut sender_info = self + .sender_info + .lock() + .expect("FATAL: poisoned StackerDBChannel lock"); + let (recv, new_sender) = InnerStackerDBChannel::new_miner_receiver(); + let replaced_receiver = sender_info.replace(new_sender).is_some(); + + (recv, replaced_receiver) + } + + /// Is there a thread holding the receiver, and is it interested in chunks events from `stackerdb`? + /// Returns the a sending channel to broadcast the event to if so, and `None` if not. + pub fn is_active( + &self, + stackerdb: &QualifiedContractIdentifier, + ) -> Option> { + // if the receiver field is empty (i.e., None), then there is no listening thread, return None + let guard = self + .sender_info + .lock() + .expect("FATAL: poisoned StackerDBChannel lock"); + let sender_info = guard.as_ref()?; + if sender_info.interested_in_signers + && stackerdb.is_boot() + && stackerdb.name.starts_with(SIGNERS_NAME) + { + return Some(sender_info.sender.clone()); + } + if sender_info.other_interests.contains(stackerdb) { + return Some(sender_info.sender.clone()); + } + None + } +} diff --git a/stacks-node/src/event_dispatcher/tests.rs b/stacks-node/src/event_dispatcher/tests.rs new file mode 100644 index 00000000000..da24ec8a73e --- /dev/null +++ b/stacks-node/src/event_dispatcher/tests.rs @@ -0,0 +1,987 @@ +// Copyright (C) 2013-2020 Blockstack PBC, a public benefit corporation +// Copyright (C) 2020-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 std::net::TcpListener; +use std::thread; +use std::time::Instant; + +use clarity::boot_util::boot_code_id; +use clarity::vm::costs::ExecutionCost; +use clarity::vm::events::SmartContractEventData; +use clarity::vm::types::StacksAddressExtensions; +use clarity::vm::Value; +use rusqlite::Connection; +use serial_test::serial; +use stacks::address::{AddressHashMode, C32_ADDRESS_VERSION_TESTNET_SINGLESIG}; +use stacks::burnchains::{PoxConstants, Txid}; +use stacks::chainstate::burn::operations::{BlockstackOperationType, PreStxOp}; +use stacks::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader}; +use stacks::chainstate::stacks::db::{StacksBlockHeaderTypes, StacksHeaderInfo}; +use stacks::chainstate::stacks::events::{StacksBlockEventData, TransactionOrigin}; +use stacks::chainstate::stacks::{ + SinglesigHashMode, SinglesigSpendingCondition, StacksBlock, TenureChangeCause, + TenureChangePayload, TokenTransferMemo, TransactionAnchorMode, TransactionAuth, + TransactionPayload, TransactionPostConditionMode, TransactionPublicKeyEncoding, + TransactionSpendingCondition, TransactionVersion, +}; +use stacks::types::chainstate::{ + BlockHeaderHash, StacksAddress, StacksPrivateKey, StacksPublicKey, +}; +use stacks::util::hash::{Hash160, Sha512Trunc256Sum}; +use stacks::util::secp256k1::MessageSignature; +use stacks_common::bitvec::BitVec; +use stacks_common::types::chainstate::{BurnchainHeaderHash, StacksBlockId}; +use tempfile::tempdir; +use tiny_http::{Method, Response, Server, StatusCode}; + +use crate::event_dispatcher::payloads::*; +use crate::event_dispatcher::*; + +#[test] +fn build_block_processed_event() { + let filtered_events = vec![]; + let block = StacksBlock::genesis_block(); + let metadata = StacksHeaderInfo::regtest_genesis(); + let receipts = vec![]; + let parent_index_hash = StacksBlockId([0; 32]); + let winner_txid = Txid([0; 32]); + let mature_rewards = serde_json::Value::Array(vec![]); + let parent_burn_block_hash = BurnchainHeaderHash([0; 32]); + let parent_burn_block_height = 0; + let parent_burn_block_timestamp = 0; + let anchored_consumed = ExecutionCost::ZERO; + let mblock_confirmed_consumed = ExecutionCost::ZERO; + let pox_constants = PoxConstants::testnet_default(); + let signer_bitvec = BitVec::zeros(2).expect("Failed to create BitVec with length 2"); + let block_timestamp = Some(123456); + let coinbase_height = 1234; + + let payload = make_new_block_processed_payload( + filtered_events, + &block.into(), + &metadata, + &receipts, + &parent_index_hash, + &winner_txid, + &mature_rewards, + &parent_burn_block_hash, + parent_burn_block_height, + parent_burn_block_timestamp, + &anchored_consumed, + &mblock_confirmed_consumed, + &pox_constants, + &None, + &Some(signer_bitvec.clone()), + block_timestamp, + coinbase_height, + ); + assert_eq!( + payload + .get("pox_v1_unlock_height") + .unwrap() + .as_u64() + .unwrap(), + pox_constants.v1_unlock_height as u64 + ); + + let expected_bitvec_str = serde_json::to_value(signer_bitvec) + .unwrap_or_default() + .as_str() + .unwrap() + .to_string(); + assert_eq!( + payload.get("signer_bitvec").unwrap().as_str().unwrap(), + expected_bitvec_str + ); +} + +#[test] +fn test_block_processed_event_nakamoto() { + let filtered_events = vec![]; + let mut block_header = NakamotoBlockHeader::empty(); + let signer_signature = vec![ + MessageSignature::from_bytes(&[0; 65]).unwrap(), + MessageSignature::from_bytes(&[1; 65]).unwrap(), + ]; + block_header.signer_signature = signer_signature.clone(); + let block = NakamotoBlock { + header: block_header.clone(), + txs: vec![], + }; + let mut metadata = StacksHeaderInfo::regtest_genesis(); + metadata.anchored_header = StacksBlockHeaderTypes::Nakamoto(block_header); + let receipts = vec![]; + let parent_index_hash = StacksBlockId([0; 32]); + let winner_txid = Txid([0; 32]); + let mature_rewards = serde_json::Value::Array(vec![]); + let parent_burn_block_hash = BurnchainHeaderHash([0; 32]); + let parent_burn_block_height = 0; + let parent_burn_block_timestamp = 0; + let anchored_consumed = ExecutionCost::ZERO; + let mblock_confirmed_consumed = ExecutionCost::ZERO; + let pox_constants = PoxConstants::testnet_default(); + let signer_bitvec = BitVec::zeros(2).expect("Failed to create BitVec with length 2"); + let block_timestamp = Some(123456); + let coinbase_height = 1234; + + let payload = make_new_block_processed_payload( + filtered_events, + &StacksBlockEventData::from((block, BlockHeaderHash([0; 32]))), + &metadata, + &receipts, + &parent_index_hash, + &winner_txid, + &mature_rewards, + &parent_burn_block_hash, + parent_burn_block_height, + parent_burn_block_timestamp, + &anchored_consumed, + &mblock_confirmed_consumed, + &pox_constants, + &None, + &Some(signer_bitvec), + block_timestamp, + coinbase_height, + ); + + let event_signer_signature = payload + .get("signer_signature") + .unwrap() + .as_array() + .expect("Expected signer_signature to be an array") + .iter() + .cloned() + .map(serde_json::from_value::) + .collect::, _>>() + .expect("Unable to deserialize array of MessageSignature"); + assert_eq!(event_signer_signature, signer_signature); +} + +#[test] +fn test_send_request_connect_timeout() { + let timeout_duration = Duration::from_secs(3); + + // Start measuring time + let start_time = Instant::now(); + + let host = "10.255.255.1"; // non-routable IP for timeout + let port = 80; + + let peerhost: PeerHost = format!("{host}:{port}") + .parse() + .unwrap_or(PeerHost::DNS(host.to_string(), port)); + let mut request = StacksHttpRequest::new_for_peer( + peerhost, + "POST".into(), + "/".into(), + HttpRequestContents::new().payload_json(serde_json::from_slice(b"{}").unwrap()), + ) + .unwrap_or_else(|_| panic!("FATAL: failed to encode infallible data as HTTP request")); + request.add_header("Connection".into(), "close".into()); + + // Attempt to send a request with a timeout + let result = send_http_request(host, port, request, timeout_duration); + + // Measure the elapsed time + let elapsed_time = start_time.elapsed(); + + // Assert that the connection attempt timed out + assert!( + result.is_err(), + "Expected a timeout error, but got {result:?}" + ); + assert_eq!( + result.unwrap_err().kind(), + std::io::ErrorKind::TimedOut, + "Expected a TimedOut error" + ); + + // Assert that the elapsed time is within an acceptable range + assert!( + elapsed_time >= timeout_duration, + "Timeout occurred too quickly" + ); + assert!( + elapsed_time < timeout_duration + Duration::from_secs(1), + "Timeout took too long" + ); +} + +fn get_random_port() -> u16 { + // Bind to a random port by specifying port 0, then retrieve the port assigned by the OS + let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to a random port"); + listener.local_addr().unwrap().port() +} + +#[test] +#[serial] +fn test_process_pending_payloads() { + use mockito::Matcher; + + let dir = tempdir().unwrap(); + let db_path = dir.path().join("event_observers.sqlite"); + let mut server = mockito::Server::new(); + let endpoint = server.host_with_port(); + info!("endpoint: {}", endpoint); + let timeout = Duration::from_secs(5); + + let mut dispatcher = EventDispatcher::new(Some(dir.path().to_path_buf())); + + dispatcher.register_observer(&EventObserverConfig { + endpoint: endpoint.clone(), + events_keys: vec![EventKeyType::AnyEvent], + timeout_ms: timeout.as_millis() as u64, + disable_retries: false, + }); + + let conn = + EventDispatcherDbConnection::new(&db_path).expect("Failed to initialize the database"); + + let payload = json!({"key": "value"}); + let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); + let timeout = Duration::from_secs(5); + + let _m = server + .mock("POST", "/api") + .match_header("content-type", Matcher::Regex("application/json.*".into())) + .match_body(Matcher::Json(payload.clone())) + .with_status(200) + .create(); + + let url = &format!("{}/api", &server.url()); + + TEST_EVENT_OBSERVER_SKIP_RETRY.set(false); + + // Insert payload + conn.insert_payload(url, payload_bytes.as_slice(), timeout) + .expect("Failed to insert payload"); + + // Process pending payloads + dispatcher.process_pending_payloads(); + + // Verify that the pending payloads list is empty + let pending_payloads = conn + .get_pending_payloads() + .expect("Failed to get pending payloads"); + assert_eq!(pending_payloads.len(), 0, "Expected no pending payloads"); + + // Verify that the mock was called + _m.assert(); +} + +#[test] +fn pending_payloads_are_skipped_if_url_does_not_match() { + let dir = tempdir().unwrap(); + let db_path = dir.path().join("event_observers.sqlite"); + + let mut server = mockito::Server::new(); + let endpoint = server.host_with_port(); + let timeout = Duration::from_secs(5); + let mut dispatcher = EventDispatcher::new(Some(dir.path().to_path_buf())); + + dispatcher.register_observer(&EventObserverConfig { + endpoint: endpoint.clone(), + events_keys: vec![EventKeyType::AnyEvent], + timeout_ms: timeout.as_millis() as u64, + disable_retries: false, + }); + + let conn = + EventDispatcherDbConnection::new(&db_path).expect("Failed to initialize the database"); + + let payload = json!({"key": "value"}); + let payload_bytes = serde_json::to_vec(&payload).expect("Failed to serialize payload"); + let timeout = Duration::from_secs(5); + + let mock = server + .mock("POST", "/api") + .match_header( + "content-type", + mockito::Matcher::Regex("application/json.*".into()), + ) + .match_body(mockito::Matcher::Json(payload.clone())) + .with_status(200) + .expect(0) // Expect 0 calls to this endpoint + .create(); + + // Use a different URL than the observer's endpoint + let url = "http://different-domain.com/api"; + + conn.insert_payload(url, payload_bytes.as_slice(), timeout) + .expect("Failed to insert payload"); + + dispatcher.process_pending_payloads(); + + let pending_payloads = conn + .get_pending_payloads() + .expect("Failed to get pending payloads"); + // Verify that the pending payload is no longer in the database, + // because this observer is no longer registered. + assert_eq!( + pending_payloads.len(), + 0, + "Expected payload to be removed from database since URL didn't match" + ); + + mock.assert(); +} + +#[test] +fn test_new_event_dispatcher_with_db() { + let dir = tempdir().unwrap(); + let working_dir = dir.path().to_path_buf(); + + let dispatcher = EventDispatcher::new(Some(working_dir.clone())); + + let expected_db_path = working_dir.join("event_observers.sqlite"); + assert_eq!(dispatcher.db_path, Some(expected_db_path.clone())); + + assert!( + !expected_db_path.exists(), + "Database file was created too soon" + ); + + EventDispatcherDbConnection::new(&expected_db_path).expect("Failed to initialize the database"); + + // Verify that the database was initialized + assert!(expected_db_path.exists(), "Database file was not created"); +} + +#[test] +fn test_new_event_observer() { + let endpoint = "http://example.com".to_string(); + let timeout = Duration::from_secs(5); + + let observer = EventObserver::new(endpoint.clone(), timeout, false); + + // Verify fields + assert_eq!(observer.endpoint, endpoint); + assert_eq!(observer.timeout, timeout); + assert_eq!(observer.disable_retries, false); +} + +#[test] +fn test_new_event_dispatcher_without_db() { + let dispatcher = EventDispatcher::new(None); + + assert!(dispatcher.db_path.is_none(), "Expected db_path to be None"); +} + +#[test] +#[serial] +fn test_send_payload_with_db() { + use mockito::Matcher; + + let dir = tempdir().unwrap(); + let working_dir = dir.path().to_path_buf(); + let payload = json!({"key": "value"}); + + let dispatcher = EventDispatcher::new(Some(working_dir.clone())); + let db_path = dispatcher.clone().db_path.clone().unwrap(); + EventDispatcherDbConnection::new(&db_path).expect("Failed to initialize the database"); + + // Create a mock server + let mut server = mockito::Server::new(); + let _m = server + .mock("POST", "/test") + .match_header("content-type", Matcher::Regex("application/json.*".into())) + .match_body(Matcher::Json(payload.clone())) + .with_status(200) + .create(); + + let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); + let timeout = Duration::from_secs(5); + + let observer = EventObserver::new(endpoint, timeout, false); + + TEST_EVENT_OBSERVER_SKIP_RETRY.set(false); + + // Call send_payload + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Verify that the payload was sent and database is empty + _m.assert(); + + // Verify that the database is empty + let db_path = dispatcher.db_path.unwrap(); + let db_path_str = db_path.to_str().unwrap(); + let conn = Connection::open(db_path_str).expect("Failed to open database"); + let pending_payloads = EventDispatcherDbConnection::new_from_exisiting_connection(conn) + .get_pending_payloads() + .expect("Failed to get pending payloads"); + assert_eq!(pending_payloads.len(), 0, "Expected no pending payloads"); +} + +#[test] +fn test_send_payload_without_db() { + use mockito::Matcher; + + let timeout = Duration::from_secs(5); + let payload = json!({"key": "value"}); + + // Create a mock server + let mut server = mockito::Server::new(); + let _m = server + .mock("POST", "/test") + .match_header("content-type", Matcher::Regex("application/json.*".into())) + .match_body(Matcher::Json(payload.clone())) + .with_status(200) + .create(); + + let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); + + let observer = EventObserver::new(endpoint, timeout, false); + + let dispatcher = EventDispatcher::new(None); + + // Call send_payload + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Verify that the payload was sent + _m.assert(); +} + +#[test] +fn test_send_payload_success() { + let port = get_random_port(); + + // Set up a channel to notify when the server has processed the request + let (tx, rx) = channel(); + + // Start a mock server in a separate thread + let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); + thread::spawn(move || { + let request = server.recv().unwrap(); + assert_eq!(request.url(), "/test"); + assert_eq!(request.method(), &Method::Post); + + // Simulate a successful response + let response = Response::from_string("HTTP/1.1 200 OK"); + request.respond(response).unwrap(); + + // Notify the test that the request was processed + tx.send(()).unwrap(); + }); + + let observer = EventObserver::new(format!("127.0.0.1:{port}"), Duration::from_secs(3), false); + + let payload = json!({"key": "value"}); + + let dispatcher = EventDispatcher::new(None); + + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Wait for the server to process the request + rx.recv_timeout(Duration::from_secs(5)) + .expect("Server did not receive request in time"); +} + +#[test] +fn test_send_payload_retry() { + let port = get_random_port(); + + // Set up a channel to notify when the server has processed the request + let (tx, rx) = channel(); + + // Start a mock server in a separate thread + let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); + thread::spawn(move || { + let mut attempt = 0; + while let Ok(request) = server.recv() { + attempt += 1; + if attempt == 1 { + debug!("Mock server received request attempt 1"); + // Simulate a failure on the first attempt + let response = Response::new( + StatusCode(500), + vec![], + "Internal Server Error".as_bytes(), + Some(21), + None, + ); + request.respond(response).unwrap(); + } else { + debug!("Mock server received request attempt 2"); + // Simulate a successful response on the second attempt + let response = Response::from_string("HTTP/1.1 200 OK"); + request.respond(response).unwrap(); + + // Notify the test that the request was processed successfully + tx.send(()).unwrap(); + break; + } + } + }); + + let observer = EventObserver::new(format!("127.0.0.1:{port}"), Duration::from_secs(3), false); + + let payload = json!({"key": "value"}); + + let dispatcher = EventDispatcher::new(None); + + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Wait for the server to process the request + rx.recv_timeout(Duration::from_secs(5)) + .expect("Server did not receive request in time"); +} + +#[test] +#[serial] +fn test_send_payload_timeout() { + let port = get_random_port(); + let timeout = Duration::from_secs(3); + + // Set up a channel to notify when the server has processed the request + let (tx, rx) = channel(); + + // Start a mock server in a separate thread + let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); + thread::spawn(move || { + let mut attempt = 0; + // This exists to only keep request from being dropped + #[allow(clippy::collection_is_never_read)] + let mut _request_holder = None; + while let Ok(request) = server.recv() { + attempt += 1; + if attempt == 1 { + debug!("Mock server received request attempt 1"); + // Do not reply, forcing the sender to timeout and retry, + // but don't drop the request or it will receive a 500 error, + _request_holder = Some(request); + } else { + debug!("Mock server received request attempt 2"); + // Simulate a successful response on the second attempt + let response = Response::from_string("HTTP/1.1 200 OK"); + request.respond(response).unwrap(); + + // Notify the test that the request was processed successfully + tx.send(()).unwrap(); + break; + } + } + }); + + let observer = EventObserver::new(format!("127.0.0.1:{port}"), timeout, false); + + let payload = json!({"key": "value"}); + + // Record the time before sending the payload + let start_time = Instant::now(); + + let dispatcher = EventDispatcher::new(None); + + // Call the function being tested + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Record the time after the function returns + let elapsed_time = start_time.elapsed(); + + println!("Elapsed time: {elapsed_time:?}"); + assert!( + elapsed_time >= timeout, + "Expected a timeout, but the function returned too quickly" + ); + + assert!( + elapsed_time < timeout + Duration::from_secs(1), + "Expected a timeout, but the function took too long" + ); + + // Wait for the server to process the request + rx.recv_timeout(Duration::from_secs(5)) + .expect("Server did not receive request in time"); +} + +#[test] +#[serial] +fn test_send_payload_with_db_force_restart() { + let port = get_random_port(); + let timeout = Duration::from_secs(3); + let dir = tempdir().unwrap(); + let working_dir = dir.path().to_path_buf(); + + // Set up a channel to notify when the server has processed the request + let (tx, rx) = channel(); + + info!("Starting mock server on port {port}"); + // Start a mock server in a separate thread + let server = Server::http(format!("127.0.0.1:{port}")).unwrap(); + thread::spawn(move || { + let mut attempt = 0; + // This exists to only keep request from being dropped + #[allow(clippy::collection_is_never_read)] + let mut _request_holder = None; + while let Ok(mut request) = server.recv() { + attempt += 1; + match attempt { + 1 => { + info!("Mock server received request attempt 1"); + // Do not reply, forcing the sender to timeout and retry, + // but don't drop the request or it will receive a 500 error, + _request_holder = Some(request); + } + 2 => { + info!("Mock server received request attempt 2"); + + // Verify the payload + let mut payload = String::new(); + request.as_reader().read_to_string(&mut payload).unwrap(); + let expected_payload = r#"{"key":"value"}"#; + assert_eq!(payload, expected_payload); + + // Simulate a successful response on the second attempt + let response = Response::from_string("HTTP/1.1 200 OK"); + request.respond(response).unwrap(); + } + 3 => { + info!("Mock server received request attempt 3"); + + // Verify the payload + let mut payload = String::new(); + request.as_reader().read_to_string(&mut payload).unwrap(); + let expected_payload = r#"{"key":"value2"}"#; + assert_eq!(payload, expected_payload); + + // Simulate a successful response on the second attempt + let response = Response::from_string("HTTP/1.1 200 OK"); + request.respond(response).unwrap(); + + // When we receive attempt 3 (message 1, re-sent message 1, message 2), + // notify the test that the request was processed successfully + tx.send(()).unwrap(); + break; + } + _ => panic!("Unexpected request attempt"), + } + } + }); + + let mut dispatcher = EventDispatcher::new(Some(working_dir.clone())); + + let observer = dispatcher.register_observer_private(&EventObserverConfig { + endpoint: format!("127.0.0.1:{port}"), + timeout_ms: timeout.as_millis() as u64, + events_keys: vec![EventKeyType::AnyEvent], + disable_retries: false, + }); + + EventDispatcherDbConnection::new(&dispatcher.clone().db_path.unwrap()).unwrap(); + + let payload = json!({"key": "value"}); + let payload2 = json!({"key": "value2"}); + + // Disable retrying so that it sends the payload only once + // and that payload will be ignored by the test server. + TEST_EVENT_OBSERVER_SKIP_RETRY.set(true); + + info!("Sending payload 1"); + + // Send the payload + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Re-enable retrying + TEST_EVENT_OBSERVER_SKIP_RETRY.set(false); + + dispatcher.process_pending_payloads(); + + info!("Sending payload 2"); + + // Send another payload + dispatcher.send_payload(&observer, &payload2, "/test", None); + + // Wait for the server to process the requests + rx.recv_timeout(Duration::from_secs(5)) + .expect("Server did not receive request in time"); +} + +#[test] +fn test_event_dispatcher_disable_retries() { + let timeout = Duration::from_secs(5); + let payload = json!({"key": "value"}); + + // Create a mock server returning error 500 + let mut server = mockito::Server::new(); + let _m = server.mock("POST", "/test").with_status(500).create(); + + let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); + + let observer = EventObserver::new(endpoint, timeout, true); + + let dispatcher = EventDispatcher::new(None); + + // in non "disable_retries" mode this will run forever + dispatcher.send_payload(&observer, &payload, "/test", None); + + // Verify that the payload was sent + _m.assert(); +} + +#[test] +fn test_event_dispatcher_disable_retries_invalid_url() { + let timeout = Duration::from_secs(5); + let payload = json!({"key": "value"}); + + let endpoint = String::from("255.255.255.255"); + + let observer = EventObserver::new(endpoint, timeout, true); + + let dispatcher = EventDispatcher::new(None); + + // in non "disable_retries" mode this will run forever + dispatcher.send_payload(&observer, &payload, "/test", None); +} + +#[test] +#[ignore] +/// This test generates a new block and ensures the "disable_retries" events_observer will not block. +fn block_event_with_disable_retries_observer() { + let dir = tempdir().unwrap(); + let working_dir = dir.path().to_path_buf(); + + let mut event_dispatcher = EventDispatcher::new(Some(working_dir.clone())); + let config = EventObserverConfig { + endpoint: String::from("255.255.255.255"), + events_keys: vec![EventKeyType::MinedBlocks], + timeout_ms: 1000, + disable_retries: true, + }; + event_dispatcher.register_observer(&config); + + let nakamoto_block = NakamotoBlock { + header: NakamotoBlockHeader::empty(), + txs: vec![], + }; + + // this will block forever in non "disable_retries" mode + event_dispatcher.process_mined_nakamoto_block_event( + 0, + &nakamoto_block, + 0, + &ExecutionCost::max_value(), + vec![], + ); + + assert_eq!(event_dispatcher.registered_observers.len(), 1); +} + +#[test] +/// This test checks that tx payloads properly convert the stacks transaction receipt regardless of the presence of the vm_error +fn make_new_block_txs_payload_vm_error() { + let privkey = StacksPrivateKey::random(); + let pubkey = StacksPublicKey::from_private(&privkey); + let addr = StacksAddress::from_public_keys( + C32_ADDRESS_VERSION_TESTNET_SINGLESIG, + &AddressHashMode::SerializeP2PKH, + 1, + &vec![pubkey], + ) + .unwrap(); + + let tx = StacksTransaction { + version: TransactionVersion::Testnet, + chain_id: 0x80000000, + auth: TransactionAuth::from_p2pkh(&privkey).unwrap(), + anchor_mode: TransactionAnchorMode::Any, + post_condition_mode: TransactionPostConditionMode::Allow, + post_conditions: vec![], + payload: TransactionPayload::TokenTransfer( + addr.to_account_principal(), + 123, + TokenTransferMemo([0u8; 34]), + ), + }; + + let mut receipt = StacksTransactionReceipt { + transaction: TransactionOrigin::Burn(BlockstackOperationType::PreStx(PreStxOp { + output: StacksAddress::new(0, Hash160([1; 20])).unwrap(), + txid: tx.txid(), + vtxindex: 0, + block_height: 1, + burn_header_hash: BurnchainHeaderHash([5u8; 32]), + })), + events: vec![], + post_condition_aborted: true, + result: Value::okay_true(), + contract_analysis: None, + execution_cost: ExecutionCost { + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 0, + }, + microblock_header: None, + vm_error: None, + stx_burned: 0u128, + tx_index: 0, + }; + + let payload_no_error = make_new_block_txs_payload(&receipt, 0); + assert_eq!(payload_no_error.vm_error, receipt.vm_error); + + receipt.vm_error = Some("Inconceivable!".into()); + + let payload_with_error = make_new_block_txs_payload(&receipt, 0); + assert_eq!(payload_with_error.vm_error, receipt.vm_error); +} + +fn make_tenure_change_payload() -> TenureChangePayload { + TenureChangePayload { + tenure_consensus_hash: ConsensusHash([0; 20]), + prev_tenure_consensus_hash: ConsensusHash([0; 20]), + burn_view_consensus_hash: ConsensusHash([0; 20]), + previous_tenure_end: StacksBlockId([0; 32]), + previous_tenure_blocks: 1, + cause: TenureChangeCause::Extended, + pubkey_hash: Hash160([0; 20]), + } +} + +fn make_tenure_change_tx(payload: TenureChangePayload) -> StacksTransaction { + StacksTransaction { + version: TransactionVersion::Testnet, + chain_id: 1, + auth: TransactionAuth::Standard(TransactionSpendingCondition::Singlesig( + SinglesigSpendingCondition { + hash_mode: SinglesigHashMode::P2PKH, + signer: Hash160([0; 20]), + nonce: 0, + tx_fee: 0, + key_encoding: TransactionPublicKeyEncoding::Compressed, + signature: MessageSignature([0; 65]), + }, + )), + anchor_mode: TransactionAnchorMode::Any, + post_condition_mode: TransactionPostConditionMode::Allow, + post_conditions: vec![], + payload: TransactionPayload::TenureChange(payload), + } +} + +#[test] +fn backwards_compatibility_transaction_event_payload() { + let tx = make_tenure_change_tx(make_tenure_change_payload()); + let receipt = StacksTransactionReceipt { + transaction: TransactionOrigin::Burn(BlockstackOperationType::PreStx(PreStxOp { + output: StacksAddress::new(0, Hash160([1; 20])).unwrap(), + txid: tx.txid(), + vtxindex: 0, + block_height: 1, + burn_header_hash: BurnchainHeaderHash([5u8; 32]), + })), + events: vec![StacksTransactionEvent::SmartContractEvent( + SmartContractEventData { + key: (boot_code_id("some-contract", false), "some string".into()), + value: Value::Bool(false), + }, + )], + post_condition_aborted: false, + result: Value::okay_true(), + stx_burned: 100, + contract_analysis: None, + execution_cost: ExecutionCost { + write_length: 1, + write_count: 2, + read_length: 3, + read_count: 4, + runtime: 5, + }, + microblock_header: None, + tx_index: 1, + vm_error: None, + }; + let payload = make_new_block_txs_payload(&receipt, 0); + let new_serialized_data = serde_json::to_string_pretty(&payload).expect("Failed"); + let old_serialized_data = r#" + { + "burnchain_op": { + "pre_stx": { + "burn_block_height": 1, + "burn_header_hash": "0505050505050505050505050505050505050505050505050505050505050505", + "burn_txid": "ace70e63009a2c2d22c0f948b146d8a28df13a2900f3b5f3cc78b56459ffef05", + "output": { + "address": "S0G2081040G2081040G2081040G2081054GYN98", + "address_hash_bytes": "0x0101010101010101010101010101010101010101", + "address_version": 0 + }, + "vtxindex": 0 + } + }, + "contract_abi": null, + "execution_cost": { + "read_count": 4, + "read_length": 3, + "runtime": 5, + "write_count": 2, + "write_length": 1 + }, + "microblock_hash": null, + "microblock_parent_hash": null, + "microblock_sequence": null, + "raw_result": "0x0703", + "raw_tx": "0x00", + "status": "success", + "tx_index": 0, + "txid": "0xace70e63009a2c2d22c0f948b146d8a28df13a2900f3b5f3cc78b56459ffef05" + } + "#; + let new_value: TransactionEventPayload = serde_json::from_str(&new_serialized_data) + .expect("Failed to deserialize new data as TransactionEventPayload"); + let old_value: TransactionEventPayload = serde_json::from_str(&old_serialized_data) + .expect("Failed to deserialize old data as TransactionEventPayload"); + assert_eq!(new_value, old_value); +} + +#[test] +fn test_block_proposal_validation_event() { + let mut server = mockito::Server::new(); + let mock = server.mock("POST", "/proposal_response").create(); + + let endpoint = server.url().strip_prefix("http://").unwrap().to_string(); + + let mut dispatcher = EventDispatcher::new(None); + dispatcher.register_observer(&EventObserverConfig { + endpoint: endpoint.clone(), + events_keys: vec![EventKeyType::BlockProposal], + timeout_ms: 3_000, + disable_retries: false, + }); + + // The below matches what the `RPCBlockProposalRequestHandler` does via + // `NakamotoBlockProposal::spawn_validation_thread`: It calls + // `get_proposal_callback_receiver()` and moves the result to the thread + // that performs that validation and when done, sends the validation + // result through the event dispatcher. + + let receiver = dispatcher.get_proposal_callback_receiver().unwrap(); + + let validation_thread = thread::spawn(move || { + let result = BlockValidateOk { + signer_signature_hash: Sha512Trunc256Sum::from_data(&[0, 8, 15]), + cost: ExecutionCost::ZERO, + size: 666, + validation_time_ms: 4321, + replay_tx_hash: None, + replay_tx_exhausted: false, + }; + receiver.notify_proposal_result(Ok(result)); + }); + + validation_thread.join().unwrap(); + + mock.assert(); +} diff --git a/stacks-node/src/nakamoto_node/miner.rs b/stacks-node/src/nakamoto_node/miner.rs index e601ceb2558..1fd7dd4fc78 100644 --- a/stacks-node/src/nakamoto_node/miner.rs +++ b/stacks-node/src/nakamoto_node/miner.rs @@ -746,6 +746,13 @@ impl BlockMinerThread { } Ok(None) } + Err(NakamotoNodeError::ParentNotFound) if self.config.node.mock_mining => { + info!( + "Mock miner could not load parent tenure info yet. Will try again."; + ); + thread::sleep(Duration::from_millis(ABORT_TRY_AGAIN_MS)); + Ok(None) + } Err(e) => { warn!("Failed to mine block: {e:?}"); diff --git a/stacks-node/src/nakamoto_node/relayer.rs b/stacks-node/src/nakamoto_node/relayer.rs index 59691d39fa8..26c272bc457 100644 --- a/stacks-node/src/nakamoto_node/relayer.rs +++ b/stacks-node/src/nakamoto_node/relayer.rs @@ -760,7 +760,7 @@ impl RelayerThread { sn: BlockSnapshot, mining_pk: &Hash160, ) -> Option { - let (canonical_stacks_tip_ch, _) = + let (canonical_stacks_tip_ch, canonical_stacks_tip_bh) = SortitionDB::get_canonical_stacks_chain_tip_hash(self.sortdb.conn()) .expect("FATAL: failed to query sortition DB for stacks tip"); let canonical_stacks_snapshot = @@ -797,9 +797,26 @@ impl RelayerThread { return None; }; + // Check if we won the last winning snapshot AND it commits to the ongoing tenure. let won_last_winning_snapshot = last_winning_snapshot.miner_pk_hash.as_ref() == Some(mining_pk); - if won_last_winning_snapshot { + let canonical_stacks_tip = + StacksBlockId::new(&canonical_stacks_tip_ch, &canonical_stacks_tip_bh); + let commits_to_tip_tenure = Self::sortition_commits_to_stacks_tip_tenure( + &mut self.chainstate, + &canonical_stacks_tip, + &canonical_stacks_snapshot, + &last_winning_snapshot, + ).unwrap_or_else(|e| { + warn!( + "Relayer: Failed to determine if last winning sortition commits to current tenure: {e:?}"; + "sortition_ch" => %sn.consensus_hash, + "stacks_tip_ch" => %canonical_stacks_tip_ch + ); + false + }); + + if won_last_winning_snapshot && commits_to_tip_tenure { debug!( "Relayer: we won the last winning sortition {}", &last_winning_snapshot.consensus_hash diff --git a/stacks-node/src/tests/signer/commands/block_wait.rs b/stacks-node/src/tests/signer/commands/block_wait.rs index 04e9b9f2b74..7706055a437 100644 --- a/stacks-node/src/tests/signer/commands/block_wait.rs +++ b/stacks-node/src/tests/signer/commands/block_wait.rs @@ -4,7 +4,6 @@ use std::sync::Arc; use libsigner::v0::messages::RejectReason; use madhouse::{Command, CommandWrapper}; use proptest::prelude::{Just, Strategy}; -use proptest::prop_oneof; use stacks::chainstate::stacks::{TenureChangeCause, TenureChangePayload, TransactionPayload}; use super::context::{SignerTestContext, SignerTestState}; diff --git a/stacks-node/src/tests/signer/mod.rs b/stacks-node/src/tests/signer/mod.rs index d8db0e960d0..aa64ea9824e 100644 --- a/stacks-node/src/tests/signer/mod.rs +++ b/stacks-node/src/tests/signer/mod.rs @@ -585,7 +585,8 @@ impl SignerTest { let latest_block = self .stacks_client .get_tenure_tip(&sortition_prior.consensus_hash) - .unwrap(); + .unwrap() + .anchored_header; let latest_block_id = StacksBlockId::new(&sortition_prior.consensus_hash, &latest_block.block_hash()); @@ -642,7 +643,8 @@ impl SignerTest { let latest_block = self .stacks_client .get_tenure_tip(sortition_prior.stacks_parent_ch.as_ref().unwrap()) - .unwrap(); + .unwrap() + .anchored_header; let latest_block_id = StacksBlockId::new( sortition_prior.stacks_parent_ch.as_ref().unwrap(), &latest_block.block_hash(), @@ -904,7 +906,8 @@ impl SignerTest { let latest_block = self .stacks_client .get_tenure_tip(&sortition_prior.consensus_hash) - .unwrap(); + .unwrap() + .anchored_header; let latest_block_id = StacksBlockId::new(&sortition_prior.consensus_hash, &latest_block.block_hash()); @@ -984,7 +987,8 @@ impl SignerTest { let latest_block = self .stacks_client .get_tenure_tip(&sortition_parent.consensus_hash) - .unwrap(); + .unwrap() + .anchored_header; let latest_block_id = StacksBlockId::new(&sortition_parent.consensus_hash, &latest_block.block_hash()); diff --git a/stacks-node/src/tests/signer/v0.rs b/stacks-node/src/tests/signer/v0.rs index 5d90a21be53..53ca77eb87c 100644 --- a/stacks-node/src/tests/signer/v0.rs +++ b/stacks-node/src/tests/signer/v0.rs @@ -34,6 +34,7 @@ use madhouse::{execute_commands, prop_allof, scenario, Command, CommandWrapper}; use pinny::tag; use proptest::prelude::Strategy; use rand::{thread_rng, Rng}; +use reqwest::header::AUTHORIZATION; use rusqlite::Connection; use stacks::address::AddressHashMode; use stacks::burnchains::Txid; @@ -67,6 +68,7 @@ use stacks::core::test_util::{ use stacks::core::{StacksEpochId, CHAIN_ID_TESTNET, HELIUM_BLOCK_LIMIT_20}; use stacks::libstackerdb::StackerDBChunkData; use stacks::net::api::getsigner::GetSignerResponse; +use stacks::net::api::gettransaction::TransactionResponse; use stacks::net::api::postblock_proposal::{ BlockValidateResponse, ValidateRejectCode, TEST_REJECT_REPLAY_TXS, TEST_VALIDATE_DELAY_DURATION_SECS, TEST_VALIDATE_STALL, @@ -113,9 +115,7 @@ use tracing_subscriber::{fmt, EnvFilter}; use super::SignerTest; use crate::clarity::vm::clarity::ClarityConnection; -use crate::event_dispatcher::{ - EventObserver, MinedNakamotoBlockEvent, TEST_SKIP_BLOCK_ANNOUNCEMENT, -}; +use crate::event_dispatcher::{MinedNakamotoBlockEvent, TEST_SKIP_BLOCK_ANNOUNCEMENT}; use crate::nakamoto_node::miner::{ fault_injection_stall_miner, fault_injection_unstall_miner, TEST_BLOCK_ANNOUNCE_STALL, TEST_BROADCAST_PROPOSAL_STALL, TEST_MINE_SKIP, TEST_P2P_BROADCAST_STALL, @@ -1006,6 +1006,12 @@ impl MultipleMinerTest { self.get_peer_info().stacks_tip } + /// Return the consensus hash for the current stacks tip from node 1. + /// This can be used to identify the active tenure. + pub fn get_peer_stacks_tip_ch(&self) -> ConsensusHash { + self.get_peer_info().stacks_tip_consensus_hash + } + /// Ensures that miner 2 submits a commit pointing to the current view reported by the stacks node as expected pub fn submit_commit_miner_2(&mut self, sortdb: &SortitionDB) { if !self.rl2_counters.naka_skip_commit_op.get() { @@ -2550,137 +2556,6 @@ fn revalidate_unknown_parent() { signer_test.shutdown(); } -#[test] -#[ignore] -/// This test is a regression test for issue #5858 in which the signer runloop -/// used the signature from the stackerdb to determine the miner public key. -/// This does not work in cases where events get coalesced. The fix was to use -/// the signature in the proposal's block header instead. -/// -/// This test covers the regression by adding a thread that interposes on the -/// stackerdb events sent to the test signers and mutating the signatures -/// so that the stackerdb chunks are signed by the wrong signer. After the -/// fix to #5848, signers are resilient to this behavior because they check -/// the signature on the block proposal (not the chunk). -fn regr_use_block_header_pk() { - if env::var("BITCOIND_TEST") != Ok("1".into()) { - return; - } - - tracing_subscriber::registry() - .with(fmt::layer()) - .with(EnvFilter::from_default_env()) - .init(); - - info!("------------------------- Test Setup -------------------------"); - let num_signers = 5; - let signer_listeners: Mutex> = Mutex::default(); - let signer_test: SignerTest = SignerTest::new_with_config_modifications( - num_signers, - vec![], - |_| {}, - |node_config| { - node_config.events_observers = node_config - .events_observers - .clone() - .into_iter() - .map(|mut event_observer| { - if event_observer - .endpoint - .ends_with(&test_observer::EVENT_OBSERVER_PORT.to_string()) - { - event_observer - } else if event_observer - .events_keys - .contains(&EventKeyType::StackerDBChunks) - { - event_observer - .events_keys - .retain(|key| *key != EventKeyType::StackerDBChunks); - let mut listeners_lock = signer_listeners.lock().unwrap(); - listeners_lock.push(event_observer.endpoint.clone()); - event_observer - } else { - event_observer - } - }) - .collect(); - }, - None, - None, - ); - - let signer_listeners: Vec<_> = signer_listeners - .lock() - .unwrap() - .drain(..) - .map(|endpoint| EventObserver { - endpoint, - db_path: None, - timeout: Duration::from_secs(120), - disable_retries: false, - }) - .collect(); - - let bad_signer = Secp256k1PrivateKey::from_seed(&[0xde, 0xad, 0xbe, 0xef]); - let bad_signer_pk = Secp256k1PublicKey::from_private(&bad_signer); - - let broadcast_thread_stopper = Arc::new(AtomicBool::new(true)); - let broadcast_thread_flag = broadcast_thread_stopper.clone(); - let broadcast_thread = thread::Builder::new() - .name("rebroadcast-thread".into()) - .spawn(move || { - let mut last_sent = 0; - while broadcast_thread_flag.load(Ordering::SeqCst) { - thread::sleep(Duration::from_secs(1)); - let mut signerdb_chunks = test_observer::get_stackerdb_chunks(); - if last_sent >= signerdb_chunks.len() { - continue; - } - let mut to_send = signerdb_chunks.split_off(last_sent); - last_sent = signerdb_chunks.len(); - for event in to_send.iter_mut() { - // mutilate the signature - event.modified_slots.iter_mut().for_each(|chunk_data| { - if let Ok(SignerMessage::StateMachineUpdate(_)) = - SignerMessage::consensus_deserialize(&mut chunk_data.data.as_slice()) - { - // We don't want to mutate the state machine update messages - return; - }; - let pk = chunk_data.recover_pk().unwrap(); - assert_ne!(pk, bad_signer_pk); - chunk_data.sign(&bad_signer).unwrap(); - }); - - let payload = serde_json::to_value(event).unwrap(); - for signer_listener in signer_listeners.iter() { - signer_listener.send_stackerdb_chunks(&payload); - } - } - } - }) - .unwrap(); - - let timeout = Duration::from_secs(200); - signer_test.boot_to_epoch_3(); - - let prior_stacks_height = signer_test.get_peer_info().stacks_tip_height; - - let tenures_to_mine = 2; - for _i in 0..tenures_to_mine { - signer_test.mine_nakamoto_block(timeout, false); - } - - let current_stacks_height = signer_test.get_peer_info().stacks_tip_height; - - assert!(current_stacks_height >= prior_stacks_height + tenures_to_mine); - - broadcast_thread_stopper.store(false, Ordering::SeqCst); - broadcast_thread.join().unwrap(); - signer_test.shutdown(); -} - #[test] #[ignore] fn forked_tenure_invalid() { @@ -3990,6 +3865,7 @@ fn tx_replay_btc_on_stx_invalidation() { c.reset_replay_set_after_fork_blocks = 5; }, |node_config| { + node_config.node.txindex = true; node_config.miner.block_commit_delay = Duration::from_secs(1); node_config.miner.replay_transactions = true; node_config.miner.activated_vrf_key_path = @@ -4002,7 +3878,7 @@ fn tx_replay_btc_on_stx_invalidation() { let conf = &signer_test.running_nodes.conf; let mut miner_keychain = Keychain::default(conf.node.seed.clone()).generate_op_signer(); - let _http_origin = format!("http://{}", &conf.node.rpc_bind); + let http_origin = format!("http://{}", &conf.node.rpc_bind); let mut btc_controller = BitcoinRegtestController::new(conf.clone(), None); let submitted_commits = signer_test .running_nodes @@ -4082,7 +3958,7 @@ fn tx_replay_btc_on_stx_invalidation() { signer_test.mine_nakamoto_block(Duration::from_secs(30), true); wait_for(30, || { - let account = get_account(&_http_origin, &recipient_addr); + let account = get_account(&http_origin, &recipient_addr); Ok(account.balance == recipient_balance.into()) }) .expect("Timed out waiting for balance to be updated"); @@ -4179,9 +4055,35 @@ fn tx_replay_btc_on_stx_invalidation() { assert!(found_block, "Failed to mine the tenure change block"); // Ensure that in the 30 seconds, the nonce did not increase. This also asserts that no tx replays were mined. - let account = get_account(&_http_origin, &recipient_addr); + let account = get_account(&http_origin, &recipient_addr); assert_eq!(account.nonce, 0, "Expected recipient nonce to be 0"); + // Call `/v3/transaction/{txid}` and verify that `is_canonical` is false + let get_transaction = |txid: &String| { + let url = &format!("{http_origin}/v3/transaction/{txid}"); + info!("Send request: GET {url}"); + reqwest::blocking::Client::new() + .get(url) + .header( + AUTHORIZATION, + conf.connection_options.auth_token.clone().unwrap(), + ) + .send() + .unwrap_or_else(|e| panic!("GET request failed: {e}")) + .json::() + .unwrap() + }; + + let transaction = get_transaction(&txid); + assert!( + !transaction.is_canonical, + "Expected transaction response to be non-canonical" + ); + assert!( + transaction.block_height.is_none(), + "Expected block height of tx response to be none" + ); + signer_test.shutdown(); } @@ -6867,7 +6769,7 @@ fn tx_replay_budget_exceeded_tenure_extend() { // Now, wait for the tx replay set to be cleared signer_test - .wait_for_signer_state_check(30, |state| Ok(state.get_tx_replay_set().is_none())) + .wait_for_signer_state_check(60, |state| Ok(state.get_tx_replay_set().is_none())) .expect("Timed out waiting for tx replay set to be cleared"); let mut found_block: Option = None; wait_for(60, || { @@ -13544,16 +13446,16 @@ fn reorg_attempts_count_towards_miner_validity() { /// /// Test Execution: /// Test validation endpoint is stalled. -/// The miner proposes a block N. +/// The miner A proposes a block N. /// Block proposals are stalled. /// A new tenure is started. /// The test waits for reorg_attempts_activity_timeout + 1 second. -/// The miner proposes a block N'. +/// The miner B proposes a block N'. /// The test waits for block proposal timeout + 1 second. /// The validation endpoint is resumed. /// The signers accept block N. /// The signers reject block N'. -/// The miner proposes block N+1. +/// The miner B proposes block N+1. /// The signers reject block N+1. /// /// Test Assertion: @@ -13640,42 +13542,68 @@ fn reorg_attempts_activity_timeout_exceeded() { ) .expect("Failed to update to Tenure B"); + // Make sure that no subsequent proposal arrives before the block_proposal_timeout is exceeded + TEST_BROADCAST_PROPOSAL_STALL.set(vec![miner_pk.clone()]); + info!( + "------------------------- Wait for block N {} to arrive late -------------------------", + block_proposal_n.header.signer_signature_hash() + ); + // Allow block N validation to finish, but don't broadcast it yet + TEST_VALIDATE_STALL.set(false); + TEST_PAUSE_BLOCK_BROADCAST.set(true); + let reward_cycle = signer_test.get_current_reward_cycle(); + wait_for_block_global_acceptance_from_signers( + 30, + &block_proposal_n.header.signer_signature_hash(), + &signer_test.get_signer_public_keys(reward_cycle), + ) + .expect("Timed out waiting for block proposal N to be globally accepted"); + let wait_time = reorg_attempts_activity_timeout.add(Duration::from_secs(1)); info!("------------------------- Waiting {} Seconds for Reorg Activity Timeout to be Exceeded-------------------------", wait_time.as_secs()); // Make sure to wait the reorg_attempts_activity_timeout AFTER the block is globally signed over // as this is the point where signers start considering from. - // Allow incoming mine to propose block N' std::thread::sleep(wait_time); + test_observer::clear(); + + // Allow incoming miner to propose block N' TEST_BROADCAST_PROPOSAL_STALL.set(vec![]); let block_proposal_n_prime = wait_for_block_proposal(30, chain_start.stacks_tip_height + 1, &miner_pk) .expect("Failed to get block proposal N'"); - // Make sure that no subsequent proposal arrives before the block_proposal_timeout is exceeded + assert_ne!(block_proposal_n, block_proposal_n_prime); + + // Pause proposals again to avoid any additional proposals TEST_BROADCAST_PROPOSAL_STALL.set(vec![miner_pk.clone()]); - info!("------------------------- Wait for block N' to arrive late -------------------------"); - // Allow block N validation to finish. - TEST_VALIDATE_STALL.set(false); + // Allow the block broadcast to proceed and then make sure we've advanced to block N + TEST_PAUSE_BLOCK_BROADCAST.set(false); wait_for(30, || { let chain_info = get_chain_info(&signer_test.running_nodes.conf); Ok(chain_info.stacks_tip_height > chain_before.stacks_tip_height) }) .expect("Timed out waiting for stacks tip to advance to block N"); let chain_after = get_chain_info(&signer_test.running_nodes.conf); - TEST_VALIDATE_STALL.set(true); - // We only need to wait the difference between the two timeouts now since we already slept for a min of reorg_attempts_activity_timeout + 1 - let wait_time = block_proposal_timeout.saturating_sub(reorg_attempts_activity_timeout); - info!("------------------------- Waiting {} Seconds for Miner To be Marked Invalid -------------------------", wait_time.as_secs()); + + // We wait the remainder of the block proposal timeout + let wait_time = block_proposal_timeout + .saturating_sub(reorg_attempts_activity_timeout) + .saturating_add(Duration::from_secs(1)); + info!("------------------------- Waiting {} Seconds for Miner to be Considered Inactive -------------------------", wait_time.as_secs()); std::thread::sleep(wait_time); + + info!("------------------------- Waiting for Miner To be Marked Invalid -------------------------"); wait_for_state_machine_update_by_miner_tenure_id( 30, &chain_start.pox_consensus, &signer_test.signer_addresses_versions(), ) .expect("Failed to revert back to prior miner's tenure"); - assert_ne!(block_proposal_n, block_proposal_n_prime); let chain_before = chain_after; - TEST_VALIDATE_STALL.set(false); - info!("------------------------- Wait for Block N' Rejection -------------------------"); + + info!( + "------------------------- Wait for Block N' {} Rejection -------------------------", + block_proposal_n_prime.header.signer_signature_hash() + ); wait_for_block_global_rejection( 30, &block_proposal_n_prime.header.signer_signature_hash(), @@ -16922,7 +16850,7 @@ fn large_mempool_base(strategy: MemPoolWalkStrategy, set_fee: impl Fn() -> u64) } // Wait for the first block to be accepted. - wait_for(30, || { + wait_for(60, || { let blocks = test_observer::get_blocks().len(); Ok(blocks > blocks_before) }) @@ -19272,6 +19200,7 @@ fn tenure_extend_after_stale_commit_different_miner() { verify_sortition_winner(&sortdb, &miner_pkh_2); miners.send_and_mine_transfer_tx(60).unwrap(); let tip_b_height = miners.get_peer_stacks_tip_height(); + let tenure_b_ch = miners.get_peer_stacks_tip_ch(); info!("------------------------- Miner 1 Wins Tenure C with stale commit -------------------------"); @@ -19335,14 +19264,14 @@ fn tenure_extend_after_stale_commit_different_miner() { ) .unwrap(); - let stacks_height_after_rejection = miners.get_peer_stacks_tip_height(); - assert_eq!(stacks_height_after_rejection, tip_b_height); + assert_eq!(miners.get_peer_stacks_tip_ch(), tenure_b_ch); info!("------------------------- Miner 2 Extends Tenure B -------------------------"); wait_for_tenure_change_tx(60, TenureChangeCause::Extended, tip_b_height + 1).unwrap(); let final_height = miners.get_peer_stacks_tip_height(); - assert_eq!(final_height, tip_b_height + 1); + assert_eq!(miners.get_peer_stacks_tip_ch(), tenure_b_ch); + assert!(final_height >= tip_b_height + 1); miners.shutdown(); } @@ -19478,3 +19407,336 @@ fn tenure_extend_after_stale_commit_same_miner() { signer_test.shutdown(); } + +#[test] +#[ignore] +/// Scenario: same miner extends tenure when the block-commit for the next tenure still confirms N-1 +/// +/// Flow: +/// - Miner A wins tenure N +/// - Miner A submits a block-commit confirming N-1 (commit submitted before N's block gets approved) +/// - Miner A mines at least 2 blocks in tenure N +/// - Miner A wins tenure N+1 with the stale commit (confirming N-1) +/// - Miner A cannot mine a normal tenure-change + coinbase in N+1 (would reorg its own N blocks) +/// - Miner A should issue a TenureExtend on top of tenure N +/// - The next sortition has no winner, so Miner A should again issue a TenureExtend on top of tenure N +fn tenure_extend_after_stale_commit_same_miner_then_no_winner() { + if env::var("BITCOIND_TEST") != Ok("1".into()) { + return; + } + + tracing_subscriber::registry() + .with(fmt::layer()) + .with(EnvFilter::from_default_env()) + .init(); + + let num_signers = 5; + let sender_sk = Secp256k1PrivateKey::from_seed("sender".as_bytes()); + let sender_addr = tests::to_addr(&sender_sk); + let send_amt = 1000; + let send_fee = 180; + + let signer_test: SignerTest = + SignerTest::new_with_config_modifications_and_snapshot( + num_signers, + vec![(sender_addr.clone(), (send_amt + send_fee) * 10)], + |signer_cfg| { + signer_cfg.block_proposal_timeout = Duration::from_minutes(60); + }, + |node_cfg| { + node_cfg.miner.block_commit_delay = Duration::from_secs(0); + }, + None, + None, + Some(function_name!()), + ); + + if signer_test.bootstrap_snapshot() { + signer_test.shutdown_and_snapshot(); + return; + } + + let conf = &signer_test.running_nodes.conf; + let miner_pk = + StacksPublicKey::from_private(&conf.miner.mining_key.clone().expect("Missing mining key")); + let miner_pkh = Hash160::from_node_public_key(&miner_pk); + let sortdb = conf.get_burnchain().open_sortition_db(true).unwrap(); + + let pre_test_tenures = 4; + for i in 1..=pre_test_tenures { + info!("Mining pre-test tenure {i} of {pre_test_tenures}"); + signer_test.mine_nakamoto_block(Duration::from_secs(30), true); + } + + signer_test.mine_nakamoto_block(Duration::from_secs(30), true); + // We are now in "N-1" + let prev_tip = get_chain_info(&signer_test.running_nodes.conf); + + info!("---- Waiting for block-commit to N-1 ----"; + "Current height" => prev_tip.burn_block_height, + ); + + let Counters { + naka_skip_commit_op: skip_commit_op, + naka_submitted_commit_last_burn_height: last_commit_burn_height, + .. + } = signer_test.running_nodes.counters.clone(); + + wait_for(30, || { + let last_height = last_commit_burn_height.get(); + Ok(last_height == prev_tip.burn_block_height) + }) + .expect("Timed out waiting for block-commit to N-1"); + + skip_commit_op.set(true); + + let prev_tip = get_chain_info(&signer_test.running_nodes.conf); + + signer_test.mine_nakamoto_block_without_commit(Duration::from_secs(30), true); + + TEST_MINER_COMMIT_TIP.set(Some((prev_tip.pox_consensus, prev_tip.stacks_tip))); + + // Now in tenure N + + // Mine a second block in tenure N to ensure that + // signers will reject a reorg attempt + let (_, transfer_nonce) = signer_test + .submit_transfer_tx(&sender_sk, send_fee, send_amt) + .unwrap(); + + signer_test + .wait_for_nonce_increase(&sender_addr, transfer_nonce) + .unwrap(); + + skip_commit_op.set(false); + + info!("---- Waiting for block commit to N-1 ----"); + + wait_for(30, || { + let last_height = last_commit_burn_height.get(); + Ok(last_height == prev_tip.burn_block_height) + }) + .expect("Timed out waiting for block commit to N-1"); + + // Start a new tenure (N+1) + + let info_before = get_chain_info(conf); + let stacks_height_before = info_before.stacks_tip_height; + + // Don't submit any block commits in this upcoming tenure + skip_commit_op.set(true); + + signer_test.mine_bitcoin_block(); + + verify_sortition_winner(&sortdb, &miner_pkh); + + info!("---- Waiting for a tenure extend block in tenure N+1 ----"; + "stacks_height_before" => stacks_height_before, + ); + + wait_for_block_proposal(30, stacks_height_before + 1, &miner_pk) + .expect("Timed out waiting for block proposal in tenure N+1"); + + // Verify that the next block is a TenureExtend at the expected height + wait_for_tenure_change_tx(30, TenureChangeCause::Extended, stacks_height_before + 1) + .expect("Timed out waiting for a TenureExtend block atop tenure N in tenure N+1"); + + wait_for(30, || { + let info = get_chain_info(conf); + Ok(info.stacks_tip_height == stacks_height_before + 1) + }) + .expect("Timed out waiting for stacks tip to advance after tenure extend"); + + let info_before = get_chain_info(conf); + let stacks_height_before = info_before.stacks_tip_height; + + // Now, mine the next bitcoin block, which should have no winner + signer_test.mine_bitcoin_block(); + + info!("---- Waiting for a tenure extend block in tenure N+2 ----"; + "stacks_height_before" => stacks_height_before, + ); + + wait_for_block_proposal(30, stacks_height_before + 1, &miner_pk) + .expect("Timed out waiting for block proposal in tenure N+1"); + + // Verify that the next block is a TenureExtend at the expected height + wait_for_tenure_change_tx(30, TenureChangeCause::Extended, stacks_height_before + 1) + .expect("Timed out waiting for a TenureExtend block atop tenure N in tenure N+2"); + + signer_test.shutdown(); +} + +#[test] +#[ignore] +fn read_count_extend_after_burn_view_change() { + if env::var("BITCOIND_TEST") != Ok("1".into()) { + return; + } + + tracing_subscriber::registry() + .with(fmt::layer()) + .with(EnvFilter::from_default_env()) + .init(); + + info!("------------------------- Test Setup -------------------------"); + let num_signers = 5; + let num_txs = 5; + let idle_timeout = Duration::from_secs(30); + let mut miners = MultipleMinerTest::new_with_config_modifications( + num_signers, + num_txs, + |signer_config| { + signer_config.block_proposal_timeout = Duration::from_secs(60); + signer_config.first_proposal_burn_block_timing = Duration::from_secs(0); + // use a different timeout to ensure that the correct timeout + // is read by the miner + signer_config.tenure_idle_timeout = Duration::from_secs(36000); + signer_config.read_count_idle_timeout = idle_timeout; + }, + |config| { + config.miner.block_commit_delay = Duration::from_secs(0); + let epochs = config.burnchain.epochs.as_mut().unwrap(); + let epoch_30_height = epochs[StacksEpochId::Epoch30].start_height; + epochs[StacksEpochId::Epoch30].end_height = epoch_30_height; + epochs[StacksEpochId::Epoch31].start_height = epoch_30_height; + epochs[StacksEpochId::Epoch31].end_height = epoch_30_height; + epochs[StacksEpochId::Epoch32].start_height = epoch_30_height; + epochs[StacksEpochId::Epoch32].end_height = epoch_30_height; + epochs[StacksEpochId::Epoch33].start_height = epoch_30_height; + }, + |config| { + config.miner.block_commit_delay = Duration::from_secs(0); + config.miner.tenure_extend_cost_threshold = 0; + config.miner.read_count_extend_cost_threshold = 0; + + let epochs = config.burnchain.epochs.as_mut().unwrap(); + let epoch_30_height = epochs[StacksEpochId::Epoch30].start_height; + epochs[StacksEpochId::Epoch30].end_height = epoch_30_height; + epochs[StacksEpochId::Epoch31].start_height = epoch_30_height; + epochs[StacksEpochId::Epoch31].end_height = epoch_30_height; + epochs[StacksEpochId::Epoch32].start_height = epoch_30_height; + epochs[StacksEpochId::Epoch32].end_height = epoch_30_height; + epochs[StacksEpochId::Epoch33].start_height = epoch_30_height; + }, + ); + + let (conf_1, _) = miners.get_node_configs(); + let (miner_pk_1, _) = miners.get_miner_public_keys(); + let (miner_pkh_1, miner_pkh_2) = miners.get_miner_public_key_hashes(); + + miners.pause_commits_miner_2(); + miners.boot_to_epoch_3(); + + miners.pause_commits_miner_1(); + + let sortdb = conf_1.get_burnchain().open_sortition_db(true).unwrap(); + + miners + .mine_bitcoin_block_and_tenure_change_tx(&sortdb, TenureChangeCause::BlockFound, 60) + .unwrap(); + + miners.submit_commit_miner_1(&sortdb); + + info!("------------------------- Miner 1 Wins Tenure A -------------------------"); + miners + .mine_bitcoin_block_and_tenure_change_tx(&sortdb, TenureChangeCause::BlockFound, 60) + .unwrap(); + verify_sortition_winner(&sortdb, &miner_pkh_1); + miners.send_and_mine_transfer_tx(60).unwrap(); + let tip_a_height = miners.get_peer_stacks_tip_height(); + let prev_tip = get_chain_info(&conf_1); + + info!("------------------------- Miner 2 Wins Tenure B -------------------------"); + miners.submit_commit_miner_2(&sortdb); + miners + .mine_bitcoin_block_and_tenure_change_tx(&sortdb, TenureChangeCause::BlockFound, 60) + .unwrap(); + verify_sortition_winner(&sortdb, &miner_pkh_2); + miners.send_and_mine_transfer_tx(60).unwrap(); + let tip_b_height = miners.get_peer_stacks_tip_height(); + let tenure_b_ch = miners.get_peer_stacks_tip_ch(); + + info!("------------------------- Miner 1 Wins Tenure C with stale commit -------------------------"); + + // We can't use `submit_commit_miner_1` here because we are using the stale view + { + TEST_MINER_COMMIT_TIP.set(Some((prev_tip.pox_consensus, prev_tip.stacks_tip))); + let rl1_commits_before = miners + .signer_test + .running_nodes + .counters + .naka_submitted_commits + .load(Ordering::SeqCst); + + miners + .signer_test + .running_nodes + .counters + .naka_skip_commit_op + .set(false); + + wait_for(30, || { + let commits_after = miners + .signer_test + .running_nodes + .counters + .naka_submitted_commits + .load(Ordering::SeqCst); + let last_commit_tip = miners + .signer_test + .running_nodes + .counters + .naka_submitted_commit_last_stacks_tip + .load(Ordering::SeqCst); + + Ok(commits_after > rl1_commits_before && last_commit_tip == prev_tip.stacks_tip_height) + }) + .expect("Timed out waiting for miner 1 to submit a commit op"); + + miners + .signer_test + .running_nodes + .counters + .naka_skip_commit_op + .set(true); + TEST_MINER_COMMIT_TIP.set(None); + } + + miners + .mine_bitcoin_blocks_and_confirm(&sortdb, 1, 60) + .unwrap(); + verify_sortition_winner(&sortdb, &miner_pkh_1); + + info!( + "------------------------- Miner 1's proposal for C is rejected -------------------------" + ); + let proposed_block = wait_for_block_proposal(60, tip_a_height + 1, &miner_pk_1).unwrap(); + wait_for_block_global_rejection( + 60, + &proposed_block.header.signer_signature_hash(), + num_signers, + ) + .unwrap(); + + assert_eq!(miners.get_peer_stacks_tip_ch(), tenure_b_ch); + + info!("------------------------- Miner 2 Extends Tenure B -------------------------"); + wait_for_tenure_change_tx(60, TenureChangeCause::Extended, tip_b_height + 1).unwrap(); + + let final_height = miners.get_peer_stacks_tip_height(); + assert_eq!(miners.get_peer_stacks_tip_ch(), tenure_b_ch); + assert!(final_height >= tip_b_height + 1); + + info!("---- Waiting for a tenure extend ----"); + + // Now, wait for a block with a tenure extend + wait_for(idle_timeout.as_secs() + 10, || { + Ok(last_block_contains_tenure_change_tx( + TenureChangeCause::ExtendedReadCount, + )) + }) + .expect("Timed out waiting for a block with a tenure extend"); + + miners.shutdown(); +} diff --git a/stacks-signer/CHANGELOG.md b/stacks-signer/CHANGELOG.md index 709abc6a244..cd8410c838f 100644 --- a/stacks-signer/CHANGELOG.md +++ b/stacks-signer/CHANGELOG.md @@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to the versioning scheme outlined in the [README.md](README.md). +## [3.3.0.0.4.0] + +### Fixed + +- Correct calculation of burn-view change status using the new tip with metadata endpoint. + +## [3.3.0.0.3.0] + +### Changed + +- Avoid sending duplicate block acceptance messages when additional pre-commits arrive + ## [3.3.0.0.2.0] ### Added diff --git a/stacks-signer/src/chainstate/mod.rs b/stacks-signer/src/chainstate/mod.rs index 4cd59a71244..83b9d81cb95 100644 --- a/stacks-signer/src/chainstate/mod.rs +++ b/stacks-signer/src/chainstate/mod.rs @@ -365,7 +365,7 @@ impl SortitionData { } let tip = match client.get_tenure_tip(tenure_id) { - Ok(tip) => tip, + Ok(tip) => tip.anchored_header, Err(e) => { warn!( "Failed to fetch the tenure tip for the parent tenure: {e:?}. Assuming proposal is higher than the parent tenure for now."; diff --git a/stacks-signer/src/chainstate/tests/mod.rs b/stacks-signer/src/chainstate/tests/mod.rs index 135745390cf..86b2de6bffb 100644 --- a/stacks-signer/src/chainstate/tests/mod.rs +++ b/stacks-signer/src/chainstate/tests/mod.rs @@ -13,7 +13,37 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use blockstack_lib::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader}; +use blockstack_lib::net::api::get_tenure_tip_meta::BlockHeaderWithMetadata; +use stacks_common::util::secp256k1::{MessageSignature, Secp256k1PrivateKey}; + /// Tests for chainstate v1 implementation mod v1; /// Tests for chainstate v2 implementation mod v2; + +pub fn make_parent_header_meta( + miner_sk: &Secp256k1PrivateKey, + block: &mut NakamotoBlock, +) -> BlockHeaderWithMetadata { + let mut parent_block_header = NakamotoBlockHeader { + version: block.header.version, + chain_length: block.header.chain_length - 1, + burn_spent: block.header.burn_spent, + consensus_hash: block.header.consensus_hash.clone(), + parent_block_id: block.header.parent_block_id.clone(), + tx_merkle_root: block.header.tx_merkle_root.clone(), + state_index_root: block.header.state_index_root, + timestamp: block.header.timestamp, + miner_signature: MessageSignature::empty(), + signer_signature: vec![], + pox_treatment: block.header.pox_treatment.clone(), + }; + + parent_block_header.sign_miner(miner_sk).unwrap(); + block.header.parent_block_id = parent_block_header.block_id(); + BlockHeaderWithMetadata { + anchored_header: parent_block_header.clone().into(), + burn_view: Some(block.header.consensus_hash.clone()), + } +} diff --git a/stacks-signer/src/chainstate/tests/v1.rs b/stacks-signer/src/chainstate/tests/v1.rs index fbd769f8f7f..14d1a56c43d 100644 --- a/stacks-signer/src/chainstate/tests/v1.rs +++ b/stacks-signer/src/chainstate/tests/v1.rs @@ -15,6 +15,8 @@ use std::fs; use std::net::{Ipv4Addr, SocketAddrV4}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; use std::time::{Duration, SystemTime}; use blockstack_lib::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader}; @@ -26,6 +28,7 @@ use blockstack_lib::chainstate::stacks::{ TransactionSpendingCondition, TransactionVersion, }; use blockstack_lib::core::test_util::make_stacks_transfer_tx; +use blockstack_lib::net::api::get_tenure_tip_meta::BlockHeaderWithMetadata; use blockstack_lib::net::api::get_tenures_fork_info::TenureForkingInfo; use blockstack_lib::net::api::getsortition::SortitionInfo; use clarity::types::chainstate::{BurnchainHeaderHash, SortitionId, StacksAddress}; @@ -43,6 +46,7 @@ use stacks_common::util::hash::{Hash160, Sha512Trunc256Sum}; use stacks_common::util::secp256k1::MessageSignature; use stacks_common::{function_name, info}; +use crate::chainstate::tests::make_parent_header_meta; use crate::chainstate::v1::{SortitionMinerStatus, SortitionState, SortitionsView}; use crate::chainstate::{ProposalEvalConfig, SortitionData}; use crate::client::tests::MockServerClient; @@ -317,9 +321,11 @@ fn reorg_timing_testing( ) }); header_clone.chain_length -= 1; - let response = crate::client::tests::build_get_tenure_tip_response( - &StacksBlockHeaderTypes::Nakamoto(header_clone), - ); + let tenure_tip_resp = BlockHeaderWithMetadata { + burn_view: Some(header_clone.consensus_hash.clone()), + anchored_header: StacksBlockHeaderTypes::Nakamoto(header_clone), + }; + let response = crate::client::tests::build_get_tenure_tip_response(&tenure_tip_resp); crate::client::tests::write_response(server, response.as_bytes()); server = crate::client::tests::mock_server_from_config(&config); @@ -444,93 +450,117 @@ fn make_tenure_change_tx(payload: TenureChangePayload) -> StacksTransaction { } #[test] -fn check_proposal_tenure_extend_invalid_conditions() { - let (stacks_client, mut signer_db, block_sk, mut view, mut block) = - setup_test_environment(function_name!()); - block.header.consensus_hash = view.cur_sortition.data.consensus_hash.clone(); - let mut extend_payload = make_tenure_change_payload(); - extend_payload.burn_view_consensus_hash = view.cur_sortition.data.consensus_hash.clone(); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.sign_miner(&block_sk).unwrap(); - view.check_proposal( - &stacks_client, - &mut signer_db, - &block, - false, - ReplayTransactionSet::none(), - ) +fn check_tenure_extend_invalid_conditions() { + check_tenure_extend(|view, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.burn_view_consensus_hash = view.cur_sortition.data.consensus_hash.clone(); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) .expect_err("Proposal should not validate"); +} - let mut extend_payload = make_tenure_change_payload(); - extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.sign_miner(&block_sk).unwrap(); - view.check_proposal( - &stacks_client, - &mut signer_db, - &block, - false, - ReplayTransactionSet::none(), - ) +#[test] +fn check_tenure_extend_burn_view_change() { + check_tenure_extend(|_view, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) .expect("Proposal should validate"); +} - let mut extend_payload = make_tenure_change_payload(); - extend_payload.cause = TenureChangeCause::ExtendedRuntime; - extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.sign_miner(&block_sk).unwrap(); - view.check_proposal( - &stacks_client, - &mut signer_db, - &block, - false, - ReplayTransactionSet::none(), - ) +#[test] +fn check_tenure_extend_unsupported_cause() { + check_tenure_extend(|_view, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.cause = TenureChangeCause::ExtendedRuntime; + extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) .expect_err("Proposal should not validate on SIP-034 extension"); +} - let mut extend_payload = make_tenure_change_payload(); - extend_payload.cause = TenureChangeCause::ExtendedRuntime; - extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.sign_miner(&block_sk).unwrap(); - view.check_proposal( - &stacks_client, - &mut signer_db, - &block, - false, - ReplayTransactionSet::none(), - ) +#[test] +fn check_tenure_extend_no_burn_change_during_read_count() { + check_tenure_extend(|view, block| { + // make sure that enough time has passed for the read count to be extended + // if the rest of the proposal was valid (in this case, its not) + view.config.read_count_idle_timeout = Duration::ZERO; + + let mut extend_payload = make_tenure_change_payload(); + extend_payload.cause = TenureChangeCause::ExtendedRuntime; + extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) .expect_err("Proposal should not validate"); +} - let mut extend_payload = make_tenure_change_payload(); - extend_payload.cause = TenureChangeCause::ExtendedReadCount; - extend_payload.burn_view_consensus_hash = view.cur_sortition.data.consensus_hash.clone(); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); +#[test] +fn check_tenure_extend_read_count() { + check_tenure_extend(|view, block| { + let mut extend_payload = make_tenure_change_payload(); + // make sure that enough time has passed for the read count to be extended + view.config.read_count_idle_timeout = Duration::ZERO; + extend_payload.cause = TenureChangeCause::ExtendedReadCount; + extend_payload.burn_view_consensus_hash = view.cur_sortition.data.consensus_hash.clone(); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) + .expect("Proposal should validate"); +} + +fn check_tenure_extend(make_payload: F) -> Result<(), RejectReason> +where + F: Fn(&mut SortitionsView, &NakamotoBlock) -> TenureChangePayload, +{ + let MockServerClient { + server, + client: stacks_client, + config: _, + } = MockServerClient::new(); + let (_stacks_client, mut signer_db, block_sk, mut view, mut block) = + setup_test_environment(function_name!()); + let mut parent_block_header = make_parent_header_meta(&block_sk, &mut block); + parent_block_header.burn_view = Some(view.cur_sortition.data.consensus_hash.clone()); + let response = crate::client::tests::build_get_tenure_tip_response(&parent_block_header); + + block.header.consensus_hash = view.cur_sortition.data.consensus_hash.clone(); + let mut payload = make_payload(&mut view, &block); + payload.previous_tenure_end = block.header.parent_block_id.clone(); + let tx = make_tenure_change_tx(payload); block.txs = vec![tx]; block.header.sign_miner(&block_sk).unwrap(); - view.config.read_count_idle_timeout = Duration::ZERO; - view.check_proposal( + let exit_flag = Arc::new(AtomicBool::new(false)); + let moved_exit_flag = exit_flag.clone(); + + let serve = std::thread::spawn(move || { + crate::client::tests::write_response_nonblockinig( + &server, + response.as_bytes(), + moved_exit_flag, + ); + }); + + let result = view.check_proposal( &stacks_client, &mut signer_db, &block, false, ReplayTransactionSet::none(), - ) - .expect("Proposal should validate"); + ); + + exit_flag.store(true, Ordering::SeqCst); + serve.join().unwrap(); + result } #[test] @@ -774,8 +804,18 @@ fn check_proposal_refresh() { #[test] fn check_proposal_with_extend_during_replay() { - let (stacks_client, mut signer_db, block_sk, mut view, mut block) = + let MockServerClient { + server, + client: stacks_client, + config: _, + } = MockServerClient::new(); + + let (_stacks_client, mut signer_db, block_sk, mut view, mut block) = setup_test_environment(function_name!()); + + let parent_block_header = make_parent_header_meta(&block_sk, &mut block); + let response = crate::client::tests::build_get_tenure_tip_response(&parent_block_header); + block.header.consensus_hash = view.cur_sortition.data.consensus_hash.clone(); let mut extend_payload = make_tenure_change_payload(); extend_payload.burn_view_consensus_hash = view.cur_sortition.data.consensus_hash.clone(); @@ -796,6 +836,12 @@ fn check_proposal_with_extend_during_replay() { ); let replay_set = ReplayTransactionSet::new(vec![replay_tx]); block.header.sign_miner(&block_sk).unwrap(); - view.check_proposal(&stacks_client, &mut signer_db, &block, false, replay_set) - .expect("Proposal should validate"); + + let j = std::thread::spawn(move || { + view.check_proposal(&stacks_client, &mut signer_db, &block, false, replay_set) + .expect("Proposal should validate"); + }); + + crate::client::tests::write_response(server, response.as_bytes()); + j.join().unwrap(); } diff --git a/stacks-signer/src/chainstate/tests/v2.rs b/stacks-signer/src/chainstate/tests/v2.rs index 5f541e1e72e..4002ae9058b 100644 --- a/stacks-signer/src/chainstate/tests/v2.rs +++ b/stacks-signer/src/chainstate/tests/v2.rs @@ -16,6 +16,8 @@ use std::collections::HashMap; use std::fs; use std::net::{Ipv4Addr, SocketAddrV4}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; use std::time::{Duration, SystemTime}; use blockstack_lib::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader}; @@ -45,6 +47,7 @@ use stacks_common::util::hash::{Hash160, Sha512Trunc256Sum}; use stacks_common::util::secp256k1::MessageSignature; use stacks_common::{function_name, info}; +use crate::chainstate::tests::make_parent_header_meta; use crate::chainstate::v2::{GlobalStateView, SortitionState}; use crate::chainstate::{ProposalEvalConfig, SignerChainstateError, SortitionData}; use crate::client::tests::MockServerClient; @@ -374,80 +377,121 @@ fn make_tenure_change_tx(payload: TenureChangePayload) -> StacksTransaction { } } -#[test] -fn check_proposal_tenure_extend() { - let (stacks_client, mut signer_db, block_sk, mut block, cur_sortition, _, mut sortitions_view) = - setup_test_environment(function_name!()); +fn check_tenure_extend(make_payload: F) -> Result<(), RejectReason> +where + F: Fn(&mut SortitionState, &NakamotoBlock) -> TenureChangePayload, +{ + let MockServerClient { + server, + client: stacks_client, + config: _, + } = MockServerClient::new(); + let ( + _stacks_client, + mut signer_db, + block_sk, + mut block, + mut cur_sortition, + _, + mut sortitions_view, + ) = setup_test_environment(function_name!()); block.header.consensus_hash = cur_sortition.data.consensus_hash.clone(); - let mut extend_payload = make_tenure_change_payload(); - extend_payload.burn_view_consensus_hash = cur_sortition.data.consensus_hash.clone(); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - sortitions_view - .check_proposal(&stacks_client, &mut signer_db, &block) - .expect_err("Proposal should not validate"); + let mut parent_block_header = make_parent_header_meta(&block_sk, &mut block); + parent_block_header.burn_view = Some(cur_sortition.data.consensus_hash.clone()); + let response = crate::client::tests::build_get_tenure_tip_response(&parent_block_header); - let mut extend_payload = make_tenure_change_payload(); - extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); + let mut payload = make_payload(&mut cur_sortition, &block); + payload.previous_tenure_end = block.header.parent_block_id.clone(); + let tx = make_tenure_change_tx(payload); block.txs = vec![tx]; - block.header.miner_signature = block_sk - .sign(block.header.miner_signature_hash().as_bytes()) - .unwrap(); - sortitions_view - .check_proposal(&stacks_client, &mut signer_db, &block) - .expect("Proposal should validate"); + block.header.sign_miner(&block_sk).unwrap(); - let mut extend_payload = make_tenure_change_payload(); - extend_payload.cause = TenureChangeCause::ExtendedRuntime; - extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.miner_signature = block_sk - .sign(block.header.miner_signature_hash().as_bytes()) - .unwrap(); - sortitions_view - .check_proposal(&stacks_client, &mut signer_db, &block) - .expect_err("Proposal should not validate"); + let exit_flag = Arc::new(AtomicBool::new(false)); + let moved_exit_flag = exit_flag.clone(); - let mut extend_payload = make_tenure_change_payload(); - extend_payload.cause = TenureChangeCause::ExtendedRuntime; - extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.miner_signature = block_sk - .sign(block.header.miner_signature_hash().as_bytes()) - .unwrap(); - sortitions_view - .check_proposal(&stacks_client, &mut signer_db, &block) - .expect_err("Proposal should not validate"); + let serve = std::thread::spawn(move || { + crate::client::tests::write_response_nonblockinig( + &server, + response.as_bytes(), + moved_exit_flag, + ); + }); - let mut extend_payload = make_tenure_change_payload(); - extend_payload.cause = TenureChangeCause::ExtendedReadCount; - extend_payload.burn_view_consensus_hash = cur_sortition.data.consensus_hash; - extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); - extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); - let tx = make_tenure_change_tx(extend_payload); - block.txs = vec![tx]; - block.header.sign_miner(&block_sk).unwrap(); - sortitions_view.config.read_count_idle_timeout = Duration::ZERO; - sortitions_view - .check_proposal(&stacks_client, &mut signer_db, &block) - .expect("Proposal should validate"); + sortitions_view.config.read_count_idle_timeout = Duration::from_secs(0); + let result = sortitions_view.check_proposal(&stacks_client, &mut signer_db, &block); + + exit_flag.store(true, Ordering::SeqCst); + serve.join().unwrap(); + result +} + +#[test] +fn check_tenure_extend_burn_view_change() { + check_tenure_extend(|_, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) + .expect("Proposal should validate"); +} + +#[test] +fn check_tenure_extend_unsupported_cause() { + check_tenure_extend(|_, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.cause = TenureChangeCause::ExtendedRuntime; + extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) + .expect_err("Proposal should not validate"); +} + +#[test] +fn check_tenure_extend_no_burn_change_during_read_count() { + check_tenure_extend(|_, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.cause = TenureChangeCause::ExtendedRuntime; + extend_payload.burn_view_consensus_hash = ConsensusHash([64; 20]); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) + .expect_err("Proposal should not validate"); +} + +#[test] +fn check_tenure_extend_read_count() { + check_tenure_extend(|view, block| { + let mut extend_payload = make_tenure_change_payload(); + extend_payload.cause = TenureChangeCause::ExtendedReadCount; + extend_payload.burn_view_consensus_hash = view.data.consensus_hash.clone(); + extend_payload.tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload.prev_tenure_consensus_hash = block.header.consensus_hash.clone(); + extend_payload + }) + .expect("Proposal should validate"); } #[test] fn check_proposal_with_extend_during_replay() { - let (stacks_client, mut signer_db, block_sk, mut block, cur_sortition, _, mut sortitions_view) = - setup_test_environment(function_name!()); + let MockServerClient { + server, + client: stacks_client, + config: _, + } = MockServerClient::new(); + + let rand_int = server.local_addr().unwrap().port(); + + let (_, mut signer_db, block_sk, mut block, cur_sortition, _, mut sortitions_view) = + setup_test_environment(&format!("{}_{rand_int}", function_name!())); + + let parent_block_header = make_parent_header_meta(&block_sk, &mut block); + let response = crate::client::tests::build_get_tenure_tip_response(&parent_block_header); + block.header.consensus_hash = cur_sortition.data.consensus_hash.clone(); let mut extend_payload = make_tenure_change_payload(); extend_payload.burn_view_consensus_hash = cur_sortition.data.consensus_hash.clone(); @@ -469,9 +513,14 @@ fn check_proposal_with_extend_during_replay() { sortitions_view.signer_state.tx_replay_set = replay_set; - sortitions_view - .check_proposal(&stacks_client, &mut signer_db, &block) - .expect("Proposal should validate"); + let j = std::thread::spawn(move || { + sortitions_view + .check_proposal(&stacks_client, &mut signer_db, &block) + .expect("Proposal should validate"); + }); + + crate::client::tests::write_response(server, response.as_bytes()); + j.join().unwrap(); } #[test] diff --git a/stacks-signer/src/chainstate/v1.rs b/stacks-signer/src/chainstate/v1.rs index b1d4347fcbe..2383d38fe6c 100644 --- a/stacks-signer/src/chainstate/v1.rs +++ b/stacks-signer/src/chainstate/v1.rs @@ -351,8 +351,16 @@ impl SortitionsView { // (1) if this is the most recent sortition, an extend is allowed if it changes the burnchain view // (2) if this is the most recent sortition, an extend is allowed if enough time has passed to refresh the block limit let sortition_consensus_hash = &proposed_by.state().data.consensus_hash; - let changed_burn_view = - &tenure_extend.burn_view_consensus_hash != sortition_consensus_hash; + let tenure_tip = client.get_tenure_tip(sortition_consensus_hash) + .map_err(|e| { + warn!("Could not load current tenure tip while evaluating a tenure-extend; cannot approve."; "err" => %e); + RejectReason::InvalidTenureExtend + })?; + let Some(current_burn_view) = tenure_tip.burn_view else { + warn!("Tenure-extend attempted in tenure without burn-view."); + return Err(RejectReason::InvalidTenureExtend); + }; + let changed_burn_view = tenure_extend.burn_view_consensus_hash != current_burn_view; let extend_timestamp = signer_db.calculate_full_extend_timestamp( self.config.tenure_idle_timeout, block, @@ -374,6 +382,17 @@ impl SortitionsView { ); return Err(RejectReason::InvalidTenureExtend); } + + warn!( + "Miner block proposal contains a tenure extend, but the conditions for allowing a tenure extend are not met. Considering proposal invalid."; + "proposed_block_consensus_hash" => %block.header.consensus_hash, + "signer_signature_hash" => %block.header.signer_signature_hash(), + "extend_timestamp" => extend_timestamp, + "epoch_time" => epoch_time, + "is_in_replay" => is_in_replay, + "changed_burn_view" => changed_burn_view, + "enough_time_passed" => enough_time_passed, + ); } // is there a read-count tenure extend in this block? @@ -383,8 +402,16 @@ impl SortitionsView { { // burn view changes are not allowed during read-count tenure extends let sortition_consensus_hash = &proposed_by.state().data.consensus_hash; - let changed_burn_view = - &tenure_extend.burn_view_consensus_hash != sortition_consensus_hash; + let tenure_tip = client.get_tenure_tip(sortition_consensus_hash) + .map_err(|e| { + warn!("Could not load current tenure tip while evaluating a tenure-extend; cannot approve."; "err" => %e); + RejectReason::InvalidTenureExtend + })?; + let Some(current_burn_view) = tenure_tip.burn_view else { + warn!("Tenure-extend attempted in tenure without burn-view."); + return Err(RejectReason::InvalidTenureExtend); + }; + let changed_burn_view = tenure_extend.burn_view_consensus_hash != current_burn_view; if changed_burn_view { warn!( "Miner block proposal contains a read-count extend, but the conditions for allowing a tenure extend are not met. Considering proposal invalid."; diff --git a/stacks-signer/src/chainstate/v2.rs b/stacks-signer/src/chainstate/v2.rs index 226b7076359..54063c464a3 100644 --- a/stacks-signer/src/chainstate/v2.rs +++ b/stacks-signer/src/chainstate/v2.rs @@ -208,7 +208,16 @@ impl GlobalStateView { // (1) if this is the most recent sortition, an extend is allowed if it changes the burnchain view // (2) if this is the most recent sortition, an extend is allowed if enough time has passed to refresh the block limit // (3) if we are in replay, an extend is allowed - let changed_burn_view = &tenure_extend.burn_view_consensus_hash != tenure_id; + let tenure_tip = client.get_tenure_tip(tenure_id) + .map_err(|e| { + warn!("Could not load current tenure tip while evaluating a tenure-extend; cannot approve."; "err" => %e); + RejectReason::InvalidTenureExtend + })?; + let Some(current_burn_view) = tenure_tip.burn_view else { + warn!("Tenure-extend attempted in tenure without burn-view."); + return Err(RejectReason::InvalidTenureExtend); + }; + let changed_burn_view = tenure_extend.burn_view_consensus_hash != current_burn_view; let extend_timestamp = signer_db.calculate_full_extend_timestamp( self.config.tenure_idle_timeout, block, @@ -238,7 +247,16 @@ impl GlobalStateView { .filter(|extend| extend.cause.is_read_count_extend()) { // burn view changes are not allowed during read-count tenure extends - let changed_burn_view = &tenure_extend.burn_view_consensus_hash != tenure_id; + let tenure_tip = client.get_tenure_tip(tenure_id) + .map_err(|e| { + warn!("Could not load current tenure tip while evaluating a tenure-extend; cannot approve."; "err" => %e); + RejectReason::InvalidTenureExtend + })?; + let Some(current_burn_view) = tenure_tip.burn_view else { + warn!("Tenure-extend attempted in tenure without burn-view."); + return Err(RejectReason::InvalidTenureExtend); + }; + let changed_burn_view = tenure_extend.burn_view_consensus_hash != current_burn_view; if changed_burn_view { warn!( "Miner block proposal contains a read-count extend, but the conditions for allowing a tenure extend are not met. Considering proposal invalid."; diff --git a/stacks-signer/src/client/mod.rs b/stacks-signer/src/client/mod.rs index 9c893237be6..6845bfd8e2a 100644 --- a/stacks-signer/src/client/mod.rs +++ b/stacks-signer/src/client/mod.rs @@ -134,9 +134,11 @@ pub(crate) mod tests { use std::collections::{BTreeMap, HashMap}; use std::io::{Read, Write}; use std::net::{SocketAddr, TcpListener}; + use std::sync::atomic::{AtomicBool, Ordering}; + use std::sync::Arc; use blockstack_lib::chainstate::stacks::boot::POX_4_NAME; - use blockstack_lib::chainstate::stacks::db::StacksBlockHeaderTypes; + use blockstack_lib::net::api::get_tenure_tip_meta::BlockHeaderWithMetadata; use blockstack_lib::net::api::getinfo::RPCPeerInfoData; use blockstack_lib::net::api::getpoxinfo::{ RPCPoxCurrentCycleInfo, RPCPoxEpoch, RPCPoxInfoData, RPCPoxNextCycleInfo, @@ -172,7 +174,18 @@ pub(crate) mod tests { pub fn new() -> Self { let mut config = GlobalConfig::load_from_file("./src/tests/conf/signer-0.toml").unwrap(); - let (server, mock_server_addr) = mock_server_random(); + let (server, mock_server_addr) = { + let mut iter = 0usize; + loop { + iter += 1; + if let Some(x) = mock_server_random() { + break x; + } + if iter > 10 { + panic!("Could not get a port for mock server"); + } + } + }; config.node_host = mock_server_addr.to_string(); let client = StacksClient::from(&config); @@ -196,13 +209,15 @@ pub(crate) mod tests { } /// Create a mock server on a random port and return the socket addr - pub fn mock_server_random() -> (TcpListener, SocketAddr) { + pub fn mock_server_random() -> Option<(TcpListener, SocketAddr)> { let mut mock_server_addr = SocketAddr::from(([127, 0, 0, 1], 0)); // Ask the OS to assign a random port to listen on by passing 0 - let server = TcpListener::bind(mock_server_addr).unwrap(); + let server = TcpListener::bind(mock_server_addr) + .inspect_err(|e| warn!("Failed to bind mock RPC server"; "err" => ?e)) + .ok()?; mock_server_addr.set_port(server.local_addr().unwrap().port()); - (server, mock_server_addr) + Some((server, mock_server_addr)) } /// Create a mock server on a same port as in the config @@ -222,6 +237,35 @@ pub(crate) mod tests { request_bytes } + /// Continually accept requests and write `bytes` as a response. + /// Exits when exit flag is true + /// Panics on unexpected errors + pub fn write_response_nonblockinig( + mock_server: &TcpListener, + bytes: &[u8], + exit: Arc, + ) { + mock_server.set_nonblocking(true).unwrap(); + let mut request_bytes = [0u8; 1024]; + + while !exit.load(Ordering::SeqCst) { + let mut stream = match mock_server.accept() { + Ok((stream, ..)) => stream, + Err(e) => { + if e.kind() == std::io::ErrorKind::WouldBlock { + std::thread::sleep(Duration::from_millis(100)); + continue; + } + panic!("Unexpected network error in mock server: {e:?}"); + } + }; + debug!("Reading request..."); + let _ = stream.read(&mut request_bytes).unwrap(); + debug!("Writing a response..."); + stream.write_all(bytes).unwrap(); + } + } + pub fn generate_random_consensus_hash() -> ConsensusHash { let rng = rand::thread_rng(); let bytes: Vec = rng.sample_iter::(Standard).take(20).collect(); @@ -445,7 +489,7 @@ pub(crate) mod tests { } } - pub fn build_get_tenure_tip_response(header_types: &StacksBlockHeaderTypes) -> String { + pub fn build_get_tenure_tip_response(header_types: &BlockHeaderWithMetadata) -> String { let response_json = serde_json::to_string(header_types).expect("Failed to serialize tenure tip info"); format!("HTTP/1.1 200 OK\n\n{response_json}") diff --git a/stacks-signer/src/client/stacks_client.rs b/stacks-signer/src/client/stacks_client.rs index 682e29000b6..1654f6e60be 100644 --- a/stacks-signer/src/client/stacks_client.rs +++ b/stacks-signer/src/client/stacks_client.rs @@ -17,9 +17,9 @@ use std::collections::{HashMap, VecDeque}; use blockstack_lib::chainstate::nakamoto::NakamotoBlock; use blockstack_lib::chainstate::stacks::boot::{NakamotoSignerEntry, SIGNERS_NAME}; -use blockstack_lib::chainstate::stacks::db::StacksBlockHeaderTypes; use blockstack_lib::chainstate::stacks::{StacksTransaction, TransactionVersion}; use blockstack_lib::net::api::callreadonly::CallReadOnlyResponse; +use blockstack_lib::net::api::get_tenure_tip_meta::BlockHeaderWithMetadata; use blockstack_lib::net::api::get_tenures_fork_info::{ TenureForkingInfo, RPC_TENURE_FORKING_INFO_PATH, }; @@ -161,7 +161,7 @@ impl StacksClient { pub fn get_tenure_tip( &self, tenure_id: &ConsensusHash, - ) -> Result { + ) -> Result { debug!("StacksClient: Getting tenure tip"; "consensus_hash" => %tenure_id, ); @@ -721,7 +721,10 @@ impl StacksClient { } fn tenure_tip_path(&self, consensus_hash: &ConsensusHash) -> String { - format!("{}/v3/tenures/tip/{consensus_hash}", self.http_origin) + format!( + "{}/v3/tenures/tip_metadata/{consensus_hash}", + self.http_origin + ) } } @@ -736,6 +739,7 @@ mod tests { use blockstack_lib::chainstate::stacks::boot::{ NakamotoSignerEntry, PoxStartCycleInfo, RewardSet, }; + use blockstack_lib::chainstate::stacks::db::StacksBlockHeaderTypes; use clarity::types::chainstate::{StacksBlockId, TrieHash}; use clarity::util::hash::Sha512Trunc256Sum; use clarity::util::secp256k1::MessageSignature; @@ -1077,7 +1081,7 @@ mod tests { fn get_tenure_tip_should_succeed() { let mock = MockServerClient::new(); let consensus_hash = ConsensusHash([15; 20]); - let header = StacksBlockHeaderTypes::Nakamoto(NakamotoBlockHeader { + let anchored_header = StacksBlockHeaderTypes::Nakamoto(NakamotoBlockHeader { version: 1, chain_length: 10, burn_spent: 10, @@ -1090,10 +1094,15 @@ mod tests { signer_signature: vec![], pox_treatment: BitVec::ones(1).unwrap(), }); - let response = build_get_tenure_tip_response(&header); + let with_metadata = BlockHeaderWithMetadata { + anchored_header, + burn_view: Some(ConsensusHash([15; 20])), + }; + + let response = build_get_tenure_tip_response(&with_metadata); let h = spawn(move || mock.client.get_tenure_tip(&consensus_hash)); write_response(mock.server, response.as_bytes()); - assert_eq!(h.join().unwrap().unwrap(), header); + assert_eq!(h.join().unwrap().unwrap(), with_metadata); } #[test] diff --git a/stacks-signer/src/signerdb.rs b/stacks-signer/src/signerdb.rs index 98b6b557d39..9bdbe0bd607 100644 --- a/stacks-signer/src/signerdb.rs +++ b/stacks-signer/src/signerdb.rs @@ -123,7 +123,9 @@ BlockState { /// A threshold number of signers have signed the block GloballyAccepted = 3, /// A threshold number of signers have rejected the block - GloballyRejected = 4 + GloballyRejected = 4, + /// The block is pre-committed by the signer, but not yet signed + PreCommitted = 5 }); impl TryFrom for BlockState { @@ -135,6 +137,7 @@ impl TryFrom for BlockState { 2 => BlockState::LocallyRejected, 3 => BlockState::GloballyAccepted, 4 => BlockState::GloballyRejected, + 5 => BlockState::PreCommitted, _ => return Err("Invalid block state".into()), }; Ok(state) @@ -149,6 +152,7 @@ impl Display for BlockState { BlockState::LocallyRejected => "LocallyRejected", BlockState::GloballyAccepted => "GloballyAccepted", BlockState::GloballyRejected => "GloballyRejected", + BlockState::PreCommitted => "PreCommitted", }; write!(f, "{state}") } @@ -163,6 +167,7 @@ impl TryFrom<&str> for BlockState { "LocallyRejected" => BlockState::LocallyRejected, "GloballyAccepted" => BlockState::GloballyAccepted, "GloballyRejected" => BlockState::GloballyRejected, + "PreCommitted" => BlockState::PreCommitted, _ => return Err("Unparsable block state".into()), }; Ok(state) @@ -182,11 +187,11 @@ pub struct BlockInfo { pub vote: Option, /// Whether the block contents are valid pub valid: Option, - /// Whether this block is already being signed over + /// Whether this block is already being signed over (pre-committed or signed by self or group) pub signed_over: bool, /// Time at which the proposal was received by this signer (epoch time in seconds) pub proposed_time: u64, - /// Time at which the proposal was signed by this signer (epoch time in seconds) + /// Time at which the proposal was pre-committed or signed by this signer (epoch time in seconds) pub signed_self: Option, /// Time at which the proposal was signed by a threshold in the signer set (epoch time in seconds) pub signed_group: Option, @@ -253,6 +258,17 @@ impl BlockInfo { Ok(()) } + /// Mark this block as valid and pre-committed. We set the `signed_self` + /// timestamp here because pre-committing to a block implies the same + /// behavior as a local acceptance from the signer's perspective. + pub fn mark_pre_committed(&mut self) -> Result<(), String> { + self.move_to(BlockState::PreCommitted)?; + self.valid = Some(true); + self.signed_over = true; + self.signed_self.get_or_insert(get_epoch_time_secs()); + Ok(()) + } + /// Mark this block as valid, signed over, and records a group timestamp in the block info if it wasn't /// already set. fn mark_globally_accepted(&mut self) -> Result<(), String> { @@ -296,6 +312,7 @@ impl BlockInfo { ), BlockState::GloballyAccepted => !matches!(prev_state, BlockState::GloballyRejected), BlockState::GloballyRejected => !matches!(prev_state, BlockState::GloballyAccepted), + BlockState::PreCommitted => matches!(prev_state, BlockState::Unprocessed), } } @@ -319,11 +336,11 @@ impl BlockInfo { ) } - /// Check if the block is locally accepted or rejected + /// Check if the block is pre-commited, locally accepted or locally rejected pub fn is_locally_finalized(&self) -> bool { matches!( self.state, - BlockState::LocallyAccepted | BlockState::LocallyRejected + BlockState::PreCommitted | BlockState::LocallyAccepted | BlockState::LocallyRejected ) } } @@ -1182,11 +1199,12 @@ impl SignerDb { &self, tenure: &ConsensusHash, ) -> Result, DBError> { - let query = "SELECT block_info FROM blocks WHERE consensus_hash = ?1 AND state IN (?2, ?3) ORDER BY stacks_height DESC LIMIT 1"; + let query = "SELECT block_info FROM blocks WHERE consensus_hash = ?1 AND state IN (?2, ?3, ?4) ORDER BY stacks_height DESC LIMIT 1"; let args = params![ tenure, &BlockState::GloballyAccepted.to_string(), - &BlockState::LocallyAccepted.to_string() + &BlockState::LocallyAccepted.to_string(), + &BlockState::PreCommitted.to_string(), ]; let result: Option = query_row(&self.db, query, args)?; diff --git a/stacks-signer/src/tests/signer_state.rs b/stacks-signer/src/tests/signer_state.rs index 77c1a8aaa7f..4678c31bddc 100644 --- a/stacks-signer/src/tests/signer_state.rs +++ b/stacks-signer/src/tests/signer_state.rs @@ -18,6 +18,7 @@ use std::time::{Duration, SystemTime}; use blockstack_lib::chainstate::nakamoto::NakamotoBlockHeader; use blockstack_lib::chainstate::stacks::db::StacksBlockHeaderTypes; +use blockstack_lib::net::api::get_tenure_tip_meta::BlockHeaderWithMetadata; use blockstack_lib::net::api::get_tenures_fork_info::TenureForkingInfo; use blockstack_lib::net::api::getsortition::SortitionInfo; use clarity::types::chainstate::{ @@ -242,11 +243,11 @@ fn check_capitulate_miner_view() { ); }); - let expected_result = StacksBlockHeaderTypes::Nakamoto(NakamotoBlockHeader { + let anchored_header = StacksBlockHeaderTypes::Nakamoto(NakamotoBlockHeader { version: 1, chain_length: parent_tenure_last_block_height, burn_spent: 0, - consensus_hash: parent_tenure_id, + consensus_hash: parent_tenure_id.clone(), parent_block_id: parent_tenure_last_block, tx_merkle_root: Sha512Trunc256Sum([0u8; 32]), state_index_root: TrieHash([0u8; 32]), @@ -256,6 +257,11 @@ fn check_capitulate_miner_view() { pox_treatment: BitVec::ones(1).unwrap(), }); + let expected_result = BlockHeaderWithMetadata { + anchored_header, + burn_view: Some(parent_tenure_id), + }; + let to_send = build_get_tenure_tip_response(&expected_result); for _ in 0..2 { crate::client::tests::write_response(server, to_send.as_bytes()); @@ -471,9 +477,11 @@ fn check_miner_inactivity_timeout() { let to_send_2 = format!("HTTP/1.1 200 OK\n\n{json_payload}"); // Then it will grab the tip of the prior sortition - let expected_result = StacksBlockHeaderTypes::Nakamoto(genesis_block); - let json_payload = serde_json::to_string(&expected_result).unwrap(); - let to_send_3 = format!("HTTP/1.1 200 OK\n\n{json_payload}"); + let expected_result = BlockHeaderWithMetadata { + burn_view: Some(genesis_block.consensus_hash.clone()), + anchored_header: StacksBlockHeaderTypes::Nakamoto(genesis_block), + }; + let to_send_3 = build_get_tenure_tip_response(&expected_result); let MockServerClient { mut server, diff --git a/stacks-signer/src/v0/signer.rs b/stacks-signer/src/v0/signer.rs index fb40e39b2b0..e5ad0e7b0d1 100644 --- a/stacks-signer/src/v0/signer.rs +++ b/stacks-signer/src/v0/signer.rs @@ -1036,6 +1036,15 @@ impl Signer { return; }; + if block_info.state == BlockState::LocallyAccepted + || block_info.state == BlockState::LocallyRejected + { + debug!( + "{self}: Received pre-commit for a block that we have already responded to. Ignoring...", + ); + return; + } + if self.signer_db.has_committed(block_hash, stacker_address).inspect_err(|e| warn!("Failed to check if pre-commit message already considered for {stacker_address:?} for {block_hash}: {e}")).unwrap_or(false) { debug!("{self}: Already considered pre-commit message from {stacker_address:?} for {block_hash}. Ignoring..."); return; @@ -1404,7 +1413,7 @@ impl Signer { self.handle_block_rejection(&block_rejection, sortition_state); self.send_block_response(&block_info.block, block_rejection.into()); } else { - if let Err(e) = block_info.mark_locally_accepted(false) { + if let Err(e) = block_info.mark_pre_committed() { if !block_info.has_reached_consensus() { warn!("{self}: Failed to mark block as locally accepted: {e:?}",); return; diff --git a/stacks-signer/src/v0/signer_state.rs b/stacks-signer/src/v0/signer_state.rs index bc2190d5c89..1d9402eaabc 100644 --- a/stacks-signer/src/v0/signer_state.rs +++ b/stacks-signer/src/v0/signer_state.rs @@ -386,8 +386,8 @@ impl LocalStateMachine { .ok() .map(|header| { ( - header.height(), - StacksBlockId::new(parent_tenure_id, &header.block_hash()), + header.anchored_header.height(), + StacksBlockId::new(parent_tenure_id, &header.anchored_header.block_hash()), ) }); let signerdb_last_block = SortitionData::get_tenure_last_block_info( diff --git a/stackslib/Cargo.toml b/stackslib/Cargo.toml index 0b8d920ab33..747aaf16b46 100644 --- a/stackslib/Cargo.toml +++ b/stackslib/Cargo.toml @@ -81,6 +81,10 @@ developer-mode = ["clarity/developer-mode"] monitoring_prom = ["prometheus"] slog_json = ["stacks-common/slog_json", "clarity/slog_json", "pox-locking/slog_json"] testing = ["chrono", "stacks-common/testing", "clarity/testing"] +profiler = ["perf-event2"] + +[target.'cfg(all(target_os = "linux", target_arch = "x86_64"))'.dependencies] +perf-event2 = { version = "0.7.4", optional = true } [target.'cfg(all(any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64"), not(any(target_os="windows"))))'.dependencies] sha2 = { version = "0.10", features = ["asm"] } diff --git a/stackslib/src/chainstate/stacks/boot/contract_tests.rs b/stackslib/src/chainstate/stacks/boot/contract_tests.rs index d7b9302de7b..61b8bcc4b11 100644 --- a/stackslib/src/chainstate/stacks/boot/contract_tests.rs +++ b/stackslib/src/chainstate/stacks/boot/contract_tests.rs @@ -6,7 +6,7 @@ use clarity::vm::analysis::mem_type_check; use clarity::vm::clarity::TransactionConnection; use clarity::vm::contexts::OwnedEnvironment; use clarity::vm::database::*; -use clarity::vm::errors::{CheckErrorKind, VmExecutionError}; +use clarity::vm::errors::{CheckErrorKind, StaticCheckErrorKind, VmExecutionError}; use clarity::vm::test_util::{execute, symbols_from_values, TEST_BURN_STATE_DB, TEST_HEADER_DB}; use clarity::vm::types::{ OptionalData, PrincipalData, QualifiedContractIdentifier, ResponseData, StandardPrincipalData, @@ -1713,7 +1713,7 @@ fn simple_epoch21_test() { ClarityError::StaticCheck(e) => { assert_eq!( *e.err, - CheckErrorKind::UnknownFunction("stx-account".into()) + StaticCheckErrorKind::UnknownFunction("stx-account".into()) ); } e => panic!("Should have caused an analysis error: {:#?}", e), diff --git a/stackslib/src/chainstate/stacks/tests/mod.rs b/stackslib/src/chainstate/stacks/tests/mod.rs index f5e4567f0fc..4803a0cee80 100644 --- a/stackslib/src/chainstate/stacks/tests/mod.rs +++ b/stackslib/src/chainstate/stacks/tests/mod.rs @@ -39,6 +39,7 @@ use crate::net::test::*; pub mod accounting; pub mod block_construction; pub mod chain_histories; +pub mod reward_set; pub const COINBASE: u128 = 500 * 1_000_000; diff --git a/stackslib/src/chainstate/stacks/tests/reward_set.rs b/stackslib/src/chainstate/stacks/tests/reward_set.rs new file mode 100644 index 00000000000..15d1ab1ec5f --- /dev/null +++ b/stackslib/src/chainstate/stacks/tests/reward_set.rs @@ -0,0 +1,252 @@ +// 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 std::collections::HashMap; + +use proptest::prelude::{prop, proptest, TestCaseError}; +use proptest::{prop_assert_eq, prop_assume}; +use stacks_common::types::chainstate::StacksAddress; +use stacks_common::types::StacksEpochId; +use stacks_common::util::hash::Hash160; + +use crate::burnchains::PoxConstants; +use crate::chainstate::stacks::address::PoxAddress; +use crate::chainstate::stacks::boot::RawRewardSetEntry; +use crate::chainstate::stacks::db::StacksChainState; +use crate::proptest_utils::reward_set_entry_strategy; + +pub fn check_make_reward_set( + pox_settings: PoxConstants, + addresses: &[RawRewardSetEntry], + unstacked_ustx: u128, +) -> Result<(), TestCaseError> { + let total_stacked = addresses.iter().try_fold(0_u128, |total, entry| { + total + .checked_add(entry.amount_stacked) + .ok_or_else(|| TestCaseError::Reject("Reward set entries must be summable".into())) + })?; + + let liquid_ustx = total_stacked + .checked_add(unstacked_ustx) + .ok_or_else(|| TestCaseError::Reject("Total ustx must be summable".into()))?; + + prop_assume!(total_stacked <= liquid_ustx); + + let (threshold, participation) = StacksChainState::get_reward_threshold_and_participation( + &pox_settings, + addresses, + liquid_ustx, + ); + + prop_assume!(threshold > 0); + + let reward_set = + StacksChainState::make_reward_set(threshold, addresses.to_vec(), StacksEpochId::Epoch33); + + prop_assert_eq!(Some(threshold), reward_set.pox_ustx_threshold); + + let mut sum_by_addresses: HashMap = HashMap::new(); + for addr in addresses.iter() { + let entry = sum_by_addresses + .entry(addr.reward_address.clone()) + .or_default(); + *entry += addr.amount_stacked; + } + + for (addr, stacked_amount) in sum_by_addresses.iter() { + let slot_count: u128 = reward_set + .rewarded_addresses + .iter() + .filter(|x| *x == addr) + .count() + .try_into() + .unwrap(); + + prop_assert_eq!(slot_count, stacked_amount / threshold); + } + + Ok(()) +} + +#[test] +/// Invoke the reward set property test with some known corner cases +fn units_make_reward_set() { + struct TestVector { + entries: Vec, + unstacked_amount: u128, + } + + let prepare_length = 10; + let reward_length = 2_000 * 2; + let cycle_length = reward_length + prepare_length; + let pox_settings = PoxConstants::new( + cycle_length, + prepare_length, + prepare_length / 2 + 1, + 10, + 10, + u64::MAX, + u64::MAX, + u32::MAX, + u32::MAX, + u32::MAX, + u32::MAX, + ); + + let addrs: Vec<_> = (0..10u64) + .map(|x| { + PoxAddress::Standard( + StacksAddress::new(20, Hash160::from_data(&x.to_be_bytes())).unwrap(), + None, + ) + }) + .collect(); + + let test_vectors = [ + // Test a reward set where two participants don't stack enough to get slots + TestVector { + entries: vec![ + RawRewardSetEntry { + reward_address: addrs[0].clone(), + amount_stacked: 1_000_000, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[1].clone(), + amount_stacked: 500_000, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[3].clone(), + amount_stacked: 0, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[4].clone(), + amount_stacked: 10, + stacker: None, + signer: None, + }, + ], + unstacked_amount: 4000, + }, + // Test a reward set with not enough participation for any + // slots to be claimed + TestVector { + entries: vec![ + RawRewardSetEntry { + reward_address: addrs[0].clone(), + amount_stacked: 100_000, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[1].clone(), + amount_stacked: 50_000, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[0].clone(), + amount_stacked: 20_000, + stacker: None, + signer: None, + }, + ], + unstacked_amount: 40_000_000_000_000, + }, + // Test a reward set with repeated entries for the same + // address + TestVector { + entries: vec![ + RawRewardSetEntry { + reward_address: addrs[0].clone(), + amount_stacked: 100_000, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[1].clone(), + amount_stacked: 50_000, + stacker: None, + signer: None, + }, + RawRewardSetEntry { + reward_address: addrs[0].clone(), + amount_stacked: 20_000, + stacker: None, + signer: None, + }, + ], + unstacked_amount: 0, + }, + ]; + + for TestVector { + ref entries, + unstacked_amount, + } in test_vectors.iter() + { + check_make_reward_set(pox_settings.clone(), entries.as_slice(), *unstacked_amount).unwrap(); + } +} + +proptest! { + /// Property testing for the make_reward_set: + /// + /// * Each reward set participants' allotted slots should equal + /// the integer division of their total amount stacked across all + /// entries, divided by the threshold number. + /// + /// This test forces a number of the addresses to have multiple + /// entries (generated by the `to_duplicate` argument in the + /// proptest) + #[test] + fn make_reward_set( + pox_slots in 1..4_000u32, + unstacked_ustx in 0..1_000_000_000u128, + mut addrs in prop::collection::vec(reward_set_entry_strategy(1..100_000_000u128), 1..25_000), + to_duplicate in prop::collection::vec((0..25_000usize, 0..100_000_000u128), 0..25_000) + ) { + let prepare_length = 10; + let reward_length = pox_slots * 2; + let cycle_length = reward_length + prepare_length; + let pox_settings = PoxConstants::new( + cycle_length, + prepare_length, + prepare_length / 2 + 1, + 10, + 10, + u64::MAX, + u64::MAX, + u32::MAX, + u32::MAX, + u32::MAX, + u32::MAX, + ); + + let _ = addrs.try_reserve(to_duplicate.len()); + for (to_dup_ix, duplicated_amount) in to_duplicate.into_iter() { + let mut new_entry = addrs[to_dup_ix % addrs.len()].clone(); + new_entry.amount_stacked = duplicated_amount; + addrs.push(new_entry); + } + + check_make_reward_set(pox_settings, addrs.as_slice(), unstacked_ustx)?; + } +} diff --git a/stackslib/src/chainstate/tests/consensus.rs b/stackslib/src/chainstate/tests/consensus.rs index a556dd25691..8959247085a 100644 --- a/stackslib/src/chainstate/tests/consensus.rs +++ b/stackslib/src/chainstate/tests/consensus.rs @@ -1625,7 +1625,7 @@ macro_rules! contract_call_consensus_test { ) => { { // Handle deploy_epochs parameter (default to all epochs >= 2.0 if not provided) - let deploy_epochs = &clarity::types::StacksEpochId::ALL[1..]; + let deploy_epochs = &clarity::types::StacksEpochId::since(clarity::types::StacksEpochId::Epoch20); $(let deploy_epochs = $deploy_epochs;)? // Handle call_epochs parameter (default to EPOCHS_TO_TEST if not provided) @@ -1892,6 +1892,22 @@ fn problematic_supertype_list() { (err 1))) (print (var-get my-list)) ", - deploy_epochs: &StacksEpochId::ALL[1..], + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch20), + ); +} + +#[test] +/// Test that a read-only function call can be included in a block without issue. +/// The fn also shows that a non-response is handled without issue with the testing framework. +fn read_only_transaction_block() { + contract_call_consensus_test!( + contract_name: "read-only-call", + contract_code: " + (define-read-only (trigger) + (some u1) + ) + ", + function_name: "trigger", + function_args: &[], ); } diff --git a/stackslib/src/chainstate/tests/early_return_tests.rs b/stackslib/src/chainstate/tests/early_return_tests.rs new file mode 100644 index 00000000000..2030820fd8f --- /dev/null +++ b/stackslib/src/chainstate/tests/early_return_tests.rs @@ -0,0 +1,236 @@ +// 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 . + +//! This module contains consensus tests related to EarlyReturn errors. + +use clarity::vm::errors::EarlyReturnError; +use clarity::vm::types::ResponseData; +use clarity::vm::Value as ClarityValue; + +use crate::chainstate::tests::consensus::{ + contract_call_consensus_test, contract_deploy_consensus_test, +}; + +/// Generates a coverage classification report for a specific [`EarlyReturnError`] 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. +/// - 🚫 **Unreachable** — not testable from consensus test side for reasons. +#[allow(dead_code)] +fn variant_coverage_report(variant: EarlyReturnError) { + enum VariantCoverage { + // 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. 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 EarlyReturnError::*; + use VariantCoverage::*; + + _ = match variant { + UnwrapFailed(_) => Tested(vec![ + native_try_ret_err_cdeploy, + native_try_ret_err_ccall, + native_try_ret_none_cdeploy, + native_try_ret_none_ccall, + native_unwrap_err_or_ret_cdeploy, + native_unwrap_err_or_ret_ccall, + native_unwrap_or_ret_none_cdeploy, + native_unwrap_or_ret_none_ccall, + ]), + AssertionFailed(_) => Tested(vec![ + native_special_asserts_cdeploy, + native_special_asserts_ccall, + ]), + }; +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: attempting to `try!` unwrap an `err` response at deploy time. +/// Outcome: block accepted +#[test] +fn native_try_ret_err_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "unwrap-try-resp", + contract_code: "(begin (try! (if true (err u200) (ok u1))))", + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: attempting to `try!` unwrap an `err` response at call time. +/// Outcome: block accepted +/// Note: [`clarity::vm::callables::DefinedFunction::execute_apply`] converts [`EarlyReturnError::UnwrapFailed`] +/// into a successful return wrapping the internal thrown value. +#[test] +fn native_try_ret_err_ccall() { + contract_call_consensus_test!( + contract_name: "unwrap-err", + contract_code: " + (define-public (trigger (resp (response uint uint))) + (begin + (try! resp) + (ok u1) + ) + ) + ", + function_name: "trigger", + function_args: &[ClarityValue::Response(ResponseData { + committed: false, + data: Box::new(ClarityValue::UInt(42)) + })], + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: attempting to `try!` unwrap a `None` optional at deploy time. +/// Outcome: block accepted +#[test] +fn native_try_ret_none_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "unwrap-try-opt", + contract_code: "(begin (try! (if true none (some true))))", + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: attempting to `try!` unwrap an `None` optional at call time. +/// Outcome: block accepted +/// Note: [`clarity::vm::callables::DefinedFunction::execute_apply`] converts [`EarlyReturnError::UnwrapFailed`] +/// into a successful return wrapping the internal thrown value. +#[test] +fn native_try_ret_none_ccall() { + contract_call_consensus_test!( + contract_name: "unwrap-try-opt", + contract_code: " + (define-read-only (trigger-ro (opt (optional bool))) + (begin + (try! opt) + (some true) + ) + ) + (define-public (trigger (opt (optional bool))) + (match (trigger-ro opt) + value + (ok u1) + (err u404) + ) + ) + ", + function_name: "trigger", + function_args: &[ClarityValue::none()], + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: calling `unwrap-err!` on an `(ok ...)` value at deploy time. +/// Outcome: block accepted +#[test] +fn native_unwrap_err_or_ret_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "unwrap-err", + contract_code: "(begin (unwrap-err! (if true (ok u3) (err u1)) (err u9)))", + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: calling `unwrap-err!` on an `(ok ...)` value at call time. +/// Outcome: block accepted +/// Note: [`clarity::vm::callables::DefinedFunction::execute_apply`] converts [`EarlyReturnError::UnwrapFailed`] +/// into a successful return wrapping the internal thrown value. +#[test] +fn native_unwrap_err_or_ret_ccall() { + contract_call_consensus_test!( + contract_name: "unwrap-err", + contract_code: " + (define-public (trigger) + (begin + (unwrap-err! (if true (ok u3) (err u1)) (err u9)) + (ok u1) + ) + ) + ", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: calling `unwrap!` on a `None` optional at deploy time. +/// Outcome: block accepted +#[test] +fn native_unwrap_or_ret_none_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "unwrap-opt", + contract_code: "(begin (unwrap! (if true none (some true)) (err u9)))", + ); +} + +/// Error: [`EarlyReturnError::UnwrapFailed`] +/// Caused by: calling `unwrap!` on a `None` optional at call time. +/// Outcome: block accepted +/// Note: [`clarity::vm::callables::DefinedFunction::execute_apply`] converts [`EarlyReturnError::UnwrapFailed`] +/// into a successful return wrapping the internal thrown value. +#[test] +fn native_unwrap_or_ret_none_ccall() { + contract_call_consensus_test!( + contract_name: "unwrap-opt", + contract_code: " + (define-public (trigger (opt (optional bool))) + (begin + (unwrap! opt (err false)) + (ok true) + ) + ) + ", + function_name: "trigger", + function_args: &[ClarityValue::none()], + ); +} + +/// Error: [`EarlyReturnError::AssertionFailed`] +/// Caused by: failing `asserts!` condition at deploy time. +/// Outcome: block accepted +#[test] +fn native_special_asserts_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "asserts-fail", + contract_code: "(begin (asserts! (is-eq 1 0) (err u0)) (ok u1))", + ); +} + +/// Error: [`EarlyReturnError::AssertionFailed`] +/// Caused by: failing `asserts!` condition at call time. +/// Outcome: block accepted +/// Note: [`clarity::vm::callables::DefinedFunction::execute_apply`] converts [`EarlyReturnError::AssertionFailed`] +/// into a successful return wrapping the internal thrown value. +#[test] +fn native_special_asserts_ccall() { + contract_call_consensus_test!( + contract_name: "asserts-fail", + contract_code: "(define-public (trigger) (begin (asserts! false (err u0)) (ok u1)))", + function_name: "trigger", + function_args: &[], + ); +} diff --git a/stackslib/src/chainstate/tests/mod.rs b/stackslib/src/chainstate/tests/mod.rs index cedefae82de..57fc8de894d 100644 --- a/stackslib/src/chainstate/tests/mod.rs +++ b/stackslib/src/chainstate/tests/mod.rs @@ -13,8 +13,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . pub mod consensus; +mod early_return_tests; mod parse_tests; mod runtime_analysis_tests; +mod runtime_tests; mod static_analysis_tests; use std::fs; diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index c5aae11701a..7d05cf499a0 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -131,7 +131,7 @@ fn variant_coverage_report(variant: ParseErrorKind) { /// 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; + const RUNTIME_LIMIT: u64 = BLOCK_LIMIT_MAINNET_21.runtime; // Arbitrary parameters determined through empirical testing const CONTRACT_FUNC_INVOCATIONS: u64 = 29_022; const CALL_RUNTIME_COST: u64 = 249_996_284; @@ -455,8 +455,9 @@ fn test_name_too_long() { /// ParserError: [`ParseErrorKind::InvalidPrincipalLiteral`] /// Caused by: valid principal chars but wrong format (due to the starting "AAA") /// Outcome: block accepted +/// Note: gets converted from [`clarity::vm::errors::RuntimeError::TypeParseFailure`] #[test] -fn test_invalid_principal_literal() { +pub 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/runtime_analysis_tests.rs b/stackslib/src/chainstate/tests/runtime_analysis_tests.rs index b6d95ff7d43..22a688127ca 100644 --- a/stackslib/src/chainstate/tests/runtime_analysis_tests.rs +++ b/stackslib/src/chainstate/tests/runtime_analysis_tests.rs @@ -20,7 +20,7 @@ use std::collections::HashMap; use clarity::types::StacksEpochId; #[allow(unused_imports)] use clarity::vm::analysis::CheckErrorKind; -use clarity::vm::types::{QualifiedContractIdentifier, MAX_TYPE_DEPTH}; +use clarity::vm::types::{PrincipalData, QualifiedContractIdentifier, MAX_TYPE_DEPTH}; use clarity::vm::{ClarityVersion, Value as ClarityValue}; use crate::chainstate::tests::consensus::{ @@ -30,17 +30,293 @@ use crate::chainstate::tests::consensus::{ use crate::core::test_util::to_addr; use crate::core::BLOCK_LIMIT_MAINNET_21; -/// TODO: Documentation to be added to the enum -/// - PublicFunctionNotReadOnly: Functionally Unreachable. Environment::inner_execute_contract is invoked with read_only = false on the relevant code path, causing PublicFunctionNotReadOnly check to be skipped. -/// - NoSuchPublicFunction: Tested. Possible only during contract call. On contract deploy checked during static analysis -/// - CircularReference: Tested. Possible only during contract call. On contract deploy checked during parsing. -/// - PublicFunctionMustReturnResponse: Functionally Unreachable. On contract deploy checked during static analysis. -/// - BadFunctionName: Functionally Unreachable. On contract deploy checked during static analysis. -/// - DefineFunctionBadSignature: Functionally Unreachable. On contract deploy checked during static analysis. -/// - NoSuchMap: Functionally Unreachable. On contract deploy checked during static analysis. (At runtime, just used for loading cost functions on block begin) -/// - NoSuchDataVariable: Functionally Unreachable. On contract deploy checked during static analysis. (At runtime, just used for loading cost functions on block begin and for handle prepare phase) -/// - EmptyTuplesNotAllowed: Functionally Unreachable. On contract deploy checked during static analysis. (At runtime, just used for loading cost functions on block begin) -/// - NoSuchTupleField: Functionally Unreachable. On contract deploy checked during static analysis. +/// Generates a coverage classification report for a specific [`CheckErrorKind`] 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 related errors). +/// - 🚫 **Unreachable** — not testable from consensus test side for reasons. +#[allow(dead_code)] +fn variant_coverage_report(variant: CheckErrorKind) { + enum VariantCoverage { + // 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. 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 CheckErrorKind::*; + use VariantCoverage::*; + + _ = match variant { + CostOverflow => Unreachable_ExpectLike, // Should exceed u64 + CostBalanceExceeded(_, _) => Tested(vec![ + check_error_cost_balance_exceeded_cdeploy, + check_error_cost_balance_exceeded_ccall + ]), + MemoryBalanceExceeded(_, _) => Tested(vec![ + check_error_memory_balance_exceeded_cdeploy, + check_error_memory_balance_exceeded_ccall + ]), + CostComputationFailed(_) => Unreachable_ExpectLike, + ExecutionTimeExpired => Unreachable_Functionally( + "All consensus-critical code paths (block validation and transaction processing) + pass `None` for max_execution_time to StacksChainState::process_transaction, + causing GlobalContext::execution_time_tracker to remain ExecutionTimeTracker::NoTracking. + The check_max_execution_time_expired function always returns Ok(()) when tracker + is NoTracking. Execution time limits are only enforced in RPC API calls + and miner-local transaction filtering."), + ValueTooLarge => Tested(vec![ + check_error_kind_value_too_large_cdeploy, + check_error_kind_value_too_large_ccall + ]), + ValueOutOfBounds => todo!(), + TypeSignatureTooDeep => Tested(vec![ + check_error_kind_type_signature_too_deep_cdeploy, + check_error_kind_type_signature_too_deep_ccall + ]), + ExpectedName => Unreachable_Functionally( + "Every place in the runtime where ExpectedName is raised comes from a direct + call to SymbolicExpression::match_atom() on the original AST node and the type + checker runs the same structure check during analysis."), + SupertypeTooLarge => Unreachable_Functionally( + "least_supertype checks already run in analysis, and runtime values are + sanitized to their declared signatures, so the VM never sees a pair of + values whose unified type wasn't accepted earlier."), + Expects(_) => Unreachable_ExpectLike, + BadMatchOptionSyntax(_) => Unreachable_Functionally( + "Both the analyzer and the runtime examine the exact same match AST slice. + The static pass invokes check_special_match_opt, which enforces the 3 + argument structure and the some binding name before any code is accepted"), + BadMatchResponseSyntax(_) => Unreachable_Functionally( + "Both the analyzer and the runtime examine the exact same match AST slice. + The static pass invokes check_special_match_resp, which enforces the 4 + argument structure and the ok and err binding names before any code is accepted."), + BadMatchInput(_) => Unreachable_Functionally( + "Both the analyzer and the runtime examine the exact same match AST slice. + The static pass invokes check_special_match, which enforces the 2 argument + structure and the input type before any code is accepted."), + ListTypesMustMatch => Tested(vec![check_error_kind_list_types_must_match_cdeploy]), + TypeError(_, _) => Tested(vec![ + check_error_kind_type_error_cdeploy, + check_error_kind_type_error_ccall + ]), + TypeValueError(_, _) => Tested(vec![ + check_error_kind_type_value_error_cdeploy, + check_error_kind_type_value_error_ccall + ]), + InvalidTypeDescription => Unreachable_Functionally( + "Every invalid type literal is parsed both by the analyzer and by the runtime. + Both paths invoke the same TypeSignature::parse_* helpers, so analysis + always fails before initialization can trigger it."), + UnknownTypeName(_) => Unreachable_Functionally( + "Static analysis catches invalid types via `TypeSignature::parse_atom_type`."), + UnionTypeError(_, _) => Unreachable_Functionally( + "The analyzer enforces that every call to `bit-shift-left` / `bit-shift-right` + supplies an argument whose type is exactly `int` or `uint` (see + `NativeFunctions::BitwiseLShift|BitwiseRShift` using + `FunctionArgSignature::Union(IntType, UIntType)` and the + `TypeSignature::admits_type` checks in `type_checker::check_function_arg_signature`)"), + UnionTypeValueError(_, _) => Tested(vec![ + check_error_kind_union_type_value_error_cdeploy, + check_error_kind_union_type_value_error_ccall + ]), + ExpectedOptionalValue(_) => Unreachable_Functionally( + "Every optional primitive (`is-some`, `default-to`, `unwrap!`, etc.) + has a dedicated analysis hook (`check_special_is_optional`, + `check_special_default_to`, `inner_unwrap`, …) that enforces the optional + type before a contract can be published, so the runtime never sees a plain + `Value` arrive at `native_default_to` / `is_some`."), + ExpectedResponseValue(_) => Unreachable_Functionally( + "Response helpers are validated by `check_special_is_response` and `inner_unwrap_err` + during static analysis, preventing a non-response from reaching the runtime handlers"), + ExpectedOptionalOrResponseValue(_) => Unreachable_Functionally( + "The mixed helpers (`match`, `try!`, `unwrap!`, `unwrap-err!`) ultimately + delegate to `check_special_match` and `inner_unwrap` in the analyzer, which enforces + that the argument is either an optional or a response before the code is accepted. + There is no runtime path where a plain value reaches `native_try_ret` or the + option/response matchers"), + ExpectedContractPrincipalValue(_) => Tested(vec![ + check_error_kind_expected_contract_principal_value_cdeploy, + check_error_kind_expected_contract_principal_value_ccall + ]), + CouldNotDetermineType => Tested(vec![check_error_kind_could_not_determine_type_ccall]), + BadTokenName => Unreachable_Functionally( + "Asset natives call `match_atom()` on their token arg during analysis."), + NoSuchNFT(_) => Unreachable_Functionally( + "Analysis uses contract_context.get_nft_type during every nft-* checker, + so a reference to an undefined NFT aborts before initialization"), + NoSuchFT(_) => Unreachable_Functionally( + "ft-* analyzers call contract_context.ft_exists, preventing undefined + fungible tokens from ever reaching the runtime handlers."), + BadTransferSTXArguments => Unreachable_Functionally( + "The analyzer routes all `stx-transfer?`, `stx-transfer-memo?`, and `stx-burn?` + calls through `check_special_stx_transfer` / `check_special_stx_burn` + which demand a `(uint, principal, principal)` signature before a contract + can be published. Because the runtime caches only sanitized values, + `special_stx_transfer` never receives a malformed value at runtime."), + BadTransferFTArguments => Unreachable_Functionally( + "`check_special_transfer_token` enforces the `(uint, principal, principal)` + argument contract for every FT transfer during analysis, so `special_transfer_token` + never sees a mismatched set of values at runtime."), + BadTransferNFTArguments => Unreachable_Functionally( + "`check_special_transfer_asset` ensures that the NFT + identifier plus `(principal, principal)` pair have the right types, + preventing `special_transfer_asset` from failing at runtime."), + BadMintFTArguments => Unreachable_Functionally( + "`check_special_mint_token` requires a `(uint, principal)` + argument tuple for fungible minting before deployment, so the runtime + never raises `BadMintFTArguments`"), + BadBurnFTArguments => Unreachable_Functionally( + "`check_special_burn_token` enforces `(uint, principal)` + during static analysis, making the runtime variant unobservable."), + ExpectedTuple(_) => Unreachable_Functionally( + "`check_special_get`/`check_special_merge` ensure every + `(get …)`/`(merge …)` argument is statically typed as a tuple (or + option wrapping a tuple), so `tuple_get` / `tuple_merge` never see + a non-tuple at runtime"), + NoSuchTupleField(_, _) => Unreachable_Functionally( + "`check_special_get` verifies tuple field existence for every `(get …)` + during static analysis, so `tuple_get` never receives a missing field"), + DefineFunctionBadSignature | BadFunctionName | PublicFunctionMustReturnResponse(_) => Unreachable_Functionally( + "On contract deploy checked during static analysis."), + EmptyTuplesNotAllowed | NoSuchMap(_) => Unreachable_Functionally( + "On contract deploy checked during static analysis. (At runtime, just used for loading cost functions on block begin)"), + NoSuchDataVariable(_) => Unreachable_Functionally( + "On contract deploy checked during static analysis. (At runtime, just used for loading cost functions on block begin and for handle prepare phase)"), + ReturnTypesMustMatch(_, _) => Tested(vec![check_error_kind_return_types_must_match_ccall]), + CircularReference(_) => Tested(vec![check_error_kind_circular_reference_ccall]), // Possible only during contract call. On contract deploy checked during parsing. + NoSuchContract(_) => Tested(vec![check_error_kind_no_such_contract_ccall]), + NoSuchPublicFunction(_, _) => Tested(vec![check_error_kind_no_such_public_function_ccall]), + PublicFunctionNotReadOnly(_, _) => Unreachable_Functionally("Environment::inner_execute_contract is invoked with read_only = false on the relevant code path, causing PublicFunctionNotReadOnly check to be skipped."), + ContractAlreadyExists(_) => Unreachable_Functionally( + "Contracts can only be created via SmartContract deployment transactions. \ + The runtime never performs contract installation or replacement.", + ), + ContractCallExpectName => Tested(vec![ + check_error_kind_contract_call_expect_name_cdeploy, + check_error_kind_contract_call_expect_name_ccall + ]), + NoSuchBurnBlockInfoProperty(_) => Unreachable_Functionally( + "Burn block info property names are validated during static analysis; \ + unknown properties are rejected at deploy time.", + ), + NoSuchStacksBlockInfoProperty(_) => Unreachable_Functionally( + "Stacks block info property names are validated during static analysis; \ + unknown properties are rejected at deploy time.", + ), + GetBlockInfoExpectPropertyName => Unreachable_Functionally( + "`get-block-info?` requires a literal property name; \ + non-atom arguments are rejected during static analysis.", + ), + GetStacksBlockInfoExpectPropertyName => Unreachable_Functionally( + "`get-stacks-block-info?` requires a literal property name; \ + non-atom arguments are rejected during static analysis.", + ), + GetTenureInfoExpectPropertyName => Unreachable_Functionally( + "`get-tenure-info?` requires a literal property name; \ + non-atom arguments are rejected during static analysis.", + ), + NameAlreadyUsed(_) => Tested(vec![ + check_error_kind_name_already_used_cdeploy, + check_error_kind_name_already_used_ccall + ]), + NonFunctionApplication => Unreachable_Functionally( + "Malformed function applications are syntactically rejected by the parser \ + and type checker before execution.", + ), + ExpectedListApplication => Unreachable_Functionally( + "All `append` operations require a statically-checked list argument; \ + non-list values are rejected during static analysis.", + ), + ExpectedSequence(_) => Unreachable_Functionally( + "Sequence operations are fully type-checked during analysis; \ + non-sequence values are rejected before execution.", + ), + BadLetSyntax => Unreachable_Functionally( + "`let` binding structure is fully validated during static analysis; \ + malformed bindings never reach the runtime.", + ), + BadSyntaxBinding(_) => Unreachable_Functionally( + "Binding syntax errors are detected during parsing and analysis; \ + runtime never re-parses bindings.", + ), + UndefinedFunction(_) => Tested(vec![check_error_kind_undefined_function_ccall]), + UndefinedVariable(_) => Unreachable_Functionally( + "All variable references are resolved during static analysis; \ + undefined variables cannot appear in executable code.", + ), + RequiresAtLeastArguments(_, _) => Unreachable_Functionally( + "Minimum arity requirements are enforced during static analysis; \ + calls with too few arguments cannot reach execution.", + ), + RequiresAtMostArguments(_, _) => Unreachable_Functionally( + "Maximum arity requirements are enforced during static analysis; \ + calls with too many arguments cannot reach execution.", + ), + IncorrectArgumentCount(_, _) => { + Tested(vec![check_error_kind_incorrect_argument_count_ccall]) + } + TooManyFunctionParameters(_, _) => Unreachable_Functionally( + "Trait function parameter limits are enforced during trait parsing at deploy time; \ + oversized signatures are rejected before execution.", + ), + TraitReferenceUnknown(_) => Unreachable_Functionally( + "All `use-trait` references are validated during static analysis; \ + unknown traits cannot appear at runtime.", + ), + TraitMethodUnknown(_, _) => Unreachable_Functionally( + "Trait method existence is verified during static analysis; \ + missing methods prevent deployment.", + ), + ExpectedTraitIdentifier => Unreachable_Functionally( + "Callable trait values always include a trait identifier after analysis; \ + the runtime never receives an untagged trait value.", + ), + BadTraitImplementation(_, _) => Tested(vec![bad_trait_implementation_mismatched_args]), + DefineTraitBadSignature | DefineTraitDuplicateMethod(_) => Unreachable_Functionally( + "Trait definitions are fully validated during deployment; \ + malformed trait signatures never reach runtime.", + ), + TraitBasedContractCallInReadOnly => Unreachable_Functionally( + "Read-only contract-call restrictions are enforced during static analysis; \ + write-capable calls cannot exist in executable read-only code.", + ), + ContractOfExpectsTrait => Unreachable_Functionally( + "`contract-of` only accepts statically-typed trait values; \ + invalid inputs are rejected during analysis.", + ), + TraitTooManyMethods(_, _) => Unreachable_Functionally( + "Trait method count limits are enforced during deployment; \ + oversized traits cannot appear at runtime.", + ), + InvalidCharactersDetected => Tested(vec![ + invalid_characters_detected_invalid_ascii, + invalid_characters_detected_invalid_utf8 + ]), + InvalidUTF8Encoding => { + Ignored("Only reachable via legacy v1 parsing paths") + } + WriteAttemptedInReadOnly => Unreachable_Functionally( + "Write operations inside read-only contexts are rejected during static analysis.", + ), + ExpectedListOfAllowances(_, _) + | AllowanceExprNotAllowed + | ExpectedAllowanceExpr(_) + | TooManyAllowances(_, _) => Unreachable_Functionally( + "Allowance expressions are purely syntactic and fully validated during analysis; \ + invalid constructions cannot be produced dynamically at runtime.", + ), + }; +} /// CheckErrorKind: [`CheckErrorKind::CostBalanceExceeded`] /// Caused by: exceeding the cost analysis budget during contract initialization. @@ -62,6 +338,85 @@ fn check_error_cost_balance_exceeded_cdeploy() { ); } +/// CheckErrorKind: [`CheckErrorKind::MemoryBalanceExceeded`] +/// Caused by: This test creates a contract that successfully passes analysis but fails during initialization +/// The contract defines large buffer constants (buff-20 = 1MB) and then creates many references +/// to it in a top-level `is-eq` expression, which exhausts the 100MB memory limit during initialization. +/// Outcome: block accepted. +#[test] +fn check_error_memory_balance_exceeded_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "test-exceeds", + contract_code: &{ + let define_data_var = "(define-constant buff-0 0x00)"; + + let mut contract = define_data_var.to_string(); + for i in 0..20 { + contract.push('\n'); + contract.push_str(&format!( + "(define-constant buff-{} (concat buff-{i} buff-{i}))", + i + 1, + )); + } + + contract.push('\n'); + contract.push_str("(is-eq "); + + for _i in 0..100 { + let exploder = "buff-20 "; + contract.push_str(exploder); + } + + contract.push(')'); + contract + }, + ); +} + +/// CheckErrorKind: [`CheckErrorKind::MemoryBalanceExceeded`] +/// Caused by: This test creates a contract that successfully passes analysis but fails during contract call. +/// The contract defines large buffer constants (buff-20 = 1MB) and then creates many references +/// to it in a top-level `is-eq` expression, which exhausts the 100MB memory limit during contract call. +/// Outcome: block accepted. +#[test] +fn check_error_memory_balance_exceeded_ccall() { + contract_call_consensus_test!( + contract_name: "memory-test-contract", + contract_code: &{ + // Procedurally generate a contract with large buffer constants and a function + // that creates many references to them, similar to argument_memory_test + let mut contract = String::new(); + + // Create buff-0 through buff-20 via repeated doubling: buff-20 = 1MB + contract.push_str("(define-constant buff-0 0x00)\n"); + for i in 0..20 { + contract.push_str(&format!( + "(define-constant buff-{} (concat buff-{i} buff-{i}))\n", + i + 1 + )); + } + + // Create a public function that makes many references to buff-20 + contract.push_str("\n(define-public (create-many-references)\n"); + contract.push_str(" (ok (is-eq "); + + // Create 100 references to buff-20 (1MB each = ~100MB total) + for _ in 0..100 { + contract.push_str("buff-20 "); + } + + contract.push_str(")))\n"); + contract + }, + function_name: "create-many-references", + function_args: &[], + // we only test epochs 2.4 and later because the call takes ~200 milion runtime cost, + // if we test all epochs, the tenure limit will be exceeded and the last 2 calls in + // epoch 3.3 will cause a block rejection. + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch24), + ); +} + /// CheckErrorKind: [`CheckErrorKind::CostBalanceExceeded`] /// Caused by: exceeding the cost analysis budget during contract initialization. /// The contract repeatedly performs `var-get` lookups on a data variable, @@ -314,6 +669,120 @@ fn check_error_kind_type_signature_too_deep_ccall() { ); } +/// CheckErrorKind: [`CheckErrorKind::TypeError`] +/// Caused by: `(at-block … (ok (var-get zero)))` returns `none` when evaluated at +/// a block where the contract state doesn't exist yet. The code immediately feeds +/// that `OptionalType(NoType)` value into `is-eq` against `u0`, triggering the +/// runtime `TypeError(UIntType, OptionalType(NoType))`. +/// Outcome: block accepted. +#[test] +fn check_error_kind_type_error_cdeploy() { + let contract_1 = SetupContract::new( + "pool-trait", + " + (define-trait pool-trait + ((get-shares-at (uint) (response uint uint))))", + ); + + let contract_2 = SetupContract::new( + "pool", + " + ;; Pool - uses at-block with map access + (impl-trait .pool-trait.pool-trait) + + (define-data-var zero uint u0) + + (define-read-only (get-shares-at (block uint)) + (let ( + (hash (unwrap-panic (get-block-info? id-header-hash block))) + (total-amt (unwrap-panic (at-block hash (ok (var-get zero))))) + (is-zero (is-eq total-amt u0))) ;; this is triggering the TypeError + (ok u0)))", + ) + .with_clarity_version(ClarityVersion::Clarity2); // Only works with clarity 1 or 2 + + contract_deploy_consensus_test!( + contract_name: "value-too-large", + contract_code: " + ;; Rewards - calls pool via trait + (use-trait pool-trait .pool-trait.pool-trait) + + (define-map reward-info { id: uint } { share-block: uint }) + + (define-read-only (get-reward-info (id uint)) + (default-to { share-block: u0 } (map-get? reward-info { id: id }))) + + (define-public (get-shares (id uint) (pool )) + (let ( + (info (get-reward-info id)) + (block (get share-block info)) + ;; the following line triggers the TypeError + (shares (unwrap-panic (contract-call? pool get-shares-at block)))) + (ok shares))) + + (define-constant result (get-shares u999 .pool))", + setup_contracts: &[contract_1, contract_2], + ); +} + +/// CheckErrorKind: [`CheckErrorKind::TypeError`] +/// Caused by: `(at-block … (ok (var-get zero)))` returns `none` when evaluated at +/// a block where the contract state doesn't exist yet. The code immediately feeds +/// that `OptionalType(NoType)` value into `is-eq` against `u0`, triggering the +/// runtime `TypeError(UIntType, OptionalType(NoType))`. +/// Outcome: block accepted. +#[test] +fn check_error_kind_type_error_ccall() { + let contract_1 = SetupContract::new( + "pool-trait", + " + (define-trait pool-trait + ((get-shares-at (uint) (response uint uint))))", + ); + + let contract_2 = SetupContract::new( + "pool", + " + ;; Pool - uses at-block with map access + (impl-trait .pool-trait.pool-trait) + + (define-data-var zero uint u0) + + (define-read-only (get-shares-at (block uint)) + (let ( + (hash (unwrap-panic (get-block-info? id-header-hash block))) + (total-amt (unwrap-panic (at-block hash (ok (var-get zero))))) + (is-zero (is-eq total-amt u0))) ;; this is triggering the TypeError + (ok u0)))", + ) + .with_clarity_version(ClarityVersion::Clarity1); // Only works with clarity 1 or 2 + + contract_call_consensus_test!( + contract_name: "value-too-large", + contract_code: " + (use-trait pool-trait .pool-trait.pool-trait) + + (define-map reward-info { id: uint } { share-block: uint }) + + (define-read-only (get-reward-info (id uint)) + (default-to { share-block: u0 } (map-get? reward-info { id: id }))) + + (define-public (get-shares (id uint) (pool )) + (let ( + (info (get-reward-info id)) + (block (get share-block info)) + ;; the following line triggers the TypeError + (shares (unwrap-panic (contract-call? pool get-shares-at block)))) + (ok shares))) + + (define-public (trigger-error) + (get-shares u999 .pool))", + function_name: "trigger-error", + function_args: &[], + setup_contracts: &[contract_1, contract_2], + ); +} + /// CheckErrorKind: [`CheckErrorKind::TypeValueError`] /// Caused by: passing a value of the wrong type to a function. /// Outcome: block accepted. @@ -478,7 +947,7 @@ fn check_error_kind_union_type_value_error_ccall() { (foo .contract-1))", function_name: "trigger-runtime-error", function_args: &[], - deploy_epochs: &StacksEpochId::ALL[11..], // Epochs 3.3 and later + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch33), exclude_clarity_versions: &[ClarityVersion::Clarity1, ClarityVersion::Clarity2, ClarityVersion::Clarity3], setup_contracts: &[contract_1], ); @@ -615,24 +1084,11 @@ fn check_error_kind_expected_contract_principal_value_ccall() { true))"#, function_name: "trigger-error", function_args: &[], - deploy_epochs: &StacksEpochId::ALL[11..], // Epochs 3.3 and later + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch33), exclude_clarity_versions: &[ClarityVersion::Clarity1, ClarityVersion::Clarity2, ClarityVersion::Clarity3], ); } -/// CheckErrorKind: [`CheckErrorKind::IncorrectArgumentCount`] -/// Caused by: passing the wrong number of arguments to a function. -/// Outcome: block accepted. -#[test] -fn check_error_kind_incorrect_argument_count_ccall() { - contract_call_consensus_test!( - contract_name: "check-error-kind", - contract_code: "(define-public (trigger-error (x uint)) (ok true))", - function_name: "trigger-error", - function_args: &[ClarityValue::Bool(true), ClarityValue::Bool(true)], - ); -} - /// CheckErrorKind: [`CheckErrorKind::UndefinedFunction`] /// Caused by: invoking a public function name that is not defined in the contract. /// Outcome: block accepted (transaction aborts with the runtime error). @@ -728,7 +1184,7 @@ fn check_error_kind_could_not_determine_type_ccall() { function_name: "trigger-error", function_args: &[], deploy_epochs: &[StacksEpochId::Epoch23], - call_epochs: &StacksEpochId::ALL[6..], // Epochs 2.4 and later + call_epochs: &StacksEpochId::since(StacksEpochId::Epoch24), exclude_clarity_versions: &[ClarityVersion::Clarity1, ClarityVersion::Clarity3, ClarityVersion::Clarity4], setup_contracts: &[trait_contract, trait_impl], ); @@ -772,3 +1228,96 @@ fn check_error_kind_circular_reference_ccall() { setup_contracts: &[trait_contract, dispatching_contract], ); } + +/// CheckErrorKind: [`CheckErrorKind::IncorrectArgumentCount`] +/// Caused by: passing the wrong number of arguments to a function. +/// Outcome: block accepted. +#[test] +fn check_error_kind_incorrect_argument_count_ccall() { + contract_call_consensus_test!( + contract_name: "check-error-kind", + contract_code: "(define-public (trigger-error (x uint)) (ok true))", + function_name: "trigger-error", + function_args: &[ClarityValue::Bool(true), ClarityValue::Bool(true)], + ); +} + +/// Error: [`CheckErrorKind::BadTraitImplementation`] +/// Caused by: Dynamic trait dispatch to a concrete contract that has the function, +/// but with a mismatched argument type (int instead of uint) +/// Outcome: Block accepted +#[test] +fn bad_trait_implementation_mismatched_args() { + let trait_definer = SetupContract::new( + "traits", + " + (define-trait getter-trait + ((get-1 (uint) (response uint uint)))) + ", + ); + + // Target contract has `get-1`, but it takes `int`, not `uint` → signature mismatch + let target_contract = SetupContract::new( + "target-contract", + " + (define-public (get-1 (x int)) + (ok u1)) + ", + ); + + contract_call_consensus_test!( + contract_name: "dispatching-contract", + contract_code: " + (use-trait getter-trait .traits.getter-trait) + + (define-public (wrapped-get-1 (contract )) + (contract-call? contract get-1 u0)) + ", + function_name: "wrapped-get-1", + function_args: &[ClarityValue::Principal(PrincipalData::Contract( + QualifiedContractIdentifier::new( + FAUCET_ADDRESS.clone().into(), + "target-contract".into(), + ) + ))], + setup_contracts: &[trait_definer, target_contract], + ); +} + +/// Error: [`CheckErrorKind::InvalidCharactersDetected`] +/// Caused by: deserializing an invalid ascii string using `from-consensus-buf` which eventually calls [`ClarityValue::string_ascii_from_bytes`]. +/// Outcome: Block accepted +/// Note: [`CheckErrorKind::InvalidCharactersDetected`] is converted to a serialization error in `inner_deserialize_read` which in turn is +/// converted to `None` in `conversions::from_consensus_buff` during its handling of the result of `try_deserialize_bytes_exact`. +#[test] +fn invalid_characters_detected_invalid_ascii() { + contract_deploy_consensus_test!( + contract_name: "invalid-ascii", + contract_code: " + (define-constant deserialized-invalid-ascii + ;; This buffer represents: string-ascii with bytes [0x00, 0x01, 0x02] + ;; (0x0d = string-ascii type, 0x00000003 = length 3, then invalid bytes) + (from-consensus-buff? (string-ascii 3) 0x0d00000003000102)) + ", + exclude_clarity_versions: &[ClarityVersion::Clarity1], // Clarity1 does not support from-consensus-buf? + ); +} + +/// Error: [`CheckErrorKind::InvalidCharactersDetected`] +/// Caused by: deserializing an invalid utf8 string using `from-consensus-buf` which eventually calls [`ClarityValue::string_utf8_from_bytes`]. +/// Outcome: Block accepted +/// Note: [`CheckErrorKind::InvalidCharactersDetected`] is converted to a serialization error in `inner_deserialize_read` which in turn is +/// converted to `None` in `conversions::from_consensus_buff` during its handling of the result of `try_deserialize_bytes_exact`. +#[test] +fn invalid_characters_detected_invalid_utf8() { + contract_deploy_consensus_test!( + contract_name: "invalid-utf8", + contract_code: " + (define-constant deserialized-invalid-utf8 + ;; This buffer represents: string-utf8 with invalid UTF-8 bytes [0xff, 0xfe] + ;; (0x0e = string-utf8 type, 0x00000002 = length 2, then invalid UTF-8) + (from-consensus-buff? (string-utf8 2) 0x0e00000002fffe)) + ", + exclude_clarity_versions: &[ClarityVersion::Clarity1], // Clarity1 does not support from-consensus-buf? + ); +} diff --git a/stackslib/src/chainstate/tests/runtime_tests.rs b/stackslib/src/chainstate/tests/runtime_tests.rs new file mode 100644 index 00000000000..7b808e47873 --- /dev/null +++ b/stackslib/src/chainstate/tests/runtime_tests.rs @@ -0,0 +1,875 @@ +// 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 . + +//! This module contains consensus tests related to Runtime errors. + +use std::collections::HashMap; + +use clarity::types::chainstate::{StacksPrivateKey, StacksPublicKey}; +use clarity::types::StacksEpochId; +use clarity::vm::errors::RuntimeError; +use clarity::vm::types::{PrincipalData, ResponseData}; +use clarity::vm::{ClarityVersion, Value as ClarityValue}; +use stacks_common::address::AddressHashMode; + +use crate::chainstate::nakamoto::tests::node::TestStacker; +use crate::chainstate::stacks::address::PoxAddress; +use crate::chainstate::stacks::boot::test::{ + make_pox_2_lockup, make_pox_3_lockup, make_pox_4_lockup, make_pox_lockup, + make_signer_key_signature, +}; +use crate::chainstate::tests::consensus::{ + contract_call_consensus_test, contract_deploy_consensus_test, ConsensusTest, TestBlock, SK_1, +}; +use crate::chainstate::tests::parse_tests; +use crate::core::test_util::to_addr; +use crate::util_lib::signed_structured_data::pox4::Pox4SignatureTopic; + +/// Generates a coverage classification report for a specific [`RuntimeError`] 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.. +/// - 🚫 **Unreachable** — not testable from consensus test side for reasons. +#[allow(dead_code)] +fn variant_coverage_report(variant: RuntimeError) { + enum VariantCoverage { + // 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. 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 RuntimeError::*; + use VariantCoverage::*; + + _ = match variant { + Arithmetic(_) => Tested(vec![ + arithmetic_sqrti_neg_cdeploy, + arithmetic_sqrti_neg_ccall, + arithmetic_log2_neg_cdeploy, + arithmetic_log2_neg_ccall, + arithmetic_pow_large_cdeploy, + arithmetic_pow_large_ccall, + arithmetic_pow_neg_cdeploy, + arithmetic_pow_neg_ccall, + arithmetic_zero_n_log_n_cdeploy, + arithmetic_zero_n_log_n_ccall, + ]), + ArithmeticOverflow => Tested(vec![ + arithmetic_overflow_pow_at_cdeploy, + arithmetic_overflow_pow_ccall, + arithmetic_overflow_mul_cdeploy, + arithmetic_overflow_mul_ccall, + arithmetic_overflow_add_cdeploy, + arithmetic_overflow_add_ccall, + arithmetic_overflow_to_int_cdeploy, + arithmetic_overflow_to_int_ccall, + ft_mint_overflow, + ]), + ArithmeticUnderflow => Tested(vec![ + to_uint_underflow_cdeploy, + to_uint_underflow_ccall, + sub_underflow_cdeploy, + sub_underflow_ccall, + sub_arg_len_underflow_cdeploy, + sub_arg_len_underflow_ccall, + ]), + SupplyOverflow(_, _) => Tested(vec![ft_mint_supply_overflow]), + SupplyUnderflow(_, _) => Unreachable_Functionally(" + Token supply underflow is prevented by design in Clarity. \ + All transfer/mint/burn operations use checked arithmetic and balance \ + validation, so negative supply is impossible without manual database corruption." + ), + DivisionByZero => Tested(vec![ + division_by_zero_mod_cdeploy, + division_by_zero_mod_ccall, + division_by_zero_cdeploy, + division_by_zero_ccall, + ]), + TypeParseFailure(_) => Tested(vec![ + parse_tests::test_invalid_principal_literal, + principal_wrong_byte_length, + ]), + ASTError(_) => Unreachable_Functionally( + "AST errors cannot occur through normal Clarity operations. \ + They exist only for CLI and testing functions that bypass AST parsing \ + that occurs during a typical contract deploy. These wrapped `ParseError` \ + are exhaustively covered by (`parse_tests`)." + ), + MaxStackDepthReached => Tested(vec![ + stack_depth_too_deep_call_chain_ccall, + stack_depth_too_deep_call_chain_cdeploy + ]), + MaxContextDepthReached => Unreachable_Functionally( + "The maximum context depth limit cannot be reached through normal Clarity code. \ + Both the call-stack depth limit and the parser's expression-depth limit \ + are significantly lower and will trigger first. Only low-level Rust unit tests \ + can construct a context deep enough to hit this error." + ), + BadTypeConstruction => Unreachable_Functionally( + "BadTypeConstruction is rejected during static analysis at contract-publish time. \ + Any value construction that would produce an ill-formed type fails parsing or \ + type-checking before the contract is stored on-chain." + ), + BadBlockHeight(_) => Unreachable_Functionally( + "All block heights referenced via `at-block` or `get-block-info?` are guaranteed \ + to exist in the node's historical database during normal execution. \ + This error only surfaces if the chainstate is missing blocks or corrupted." + ), + NoSuchToken => Unreachable_Functionally( + "NFT operations return `none` when an instance does not exist. \ + The `NoSuchToken` runtime error is only emitted from internal VM assertions \ + and cannot be triggered by regular Clarity code unless storage is manually corrupted." + ), + NotImplemented => Unreachable_Functionally( + "Indicates use of an unimplemented VM feature. \ + Can only be hit by directly invoking unfinished Rust internals – not reachable from Clarity." + ), + NoCallerInContext => Unreachable_Functionally( + "Every function call (public, private, or trait) is executed with a valid caller context. \ + This error only appears when the execution environment is manually constructed incorrectly." + ), + NoSenderInContext => Unreachable_Functionally( + "Every on-chain transaction and contract-call has a well-defined sender. \ + This error only occurs in malformed test harnesses." + ), + BadNameValue(_, _) => Unreachable_Functionally( + "Contract, function, trait, and variable names are fully validated during static analysis at publish time. \ + The runtime only ever encounters already-validated names. \ + Only corrupted state or manual VM manipulation can produce this error." + ), + UnknownBlockHeaderHash(_) => Tested(vec![unknown_block_header_hash_fork]), + BadBlockHash(_) => Tested(vec![bad_block_hash]), + UnwrapFailure => Tested(vec![ + unwrap_err_panic_on_ok_runtime, + unwrap_panic_on_err_runtime + ]), + DefunctPoxContract => Tested(vec![defunct_pox_contracts]), + PoxAlreadyLocked => Ignored( + "The active PoX contract already returns ERR_STACKING_ALREADY_STACKED for double-locking attempts. \ + The VM-level PoxAlreadyLocked error is only triggerable if locking occurs across PoX boundaries. \ + This is better suited for unit testing." + ), + BlockTimeNotAvailable => Tested(vec![block_time_not_available]), + BadTokenName(_) => Ignored("Error variant tests should be added"), + } +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `pow` arithmetic operation at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_pow_at_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "overflow-pow", + contract_code: "(define-constant overflow (pow 2 128))", + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `pow` arithmetic operation at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_pow_ccall() { + contract_call_consensus_test!( + contract_name: "overflow-pow", + contract_code: " +(define-public (trigger-overflow-pow) + (ok (pow 2 128)) +)", + function_name: "trigger-overflow-pow", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `mul` arithmetic operation at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_mul_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "overflow-mul", + contract_code: &format!("(define-constant overflow (* u{} u2))", u128::MAX), + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `mul` arithmetic operation at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_mul_ccall() { + contract_call_consensus_test!( + contract_name: "overflow-mul", + contract_code: &format!(" +(define-public (trigger-overflow-mul) + (ok (* u{} u2)) +)" , u128::MAX), + function_name: "trigger-overflow-mul", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `add` arithmetic operation at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_add_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "overflow-add", + contract_code: &format!("(define-constant overflow (+ u{} u1))", u128::MAX), + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `add` arithmetic operation at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_add_ccall() { + contract_call_consensus_test!( + contract_name: "overflow-add", + contract_code: &format!(" +(define-public (trigger-overflow-add) + (ok (+ u{} u1)) +)", u128::MAX), + function_name: "trigger-overflow-add", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `to-int` conversion at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_to_int_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "overflow-to-int", + contract_code: &format!("(define-constant overflow (to-int u{}))", u128::MAX), + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing `to-int` conversion at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_overflow_to_int_ccall() { + contract_call_consensus_test!( + contract_name: "overflow-to-int", + contract_code: &format!(" +(define-public (overflow-to-int-large) + (ok (to-int u{})) +)", u128::MAX), + function_name: "overflow-to-int-large", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticOverflow`] +/// Caused by: overflow when doing two successive fungible token +/// mints, but it ultimately calls the `add` arithmetic operation +/// Outcome: block accepted. +#[test] +fn ft_mint_overflow() { + contract_call_consensus_test!( + contract_name: "ft-mint-overflow", + contract_code: &format!(" +(define-fungible-token token) + +(define-public (trigger-ft-mint-overflow) + (begin + (try! (ft-mint? token u{} tx-sender)) + (ft-mint? token u1 tx-sender) + ) +)", u128::MAX), + function_name: "trigger-ft-mint-overflow", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::SupplyOverflow`] +/// Caused by: minting more than the declared `total-supply` (1_000_000), +/// triggering the cap check in `checked_increase_token_supply`. +/// Outcome: block accepted. +#[test] +fn ft_mint_supply_overflow() { + contract_call_consensus_test!( + contract_name: "ft-supply-overflow", + contract_code: " +(define-fungible-token token u1000000) +(define-public (trigger-ft-supply-overflow) + (begin + (try! (ft-mint? token u500000 tx-sender)) + (ft-mint? token u600000 tx-sender) + ) +) + ", + function_name: "trigger-ft-supply-overflow", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticUnderflow`] +/// Caused by: `native_to_uint` conversion of a negative number at deploy time. +/// Outcome: block accepted. +#[test] +fn to_uint_underflow_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "to-uint-negative", + contract_code: "(define-constant overflow (to-uint -10))", + ); +} + +/// Error: [`RuntimeError::ArithmeticUnderflow`] +/// Caused by: `native_to_uint` conversion of a negative number at call time. +/// Outcome: block accepted. +#[test] +fn to_uint_underflow_ccall() { + contract_call_consensus_test!( + contract_name: "to-uint-negative", + contract_code: " +(define-read-only (trigger-underflow) + (to-uint -10) +)", + function_name: "trigger-underflow", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticUnderflow`] +/// Caused by: subtraction at deploy time. +/// Outcome: block accepted. +#[test] +fn sub_underflow_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "sub-underflow-deploy", + contract_code: "(define-constant overflow (- u10 u11))", + ); +} + +/// Error: [`RuntimeError::ArithmeticUnderflow`] +/// Caused by: subtraction at call time. +/// Outcome: block accepted. +#[test] +fn sub_underflow_ccall() { + contract_call_consensus_test!( + contract_name: "sub-underflow", + contract_code: " +(define-read-only (trigger-underflow) + (- u10 u11) +)", + function_name: "trigger-underflow", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::ArithmeticUnderflow`] +/// Caused by: single-argument subtraction attempts to negate an unsigned integer at deploy time. +/// Outcome: block accepted. +#[test] +fn sub_arg_len_underflow_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "arg-len-underflow", + contract_code: "(define-constant overflow (- u5))", + ); +} + +/// Error: [`RuntimeError::ArithmeticUnderflow`] +/// Caused by: single-argument subtraction attempts to negate an unsigned integer at call time. +/// Outcome: block accepted. +#[test] +fn sub_arg_len_underflow_ccall() { + contract_call_consensus_test!( + contract_name: "arg-len-underflow", + contract_code: " +(define-read-only (trigger) + (- u5)) +", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::DivisionByZero`] +/// Caused by: modulo at deploy time. +/// Outcome: block accepted. +#[test] +fn division_by_zero_mod_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "division-by-zero-mod", + contract_code: "(define-constant overflow (mod 10 0))", + ); +} + +/// Error: [`RuntimeError::DivisionByZero`] +/// Caused by: modulo at call time. +/// Outcome: block accepted. +#[test] +fn division_by_zero_mod_ccall() { + contract_call_consensus_test!( + contract_name: "division-by-zero-mod", + contract_code: " +(define-read-only (trigger) + (mod 10 0) +)", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::DivisionByZero`] +/// Caused by: division at deploy time. +/// Outcome: block accepted. +#[test] +fn division_by_zero_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "division-by-zero", + contract_code: "(define-constant overflow (/ 10 0))", + ); +} + +/// Error: [`RuntimeError::DivisionByZero`] +/// Caused by: division at call time. +/// Outcome: block accepted. +#[test] +fn division_by_zero_ccall() { + contract_call_consensus_test!( + contract_name: "division-by-zero", + contract_code: " +(define-read-only (trigger) + (/ 10 0) +)", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: sqrt of a negative integer at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_sqrti_neg_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "sqrti-neg-deploy", + contract_code: "(define-constant overflow (sqrti -1))", + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: sqrt of a negative integer at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_sqrti_neg_ccall() { + contract_call_consensus_test!( + contract_name: "sqrti-neg", + contract_code: " +(define-read-only (trigger) + (sqrti -1) +)", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: log2 of a negative integer at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_log2_neg_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "log2-neg-deploy", + contract_code: "(define-constant overflow (log2 -8))", + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: log2 of a negative integer at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_log2_neg_ccall() { + contract_call_consensus_test!( + contract_name: "log2-neg", + contract_code: " +(define-read-only (trigger) + (log2 -8) +)", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: pow of too large a number at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_pow_large_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "pow-large-deploy", + contract_code: &format!( + "(define-constant overflow (pow 2 {}))", + u64::from(u32::MAX) + 1 + ), + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: pow of too large a number at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_pow_large_ccall() { + contract_call_consensus_test!( + contract_name: "pow-large", + contract_code: &format!(" +(define-read-only (trigger) + (pow 2 {}) +)", u64::from(u32::MAX) + 1), + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: pow of negative number at deploy time. +/// Outcome: block accepted. +#[test] +fn arithmetic_pow_neg_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "pow-neg-deploy", + contract_code: "(define-constant overflow (pow 2 (- 1)))", + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: pow of negative number at call time. +/// Outcome: block accepted. +#[test] +fn arithmetic_pow_neg_ccall() { + contract_call_consensus_test!( + contract_name: "pow-neg", + contract_code: " +(define-read-only (trigger) + (pow 2 (- 1)) +)", + function_name: "trigger", + function_args: &[], + ); +} +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: calling nlogn with n = 0 +/// Outcome: block accepted at deploy time. +/// Note: Returns a [`clarity::vm::analysis::CheckErrorKind::CostComputationFailed`] which wrapps the underlying [`RuntimeError::Arithmetic`] error. +#[test] +fn arithmetic_zero_n_log_n_cdeploy() { + contract_deploy_consensus_test!( + contract_name: "zero-n-log-n-deploy", + contract_code: "(define-constant overflow (from-consensus-buff? int 0x))", + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch21), + exclude_clarity_versions: &[ClarityVersion::Clarity1], + ); +} + +/// Error: [`RuntimeError::Arithmetic`] +/// Caused by: calling nlogn with n = 0 +/// Outcome: block accepted at call time. +/// Note: Returns a [`clarity::vm::analysis::CheckErrorKind::CostComputationFailed`] which wrapps the underlying [`RuntimeError::Arithmetic`] error. +#[test] +fn arithmetic_zero_n_log_n_ccall() { + contract_call_consensus_test!( + contract_name: "zero-n-log-n", + contract_code: " +(define-read-only (trigger) + (from-consensus-buff? int 0x) +)", + function_name: "trigger", + function_args: &[], + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch21), + exclude_clarity_versions: &[ClarityVersion::Clarity1], + ); +} + +/// Error: [`RuntimeError::TypeParseFailure`] +/// Caused by: invalid standard principal literal (wrong byte length) +/// Outcome: block accepted. +/// Note: Gets converted into [`clarity::vm::ast::errors::ParseErrorKind::InvalidPrincipalLiteral`] +#[test] +pub fn principal_wrong_byte_length() { + contract_deploy_consensus_test!( + contract_name: "wrong-byte-length", + contract_code: " +;; This literal decodes via c32 but has the wrong byte length +(define-constant my-principal 'S162RK3CHJPCSSK6BM757FW)", + ); +} + +/// Error: [RuntimeError::MaxStackDepthReached] +/// Caused by: private function call chain exceeding runtime stack depth at deploy time. +/// Outcome: block accepted +#[test] +fn stack_depth_too_deep_call_chain_cdeploy() { + // Build a chain of private functions foo-0 → foo-1 → ... → foo-63 + // Each foo-i calls foo-(i-1), so calling foo-63 triggers 64 nested calls. + let mut defs = Vec::new(); + // Base function + defs.push("(define-private (foo-0 (x int)) (+ 1 x))".to_string()); + // Generate foo-1 through foo-63 + for i in 1..=63 { + defs.push(format!( + "(define-private (foo-{i} (x int)) (foo-{} (+ 1 x)))", + i - 1 + )); + } + // The top-level expression we want to trigger evaluation of foo-63 + defs.push("(foo-63 1)".into()); + let contract_code = defs.join("\n"); + contract_deploy_consensus_test!( + contract_name: "max-stack-depth", + contract_code: &contract_code, + ); +} + +/// Error: [`RuntimeError::MaxStackDepthReached`] +/// Caused by: private function call chain exceeding runtime stack depth at function call time. +/// Outcome: block accepted, execution rejected when function is called +#[test] +fn stack_depth_too_deep_call_chain_ccall() { + // Build 65 private functions: foo-0 → foo-64 + let mut defs = Vec::new(); + + // Base function: depth = 1 + defs.push("(define-private (foo-0 (x int)) (let ((y (+ x 1))) y))".to_string()); + + // Chain functions: each adds 1 to local context via let + for i in 1..65 { + let prev = i - 1; + defs.push(format!( + "(define-private (foo-{i} (x int)) (let ((y (foo-{prev} x))) (+ y 1)))" + )); + } + + // Public function triggers the runtime error by calling foo-64 + defs.push("(define-public (trigger) (ok (foo-64 0)))".into()); + + let contract_code = defs.join("\n"); + + // Call the public function via the consensus test macro + contract_call_consensus_test!( + contract_name: "context-depth", + contract_code: &contract_code, + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::UnknownBlockHeaderHash`] +/// Caused by: calling `at-block` with a block hash that doesn't exist on the current fork +/// Outcome: block accepted +#[test] +fn unknown_block_header_hash_fork() { + contract_call_consensus_test!( + contract_name: "unknown-hash", + contract_code: " +(define-public (trigger) + (ok + (at-block + 0x0202020202020202020202020202020202020202020202020202020202020202 + (+ 1 2) + ) + ) +)", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::BadBlockHash`] +/// Caused by: calling `at-block` with a 31-byte block hash +/// Outcome: block accepted +#[test] +fn bad_block_hash() { + contract_call_consensus_test!( + contract_name: "bad-block-hash", + contract_code: " +(define-public (trigger) + (ok + (at-block + 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e + (+ 1 2) + ) + ) +)", + function_name: "trigger", + function_args: &[], + ); +} + +/// Error: [`RuntimeError::UnwrapFailure`] +/// Caused by: calling `unwrap-err-panic` on an `(ok ...)` value at runtime +/// Outcome: block accepted +#[test] +fn unwrap_err_panic_on_ok_runtime() { + contract_call_consensus_test!( + contract_name: "unwrap-ok", + contract_code: " +(define-public (trigger (input (response uint uint))) + (ok (unwrap-err-panic input)) +)", + function_name: "trigger", + // Pass a real (ok ...) response as the argument + function_args: &[ + ClarityValue::Response(ResponseData { + committed: true, + data: Box::new(ClarityValue::UInt(3)), + }) + ], + ); +} + +/// Error: [`RuntimeError::UnwrapFailure`] +/// Caused by: calling `unwrap-panic` (or `unwrap!`) on an `(err ...)` response value at runtime +/// Outcome: block accepted +#[test] +fn unwrap_panic_on_err_runtime() { + contract_call_consensus_test!( + contract_name: "unwrap-err", + contract_code: " +(define-public (trigger (input (response uint uint))) + (ok (unwrap-panic input)) +)", + function_name: "trigger", + function_args: &[ + ClarityValue::Response(ResponseData { + committed: false, + data: Box::new(ClarityValue::UInt(3)), + }) + ], + ); +} + +/// Error: [`RuntimeError::DefunctPoxContract`] +/// Caused by: calling stack-stx on outdated pox contracts in the latest epoch +/// Outcome: block accepted +#[test] +fn defunct_pox_contracts() { + let sender_sk = StacksPrivateKey::from_hex(SK_1).unwrap(); + let address = to_addr(&sender_sk); + let principal: PrincipalData = address.clone().into(); + let signer_key = StacksPublicKey::from_private(&sender_sk); + + let nonce = 0; + let hash_mode = AddressHashMode::SerializeP2PKH; + let addr_bytes = address.bytes(); + let lock_period = 1; + let auth_id = 1; + let height = 48; + let pox_address = PoxAddress::from_legacy(AddressHashMode::SerializeP2PKH, addr_bytes.clone()); + + let lock_amount = TestStacker::DEFAULT_STACKER_AMOUNT; + let addr_bytes = address.bytes(); + let lock_period = 1; + let auth_id = 1; + + let initial_balances = vec![(principal.clone(), u64::try_from(lock_amount).unwrap() * 2)]; + + let signature = make_signer_key_signature( + &pox_address, + &sender_sk, + 6, + &Pox4SignatureTopic::StackStx, + 1, + u128::MAX, + auth_id, + ); + + let mut blocks = vec![]; + // Attempt to mine each transaction in a diff block + for tx in [ + // These pox lockups should fail + make_pox_lockup( + &sender_sk, + nonce, + lock_amount, + hash_mode, + addr_bytes, + lock_period, + height, + ), + make_pox_2_lockup( + &sender_sk, + nonce + 1, + lock_amount, + pox_address.clone(), + lock_period, + height, + ), + make_pox_3_lockup( + &sender_sk, + nonce + 2, + lock_amount, + pox_address.clone(), + lock_period, + height, + ), + // This final lockup should succeed until we upgrade our pox contract + make_pox_4_lockup( + &sender_sk, + nonce + 3, + lock_amount, + &pox_address, + 1, + &signer_key, + 48, + Some(signature.clone()), + u128::MAX, + auth_id, + ), + ] { + blocks.push(TestBlock { + transactions: vec![tx], + }) + } + + let epoch_blocks = HashMap::from([(StacksEpochId::latest(), blocks)]); + + let results = ConsensusTest::new(function_name!(), initial_balances, epoch_blocks).run(); + + insta::assert_ron_snapshot!(results); +} + +/// Error: [`RuntimeError::BlockTimeNotAvailable`] +/// Caused by: attempting to retrieve the stacks-block-time from a pre-3.3 height +/// Outcome: block accepted +#[test] +fn block_time_not_available() { + contract_call_consensus_test!( + contract_name: "no-block-time", + contract_code: " + (define-read-only (trigger (height uint)) + (ok (at-block (unwrap! (get-stacks-block-info? id-header-hash height) (err u100)) + stacks-block-time + )) + )", + function_name: "trigger", + function_args: &[ClarityValue::UInt(1)], + deploy_epochs: &StacksEpochId::since(StacksEpochId::Epoch33), + exclude_clarity_versions: &[ClarityVersion::Clarity1, ClarityVersion::Clarity2, ClarityVersion::Clarity3], + ) +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__read_only_transaction_block.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__read_only_transaction_block.snap new file mode 100644 index 00000000000..c231df2206e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__read_only_transaction_block.snap @@ -0,0 +1,1381 @@ +--- +source: stackslib/src/chainstate/tests/consensus.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "51577d6278e6306e4b22c0a216282baf6ba5b442f524a7f0a2a4716aa9e0ab7a", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1002000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1002000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2445fc5527d2c4984a4eb694f0db4d664eea16b25bdb548ca77f75cedf676681", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 312539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 312539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ab0b251d85db1d2538d7ad86f4a5df46241aaf8a5afa228428b6778a5740ec3", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_1-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f22a7e2b9860454930e798d428f92fea04dc8f19dc1dbcc52fd6a95c4ecbe7ff", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_1-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "01bd82da5e7986cdaa13f3edf8f7fac185083fc9876eecbb135be98b3b530355", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5aa4cc93d04bd6d214faafcffdc1e5abfe0d7e8e7539d3e13ca25bf3764b474", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0538101c3dec1c4b1c6ed889dd890e189ecb81f4763e15c5ff471fb6748d4171", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e7fafadb8ae09aa769ea544bccd6f8a73250b44eb5e37e1418d334c2af21c1b", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6574269adb31f8c014ade973341f2bfb69c7e4d148f5f2a0dffee7c75427dbf", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_4-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "52b55bc3710bcd85a5fc1dddd5af97a4f1792f0c692e8f5547ba8442c194d1c6", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_4-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fd6416758c483aa99ebd2b39991e5301578234b74546c19f9863b7b04ffa25c9", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_5-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bed561a9b3aae9f71b46b752d4f22d396d9bb70f7e29e9bf25e18e2fa6aaf3e6", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch2_5-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5ebee702b56639d26eeee668950cf9cd7f639be024b0fc5b96b0279cac33e0fe", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch3_0-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39c0e14dab88af8a25f3ece3418e40cf8e42b66ebb33f4e58fee68318dc5540f", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch3_0-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ae1a8131ba6a0a3f69cc9be24c038773cbd2876003afd5dc8d3ef886d58fa235", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch3_0-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f8c681b44d1d29f00e8fb268759b88f9a469d40565256ee0c4cb83c2cb7f2316", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch3_1-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2e0281f175bb57f0631ea7b8937f14df1e790700c0ced8bd52325c0bdc0ec16e", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch3_1-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a5160201f1b8499ec68d6257c20206ca7cac76dbfeac7607c11500e19300e149", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-Epoch3_1-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a56183a75e21f860a9689447cce39e32d78a47dda9904d940df09d2609f640ea", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5a7c1cfc1c129b043e7825a34c02ee0720e66265a1068e6010b7df2385bcf512", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c1d285d0ca82926e6012c2622d25f578acf8b0da0ee600ff133e79a79b91ac6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f28056766befaccbe185f7b55c5bf0461c8de86541374647a36f16421722857", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b56b453f0ce232e86c7ae373f4e428205b094a9c44a94c54637fed91561c96a0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f240c21580d09b3ab71fa9c4bfca8450548fbe6b14ea89f38e9cb7938050c77", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "60975ad5afebea0f32a43ea5aef39fe9f17e55ca78efeca576fe4a8a1d7e46d2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: read-only-call-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: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 98, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11113, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "38e1efcf2f1c9f4c5c5cceb74a5d7e05e055bf4a36aac72973408ff8e18d748b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a440a9c9e04fec0285c75f02d501c00074a416cdeaeb546e06e9eee2fa6f0a0a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8a82d9a403ce28fdb5b091d7cae9ebc361003f4db76fad985bc3d3a8eb9082e8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "15bf623860a8545ed8e2d9dc329ef24fa26dc5e8c11bb4d25ab6c690335189d4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bfad2055049e35c731c12ba5a93a9941029b5e5fae2036df70219757c5a77232", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48777f659d549be58008ae6445241c2f2f757332a4c7b8c1d5bae95ae85d9e99", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "00818fcd7d457fcd91f811520b7db8110db2df62d63f6bd2093f7bed10e35b67", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2815673531ba079558da18dfa3bbf8b95ae5f2c5f4d6d16991da1d143248c27c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "01a56af2340076b5e165bc8808b2225d3450a4683ae0fdb3eb5f99f889ee0967", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1438a7859954c0fd2d5d4ecc11129bf28102864f5bbac98e7adedf185ccae897", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4d883eb6f4cbb713b5c947d0ab023433bca4fd6db5d8c9608e7ed4d153a37e53", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c04497f5cf1f641f481b0b917bbd1dbd532419a7840cd2d0bef8e3ab6ec27eb0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cb33963be842bd7416cbbd34af46f2d00c369d54371a568d773b721c985c4c4a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d01470fda7b33b10773617592661bf51d3e8321cf21e37b67e322017a186927c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0729e12ef4e467c701f80f5104ba171a49e5c8603b4a0cd442968284001510e8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "35269d48f0075f6df753a4b6f001916f6be546fbe815c265c3fcfd2882392eaf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e18bfd4b07b8e4b8498be255f29f764d26a49feab73b7d541f73f7286ea6a71d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "87909ac870d2a81fcab42e11143ce43166aa9326ce2b6cc224fe4f983a7b90bd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8b0cd0bb89cc5c717759d3606c97ab465915a27655f9b0f1436a0d17f1053531", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ac3018be81495d471f4553b7d33017ccc78203ba2f31637c28f8026b765b45c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bafa57570fc718b1181f186122481a92d93f6523f2f8156bdf7d4e0cfa545c60", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1dd30ee345cd8f4af1ab67766e29c8624612c6f13422ae4f8296b1c1b1589fdc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e921878493fede1229d857a54dc81a734e731c607aa0ff03982381fe713ffb27", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "853b3f3c1594583d9305194889113bf971ec1a5ec3709d65b19dc78b93c56d9c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "aa4459a84e2a74054d41981e3c8b7a32f4fd91e54c8fa40310037d7ffeafbfda", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: read-only-call-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Optional(OptionalData( + data: Some(UInt(1)), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 90, + read_count: 3, + runtime: 389, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_special_asserts_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_special_asserts_ccall.snap new file mode 100644 index 00000000000..d41dee5daa0 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_special_asserts_ccall.snap @@ -0,0 +1,1406 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "a08024866209ff97ca3e66d9e252c286452fd0b3ef0d77c954ab233159579856", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 797000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 797000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3fa0c6f37720ca9d4f23e531c67331a664d6d70713f28fc17e683535d093c495", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 309022, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 309022, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eb2439eb34f9a84ddcf0c73f74d625981c4ce01638e0e162d67f585e32d12f04", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_1-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b2d9cd8fe64647eaf0075efaf50afa1a143779d34a39d6f86695db2300b4fe80", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_1-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "91ed995b67529b61cede875eb6b9f2042901595edf463830296babdb15d9a38f", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9a8800d1e63985dfc3e4296992e5c17e1d5fa3a01d861e27b7c27498b37864f0", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "56cea99db8c557190f5217c8eaf1e1b1efd088fdb8bd27a6ba6e8e1e00e4e02b", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a903cce499814e81f31e1f747fc4ba04fc01f9978f5f3f8f9f27ccc7d37386f", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "da27ec2593c89e91455f1415b74863068f0213f9b0b1644d208e90eb3fbaf3a1", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_4-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f9518d9a7a8a823cda2ff098d348a81de701c9267cc8c2f32f879255e3e08525", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_4-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "975c6986b48c8100c2327b9a00ba23f2bf4b37f818920f13dfc831ed2d89638c", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_5-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4dfcf704cf6d4e456e8347f4f326e4b0459c1a45fceb207fa945c1c16b78fdb2", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch2_5-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ddf0f180e1ad62447782c32a60c88e4c51d181e45f805f36cda9230612d122b", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_0-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3592e5d0e5556540b7a0d516c8b0d085b0cae37042e2374ceb6f3d314a9acabf", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_0-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2d835131ae9634fdffa1a0642b8172aa59749e84047703946e40ae524fc7e79b", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_0-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "92049d23a5842f1a906727d61b36c587c78afd41fb5e704deaa998fa2e851211", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_1-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "87a79c4282d83c70c0fd8952e7b6f2dbcf0d96ea2416da75ab28edf31a563242", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_1-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "96b8e24c837d07e29b622e1d082d00e8352a29dbf60e3f8a464bbb709b20af5f", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_1-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d5b60634a54b85d0488cf1d3262094fe0029f222baa1508dbf0fd698c03844a5", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0ca40f1f555502c788d91e66688df86c97f7ae7fd8640460697b5006b09d892e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1f61a50510f955365d49f9bf8b5843aa64fdafbb9eb969e7ac63cc076db87cf9", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "20c7dfafcdcb622ef8a844b3fc3d085dff8fdf8db39816ca7dd92f23a9f0ab4d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10828, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12bee4bbb1277319b2a6ac94609fb2d39fe00e477fa85af1dfe06d424d536627", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "90747af9d07e85ce84e0029edc8579880b22338a97f9e6d3fc640a42affab5bc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "60fcf084b95ec9b62abd8d5abc5bbeeb24c26cbc328d88d9adbf8c19c55ef3e9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-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: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10827, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "91cbf634c59f9446cc492fbdac50154242b71a2f0f91bbd8e70e6dc09a34825a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ea504dad2301082686bcad1f68df18348d011a216c31d213d5683319bd217fcd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e87e3e6ba8c5bed7e00fd138c654bb650b89aeac179c27bed3b5b8cd1d3d08f3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "540fc2078901c9fd2a5392b9b0f66bfa6ab1c7b53b941dc7b1615651a47a7c7c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7e7a635aa5489896a7a00b8460dd896672bae31f8fa95f84c8712225217a7f61", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9fdb85aa51f9f286371b77842c905a7f9071daecd44a99c6d13dfd2fc5399de9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ac712613582e6764e415f5c1c59a209924a6aff225d5b208745b707ed5c5a7ae", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "23c0785e0ff3e217e3ca784cd31ba20bf82febfd32017e877a42d1cbbe1480f7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "135daeaee6900bc4719e61a83431bad601b910388f9815f42a9ee11a5e399a4b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5aa788203128c21e6e3235eb460a09c49f7f91316db72906d1f7e8d225617879", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "68d31b17176099f011791d48905d76588bf6d3cc0b0f411f13a770481573429d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1c6b72099c52061d9734e8b9e6d37139fd215ae38c5d6820771b81252476d7da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e7f51c7f70da3a01a160b98c4fc070f6f4984d6b00251939ca884c3c12cd8dcc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5187bc0e3bde9740dbecf0f18731908788783f33fd694ffef583ca5f69ad2418", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad24d2911086adcc7a30a46b853823e637070d21046eb6a43165099053e86fca", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6e0a6fcbe1fef6abe03266bbc2973784605b21d4964432d75c433841491fe55", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3750feebcc5ffb17950d7b4fd5ebff2135d85856b4bcfb79e84d75e6474dfb7e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b2f877c406fa5c317a9baf57dea12ed574d446d3df2a1181b005f0a1a849bf7c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c2af2faefffe3888277986a35ee9359ade85827d26e72849a202ad092cdbff0a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bba125d343c123f1b40f73505244810de94616c18c3ecb8528983e8bfb6c9b1b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1371b8980c6fc06449b6e969d05e7c25d85a3f06a3e402771d6f00fc52ba13d2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "72d4cc8d767b09424b8b73b89384e76d6766ff93f834b34ad99024aff3596f64", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f51a81703bdba262780d634e54d4bfd956e1ce21dbef5ff168b7d37c51976098", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e1e0965444e4b40da21ac757950a423cc47a7a5d19bde8a557bdd02ebd94eab0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e76b7b8801f2228da94eafda2c729e398f60270243526918cc400dba5119731", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: asserts-fail-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(0), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 68, + read_count: 3, + runtime: 527, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_special_asserts_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_special_asserts_cdeploy.snap new file mode 100644 index 00000000000..a519e431ce4 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_special_asserts_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "d47bb2a892fa464c0072e68b6dc293c797dc7cadd27e014f8e7aa193a00a379b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(EarlyReturn(AssertionFailed(Response(ResponseData { committed: false, data: UInt(0) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10803, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10803, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d592511531cac2d5fdfbc9a7dca78547142044b7615f96e46acb29b64b17c217", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(EarlyReturn(AssertionFailed(Response(ResponseData { committed: false, data: UInt(0) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10802, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10802, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2930bfc6522f8f697f2ca4c2eaa6ac6d86040648020a6e79ca6d4d858e9451a8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(EarlyReturn(AssertionFailed(Response(ResponseData { committed: false, data: UInt(0) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10802, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10802, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0f0170588c2b58d2fc46f961aadd372026889fd6d76f394d003371f85ad11f91", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: asserts-fail-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(EarlyReturn(AssertionFailed(Response(ResponseData { committed: false, data: UInt(0) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10802, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 63, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10802, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_err_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_err_ccall.snap new file mode 100644 index 00000000000..2234e1786bb --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_err_ccall.snap @@ -0,0 +1,1406 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "0fd92bf3ff5a010a14778767f23e7d4cae4f1fb80e799057e0f54c795793f07e", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 2141000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 2141000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "febee2a3ac9c3789b6553ceca0e284fcfa7f8356e6a484efc496ef2fb2d56d0c", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 331514, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 331514, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "be124bfda5530f3084b6a1910c9b31791a9dc0baa2b401c6db7e93be56caf3bf", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_1-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "31ba4a83f53433ed0a6a879a2fa47b00f4c241b79147dddde3b614c9495d0063", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_1-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b46cbf5fe042d690b1c58d4ec8c0a03f953413bb23b7e7d286c4c8ca61206b0d", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "197918efbe7e5fae8bfee5186555cd16a410eb2278f50737c021dcd3c4e4dabd", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "db70eacc6e8adba3d9636c12036754fba28991c6afef0a2d8d14c7e938428ff8", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d3b1dc40e400ed742795937fb76a5b8f62b57f452af8ad02ad9bde3b18fec6d0", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a3eb66c22cdd88d1219478c12349a65708fd68a913fe4af0cc3ad6d9a2dad209", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_4-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e02487b82a170ec373e3bcc06f9e61a3ba891eaa5200fbd760f4101845d2228a", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_4-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eac9c7ed54e5d84aaa919f2435f77901dd51c55e5780dd5a483fd5e995aa4fcb", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_5-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "35f8d049d6ba744669e4cc1c20b3cfe5c9e8c459b9a190fa43a77c9113af2b96", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_5-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5feac653be40087c1c2b6bd01382ef5d064ba3bed6c6bfcf9c438880a57c1a3", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ae7479babb0b133e021875773c70c8e885cba04684058a82ae26d39f4e9a9c1d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "33ff19294143689c81d8198582ba6b13e87b4d2971984d2c7378141d1b2b9775", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e8cb2104a61219b337c90a4e82541ff20e19a7567f87b635dd63ae95a03c5ebf", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ec1d7078e30b48bfbda8df0343b5551b462e2f96929ab50e6dae8deaaf39ad15", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a372a5a68a7d0da7f2feb92ec48ef3501891e08f26c0ab6162f7ff8b2edcbece", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d7a75343adcd2c15df2e061e8520a688fbc09101d5649921cf99d46778f45bbf", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a319a12729c29931b6a9e3ab3737ee45aad1919ed59095c3f3be0edb8cd84149", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9ab09ed40cef3b219a950f52a87ed0d9efd8c827671584ba85f55e4f6760ed24", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c1f633764c8ee370eb5ebc121bb0a8a4c739c6029009cebe22ebb0dd9472308a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2c26a5b111bed5791a1ca89175ea9b044f3be0f78349b86e6d31c0298ea725a9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2ae940a60d6efe3f27ebb43b58d3364327adb1d32a5df3d5c4d5a01c22293a6b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bbcc121ade6a8874fb82d2b0b353bc92b75c70dd1f802768965e5fe53c2f60c7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 209, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a26c8710600937cb45421e1d7ea7b0005f1269bb72319d9b95e4906a9e49dc8b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_0-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f2dc23c7f63fc8d58ff6f6607e8a1cbe8089f0c1d1aaa89adcb432dd8fd5e208", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_05-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "15e0a664bec2a6e81f2b8ecea16f5182abaf50bd1f7114c805b3d17ff8245e18", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_1-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c1f599c0a29f43e550c16851881bb724f75f8527b51df40a6f017773b5fa6b7d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_1-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d3248b0ae955f2ccbbacccdaae34d99fb491861f317f836c84637aa445df4100", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_2-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a9ad8de4384ec3d411a73f16e6e45d606ea1a3e38bc119071a602bfc3cf5b5f6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_2-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ec1f452ad426ae6df01d0034d934e5a80073c8c5ab0ec7bf4014aa48c3e0a615", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_3-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "acb002fb6ff7ac65abc001d12919900deeae9ab7f3a4791abd5c2e3571c66a01", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_3-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b1af3b8dcdef82f7750287488557586127fa7f5e559e076e8c2dc051313ddd83", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_4-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eab892017a3b92eb1beb51f4b95cabbc1d2ac9e367cd10c3c7fb996eb94de31b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_4-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "63d5272277e2f739e71da279dccdd2fde9065fefbc1b681c3a86c4db812d0539", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_5-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9b46d4ff9a3ea76d0cf8d1f4ba75f2150bd16bd3fb45591b9f15fe16ca222a4f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_5-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2c6086dd08e55205b5d5f8b0d8e53ea5779d85c626ab643c9600f4ec560fc173", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2cabc3904d03a477fce9273ee2d6c3c39d189584610eb80697e06dcb458e9e96", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ee6105cf6ea18e0232c46ef85dca1ccb1cd9d98a97d321a056bbfe379704d967", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "77f90732c3a959e9296314299052cd4906d160ae57b223b971cab2c04c5f7366", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "084f3cded5e46ca36281baf5b920187c82c9f0c9bf1ecee4900cfb0e88af6843", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "00a4877c2afe55cca172cec4efd8b1ca9aa3e8d55f3ee18a7ba3cd14ea4ae82a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d498cfbd778968a86086df4a421cb7127552590c44ca69ab518149fe2bb697c9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "14471c68e877d2f30db2d52018f77de5a72cf9eed1ce32da72e230a9196399b3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e0abfa9f76edebf18ccd44082574462d8473a18074c69964c972f77bc1166f81", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "74d363bd1185561a0d920f1a9836cc69326aa0741a78155b4265cae17e1dfc9a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "43d033a843f5d24e744cf454b36188d7e36bef9f9477ed2c062d373faa10f42a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d7f7e7ddb62a9bdbd4a93874f37e5fb1e51e98b829ca10b630f9df3ccc303b24", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a5e6a113647c40f8676618795173209b74cdbfbb245b154ae33f07e1101e8f97", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity4, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(42) })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(42), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 647, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_err_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_err_cdeploy.snap new file mode 100644 index 00000000000..820c1f57357 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_err_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "b3682d178c3fec0a62c6e3f4241b80bfcda985ff793369ea7c14dcf6e25c8a90", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-resp-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(200) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10660, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10660, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "01f825bc881ff9d7b7a6cb28bd193bec276a87457696aeef63ee1011f66afca4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-resp-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(200) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "175ec7f77d9f7625f588aa65f25f18af630c1f6b435ab67615c6a3cd5623eb3f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-resp-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(200) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48c57b251a382d0019b09a77dd8c5ce2e374123224fbae9af086756b20acde3f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-resp-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(200) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_none_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_none_ccall.snap new file mode 100644 index 00000000000..1ec2d2e015c --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_none_ccall.snap @@ -0,0 +1,1406 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "cf896b8039838f3725de4f55fa2d595826ad1cc216fb988ea9b08e74af5c7b0c", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 4616000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 4616000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "93e12c6be7ac6ec370bad50693c5bc7d8b5a95369893ad8a89df28a69ac46a18", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 373443, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 373443, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fa5c657a22ded50b86ab407b33aff1d0d0cdd5fe6d6eb2d069f82f13f19b9f9f", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_1-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b69939ee0121d7dfe4686aa067fea88ac2e07d2df2a8ac36f42d46d8d92d3d7e", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_1-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bd2a63d0aaf5924c890ab7bd8f49c86babe7e33d9cec596e2b9335347bc83130", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "885c6d1af4cceb02d34f2a2e956185d4de3bd7cb6e619e470fe26277fdff3981", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fdbd5e8a5f1694a42a9c8862bf6d4c1c16840497355cadb6d6c3f14cd3ca920c", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f8ffa02aa8605d3a20caf1bd887913f3a1418d1a9dcf55db5d7e42cc850b232a", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d9f0b1b23be73b0f1370405f0613ac0189b1c4ffff5fc5c697674ade52f2202c", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_4-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "117db718d16c05ee64ca895a6fd49c3d0a42aaec48149e66bbadd976938c61da", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_4-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "126588fb4b0de1bafc6eb3841b59492af43e530cc32846161786dc3edfe8ad99", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_5-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b6ec3e820b8128ef326f9574c2cc0accbaa850cd12dcc4f1f81ba757ee66a881", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch2_5-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3cb27ee98e2a2211ae9043dbe3e777263dd11b3f2c37b33521dbf9f222c2d34f", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_0-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ded4ee229ce7e12fe5e091362e5e8c2296dae8c35bef401a38890f8514fe95f", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_0-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f06394e1ba9060b702a603a4c665ff8e378489988d1a7c785931933ba427272d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_0-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6e53f9efc7644de9f29bf8c8d6c416b4597f5179c20c84574711011f057d44c4", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_1-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dbff7217129c0cac7b417bb76f592533e0dbd14e7bd1bf0f6ea72fdeadb0f023", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_1-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "041a9dc0d08fe20502a134e9833be75dfff49bf3ad0858d0cd1482174c9e7386", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_1-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c4b05df4b656e392e1f8a79969f74b48cf9a27afbc584882ec2e1ebf33f5a9d4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c32dd266809633f161e1b485c9b3f2c10bec440305422fce8f26248729bcb869", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6b60643ebac476f6f7c1eaeec9a728f582b931b7f038142362a8b7257910cd01", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4276d7052615577f0afb068771da4cff038647d0c18f02730bd0eadc05e8e9cf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24793, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6a86553804970c0de52b2f2bc91a3407af68253b4ee3638ef9292c21c4696a60", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "feb266d3353e1bd69df52c15e3dd095e8be226d3b0a1a1b0bb01ae6269d61dc9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a2f4276dcea513579be1295054264277ded0f6fddf7d8f5ed1a4c3929e5c9957", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-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: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 448, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 24792, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "af0ef9687391ed9bfa4aa0be5a4e6747c31b3067b02b63aeaf29779c08569463", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_0-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cfaea85831318791ec7d6fcbcc3d5616817706c7aea46869f7797463765fb84f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_05-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f5f207a31c6507b503b3339248494d6b09a83689720d0d9d7881d744443646f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_1-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6db6f491c8d2184d46c815a539ba0eb06b9119c0d19cce463c02c77c29b96ed5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_1-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9007213caf6b487fba97ffbbe7f3a18feb69d7c152a978f82dd6827427c0d74c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_2-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "540913c3f49e1b9123a49ee13ae10d93acec2be6647e185340468449932ed60a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_2-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4de8336d7c818b77eca2fca4d7c6717761fefbb53072747984f80970eebe82ab", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_3-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "650528a7428a4ffd4780709582bb0a47cc9024cd977efa73f381b8bde7f3bddc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_3-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "be1b4e340a9abd7c0c87c51ae08631976091ab4ee767670a03febc01176889a1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_4-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c9bb8b50e6a87d679672defe18e123e48e6cc6e0a45c76ddc637a221932546e2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_4-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5823978a06967ba08b17f9d3ae0c6a30b43622304e183a39fb826c8342fd4263", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_5-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "53c75b1f343b5fd2a4ac9b497bee61d645154651864435240513a9eb8df3e8d3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch2_5-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d5dcc584d6bc76b7d7a8ec40bf439390b7f6e9b690855e3f947d0ff7c5fb8d4d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_0-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "add0231f934039ed7fa52372888e10c22bfa666a3e6fa737d07b0e562ff2a1a5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_0-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "146c61aea626bcbf5f71dff9bd746f553aefab2669375107a5d608bb15ab4e17", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_0-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3433d0f234df028bf4a8452729983b176193d3ad06c7ac0539d8890bfa90b065", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_1-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "93ee5bff7d0bfc4c13ea5afe3a8dc15d7bcee6964d1cd09d1ec656bab8b0eb92", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_1-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6bd61c281375519ac0c6f9e0e247881e417c163a45dba7ef540170334690eeae", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_1-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c844782608ac8401849cd1c9a1b687202d96460dfa7ffee1505f4c2693d36605", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_2-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b48c99561e2a58cff3287f2f7322086eeb2733953bc7f4a782e55061409237db", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_2-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ebea51e26c3995e75691d0ca3baf376d3c18fef7258ff4a1a972ad43ba5c750", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_2-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ce419c11530c1559f4d93d5bf7afc315cf95f830cb0f504429d1342a45e4486a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_3-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "34eea8dc7399fec7f72d37c79596c1469280246ba4493c02468db9970f10325c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_3-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "77f72189c81779fae2dd498c2ffabba7534a65627b7cc7e42aba2866151beaea", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_3-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "329390b7ea4a419d1bb0c748afd1f8143e44b55b40b6135151c8949ccc9c0ca1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-try-opt-Epoch3_3-Clarity4, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(404), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 409, + read_count: 3, + runtime: 1363, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_none_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_none_cdeploy.snap new file mode 100644 index 00000000000..ecab6ade445 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_try_ret_none_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "4cca742df63dfae2a6082353ebd9528d316f13ae99fb29442bb8e53cc7342565", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Optional(OptionalData { data: None })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10150, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10150, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f880ddbe4c1b9a1a39dc7a73837aeba228f655d2154b85ca24d40416b3bf4c81", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Optional(OptionalData { data: None })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10149, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10149, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad4865a7da12cf485fcda21875c1fa5ee0401a59ea2a09687bc9b8a9e777f700", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Optional(OptionalData { data: None })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10149, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10149, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5d5b2142534b1f303d25620983bbb8951ce28d43a954e3ddcdcb32916744bf61", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-try-opt-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Optional(OptionalData { data: None })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10149, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10149, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_err_or_ret_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_err_or_ret_ccall.snap new file mode 100644 index 00000000000..a67c543bcd2 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_err_or_ret_ccall.snap @@ -0,0 +1,1406 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "59e39c53f927404f42a5931f369a03f8ffe8c0a13d1e64148973d6976de0b631", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 2285000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 2285000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5c145fc03b4a4ead2b95235d57d7ba1dc3b8a1d3bf421979667abf76deb121ff", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 333874, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 333874, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "55146052c2292ed311e4b703d11096c76f0cf0bb66eeb0289493300cd2698fe3", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_1-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5799969e6d3b76c97437fed048da89f343e4da3b68abe8b4efbcbc3466158b40", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_1-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f16a79caaa849e88d75efe2b3d1d0a9308bc5d7bc22811cb1ccefeb689eb25e6", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5a7944ff4ef7dfc8654aa3cb204036f4b8e6771724b38368e5a6afc6123a9413", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54982e9823019f8aaddd842793a85bada6ba71dc4883d578a8b3ccf5ac22ea39", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05536319afab4061512ad648c17d3d42950cc970ff30f29e6d38bd2292228730", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "78f802dbbe7e79df117b3621d9e9311b593372ddfe4c02bfae2cc5b2a437bcc3", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_4-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a4576498d3d246144b77be750756a27aca31c439c84c37be3241ba68bb2aa73", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_4-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e89c60fa26fa24a8343f2bb5c2ac19fb623cf3e2c2be61b41b61f4085b9f6bfb", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_5-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ff85f93296357534d7e9c2ce5262a08a26edff30492445b565bfa495f4aac72", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_5-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "46986f9778faef5d52d1c3ab7adaba2b1b6a2d4c1485cb2a10a4f3f2abc8cc98", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c9ec844744fb61cb8281a053eaa0c0facef80f1a48117438a50cd3e2331253a7", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "79492c03aee3dcd743c5410882ecb9a8ada3476a401f04a524a929f85d9a72cd", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "09b739a002e84c19959c9ad9ede129ec7682cf660b57dccf7ff2d51c2bc955e9", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c6342ec119476dfdfb05b24fa38d71984158cc7b24cf1f1d40333223f1f6ad50", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "779e42c62e3ee5fb7ec646913da6dd86b8afbe9f2ffb590cbaf037380eb92cbd", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ab8d5f39f143f72337fa60bd1559418fb43884abfacc4b8d09dc4abab68b848a", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ffdd05c7520b29de35694cddd7494bf2316732da10f3e8e09c667049d8b041b2", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2560c2773d9feeb4b9ef0e48d71190df36a157d64b406423b95a8330dfa0e05e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8fd38cc8a3cf3addeca765fabd8de11d5bcb724354626fb4fb719472e98de0eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16275, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7e741ec17c914b13a13db2c8b79929c9fd1224d261edbebdd9a49bde5ee9cf88", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5645f7da6a77d19236f024b4649031baefd27c16b8159b1a490ae56674c07b93", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "25edf8bab98dc8b5f65c4619aa22cfe38b54001701d6e42ffa5a8a7a1f64d302", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 224, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16274, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7bd043211ef9ee7cfb9649003d787d336dedd29a4688dbea79cbbb0a3c86908c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8d13734bef82d6b0d593da378be49e9f04556be1adeab2cc210c0e967c6d2021", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "03b1d4c6551f27b37e89d5cfbd997f3f914348bfbda1a0f86e5e4166d5f11bbf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ceca0a2079043fadb8eb64065d2f6d6a8bf77f367c51c51fc6db818d17615112", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48816855ed1b33df958cc2f810449461c292c4d72a94f32fc03cc33febcf426f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "56d536b5f32a37a51be2b2de4721eba86973a8e2e0bf5ea2d2eb585647747aad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "001317be6f5a46d5d803582042af59e0e3e53b1dfd475220f5c9acd39e40a86f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "252f6021ebe37f302df02b8ed0866b5196e8dd7ef30e12500cc499b44dc4a1e0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b81c5b79de88a8134cd949686575e7612efddc57f8ee8a35c39ee86ebbc4d765", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b3ed7844f37cf7caa68ffbf9698e3bf83a467499b7a2d35933b8f4d9fae5d995", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b3fce2dcfaea472f00d3146d8a471b9b5106780abeebbcc984dea203b788f65a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1a253c157c4dde1f025a561ab22662b45311920caedfb403918701a43384b343", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "53e1915847f18021bdd7aebb747d75028a8fabb6f5f0851c06fb02af314e6339", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "37bf3a38382efd7f0661dbb3cd310a63f728a59d119eb0191d12f77821826cfe", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c632897e8c232542bea46cc41cb9e9dcb1667389409b8207bc05178b97d7b94", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "605629b9e5e0675818c7f340d024b1d8b78838b59401451b96c6f257f0314d18", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad14fdf4217257d7960369cdcdf09724a93b2099682ff01389957fe712e9299d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "82906ccbd8117a29aa8a5afcc190cfd0eb0ed5a99eb5d2d3d9b86262bcf11099", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a9eae5202b3ab6edacc998115c4b4208d43c4ddfdb85a7d855ba3375ecc3efc1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ce8d7d9f7f6dc69b10d52c968e3cea2ffa7335576b19605742d4b00f7b55d1d6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0858c19c19f5f547f3dce1f3b711632b8ba0fe77d6048021d3b1b6d1c6dc60c0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "feeb8da3edb8ca156a96af05d7d8c333974e8a210cc69f715d1091d55c19b9f1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8cc1d11a7f5e97563f04efdfde636975dba3ba4a19a212021f09a5348c5ae5bc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "527af50b18be21174e5e8a9c139690f308935feab570e0368ba125208a9ef380", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ff9aa0da70ed06713e5fa4c89c5721e6b70a9a76f20d192abd4e460761269bd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: UInt(9), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 1232, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_err_or_ret_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_err_or_ret_cdeploy.snap new file mode 100644 index 00000000000..357799918ab --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_err_or_ret_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "f056bfaf14bf69d07e31731701a1530a96a85ac0a3a1c319bd1e1117ff8a0295", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11504, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11504, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d89a5aa958dae31fad5195a7d9fd61f7fb727e07d307b83425d20ca26df1655f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11503, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11503, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ccfd1e550e8870311be728427ce69550baae1bf58f48b9e349a71db35fc9ffd3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11503, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11503, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8555efcac78ede508ff5c71dedb6a39d9b900170a9fd6df491462b7e217facc5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11503, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 75, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11503, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_or_ret_none_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_or_ret_none_ccall.snap new file mode 100644 index 00000000000..36e4f3e4e11 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_or_ret_none_ccall.snap @@ -0,0 +1,1406 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "690c59d12909988c0989ec0c642ce1189ef9db06b0321a20e511a549cb662bbe", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 2261000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 2261000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2e643201a8bcaeae2d3c023e7740f3e63b5053128d13e0343948bb5f7bdd9249", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 333420, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 333420, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3ed14af5617614088905f9548fd8226c7d91d378142d2170b550f7608de565d1", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_1-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "14698256bd9dc6b77291fe36375d70181db8f2681ad3f4c6c9f84bc1c201121d", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_1-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ae365e94859aae84fe6f2624b1c7f44d97d431a2f082271802c1dc9fda504137", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5831f8b7ac3c0ec84266997986718caf382a7b13b776b68c39f2cfa77379f393", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a62fe9c717a8cce175677b9d38c08b8e2fbbb1a14d7a5ad178958994924bcd3d", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eda3b754a99c60abc18ee18c307c05c5d05fb326976faff308f0054e54613974", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cc616b80969c47b9bb8167d086c37530f12be4a03d123079d8a9168a57705155", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_4-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "68131c2935250282d6aca11d322eab0c784d70df217608a1aaae152590e4b922", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_4-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ba0cfc8ac07c6926127d72ef9e86eec709db590f363bd27cf5d2be4d1e43eaf9", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_5-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3bf3ef9fc116e81e57ec52a79d89de01a826992e5108e0fc52cfd88a9b0e0ffa", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch2_5-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c78772041c03bad99600e917fa9ee9db5b4faf0cd9eeac62cb02a0a03fc77d32", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_0-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8cb1b10ea1dd83cae9955c55a73809a4593a80e7b3273012d3ecfd8337338301", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_0-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "940b139bf621ee1980f6fa9c317c858fc897059ee98c3d1123dfc6091e170b16", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_0-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ae43bf1f0f60d6eaa0c057108d8c94f8854b767674a0283d1d85c30b759777bc", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_1-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6529af7f71b26e51245a52690d2359d74df399ced8c0019891b9ba8e192a05c4", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_1-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "02bb9b3dcd10c8ece83dd2c8662e867d7460051b73b6a7b446f9402070f9fbc4", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_1-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "04edf63a436ce1214d65c2f09d5367f2c18284cea46aa54d8c52d325ee41036b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "45a21c287df1b4fc08fac94113b1155e8e348e966a78c90348aefa0f380504c8", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0fb25a935e366b99327e3b6949e0ca425a7775f345b25d5de7876abaaebad8f5", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a0d089ca7ad3c96c858a25339a661a3a6c24755647bdaab2f78f2df16e5b4f02", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "68e8527c8847aa61b89a144aa2e054f9415761cfe4acc80d6f6445256a1c61a1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eded101ad4f0421a643b49dc71537f768fe115cd05dcacc346f24855bb3e51da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ac71029fa2450f4f9f3a72723483d7100be43673687d934cc8f8871579627614", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-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: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 221, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 15797, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d3064f39dfba9a0afbb3c4fb05a9e7e4c54ef422c30f3517dc72614a52b8d747", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_0-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bc76e2f8d340e55b0d5fa018653ba623f467d757521f36898bcc42f617c193be", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_05-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "feb77985c7aad89238e249facbb8a79b3c44449a22a55072f122b9b2b951d6bf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_1-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4bf7d67e789625854c7eb873d3b6ee8ccc43b624223711722d355082c126b486", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_1-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d0b1da250046943520d703ea92b47435fe6ce4d97cef7c1481a78430aeceb9ce", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_2-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f2f0c6efeaab7759014772f37cbdf48fecad65d2ec72b48b9dfd0f7c0873857", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_2-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d959d8b16de5f2a87193ddc5cd373f81ab6b787d9c0b8a55507d511bfacbcecd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_3-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f0ae40b1d3b6fe471bc17a9ae8cd640b4aba042211ea9724bff4eb6b560896e6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_3-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6944cc7c07d815c4a11384b58ae5b7e91c6124b7fa1f119d613c1efababcb966", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_4-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ed15441840d14ada6f794bac1f46ab25bf0a0832dbd5bbe4e2fe5577b60b5640", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_4-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1d6fe0bdad711c87828c51bc3d15eabc9f75622abac25cc700b7d850470b1d5e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_5-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "95a58bd7ee98d4776117c7e396bae021775ee0fb441037e8453055314b597353", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch2_5-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cc1efc4787973569acaeaa75412c6e1d6d106320d158286465152693098bea9f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_0-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "581a6209b24a7616ff450ec12d982d98e599989d7fe7f95e4100da623c194141", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_0-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "179c8149406aaaf1defd3a346ad53608f3fadeffa5a085428dbd71cd66c27cfd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_0-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6d236def058aec13e35856ed6d2f173cb02fee99ef8e89c97ac97007c8703ee2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_1-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "88fb26221fc89907e01658d7663612e2d54a9eff795fc47754dfe94becc1f383", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_1-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "671b44f0de0701a4a327291399e9b6728a1e3f63261a545ab84b208e8bb633a6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_1-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d81d4eddb22d1a60d59d7b33993e1c10ea0f41728fef67c8080a3b9cf5dc5118", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_2-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7279a90c6a2a3c3e76db4412a7f4243bf4e3b6291c24b391ea95b2a38eb8cc04", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_2-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8d0536c8a7252974b9df0bb711beb9816aeeff65578c10df585a33f307c1333d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_2-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f0ee32b6136ada3f945766cfe20ee92e33bf7fb11db2cfe10394259878d87c69", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_3-Clarity1, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f87a767913a0b21ba0383caceac33fd455fbb9cfa66d8ba1321483635b302878", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_3-Clarity2, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dfaa80461fec4f2bbc1702310773655f3116cd12605d7e8d1b037ba9014ff988", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_3-Clarity3, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "63d8aaf844bc824ab36242e1b652015a336acca7fbe0cfcfbfca9c63ebd64586", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-opt-Epoch3_3-Clarity4, function_name: trigger, function_args: [[Optional(OptionalData { data: None })]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Bool(false), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 200, + read_count: 3, + runtime: 846, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_or_ret_none_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_or_ret_none_cdeploy.snap new file mode 100644 index 00000000000..c96bb914e1e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__early_return_tests__native_unwrap_or_ret_none_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/early_return_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "f3f4dbfafdd889a32f3683d084f4b680d9afcda3e0f8c2afeee69f29c9d6f810", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11003, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11003, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8889dab55b463ae18c4358727d56c49f3e82204f556403ad06dc8088f954d8d7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11002, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11002, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5b959245caab9a0f2fe579bb83b001978c1d5074cb86c9aa9ef1045ce5ed89d2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11002, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11002, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "98d3701d8fe70645e44797525dcb00644537510e8eba7fedd267c7a9a7198cd1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-opt-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(EarlyReturn(UnwrapFailed(Response(ResponseData { committed: false, data: UInt(9) })))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11002, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 69, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11002, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__bad_trait_implementation_mismatched_args.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__bad_trait_implementation_mismatched_args.snap new file mode 100644 index 00000000000..ebfbaeea9f8 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__bad_trait_implementation_mismatched_args.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "3370fb9ff55717a78b9fa52812ee4f237ca930175a71747efb520c5198824462", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 2133000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 2133000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c7c928dc115cddc36cbb365c59cd49bf0e0aba3685573ea53ce6c98d31719c02", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 332311, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 332311, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0934762a53ecbc5d19159b7117c352f5b26507ed77a48e8cc50bb432db7f25fe", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_1-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c954bdcaf1b5b61101925476d38ea8a41249faa7d8fc83cb21567ebeea75060", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_1-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6cc9565d6996876ea6b0c8669b4f5d4dda1e91563972d393002756d7db835809", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f0203f66fc5d08bf1d38334dc6ac50c05a312c179eed4ec6a603ddafcadd92d1", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e633f188a8127ee8cc125da405f0d0640c9577fbd8c2b6ac1ce26c320a119f5d", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c56af337d85e4c1a811d9346cd6b449cb885a5a12c2681a4caa9c88f363172a", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3064516c0d6644d51616330d279f3c597d6fbd19396aa4a691e16332dbcc9d35", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_4-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7365fd2343c9ddb96f59b74ac047ecef4ae7e7527d8db02f41b5e7c1f23a9fa1", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_4-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4d36f1bad2f977a9b934f55ee75880919a98fc4b45a96ce80b908f98df1580a8", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_5-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ae947d5eec7d7f9131c5643f4f6ff91cf9c352a86c7bd53ae8136e5764bbb3e5", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch2_5-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05792f95c13cb6484ae1d38d77c15a3d20bd7053abe7a543e2e171115b3f6f3a", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch3_0-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4a792472527c07687fd56fc45b7abd54b589b965306f95cbda1976fac3bd7c1e", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch3_0-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3aadf17b47915d97645ecc1ea1d4e0602d5d1165ce65086cb188b95f06efe1d5", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch3_0-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e7c243d095ddb428fce13d42241b22d07bcd2be8cedd6fa7240438b800c36de4", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch3_1-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a18d18fcf889e41d799db522e0cd7e1b042d572deb9ccb974d4bfc1b804797a1", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch3_1-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d358127687ff1595faf19b82531b084b1b0762fadcf824d30ca5b3ad3cb4459f", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-contract-Epoch3_1-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "447d1641a49a4a171a4bcd78bc903bb9cb7abe738afa5c9cc4e77c78db11bc89", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8726304065aa184ae235e93f549ea2cbcb25c3fe1953a100fe68ac789a7d207e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ba4d3e0c9f8d2423c1771fc1c654f846a8f857628a4a60e97c912d1a98bff89", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9dd2ca3752d24d1b73eb15facb76190b913c9ba862c1cea5641274da414a5877", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16033, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5c1aea19841f41c37ced8ca5d2215c244e3c53ddfc3a93694985adebcf1f25ed", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "af8027a257e9e4d5efb601ad65e773050857f848a5904853b4bce50cc3da00f2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a7a4f4a9c0c95868082eb1fabbafb57cce6c29f813f6c26490ce8d6ced98b826", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: dispatching-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: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 212, + write_count: 2, + read_length: 6, + read_count: 2, + runtime: 16032, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6174ad739de30e83373c6311c40d28b125634c7ce3de04806d96f27ff28cb9aa", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_0-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "392c232735700fca3c1296ee4437f5ea5eaaac35437cd01d52be4b733a04c5b3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_05-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d8f7e05c38079eea77f68d24999247ce4b29854a46a3489f6739928e4dab0ec1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_1-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "730570f9415632ae70a9b4c17c1089eb359ef8c7af0f1dc2908f31bf26012d54", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_1-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d682f21b9837152577cb98154cd170c55792b1dcb65b2333e2ca808055e27be0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_2-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bd28f1958cc7db4c9af85370a8d2f3e6d93bd84196e846a06b9c26517c64fbd4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_2-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "426810a9a7ce775b2724010f4d2950a742834d797b7864282a718dab1716e18e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_3-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "08083fe9310fabda8338d0b48bc3de59a7714f4cf27de9eb3229886261fbe605", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_3-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f33d75a3cbe07fcc5b21b7a0e3f253f08aa3c9dae325de044d782f76f3da98c2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_4-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fb9564f3f3e98e1f1abd1a0cc8a365f926659013eb364ff7dcac71ff38463e3f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_4-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bd7284a35717329f82f4aadb0e383ddfec40901b589570abd622dd8585986dca", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_5-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad356008a20b57d625e5e1517dc63879d86cae679f6d953619e68c2b8bdbba26", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch2_5-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b3007404bd9ebe17ec70735d4a30b7fae87f7bb73d77326b3a5e58c51cc3a55f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_0-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0494d061656bf41f8b3c1f433e73e126b456fa7e1e10fa9ac2f756fac2766a5e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_0-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ed010065982e8d216cfc16b073b5a989f5c46135b5eabbc0ecbd14472cdd2524", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_0-Clarity3, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dbaacf2bba722f6fba0b562f72aaff1e47d6632f6147a443ec81ff117b015150", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_1-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39a1cb62a0f54cd0841354792a1c40354ca7eb344a82047c69b3113369b497c6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_1-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "82df726f29a89ac81df81f5dc8103c33aa390705c8fe7a985694c2ba9574c152", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_1-Clarity3, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "22f876a01bbe2e634200a51c3bcd40e1d1c72ccd6a3f511b0e913907a24874fc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_2-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "065c6378f0c4fa80dec1391377fa1d8600d2fdf406baa184093cfddd6bbce5cd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_2-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "032c05a73462c43d48979b6dc5b30b64890bad25e389ea170dcb5ee5bea7e5b1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_2-Clarity3, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b2503131b502aac5be8f18ef2a9154ee8f1e8f491b6ddfe770fa8b09d8a3c3ad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_3-Clarity1, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "75cf10b81cdb0eb9f1272404fe78c08eeeabb4558a64461c641e3e0b5b58d403", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_3-Clarity2, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f66fcbcd7e898e75e4e48d25b6beaedf872d1199c2e1e9cbe7d31a39a0e1c3ce", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_3-Clarity3, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5abf1ce5e24aab1eb01388d9072213952d5dbdb676dc45c4c0e38e94fc21bf4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: dispatching-contract-Epoch3_3-Clarity4, function_name: wrapped-get-1, function_args: [[Principal(Contract(QualifiedContractIdentifier { issuer: StandardPrincipalData(ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP), name: ContractName(\"target-contract\") }))]])", + vm_error: "Some(BadTraitImplementation(\"getter-trait\", \"get-1\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 190, + read_count: 3, + runtime: 751, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_kind_type_error_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_kind_type_error_ccall.snap new file mode 100644 index 00000000000..298e27a7f04 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_kind_type_error_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "40150865647d615aa0f8eeab66c92161ec508b98ea61c6aa06a594fa65425ba8", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 7392000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 7392000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b9099134fac7fe339c301d92ece8dd66d6d9e30cbf5c9d03b71e5704e2b99cd1", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 421039, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 421039, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e384351d497d008a323ee31f7330dad1c53e8d97256dbb4847d7081b2bd8ed1f", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_1-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4fb1a80a5dcc6241427e096815b3c392f609dabfc304da1d2d2523e6a6c539b5", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_1-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8815e8b5a750faba45950912d27d4399d8dea78be84dde56b339b14c139148e3", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ebaf0cfc9bb8f3c02ee4c9af5bc93debe3ff70f7940dbd82516ec63e04709779", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b779de76128da56deedf61b8228a116eae22de782573cd14bcbb53c516dc6211", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "70b836f3ef80545f4929a77becbfc5ca17aed146970b3bc27de5d0af613916ba", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "13d45d4fe25c6da0cc9de308850ee4d8f07542d4cc5b27d66e4f47e38c3d6fe4", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_4-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f63a1a46ee0e513a13f26bdbf3ecf1707a85941c51bcdc375944912367262677", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_4-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "087a9ab93882ef7bfe8e4603db8e724c9fff91ed1fe8bf7a3fff2e68a913ad30", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_5-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2e24bd4ae40b271c638e68d91f1f7300bc0df64b0259a673f2db95931cdc7c26", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch2_5-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c16a2b9d79d3caf68cd90a0696cee3291edf9bb1e370912f0a6f6b5edd60dec", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_0-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c260e621ad20c5afd254b05f4b7b986ba45a3c263a2fb30887976da3ffba58d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_0-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "10f5900707ec40faa9cd8d9d47e13c058743dc4fdc5bbcd8306b2f63a48368c1", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_0-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f94dc0555e25227cf8ed2f6d05f81aff3940445dc66fbe68b871ad3dab8a15ff", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_1-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7fe37ec11ea9f08cf1fc243b549be39fcf68663accb67d86bfbe74f47036a110", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_1-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a0c5b8c27b5c2447ae2397b91590902ba031272ba1a4a7ab3790204f514b00d5", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_1-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9f10c8554a327f128bc76c93fda0cdb24dc772e24befd5d6dea5bc150a3790f4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0ebf8b8eafb39afb9a9537ddafb4114dbcd2ca3be6c9c7301c65f7e8841a1633", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7200b1d6cb50e438bda77fcffedb15f2c3e446840db3f02ca2cffbbe79920e8c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "805ead69e557e37be939512a5aa6d2c18b0f9b84b7879661a261b25d6aa6c525", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 6, + read_count: 2, + runtime: 38847, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e7e8b6d20ca98019b591da13237d528dee8f3b468f84559736d5f578375f1ea3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eb62c87a91b18e4ac78107a2400ad71facce085e46e1bc021880c0e0b14bd4d0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f9cdbaaa30e8a3a4083fb4fbb704b13a370f177b6e10ae627b40cf0d2fbe280", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-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: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 789, + write_count: 3, + read_length: 8, + read_count: 3, + runtime: 40485, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c90efa3fad68239653e442cda095e172c2c2cbc8574bf2f4aeda13d19be92531", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_0-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f7db254b641b43c52178fae451587b5c7827cfef7d26be6e30ea5110b5f50afc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_05-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b036864c807cd62fa6546a1095cdccf3902e088b5cccfe81de43b0868f49950a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_1-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bb27d0339502ad660d0b6ebbee3c12490a35fb0230f17696a08227ff9d461f25", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_1-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c4769034bd6222555c18f65515f5d5887409d6c2ec627a0b73ad990292c97a25", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_2-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "250a4337d2f65fc0a079caee4e3b500e863612ba854dae00e65178b805a56b71", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_2-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d25fc356a92a2be4aed455b98b65893e49e3626649bef8f2d772d5a58e6252c4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_3-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "385cdde553233d8da223bedea07064119cc1e153d1724d2231edb9a41d7505c6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_3-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "838b7c351ac1d393af6c4515b9265675f734103543edc655d6c04db560f3809a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_4-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b9757dbbe44c99b62749698ad27054d489672e7203061d3baf4c2adc238e719d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_4-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9575074bdf6221689941aa212fc9fd63b371369edef65f27e8500a3469c84194", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_5-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0001f67447a0be19ad6ab2303b67806390f7225fdeaa51c29539a9bf8ad43bd4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch2_5-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff1516f5fd4807919cb371ec2b97a952196f0fdee7f0ce52169cbb5e4b97153a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_0-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "73a99e57c087895406a758234e2174f186566c04332f9d2f6ab5243b488bf953", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_0-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d02ffbc826c95ec3c082d7a6bba9474ecb97c6dce223bf2d0f4b8e38e60fa8cb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_0-Clarity3, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f66b369f8a442b1b88b9a763db5d3b84c8254c61b6bbee9beb79b26eedb8514", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_1-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "20b2083f5cf4af725f1d685fef85e681d1b8933cd7a29eb2b967742e7f981a76", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_1-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "19ebeaf8080b39cd7188317b2c9d2adf6ca390eded4f4b0a4da5b02c40376e54", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_1-Clarity3, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f128fe18384297b3b3487c3c9cb78e0557b88f0aa71cdeaa8820d43ddd6fb22b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_2-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "89f508bc9223d1097a55c17f76033944201fffb6a00de2054e76323cbc1a368b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_2-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "db56784f2bc08034d753ff7dd84dc79188c489789e9cb516ecba8577ae5a5ea9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_2-Clarity3, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e839cae025f35684237c14803ee6c5307598fd057de1edee77842aab040c176b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_3-Clarity1, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d979c3d437f977f1b465a21e76f392d18d6b8f7e360508f4976613c302b50144", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_3-Clarity2, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12e95ed282ec81fce5878cab3dc12902ae5c163bdcb18381cc45c371a39a99e4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_3-Clarity3, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "980d8da97b1126eee286fb011f49112f2bf36319754fe25a7270628eb649ea7c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: value-too-large-Epoch3_3-Clarity4, function_name: trigger-error, function_args: [[]])", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 1095, + read_count: 10, + runtime: 19452, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_kind_type_error_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_kind_type_error_cdeploy.snap new file mode 100644 index 00000000000..c5b9483d6f1 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_kind_type_error_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "8c2161ba760559dd0a19790ab560252ad1f369b1f2aa2d868868d50967d1e6b3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 470, + read_count: 9, + runtime: 58240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 470, + read_count: 9, + runtime: 58240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3dce5528fed1676402aeeeb23005cd535a482fb8d930526c7e09f1ad55e5e7eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 472, + read_count: 10, + runtime: 59878, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 472, + read_count: 10, + runtime: 59878, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "312bbd18f60e722c1dcf90fbeb7a6962c54d1b3aff1a18e67dcdbd08cf95fc5c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 472, + read_count: 10, + runtime: 59878, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 472, + read_count: 10, + runtime: 59878, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b17737c76f4b5fe4ac96075989298957d6543f8b4ef2c5225a19e973d9d3f82c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: value-too-large-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(TypeError(UIntType, OptionalType(NoType))) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 472, + read_count: 10, + runtime: 59878, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 811, + write_count: 3, + read_length: 472, + read_count: 10, + runtime: 59878, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_memory_balance_exceeded_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_memory_balance_exceeded_ccall.snap new file mode 100644 index 00000000000..cbbbc40df57 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_memory_balance_exceeded_ccall.snap @@ -0,0 +1,992 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "5ccf5bb99a13f30b05cc765be71215f8ab1ce3fe3594c6e6ed251d19c9b4e611", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch2_4-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8968d1bc501165a5ecc8833628be44e9eb77509ef6bf50da17ec67cadd26ebf3", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch2_4-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6dcfaa005103f6340a32eda3c13a23498ffd27aae0d84556d66f6ddfc4209f05", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch2_5-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "67697b12a20eff55cb31d732c42f1f73f741d42398293469fe72cbefc295600a", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch2_5-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c2274cdca52ff73c67e8ce40c339cb1a75dd20a5f4cb5bb27721931eda2d9fd4", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch3_0-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6b9f3ebb6aa2da85c2bebf6b9b2bbab5ef50ea91b90b2657e930594ee06bb5b5", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch3_0-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0dd84199c952ece6fdf67fda3f12ff3e42884833db1d4adf738af848ce0d8fc1", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch3_0-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8daafcf9d65f1868988d6b0c15bd85b79c17e7dbf68aebf4bc24c690b76ed491", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch3_1-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "51b75badc2b90cbacd82bc36f917a9097662c93738e89b09d524db23face2bfa", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch3_1-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3ec916094f61ee965e7ba8bdf00afb29de49fa7c2e18618e95d367c7175cd77f", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-contract-Epoch3_1-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "de3a5bca565bce0ef8d09a4e32a638c0013f64a2886731099410c4d851401f0b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f34b870475c61233183c38a84802682f38b64baeeef336102f36185583188ba8", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e98f945693757faa170a8dcfcd186ba4e4efa5789bbc7e5989af9d105ce07719", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ea3790e94f83eae0633fbec55f92baf5d781e4a3e6115c21472e157703cf062", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "323163e36e63f90aa96d8933617854f8b83a051eacf7ba0e4fbccf22e544dd92", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "caab33fd25c4388523f83ee829dc3da3aa9c122defc0a6baa33d1b83c2b31727", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "91c23043f47813422e0f37c98a47b418233096e85d1928f2dc97dd8cbf5fb44c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: memory-test-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: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2135, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 81972006, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4405731847f026e07eaadc04a91914dec2e1188dbeb526c524755852d8bf6f19", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch2_4-Clarity1, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9bc69bedf2e7bc8ca203478cb4e158f92bde59757caf8ac461e2f635600f78e7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch2_4-Clarity2, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e3b9d42e7de4f783cac254454e5e2cd26dc200ae6c6715de4ef8a6929d5bfdb9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch2_5-Clarity1, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "685dd6ddffd1633222fdd3482d05d36fb10d99006e49e2501cc8550e245b7c43", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch2_5-Clarity2, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "59862c79c2e73844685b8edd2ecb0b512541c5bfdfcaa09606c7ba264023b206", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_0-Clarity1, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5abe27c1a7b55c053b3211e1cc33331fa4877bee2ce61db25cb431fedb52bfee", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_0-Clarity2, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f9d5eef1c8c010ba85c699a1c5401762d58baf4225eb72975691b46a8174a210", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_0-Clarity3, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a6ee96a7152d819a6df0c66fb4ec3ecbb63760a86b2fdf08b9e3da12b4a9ae23", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_1-Clarity1, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0cf4aae06cc2ca0064fe78aed2e9bc96a34b77d533ce8575a40a65cfe5387dab", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_1-Clarity2, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "47c1620e84e0bde4d11c726ee6cdca2ef7e75b362c44a0fbf7709001a633666c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_1-Clarity3, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c78c81f7f6f535463409ae61c013cd5cd7b5d8229cf88eeb10105c2ea62058af", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_2-Clarity1, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b38490ada4070675d9741c22537f84e97cfbf46f730dfd4e71e4a4383073262d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_2-Clarity2, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8d742b11890676f09fdd18b8f2c8ae96aab192da66c70cd79c2ec9b05fb74004", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_2-Clarity3, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "70a41c1736421b54211e47840ae7dcd868a673888a21269c1248de985e4de40c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_3-Clarity1, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fd1caecae55bfcbd24fa65868a370c5b3578862e60ea47a864ec2455fe8440eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_3-Clarity2, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "63db2da5908563118f489df5638773a72623484ea8ae2f5e28d149ebd2dc0f5f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_3-Clarity3, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c2cb724d89135bd23b5dc77388312b231e1e451fb8cf03dfebe0f251a0e824ba", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: memory-test-contract-Epoch3_3-Clarity4, function_name: create-many-references, function_args: [[]])", + vm_error: "Some(MemoryBalanceExceeded(100665636, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 2099117, + read_count: 3, + runtime: 199232461, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_memory_balance_exceeded_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_memory_balance_exceeded_cdeploy.snap new file mode 100644 index 00000000000..c5fb6bee42b --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__check_error_memory_balance_exceeded_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "5505ffe9f29f58ae18f34a7ba44bbc194f906f48478cc02bf61b6991098e18cc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: test-exceeds-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(MemoryBalanceExceeded(100665826, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c55172d93bd47806a82e7f96ac2ba529b89f3742578674ec613cb9bf60d7dee9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: test-exceeds-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(MemoryBalanceExceeded(100665826, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ee7c0bb0d2d9768703c0215a4fdeb79c8dd98c507a6f79bc6d4a068cc5a4d166", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: test-exceeds-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(MemoryBalanceExceeded(100665826, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fbd16d6c19ee0bc2bf124da2e783e757b2c91cc7e02278692d084b31e7605f24", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: test-exceeds-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(MemoryBalanceExceeded(100665826, 100000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2077, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 279102966, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__invalid_characters_detected_invalid_ascii.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__invalid_characters_detected_invalid_ascii.snap new file mode 100644 index 00000000000..47e05f91b6e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__invalid_characters_detected_invalid_ascii.snap @@ -0,0 +1,90 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "7079e963a2c4cab5f00fe7ee2c68b3763bc0b842bb330113782ebcd5cffa188c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: invalid-ascii-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: 327, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20596, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 327, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20596, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ca4191a3af9a30567e7e5ff1c35e36930113a23fca96b1b5f15d0c970579525", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: invalid-ascii-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: 327, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20596, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 327, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20596, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "001825f3da07df3e2a6c7e1ffe80327924c7523934e529896f6335da1a46e0cf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: invalid-ascii-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: 327, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20596, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 327, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20596, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__invalid_characters_detected_invalid_utf8.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__invalid_characters_detected_invalid_utf8.snap new file mode 100644 index 00000000000..79753485b10 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_analysis_tests__invalid_characters_detected_invalid_utf8.snap @@ -0,0 +1,90 @@ +--- +source: stackslib/src/chainstate/tests/runtime_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "c395a2c99784293377d7e609402a723090a40fe3e9046b2c5978738307020374", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: invalid-utf8-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: 329, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20642, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 329, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20642, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "13a28b3e6e03a0f7df76fe6bf5a0e9ba3b2ea861492c6f733f0bb058cb17f262", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: invalid-utf8-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: 329, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20642, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 329, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20642, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e00ad089a899f83bce873285ea3511cad79db028794602937bac95ed68e3c569", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: invalid-utf8-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: 329, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20642, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 329, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 20642, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_log2_neg_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_log2_neg_ccall.snap new file mode 100644 index 00000000000..409b9321d6a --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_log2_neg_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "ae002e87577c8ccec2be3e435ac8a033377a66b4832d4c5460cb9e871374eb7a", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 484000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 484000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "72dd257abe2b857b250662da1a99b2f30ba7e54eac616b4c82ee8adc6f69e1da", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 303949, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 303949, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e39fd05c0628dd80f4f0a69a26dd48e6d565d5d6e367b19f61b6c784b093f1b", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c335cb5f0d50ed6ac1ccd49f3a21e845bff86b7152e89cb2c4c9a89b6cac7901", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e24f2686d50267fea46ef408d2061b78c6568478de3dfb2ba8a8c7efebb8011b", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "09b7abff9f47ca280bfb507276b0bb0a14a4237927b976ecef6b69bde386401c", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1b6b5e2b34bb200edcf4f3820cc6aee790ffde2deb75131b4c11cceec0811666", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "165e9d3761c096ba517e8fb83e542cae72a89e1e4cd1dd16c1f795989dad85d7", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "269bb344a938253690042dbf438ffe8a1ba1f7841484706f4b1483564ca6fe3b", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_4-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d9d702baf83f75982385faedad2125c8324d9d6c3f2e4e0523b77825e4ae2b94", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_4-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "62eef481a13a331a46b753d33307c40a5d1ae24d7e92958559e704c568934923", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_5-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "655ea7f2a9c5d91917411c95a5057828ea9d402e00c85af0a7f783af84e26e64", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch2_5-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7353e8129d7286edf74638d9c3730c26e984b13a21c32576ad4ea6ffa15276f8", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch3_0-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "597689ad36f3734ab70cb5f07222647129197f30b779d120ab94c34da863c85b", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch3_0-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d757b496c3eb5d386cc3d7bd847e4d29822a9fa76fc4ab36d3963bda57797b3a", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch3_0-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2cac3e572831777ca33bf4028298a11277d498a2264ff6e4960d42e7a270f417", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch3_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "560697f3aed85b44cbd44e5a46b6a94b1b3825f3af0765b17a025de3077bc7c9", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch3_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a24b0f6f2fd73b4ade8167ff76628632a9916ef97603900438a184d1c69950f1", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-Epoch3_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "435cbed1980cb71b3295acba2b2187676bbeacb684d6b07c124cea3e51dbd6ee", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b275d996e5233418688962f25755379c4db6c5db4236a3e06d564cc612f2c83f", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1996c29f9b30b1db3ff19774accf39544847a5f839e978f99ff1ba9e0023bfe1", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "123e6fed652266a372cdc2ae40b577bf37d013d4cd5f38a714f5f679f42f2dea", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a570718f688780e0b8ba7bab19248e20e5c32033ac11fda07513a4a50769cf4e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2afc0420c6f4f9a2831514d47cbcfa30ffebe1d3be698af5c43180f924a08a7b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "419e29b09a3c7c039d40a594c1bb9b93facccdc4abf2bd25d4257eb4d551ef33", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9434, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0783ce5129d656fb1e8b48ff04c5963b909465b34df4403fb3d500846ac46056", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "520a6e0703a64e347cf2ebc09982c34f0ed5b87883d0dbd29e24807aebd5bfff", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4eb85320bfb9d11ce10a7e26cd6c581bb335a0833806bcd4c42d098497812833", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "be23159fa198bfd9bc059310a09ebadd9db43f966a109ee78f714fe65a5e6846", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5aa218ca9ab324cc7c7230e49ec48dad28f23b16a45ad2f60e66600f837206c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "89de56f37d72b18c23522ebac8fe2de670f34be08c6052e1ba23a9870ecf5468", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7bf722932ae2a08999fdb20305fc3edb5e0083b91deae6d234f022faf403c01f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05bf741cd7ea56f1a95a2a1c715ad1ea8086c6311ac3fee4912f56372289a2d9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dc444e0df36352cbb7d04db4ab19e94d18d68b5fe2ea03fbae1239a143e1e498", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8fce26a00efc2c9a843b2c396ff521f6481a2295ccb2d07c062460897dd40a06", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d1d8de4ec680ab6bea7bf6bf9a6a773e1b7bd4ea9cda6f24a26daed7f0163eb7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3c6bbc23ac4c0479f94f7a39730b47430c2cad2ed4f12c3ae3aa12feb5e8dbea", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "406429da2292c3eca547aebc9b2ad7b8c7d1a884c7f0d269d016d85a5de74dd2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c8cd25feb7b6a22316fa3f25d4d9de8f57495250c8d06d66e24a9b7b645c396c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f1ac18d2aee0c6140915b2a3c7bafd148e5e3b470a9a38f3467aa119868c311", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3ba27bf7776390109f2e5503c2e5b034ee3d9a2d89f981a71f255b207fa2b704", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2b1a2b0d428d5c923fa62a716172cb5d0bb89d63818e9d06da91f9abf5bcdd63", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "89e4cd0a49af2d3bccd7d30933028123e0c8ec69f07af767c86b239dc3d160b6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2b5345b16f024dd041e65576e0a034f166b5ceea790bfb5ec2a3a1925c649171", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c28c6b712c0d18babee6600a0ad2e7c539ab36861b350423be5b0875e60b724b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "241044ec2521fabca245bf0c9f6534e91a3e6e2449b9fb08ff821f3117f8070c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "02c4ab54ca6f0188625c7e3c32c268499d7cd8530e50797d55f567990a1523ed", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "469a1dc3f14076eaedb20ee1889b7b1a9f385ceff22318de7e74449b7ce1210f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "df9843b7fcec38b3b4c55d9f4fbc840ee1583f655e20c1c6de3138b2f5ce4247", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "010cd3b0bf5523de6ad7f93f37a018f48450a3be22f1254f13b321bf1790ac5d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: log2-neg-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 43, + read_count: 3, + runtime: 276, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_log2_neg_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_log2_neg_cdeploy.snap new file mode 100644 index 00000000000..44cdbb61ced --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_log2_neg_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "080e462a7a4181ec7a8eeecef8d0902641c1d9e71e8c70416c7dd1816231d41f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-deploy-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0b0c1dab2f9ec50bcb1d2bf863ca009a2f9cab84528f939ad04d62ec5a76a106", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-deploy-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1e63a8e4853f64eef0bb25be4b768b75c99d3b20355659e75aa14d93e665eccf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-deploy-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "828ee8c46b553b4236d3e1cc5118f240d17fe17c86e50f45a340f651b4512ebe", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: log2-neg-deploy-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(Arithmetic(\"log2 must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9137, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_add_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_add_ccall.snap new file mode 100644 index 00000000000..aef33f43981 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_add_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "6fde4e384ce496e7a263ef50102ed48a1b592e20c4a5370cb4aedabd845686f8", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1083000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1083000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a10d06219ccbab6e5055b7347068d3dfcc02923d46c8e87ca9d04202d25c15fa", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 313908, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 313908, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fba795c167e43b7aff60084fa8f1b22d4fd62783d8f7d0871a9b689705aca537", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12f1dde88efbefe74b52107c7a54eb09b38c61b30c2eb21aca30c17402f2dff6", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bf09b2ef53d58ab3e3c1ca444fa06dcefd8bb040d8f021c9fb457c384903ef83", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fc26712d180aabc1992910a622b2f9759a8e62ef92dede0aa2c45df5cd3c6fd6", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5090a3da5722548b7f7ddd50bde1b2dac3a65a80cb9f65c771edf997094b4ebe", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2781dd2d6c0fff53b9d385316d6ef42a6a28e8634726d9630a86272c4bbe58dc", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3cfe3ca84306c691f08aafe54e5527a8899eea2c1f189209a1abc078c62d3840", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_4-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "172b34413210d78c70e635edec41f650a17545db91177c7b90049746179b2500", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_4-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e063b6ff22f9a9eae4a3ec5b2b4f286d4fda5dce6c0a09a021d8db62cfa24572", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_5-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8b8e77a12f5d1374cc289e2eb45d467d47a30044e9c68708c2f0b32a7e8a437d", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch2_5-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "628c3d094253db4f672068c79d63eb646ba5f98de870470f4c13e4d1ac6ce531", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_0-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "585c18ef8c885c5ff96882bf577d27217c1742503fca1316e88e2f5552e7b4e2", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_0-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5809ca5134b2642dd49ee3b017a819b63db6aea8eb665980f96d7cf629f50530", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_0-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7e076de56a542834285b8ad5fa38f1c287cab06461c3ec71070e02652ac80378", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4629f3a559e7fd143221d413ebcbbd9f426d2cf1d6b0f22786632faf1f112516", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c3325e8ea5e767b19fe0433bc29d853473fb698068d9ecf25663ead2b26868cb", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d448cedd021d3314c50c82b4d87dd7308381b828b845a29a6801c8f923cf43f8", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "925001548fae5ab6b2f6771cd46294140ecb72becf86fa72bf8965f318826261", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5d4c17daf29b01c035c7ccb1c88f2547bc71859dd7b0ca086f6e26d1098eade", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ddc7e7751de9184c573b1a1f7c52d3b59b51bd4d42c80dc8088968d559b20865", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "317018b46786dc242f82a5bef4b43e6704ce36c92f01c04f192600dab294741e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6d0b0a6f004286492efa1e202db4f6606e8878ea82bf0a2679432e5036a2b819", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "84f33e64c3d4efe0c37a59071db306fb92858430c3143725bf8fb1a491bf512d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1d7f2cdfbe325d8a22347327f6d9b02bd17febcb2e82ffc15b302c44810851b4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_0-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2cac0f84530583190d0dea99c18045a48c95566764b9a2996957926a9c7349e0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_05-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f72774555a55a8ffd574a19ecfd1c411af6f42e31a84ea7c97892b72793ee0bc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_1-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6699126847b1c7c3a0f116e9c860fd60008f81cbb2b0a0016c07d6a896d42bc8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_1-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ae60e8d20cd5774a0bf2bbd2aafe7092b6669c7ea1c59e1ac804fafdbb8034b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_2-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bf609f3ef9c230d61f0ff5dc6ee08771651ab3c0433d4722b4232705009d21c0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_2-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e95643375ba48d503d47e48ba653c3d5ae59fbb57cf6bc56168a63eace185a69", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_3-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "10372218fcff0596624efad10a06ebcc594e069f8b45ac7dac7cdf8ae625a579", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_3-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "00d9ad4e471c282eae1c50bb54290404117be5ce04f067de02c3269aba163b6e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_4-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "472bfcc9bdf618c038e2e3c7e8e8febc596679f7c51c8b7d78d0c7694011f7ed", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_4-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8cde336f58f689d3bf1fc607e6890c7f7a80aca51c16e9fd6818161e108a98d7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_5-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "55c58aa200effac1b86e9f44f37a049bcd50b0d234ecab0b3f73d8e573b9bcdb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch2_5-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c4bd7707d5108c8dba65975485f40f71274fa7375e91f40ce77a8e16633e14c0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_0-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c5ba1c4c807fd665a9396339bb9d02c241d607f852dbc6aa309683d6adc94da0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_0-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "730f45541e445d217232ccaf7b3e8feec2f8547f4c95f5b927f5658870c08af1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_0-Clarity3, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c6aca1278e155378f79e3c43c85f090f4e74c7a4c9b38a72948fcc985a00fdd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_1-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b60cba487882ea24e8110caf5c28385721c58fba47f6862a7eb532853ca07cb9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_1-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3ed4691f2b65cb44adcd0ee2a19d69ec82dd400d1a852ffd433a0019ec853dac", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_1-Clarity3, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7d33a1b28f4dd8d4872d99915826a9c4f757304ca875dc2b2aba05fdba850333", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_2-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c80e2f97e4bc1209b98e56e2c5c2cdf3a084071f51b1e6005f5a95df81e7adf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_2-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ca619a2f02bb72f7bcaed12ce0f02499a7d92560e52883acad19a834341b798a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_2-Clarity3, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "73c3f4fc36128cfbae50c71eafe71d7bcc7bd11c87203354259740dbc244e4c9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_3-Clarity1, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "06d4b3f5810c30071bae53ecfb5d6eaf9ac487ce97c67531a07110459d715ff9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_3-Clarity2, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e945dacd08039d95d13f53b61e4d8e0397ce2fedcba219f83abbb4642b5f613", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_3-Clarity3, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fd00314cead95c6a85917cabfeb849caa0345d22b7e63eb6ef3a875a02730c90", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-add-Epoch3_3-Clarity4, function_name: trigger-overflow-add, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 359, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_add_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_add_cdeploy.snap new file mode 100644 index 00000000000..6439ad66a92 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_add_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "0baa8536816ea19016addf5641e710546c1337086d00ae90446b95d3cc4fab61", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4d0b8a9994273ba64c02da838af9ea8fe923c37f33148fb4ffa7945d8f3db8c0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e9c40ceaa2c130c43a92bc6e9483bcce93fca77ff003b88a33393f63ea079d36", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1b1178d5b1dcdc140033836f80645c93ef56533e2d86abcb0da2ad298901b810", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-add-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10722, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_mul_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_mul_ccall.snap new file mode 100644 index 00000000000..78cd491c1c6 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_mul_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "6d1163e4a779fc3178b4218f6bd9a7105cd483421b28325c6e49e803ec1410c2", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1083000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1083000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "319b67d38297be5403635bae926910b23ca04d678e21862e755f072df61f562b", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 313908, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 313908, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3e06f804ecf33f33d48d606e142a8cdff128b5011629f3c69615636998010f78", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "77de53ff6ec775b711e454cb4084a6915ec6e021addb7fe43f78b7a84f28267a", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "020bd78d8fe701918d9b3f2c5f4fdf6ba21da7bce48ec536e66fd50c849df087", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7bce20b3e524e9140b0c4f038c17ae777c5d6df1d7c0d7ca8c5daa9bd11808a6", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1be576a31a15b83c6df57b0fbb33d052220798a3e405bb992e9abe008733c8d3", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9e497ca787d92bef35b8edaaaf74238e8e7fe8bc793245232c2610e1c21a4dcf", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0d6b0896bde2d167c20419ea1371d7414771529ce2b0595354df75069128b79c", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_4-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8f4837a8cf7f693ff51b41fe6e9e10eb74d074312a1cd5c307c76d28d8cc5515", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_4-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "200189b2bd8041c5596514f1985fb5ffbec727d16c9a7fd4c8dc27f8d86da910", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_5-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dcaa0827a53a7c028669c11fe9f082c1f3597daa7b3caf41b624a2b5d3a6f601", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch2_5-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fb00a0a248df03988141e2b39b89816dd84c6cc5b6dfe39e986fbdc1deedfe62", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_0-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6198d6d199dc09edbe807952601ed4380da9d55229a516a4c1aa81e8ec125830", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_0-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dd70de5195bab63805332271115e08ceee983dd62135fe8b424c60edf1ba8ecc", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_0-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f75ee1951e652ce05dee0b248fd5e5ff9f9e742ee79935019d87ec5b1a1bf413", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6e1bc479af76ea9a447d3571e1f47917e24e2ceb620c8b46505fa7177051c501", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b248a18e15781624a18b31a23e0e91399fa5342cc24835abfcae2b529cb64c31", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_1-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "673de35621f8700c7d18ca292bea7ddc70ab55b5048e55fd9406c1eaa9e67556", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3866df02b0a73152f5beaa63fa8cac6f03704c7c0b86b087a5785f89f958a5c5", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c3265a8bd6dac59f69430b61865459da9b92d91eebffbbc5126ddf0d63306a56", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7793c7aa62408e715e7da322e9aff799dddeb9a1cfb27946e10b17ead1cb5aaf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d18e32216aa891dafb239da4e5c84b86dc1285d08d48ca1936a48291ff1ab87f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fa09cb28a5bf9c5eda0cb5eb83a471b141929b2400b003b90beee449765ef513", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b248260e94bcc51105cbdd91b7c7272799470775772d2a5a22e79f3e10890d6b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-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: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 107, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "aa244fed9d0ec70f9e00de27e40aa602b020b62ab00a60271e3ce6f745bb5d78", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_0-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e0f790cee3f063d4da0c65f8426bca495ebd0cbf5930678fe8793dc8b056e2e5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_05-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a9db46ece2a2199addc992ba00cb3a2886117537af429ecb1e1c4eb5ebf26929", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_1-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "930a4c4f4a7cf5e22a2a3814dfa74f2bddd6d489a5b51390b76468e768ba7f32", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_1-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12e14f254fbfe594fa1f172db5e4c8885a2e70c81572e97b9ab17631f3722544", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_2-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "381bcf3decd7edb5245cb3182ee2d569065098702a0ac2329ebe7ec81aa565f2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_2-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6ab15abffc8f6a512a8d77bd0a4581b808b0d8ac9d2b0c871bd2299f43cd3e67", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_3-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7130c585b5d061adc26577a810817df1a1d06c95971ff9485f6ca4f41874a431", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_3-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e2ec2f599d66ccfdd05f9eaa06574f33e0f466b761eeedabfa9593a0f60e5591", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_4-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1d0fc60ca332c1c14f1612b94c9f03739ad1b0fef258375d1015565f1cfeafb0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_4-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c1a2e4158de81d5aec783ca338b7ff5a57677e8b9595fc47d21d58356ff6e4be", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_5-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1a77ac906b81c22beb9db3121beafd16120910ca1f6adcaf233a3047a935e81d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch2_5-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2fe113410fb67bd28e9b87ba38acd97d8c6c9c5890418d8e34107d4e92a20dc8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_0-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c30468e227b29f1679a4489a243955071dd3269edaeac790eaf8e17eeba983ac", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_0-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a6c46365f67a095c99a645a14acf92cf63efce325afc855e82da27b2e434ba44", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_0-Clarity3, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4daf1f29b337ae531c27f4b38301fbd8e312cfd20e0924bfc23d73f6a1a914bd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_1-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1c463d0735503d2a266dff7871e919772bdbe1d0cb2855ae2e8310c04dffa9a0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_1-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "78ff0db8b1b7d148cabb3ea060f7c47f00ac8246aeadccf87d94101b35c43a17", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_1-Clarity3, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a6ccade1d20b1fd27bc83a589ba1b63185728294694d68efe0237e200317f489", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_2-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0280c2df8c3c8752eec92c6dc5ecd35420f4bb4c6258561d9ae065d66e740ca3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_2-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "74a3e8626f46f4147e9b38fcea885cad6903ea44dc402e8391c0e30eca94a88a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_2-Clarity3, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d18fa16354d0e87d65d4f23e0883bc963477aefe30c34e6969abc8ae98879ce3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_3-Clarity1, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4c0373d69240502b13288971323f203359b7f51ce007f7b4e71d24e8289ca69f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_3-Clarity2, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4811d789c5eaaa96f4a30abe118157182f6cd256d78c5f1a27b6a5d4a3560973", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_3-Clarity3, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f2de91edad43018c999a154806db0353f8f426c502c7fbea64493b46bd89b15", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-mul-Epoch3_3-Clarity4, function_name: trigger-overflow-mul, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 96, + read_count: 3, + runtime: 363, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_mul_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_mul_cdeploy.snap new file mode 100644 index 00000000000..9293b6f1341 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_mul_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "0baa8536816ea19016addf5641e710546c1337086d00ae90446b95d3cc4fab61", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a461d9962bfd766d0212f6828b47e700749ffa7508b238fa525c3caeddb0ea76", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8922675b93c8ace92260b435321b76f9cd4b4d5e83fe5235cfa288d6ca9944f0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b60558e3327e6d0dda25a9bdbd245e21a01eb27ba73f4c29820d79beae422aa8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-mul-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 83, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10726, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_pow_at_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_pow_at_cdeploy.snap new file mode 100644 index 00000000000..1770365c31b --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_pow_at_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "dce217f957d6d3d623cfba04618bd21ec2c598fd4b895020c8be66f84749da43", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7f5d744a37dfa13c95e3c6d436a052510738169c0e02b82fb21b3ebc6c10684c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "57ffaba34c7a71ea9cf69e7a3d1820d2f0e44ccddea2d3829c52196b0bf72a1e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b167d513ea4c2fe95b6d712fd2d171cef9f45b30968969452b456d9c4a8ca785", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9350, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_pow_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_pow_ccall.snap new file mode 100644 index 00000000000..aa50c363752 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_pow_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "89f3cf22df6754d97429a4edd8a9e6b5acb9c2e05b1234490f7b9789f184b12e", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 687000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 687000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f13d3584c91768076efe510f46a1c81517c59a50c425c248e8aa956d3e6b1ea", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 307248, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 307248, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7aac3e4bc5bf035de217bd7618e6f8d03fc9ba285af88bfaac00eb56f40c7f7a", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_1-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6bdae7434e09b362ee84adce0ae44418b860f716d0c725e495166ba7e2308e54", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_1-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8e739c3de168ac882efd24da994f12e62a299a219393a7fdd2990d3697107c34", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "845c231c0db37df1e0256d456cf6d6044d292ccba7fefb421543a5146213830c", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "370534550c370c501c4fce0596fd142f72985585927529d3c4614383c2813f2f", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05c7edecb2cca5abc8110761deb80aca8a469ce036b3a3cee4392a6cb9c90aa2", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "17daed1171970213af1dd632aa963ff9dc1af535221e915106362691e407a621", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_4-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4805f48eef5c766e33423e4adbf5915b5c44f7046602088097b65152c56186b6", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_4-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff8a9322ab58efabf490257e20e0c79e3755688e3c98164ef9c2319b8084b76f", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_5-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "87510128ff108a9ced0863e0e8416a415cdb54e735614588c7e71fb656bf488b", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch2_5-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "73acfb245589c4cc4da74e86653259c3f9e7751f90443e274d210bb224f02522", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_0-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4955f4447de545fb8c55168d27e41a845241f07fc91ca5bdde8912566c9395cd", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_0-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "71b81d3a906e44f40af53dd8ab47919175c8a317159a737c224ff72929cc4b24", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_0-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ef302508f87876249333385354990dc951544631413cc75e9c5b31fc83e88ea", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_1-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d0e2a7ee5ce46cb3862b25ca35145dcb3754cfa3142a33b01d7508510f31c4ef", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_1-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "84a9398cbf8ee88ca5e8ae6c46e9d52e42026653305925e14114170b449bf68e", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-Epoch3_1-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a0af3cfc5e527e4823049ce3b6b2d312d40f579f090c3deecc61a472a377edd7", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7f92f25c0767da03ae00a63e0445b338452b086406c36b02ffa7a1951fcbdf5c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "db1cff7142f4dc1d0c353073a142349af267b56d1da7eb9db40a8bc9103ed6ed", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3900c7279220ad0ce7d3c144366ce4d6cfb948725c64dfc2e98be1d4ca1fad05", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e3f03bcc046f46e92383a0c9ec650e25c545192ce9e1096c19e55f77d7b82cd3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8a73507da4965c310394545e2e48ed7d365f4e42f6eb831e72cf642fe94dbfcc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f280617315c408ad3e40ee8678573ea5755f1eaf15a7c8e35dd879db9f8c9b4a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-pow-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: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 71, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f07773cbac777239f10343e36f46fa64f779c880a1c351e5a058b56b93b1abfc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_0-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ddf1b188d3a4a3b0f12101e0d13420cad7d42bf37cd3bb6f4d21bc5fb302d22", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_05-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3c73d3f871d99352db03742e5534deb83e7ba111a97ea52fab02da2e478d1937", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_1-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e1e9e32e12cc1c8eef36997ba0ee2a210673e2321bc8779f93c881b3002ff9a8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_1-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f7c0bf7ae11bb1442ba55231db93a2c8e978dda82f81fa9100cbef0764f29e0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_2-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "034ef4a7405be03f250c8ea622348e1129565432ffe617ca4b1c488a4661d7e1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_2-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "676676a7402d1764628dae947a2a05a55fa2cc1323d0f9dbbabdfb7042d26416", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_3-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d17f39be434de3d16e86839e13318312e287e743a85375d596c2b532ddec588f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_3-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "29be94fb421e2c0495ff2a7061f6c341dd20586abbdf29231fb87caaeaee73c8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_4-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "01e97fa87b872616c0f6fd31c579e967635fb8a237ab2ba9d7061c1c4e0ca7f5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_4-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "06fd105b9efafa11907cd45fc586718933a314e4bc01f18272b109a7bfdac6b9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_5-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bf10f0a526c6699f2f60bd699b154df2c3339af9c9edf7e295e2ae10af16b1eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch2_5-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6614498f0599ee338cd8a49c78c08717f40eae9ef18548d4c91141640530b50a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_0-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "35a15bbb7473ec5ccde9133a1cbcb8006391390b85bafc66311cead3b2a17caf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_0-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c7df6c9f4c80a03a1183c7e730f4482a4fc3bd4ebe8a02fc89a451537e2ce0f2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_0-Clarity3, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b064c3ea87469975e2050c55f4e417217d398bc78632daaa69a5de88c1b807ec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_1-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dc3af9680c6edd95fc6f1f7b7b9c10b5d2213ebe67b31605a5a0569f84042631", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_1-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05c438e36c357057f42a36cbdacfbe59b61842e679adddf16d894e6ffafe55cf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_1-Clarity3, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d9082c9c3b4bb170f368a5038fe277671dc91ac24eb94ae259bea45734507d2d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_2-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "06408987163a4f2bb72be1e7f40330a113c604dce14cfc9e56c6f194c51263d1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_2-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "85cd9078eee03adac4b003ae5bfde16153a698e56c5e764ee934de881b4c929b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_2-Clarity3, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "376232a07e0e818524b4ba330ae43ca429c398bd596d8922aa87943acf189819", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_3-Clarity1, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bb0d0f77fcadb4aa87894a7865d72a522bc414d98e7f2b2b025cf9ad49918b70", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_3-Clarity2, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d746e279ff6768b271b78d122fa5a6310a0142e021e9aa50f9cb783eb059e916", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_3-Clarity3, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "568e948f60710ad9734580d737de8a689f0c3e80738178b2048c5b3ad1860273", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-pow-Epoch3_3-Clarity4, function_name: trigger-overflow-pow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 60, + read_count: 3, + runtime: 319, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_to_int_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_to_int_ccall.snap new file mode 100644 index 00000000000..5fe683adcf1 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_to_int_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "dfb33b4e72b6174599772bf52fb232a22195ec66cef39b001614e0b4f5b676f5", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1110000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1110000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "26aa65a1c125bea0bf762c3731bd733672b30d2f7a36d178953a3cb1fcf4c23d", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 314336, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 314336, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ab41230d32b4d593035b555027608d87407a7332de30e70e617ea5b48bd251f7", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_1-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9083f5b2cffdae3511974dee901b994954ebd14c354e4c164dfb156959d2667b", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_1-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "68e8bd367b9cc3e5a028d5daed90d912724c81b0faa7cb4b277b5f009456ef1c", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e4668609e5f85ce132370c17aa4736e587362b84f0f6951f96a134330bc52e07", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a44783ff0aaecb39903b1c85532ab24e2fe7d0e1a0a2fc0345fd1e1667db83fe", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ba81393922950071c93f20216ee1ea038dd53af121c80a00fb17dcdc1fb91ef4", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0d8eddb711faebd289fe457489dd450447108dc3ef3ef06ebe03384ec4dcb21d", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_4-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9a8a2d8cbb61573ae8ec3b9b1daa31ab1c06e4d0dfbe8dd613bef6f778b4ccee", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_4-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5ed207a26feae0ad151c71d869830b1ee37442718a8512287fc41893c314475e", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_5-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8e354140a9da1453da9c5ed028aa8fd8f4bfa06790f095cfbfd6de8af4ef2ebb", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch2_5-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "99c153433321d4722e0e164b942941e409ca40f66db7e40aa1282a347885223e", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_0-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c8b09147e4ea590515535146c7ac718c33d523fd869ad94916c5e21a7fc4c902", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_0-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fe8373669750dde2ac4fefc2f8699017936364c6b9ccea4146444349b99448f4", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_0-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a279c7fe5f1a0bc297b8a8c687ec980f12b90f7706bbc6eba714835799d823ca", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_1-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3b04d46434516f0ade927e989e23ea880f3d2ba5ee3303aefa678d92dd842006", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_1-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c39efb15428c70ea1ba68ece5a7f4b1bf72f60a7db69b22fb2ecb98fdce2732c", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_1-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5cc6915a512baf07b76cb0fc75b77102bafd7cbd6dbce54a22175ef17a4fcadb", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "405bb7f2f825437b924e4de44d516f3280464003e15cd91cd0a1ca7cc7448252", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ea6c9bf4b62efd11eb28c6f6fe56aa984cae238c65b9e2970b48bde4b8be6fad", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "45029da6167adf357f4c6a21e75d5497707b4f5a5cdffbe7f2b7558e1303b8f9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1084efaeb511bcbb2b562a8309e4384db4d38f8d30b40971e6958dd9ff87ce46", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c4db78332e2e905b0b04e216c816020f9e97a14b3f54129ec8f3c6cc24c5c5f7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c7da56aa4ba644c6d32fdaba804ebaa9b3512bd115b357c4b821ff2e7b259d2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-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: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 109, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11586, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "be82c1bdcd98cc4c39694222d07efcb7fc295fe446418e79d075bf7c301db6db", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_0-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "aece59c4f62839687d797d22b7c48b93667a509a2417cead7c55a335d374d9a5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_05-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39079fd2c79cd981d4a25342bde141b547c43148029e670e9adf16fcf9c7e4dc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_1-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a3a982398d315157e0f674be60bb27abef643c20bff23d600c19ec2e34d69b22", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_1-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff6114d0302ba2900cb67822c02b9a462259dad05fe84a7288d390570c0f0afa", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_2-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c8cfc4ebee4f6b998f5db68833a365625f67d5397f23cec11d757143aa34f150", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_2-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ef340e806a95e8df5e7955e50fc9a6fc1c8a9fe6c2a3e03ef31ad3d34cbc109", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_3-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "16e1f8d62c23767cc1ec1e9f0891d52973001a122d72f612bc160dac2a0be196", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_3-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3d30ce2004f8922c59046bbdc02f85498c3c7ddeeffde7305003caf42a8d7c33", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_4-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c922211635e78c283027fe0bc2ed4f210d6db37276727750875cab05f3b4fd9d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_4-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "431cd6937a64116e7d34314ae89b1430b5924cc25e8c6981083210b698490305", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_5-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d94d75a051480b3c069d5b233d4ad635ed01460e2c74bc738fd5b58fadbaba27", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch2_5-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d249d8959431d377c4fa6c3f27688b4ff76ffdbfb3e8042a191be923604d8b90", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_0-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "955ab1dd4640d923bf5bdc916109fdfd13704615c0fe22b49dd80e4ff0ab3b22", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_0-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5d21a19a5214ead3d9986eb4ab9e379a0a25e4b9b49c8638c2eb7ac76018a712", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_0-Clarity3, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "021ab6fa1d3a269338a0e4d2b678ff3dd15e754eaedbed144aa694b5b81b83b4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_1-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c5bb51db10daed438da867845e03f52a686935d2129d39182f41546be51c7f1a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_1-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a8e8013be20ae3ebe7733ad603479d215e083526e2894cdbba59f1e4bfbbd2e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_1-Clarity3, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "14fb8bb738fee2a9b926a0db4d7d9fd62c56ad99c30fa7e95ed518b4dc8429e7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_2-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "afab62b73f728d9701d125f2f574cdebf6c20fc2e7eeb548db1aaba8a62f16ea", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_2-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "461cd1a83957594eb92f04c8ba2703103cde0167f7527359a6c3b767040d2f96", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_2-Clarity3, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c41402e80e9f5071365761d88fd9bb273b3df33368cdf7d485fbb0dce8681bad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_3-Clarity1, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c92099a4c2e4bdca88fd6b996f8a1095a57b9ab32a99dcba85ebdeddcaa63a1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_3-Clarity2, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "191553df4d08f542fb25a0a627fec958120cf6a9f4ac6201eeff52ef8b66a390", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_3-Clarity3, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c641562b40471e7fe392b3fd891c8ec4ef8b312c997d19b3c7711f030384583", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: overflow-to-int-Epoch3_3-Clarity4, function_name: overflow-to-int-large, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 99, + read_count: 3, + runtime: 350, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_to_int_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_to_int_cdeploy.snap new file mode 100644 index 00000000000..88e76028afa --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_overflow_to_int_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "fc84433c9b52b0d4803c8fe840b1c9215f0c735f589c5d6b64ca8c4fe00bbacf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "efaa553031752fb0ac86bd560258c428f139c4801a31f1737387d4a5f8f47be8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a16226d9373d3bd0c0616aced0ff046d76e89c253310043252b380a854d52073", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1e9e1a778a1a0cf8a508f7282825093cd4f22138b2b8b7abaf1633e9d8ecbc40", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: overflow-to-int-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 84, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10659, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_large_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_large_ccall.snap new file mode 100644 index 00000000000..eb7cc5dd840 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_large_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "48dedeb511d27f477aa4696bb15117af400f3a39288c6c00ae5d8010540a8428", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 589000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 589000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0604b5e9959bb5466d02dce7c7b3ce9a8e05bef3004587b70e9b733355b5a8a9", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 305741, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 305741, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7eca09489d0136b6c0bf2990098465970bc246751179eb6cd23970e3ae653126", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_1-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ea7a9497a68c56ad5df9a2b01b9cb3f0001d0f6c33a6090873dc228d1d279ab", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_1-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f7756d817986febc717191025292d44e3f402e74325d182b405cbdf83f57807d", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "10d81b17c99aef288a08ebea3fd6d47f699e87074fd29692847c1f85c089e49d", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7e1ada704fc4206cca4b5ffa5f688dbe1a0fb69abe6f9e4da124aa122caac27f", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b136e7a31d81bf2f18e8aa2fc9406241ea200e33c125831967465a2e232f74b6", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "199ae15556e2e5890e652a55033059b5417920372a9f4a70ee13f044880f487c", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_4-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1161f0d5e736e33604e840d59e70bf9fc641ce2a8aa4dab3fba7b7f26b5cbc93", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_4-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3b600249eac22914acfa21e9164c6316355712581e4d8cdfc6440bd7aec77cca", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_5-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e153ccce15109f79496e40094c2a9c322ce0660342100bed9743e38426453fb1", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch2_5-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7f79faa6fbf34ca03bc002082a560c58591754c9a6873c93392a1e3f14783175", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch3_0-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ba74933d199cc336f07cf79fd687da7bbe2e8e989c2bc0128edc7a832b265570", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch3_0-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "41d26c44b5e30a86cbe37840452241e2bf608b3d1712514aad38a91028710498", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch3_0-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7593a50d47f3c00d6b747632457eb3a17b9fd40b01927717381697c598f84e65", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch3_1-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3e755fa61fd302fd0167b8cffaf150eb475e20c9f46ad728beb206ebe7046abe", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch3_1-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "beaf7f8e85a5e988da9e0ec41e3b28e21bf8a5a2c42bc5b517c81390ff73c382", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-Epoch3_1-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "084328a73e61f88f027b71f055957d1fd19b4e70cdbd6691f4927749d4b7b092", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48452ddc8deb2bd0ae7ac92d97f9bd7076d98c3a33ce9e3fd7dcc10c1858dcd3", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ef8c81e0150465fe5778c317ce1ccbe95d32b65f170a746fbf76e9103a9315b9", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "354081965b759cbd23e45e019ec33254cfd712b2c2db366c484698606ff9bad3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a896de57c2c3b3d57d4b7fbeed97b623c5b7de7cbb21bb2e6713b12fa1ef48a1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a8c5361d7ae55d7b5e856ac46b42cc5deb6953dbaed882ac6e23ad7f1eb11eb8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0cec1ec55826f90c90898fa040b3c70299f1b16b07250ae92193c5fc1cfd64d3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-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: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 61, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9903, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a9b2fb85ecb7f90d8a03feedecdd1eadf3dfee9b1569fb678963dc326d74ecd5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4d4110063551600d01da61c754bc91fc63fe922f733b982e2a824b87f5618798", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fadc6f4b3c3a2343fe6b21f05cf1eb51bbc9268afcc00ec1c8c63f3ebf9c2aca", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "46960888580d257e64bcb68c78199f454d8690a26ff1502afeac1b3c22e56c1f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "055db876882b72ac2a579aa0c5cc2553a5033573905b4664a0c7025da81319cc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "610152fba548fbb47aa37ab4e6793fe013c2928d88a75a57981be604e6eaaf9a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d90f4c0c9dec12dba178005bb27386ea94302f72e8e27de5fb20dff9b39e01d6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "23b6637b8be208279254ad02d128de3a2c26e440fc6c754f2117afa25afc7e5b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d96f97c59ef3d02ef64500985f065908c0f710797e3cd315863d5ce8d38a790c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d2bffce2cbdd7ceb7692a77e14e10b22b1484d846f80e4cec3019ce60e313f70", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5fc998f99f92350678fca7badb96ff5fbaf4876eaf02d840e4d18429df0336ab", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cba7d2be00700011b703379a4688a2e803d01fe14ea588d9000a1860e4a2f157", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d48fe36e37132f8832948f596bdb54229afc4cc61196299dea7fb9ccd83c7b5e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ec5c383b8b6cd1081bd415fcd5936f37fcc232f50c5f66a36dda1fddd5dbf70", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3a1fdce90a45c1891f4087c5869164831bfa5ef08c7c0dc41fdb63d1abf96076", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b8718de6668193a631ee8d0f516c5839a9c2ecbb73b0ff7dccc70f2ffe69b16c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c10466b2b493e4899dcde4ea456bf036bd34f4197bca8dc04ad1be8e0ea92e24", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a5d590b3bb33783606ef135529ca59c456fd0a3ff4f970b7d1ddf9055ca5633a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f32d4be0360584273d17c38eb77387f399cd926d6f88480019a85b9c25d949c2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12d4e0e73f40f2f703c5414b93049d2d3abe0ae7043cc959b1a0b81116f0e043", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d41178f6f6d2bf86fd0ac0d95ee8510c9c95d8d9a9ae938dab4a166781257976", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8082cecd6ec475d9eae3893ede58631fb9bc0e64af80e8c1dca81fbbde769948", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cb55d93f0be772f04e205625e027db46a26851ec242248e9f55953475fd4286c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39291b5282e4943bce4d40433760fa41a5fd8209cac821280eaf36c2fae43c51", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0aa666caf86ce9e184ad664fe0988347c1bff6e33843ba0c17f8d98aaaf2a835", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-large-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 52, + read_count: 3, + runtime: 295, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_large_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_large_cdeploy.snap new file mode 100644 index 00000000000..2963c4737b1 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_large_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "de486d3d99d8d0753834659775bbdf16a6999340304bcda39bfcac027d5df3b8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-deploy-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6b663a6af29976434674101a311012647e8bcd47c86bee85c50bd281e3a593ac", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-deploy-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c008ecbf336f6a5c4bf33bbf63beaa3b906795a42dd55daf0c0cbb149be8ccee", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-deploy-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3ed4e6546aa16c41c48843411bc36b4ed84b211c485985a233a6df98438e7656", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-large-deploy-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 54, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9616, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_neg_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_neg_ccall.snap new file mode 100644 index 00000000000..5778e10db15 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_neg_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "1d7c5b604338f105445d6c9328595a97705ec7f33c5a96cf243c53bff3d182c8", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 541000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 541000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c115c5dd77757e644ee7591129bee8cb4d376583e123d006e923eebf5d0c76e4", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 304945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 304945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b6b2ff57eebb0e7affc5b97ccd46121d68fc7fb9e0b681c2bf6d6f6dd6647901", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_1-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "081de13ae038376cba1b62737316824b3a78aaa984dce203f6a77618ab9b9492", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_1-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "643c86ad0d3dbedf117716afd728df37cbb982e93b11e09180990b9ec1d7c171", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "29d0e6c3c82839d6568b2c53573baf0670ff4ff2e26bc2d1d85056e10cad9dda", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e2e28a77969237fee73649dad66a32c4f0ee040bea17c9f2128c5946eee0a055", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "33e9c201fbb66959196748bcd300b30b07d8d9576db6a41a28a8c053e9751961", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a655ca5344ae181d0e26fd04e41a21f1c57ca83766c2eb435466b584659f749", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_4-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f04010d7a37a7a59fd44352f2e78b799daccca2d256ff4699f40e8fa5eb35115", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_4-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7eb93623a58fb1c5f0724670f9b19769185fb90c852265fcab4bf8e92e490c12", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_5-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5c08124279248adfa0a02c9320592fa0de32773d10adf198f3db418931a4f2e7", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch2_5-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ce4795b66c2e531ab0473d57184d02d5040f4bf778691ca40e52f4f19423cce4", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch3_0-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c0a709ad179d9cbbe1051d4b3aa8b6b43dc90d613d45717df8004d2b5ea84e0c", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch3_0-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fe90a830b53db8f586cc8d952e232089b01c34440945f10f4a8029803022a755", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch3_0-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cfa886d23d70ae46b7625163b1c5f3f83a0d730fcd30baedd602f53cc2135bf8", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch3_1-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5587f8970cc2eaa7441965799246b0a4925d04316f4a0c30736f0230864d7efc", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch3_1-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c230ee3273422d7ba88f8c3f5ae21088200ed722c70b2f24de49e1e5b9dbb5e4", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-Epoch3_1-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "26cc3191da32b24526b06e97b07fde8565ba25b10a1d268c76a05f6170185c26", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5ed60c895d9d8a1bae3c9a8659807deabe0c2d8b0c61a7cd65912973b0d9182", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "288fe33c340bdb9d380854de55fa97d2986ce36f7c108e11bb8c2b3c6723c7c9", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "487ac373432e0d4738337746455209eab98509375e7059911dc0a3a4c7015b4f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dc35141d86c5c42124c63327eb11a8962f5020f7bf8a2579fb23ebf3549ba710", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bbe772fd67b3c0dd31d2494aa7536520ab9607e0ab5304aed3ab0af5321f37d7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54991312587fba311b3df7c0ceef05bbbce2e9019a415b3abc13d5f85880f183", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-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: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 58, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9842, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "355fdbea2dda7dea3f6dd5ce0be81e753481e364eff4677fe21d823318f34631", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f21bc4734ce5b5c024dbe2653d646ec6e59007a24ceec1c27efef005b940a7c8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e00d697aaa516e26a70b098a5ada767b8c4fc7b6c7d429bc87cbe9b53b3bcebd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ded341ccd8e5d137914f145205b319bf900edcd71faece0afb613fc9ab747e0d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "75f6a2f51a47d91a36a4997860fbc12dcd2794204f3e57f3bc6db77f044150ec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eef65f3d7d9661fe98296ada6326a196484f7e133b9d96f6d5487216d9c9105b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "476affec703d63f8ae665f25014e7a7a5473ff7814f03de2f579dd17cd6510e4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4b01604ebfd71a57207716ffbb829739a47fa35624585d11e64b03a6213a3182", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "32264407c3141582dfc4166e828f5bc1cd7d0a86fa1cd5db71a730f3a4c082ba", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7addaf403abb911d5db67e03f3ec643ed9a92a368f909155af6e128d86a40fad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cca4cebc1521cd610009ccc5d982b1fc008af43fac963fcc0a0522a35cf5ae14", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "249c3521849f0704e91890d97f77b54964d213ba34fe62a85bad3f966a21c02c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "96b226137ed4068368acb870f22c7d48f0bf89d63b43df1875143508926fc06e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f5f6b5e02ef2c89e1055f18e141e187e09a1786dc211bd9356f0ab2b9f31f8d6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "30b758e2c6f0cb3cb83fed602f315cc1c1cc3f17162d60570dad98bbed3dc402", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7416ec9ce19552555815a2d444b6f74379b22bf2dbb76a8838e57c5c410f9511", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "282ba36b39196ed0c752c0083af97ddc0aaefdeb0095fcb168f67739fbcca07e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "946aadf15bb4c6cf9daad04f9951276c4e9b3f103e8fe9ab45b0ce5d2ddb1673", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1f43163535c33cf6ab9fb6e4bed3ae927a712c303db60036985c4fd5f686f6a6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "71afba94a2994a588a9d88562f3df8333c53fdef0312dc6f584444fb33680aff", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f09be1feb3aff9280de203945cd2b76e9c4ed9e08cbb0006020123d6994f2aa2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ba945ffdcf78844ee84282af332c351cd8f116dad62b5e403f31724bf441a9e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a51a8be7e493b7b398b0bda6c427ccf09d1aed1e9c1fcd64575780f206f71b73", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b79ee6d81f8f54bedb081d5812184c2834a75f225058d59b36641fd616fbd9a6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5d5c9d7677fb0232b8015fb2fa01242e63c82d6848b824b4573ba94096cfca0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: pow-neg-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 47, + read_count: 3, + runtime: 442, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_neg_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_neg_cdeploy.snap new file mode 100644 index 00000000000..08e940c8969 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_pow_neg_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "e98fcb2f30a5cca370fc492fca335c2094657af7c8229458cf187a26f82b8bbf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-deploy-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dba549f454495012d77ee4492f49a063fc21463e9bac50edcad350ec86cc42fe", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-deploy-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "de9c25034523e88d1b729f60834475d63c6f6f5d68ddd2f55a84e40441573927", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-deploy-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b87497e1ce713ab3d3c19358386b661d526cc1fc34bb16f6d4c0e157545953e2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: pow-neg-deploy-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(Arithmetic(\"Power argument to (pow ...) must be a u32 integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9707, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_sqrti_neg_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_sqrti_neg_ccall.snap new file mode 100644 index 00000000000..f30505cfa16 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_sqrti_neg_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "b23f4f1f5d2ef83d6953edb8d640b5fc932b58e281aa02424e6abe96b69a7fc2", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 495000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 495000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f61d174c458bbbc88e7fd46b02abb42ca30bd1f22a31a5fd16fa32e5e18a5f46", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 304134, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 304134, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0a1f1ae22976ff6397cf81605218d367bb1a74c75188060ae0a080033858e655", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_1-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9edd241638eef0964d522aa06383eefb5b013ee9556483d41aacf0670db27eb3", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_1-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d4bb93c9de7387758cce479914187551cae7817cab6843e5a7ad9d4da4c2ba3c", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c52168273091c0871f91dd15847df432d012b5ccacf459761668807fdfa54e85", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2524698b4fb49ece2391a9c695559b41f18304aab2f8604c7e85c536a3deefc1", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2d1a25e614450db1ca1a968373fc5bccea7c252f93b9daf08250dbe0a1b710d9", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d577668de6c542f9c863401ceae48c7a76b5d3631bac3cffe1d95e29a64a494a", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_4-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b4b569f46fe4defc1e51911fdbdb4c2b45c667495bbd1315e098244120c4c1b0", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_4-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e18fb1b199c59ca9b7b29729c839aff3918aca11a66e446efdec46b8718f30be", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_5-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1b815494829bbca2a20b07843aa663cd5bbcd8169d805645a5131ea1953af45d", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch2_5-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6ca69990e93755fc0cebba6d6ca4894f418489a5b1900ba5b6408e5dc0921d8b", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch3_0-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0df0a286a6d5c30b41e93685ae432769089fc15471bd32e39ffa8346dd566cde", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch3_0-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a6fe0d429e94f7ea8402aa384c70841cb64ae1bab11743a2e04a11003d5dad4", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch3_0-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d2392d5356c92509d0763532c96a18e8d1fb3b872bafee6efe4b685a6c743e4d", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch3_1-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "97196407de5b000d50494c5378c7d2fecc9bb21ebf72a3c9dcbbb050cb950068", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch3_1-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "81e532a9addc7ff44cb0667e7ec40b3a47959803ed57a55bb8f5800ac77ad5f9", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-Epoch3_1-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "85ebf3868a1b28414a7ef9416a9fc97b64531790120a49d959639c0de37c06b8", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dd07a83b478c9f2df5286b7f20ceceaf2a69bcff3eb23e660882748f25edc574", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8a51d2deb23980068622a8210e9a3cc1c9a05f37af82a878c4b3161f45b520d9", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ce8664160f454ba483b07558561d7ae1f9ed429732ffef75d5ddbcca0ae5722", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d10182517e219e235ee9d9ecbebdeffa0a235eaac927fa9040df1921dc7b130c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8f013dac0b0dcf61ba59d538c2fc9981c0f025174305485c83b55aa407af0ba5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "df6f475485a02fde969d0717c38869c31b15cec5d5e17102c4b5466c58142650", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-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: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 52, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9472, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6cf8d6a70173e8f45567d8aa9e6ccf0c2e5914ae7291c89665c2704de5e0346a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0a72bd96e0c2546910ded282b03b620f5bf64f2214861fe4f8b15f8a029eed86", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39a11fd29381ff24921252f694c238a62511b7b722812cb752acdb1e33c7c866", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2da518004f2a0c32599f800a54ebb7dc06d2ac3d6bd45772960ee95707434dd9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c5ffab4b873cdfa3c6697b2ea7061737b5b56a8ca8ae7a967b541803fbd9c0c8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d3d2269323e961e4b77c3433214ba8e59776b7019986c7ef436be37d98546309", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3d195805ce9b3b106e1c1900abf4d9d8bd6986f230b42bd70b31808ef14b51bf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "73c7e56f50e40cb8e13ba769f6e0157ddcba14e70feb35994502923cac699cdf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1501ae586d545af8b77fb08d3f87ebf58f0536af0919c29feebdef7b14468794", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "609a85cd080003450a6b31f0da10cc90400b7802e756b8db2d2951480bdb7120", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "592af9434e769b7a90ffcab98bcf62ef99621822b6352cd9659b5f7a24297661", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b2aec92fcac97a9feaba87c4a4a13c64133825794321644959af75b1ab20763c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a3f0c0fdfad2569460a6dfeb19f2432ec385f4cb1b7bbf7b45119ea8959a68c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1c1220dd35a4208d9cc1666bb0d12a86d3919ca8e4f92792644c7bd704f51bd1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ba4d76bf41a3471d4ed1caaf2650d9a2c30e600bd944f73567fd1c64545cc7cd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e80fbd2d8a872dcd74adc8ac82e929dbfd501f91501e5d435905ff0de5ebd5d9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e62d16319de14bebcca1cca6c0365cb79eeed28124574b72a5fd43e7e6b1e6e8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f4bf742a0f3435ef0a449436836671585abde756e1fdbc89d55b50c7bd68df26", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad83f0fa0a336b2747f6d61b87b0773b614e47e7f7288d91346c5984b0ab6157", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f1c679f3d003f561da125e7c34f94f6a58084d8b4cd5df5735a32ae31abff78", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8c4cd7ae83c7bdbc6c742f671c26d0cd0ebbde864ab3351369be3a52b6852c22", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c5ec96db51d372cd30a6fa898f13ff918b99701de43c17abb3d516812e9e8e3b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "69801febd5e929ad25b704998202cc9d5eb1d4bda8546d73d60acb49ae51a58d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9600a6d7ead5ef03d3f57dded9b70e6817ca7ec1cca77334099d783784b9436e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c8bb5d1bc93fdf190b4f06a0444609e66b56d72c6fbddc52ef6d9ef3be19cf9a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sqrti-neg-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 286, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_sqrti_neg_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_sqrti_neg_cdeploy.snap new file mode 100644 index 00000000000..10016e3f395 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_sqrti_neg_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "61770b852c70404d767e86a6b34d7c126f33502ac8ff8f399a34a81728b90d05", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-deploy-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ea36cfea63f1d52ad6733597a82d44be98bce83b2e4357ed92838cb7e5419c78", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-deploy-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "32e1f4bb3158e90d0c7967df8550659a0199ec2d4da9cde1ac1e83b5f154dfce", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-deploy-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5930e9ed0baa0272886ed7e98ccc906f4b7a99f578a463bd7550be7cbcc5a46f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sqrti-neg-deploy-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(Arithmetic(\"sqrti must be passed a positive integer\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 45, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9184, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_zero_n_log_n_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_zero_n_log_n_ccall.snap new file mode 100644 index 00000000000..31c010bac75 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_zero_n_log_n_ccall.snap @@ -0,0 +1,818 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "7648087140ca0c0436b176b883ad074529f63c880f4f45b10ebe0ef73f2f7a42", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch2_1-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "60041b5cd56f47b778064e0a2572e659e4be20aa3613876fe7d9ca13fc2a370d", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch2_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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "887c4b67777594e7819cc1203aea3b863818a740b0a9cd388c6d025fd958750b", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch2_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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3e8d4cc38e681ef15da6ca21254c150ead70a3e08f8dde72bbf86249eea7848e", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch2_4-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1de63de18ca20dda2905fb14eab813651312af6a5ff7d2e47d7d3cf95d75db6d", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch2_5-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "36565cc16b5e76878e40b04b1a39783fb376185d91e689dafc93869452db3244", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch3_0-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "08e0feaff16a024269c66f232adea9812736954e4348c13e8f6adba010ce33fa", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch3_0-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b0e3d15f8f8842fe68611592fbb9c732f414a4c7d7c273f1ba9ab7f8f24c5296", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch3_1-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6d011062b3be57719ce99a3e8820ddc4be47eca44edd5ba354c41fb5d453759b", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-Epoch3_1-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05c04dec6e47af7e6ae6259d56999d9ceefc282358642a34a333db791ec763ef", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "08e39f53d4eb73ab4fac2af32e9cdb8139e9d36980fd769d92cdb2a1389502cc", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a441a9f3d2340b90fb76fac25ca474646b39235a39c717d304d4a0e287ff91b6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "040a5545ac501d59d5fced73d81fae41513451ff704b9b272a0e1cf856b41a50", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "06e571b48474c7a72b2856a915d0fb435617201855cb011a6f81b18bf049b33e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-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: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 72, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10657, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "61d6875c3d5dc262cc3613e0e63693ff62efa10add8cf163a9aff92001a2961a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e78e9f5b978be714a32e2fd46e095258d24727581fd32d7e07af31223c0635a0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "745f27c24f78064abe019502a6cd127a6fad4803694dcba9f8c49699d0b6dd4a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5d528a04a16eae06a8b53c48de1ef19c3280a2481d96e5bc21d41d833b215c80", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "da1f7b3b18e00427da035be892b35900b86ca57499dd8ae1524adafce098dbd2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f5419394442a566b9c46f92d84bc71da986ff08c6f92440073b9774e95e2b3a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b8fe06b979bebee41a370167575f64818b4466ddbd639668d5d79512f2bbc95f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0808a655abe03d099d5fdd37e7bb09dc2935ab2cf61d94705f7c81f027fb0404", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f0ca056f117edb1760ab6c458c80434281a70b02cc909cac7f7c6b2ad5e575dc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "72ec0d0189cb1c71970ed043276d1864250ca8936a6f27cf163f18b31504f1f5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f0558d5491a37d3cc23614732cbe4bb0236605964b03e763e2ab1dc6a1f1c39", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a63605d22efa44ffbd5163ee90fa6f7b1b48c84db1039b21ee96fff22d633cb2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d36734de0e8236039947508eac18e245d229461ec4405f19155e865553a50d2d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "419c8242d14aa07b1322b70c3bcb3f75ff5a30a9098118803a0f69017310eeb2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: zero-n-log-n-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 63, + read_count: 3, + runtime: 167, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_zero_n_log_n_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_zero_n_log_n_cdeploy.snap new file mode 100644 index 00000000000..faa1bfffb9e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__arithmetic_zero_n_log_n_cdeploy.snap @@ -0,0 +1,426 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "45e7a19a0ca4903dfa9a9e7af9140c915982825996f2dbec02b25ef951fbfab7", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch2_1-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fb74cabf518c01f48e924015c111d210e859f70de2d6e327cd2f54b56f2609b9", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch2_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ed66f07a7ffdf0272ffeb45ff62a0dac37c402bb60acc36e182aabd56dba24a7", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch2_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f497709d0b17e23f07b2322295f8d1ae3fe6e4de1c522c286d7a54dfe20020c", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch2_4-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a2d29fad3fc858cd74168c09534c25b03c8aaccb6185f65190e6031e033880e0", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch2_5-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ce716e97696724a45e00b8fb63fb5a91e4b4047ba1ee84873f6dfde72a23951", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_0-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3cba9afc4def2f23eb227a6946528861e7e6e2c8c182ec2f310d215f5bf4d66a", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_0-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "91bf9f9b71e0c82b58db758a9c5a76ab9d8fb87fe1ce28ed6682a88a6237cadb", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_1-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "389eeb6ff842a1c4be40531e3a99de24f6c2e796b6c80648fc986c1cb5f66b6a", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_1-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "28882ff418110117b998c93f8b4e7799d27d8101cb6a7711225f8d05e70caf6a", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e814268312b652f8618e968f80a42d6d793dc6e4dd815a813259fc495010d821", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-3.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "25a01eb15034ef4ab666a7f54a12cf0eca70e3f314de94eb195cc6277d4afdc6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e12d7f5d94d8c03907b946f7814e33ba357e4e42cce726e935035c9ee3a67f5c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "79f66684d2a068eef18553d25d775a7d7bcfd2bd54c28868b421cd300da44d66", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: zero-n-log-n-deploy-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(CostComputationFailed(\"Error evaluating result of cost function ST000000000000000000002AMW42H.costs-4.cost_from_consensus_buff: Arithmetic(\\\"log2 must be passed a positive integer\\\")\")) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10231, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__bad_block_hash.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__bad_block_hash.snap new file mode 100644 index 00000000000..48d22a69d8a --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__bad_block_hash.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "78bf7f8540300b570420a2ac53de493b330022ec9f38148f98d66769e8ed42c1", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1608000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1608000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b75b99e866a24bb80e46b311372171350c42570e0005d0bd6be596a1fa6c205d", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 323016, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 323016, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "712d2a613fc571d4c5536725e0c3084ed3ed1e53b9fbebbe016a991444aaf403", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_1-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c98a367961d6744b80c4109cde44ed90670cca701ae463665143260c94453c08", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_1-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b0cc7ea1ded14d32b22715df8ef94b98761b8271190f20348b1bd4eb9bdaedb2", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d0cde467f2a52feb3f44b8bc5a912ddedfec70fd0e8253b10fdaaafbee4699af", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e382987d4843c6eacc53063a4f3550a24e08001f936df83532a4489fd7737697", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2b9ace80ac3addb1336ecdf4274a046c3b7a5430d97716310090978d48ad90e2", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1d5f19baece8dfbfc557a850e90e40baf7cfbf23f8c22ef8cb1996d23b737b59", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_4-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "96c19444aae139856ac8122b381ff4c1cd9a5efc11eec90b32e818bc822b8567", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_4-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ab515f8987a0c8bb55b58016fe90c676d3e168f7aec57e1d138f8ca8cf4ac0b5", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_5-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b2fcbfa7c14e65ddd8aa05c12ad6cd01de9b9595bcc6226ddb77701d8a7ef8a6", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch2_5-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "83c924c806155a899f299e0ebfa118c19289f98a3fce3d7848a177d0918be045", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch3_0-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "65430d2c13f0ff08d3dc3c0b2913f1eb93df16ca9b43dc895f3ce6c137da0441", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch3_0-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cf363d5d41f415f223b99076075643bd73744768bde369d23576db01f9907f15", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch3_0-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3c16b0e056acd49c4b9161f3a5796a86662b90511877a83adb1e343116117703", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch3_1-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c806bdf0e7e062c643b5cfe36ca4d45dd215e6841e559cc0fc9522ed753c28d6", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch3_1-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eb176000a40811ad3c9dee97b366ea800285713b6b624889946562f35073c211", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-Epoch3_1-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e14c9df1ed7eda6e39af5855693278354aaa6af7709005f7f6dc44992b4672e2", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12bbbd74c2037703daa6c7761f14825a37860f4dddae8f96f879019c92f738b9", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "42397905a3955e65d7101e6cb859c35c75b8c837314db61a206056bdacebc7ca", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "75b955fbd1cf59d302575e0be127322ef086b48f9d01e718a9aa9bde8b76da4e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0cf9830ef0292d2e5bb658a83ff8cd5e46147ab784cca05166b39453b7b9dff6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6583f506d676e26c4951f2caf239cbca8058a0aeea0e15f678d7f47b9a139bf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8f19615a11c9ff2f38cdeb8449b4749b4689913273135e05a52cd9e754f78a84", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: bad-block-hash-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: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 156, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 13944, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6aa2d69325bccc1fb1b8fbd5bb1cfe91bb4285f9d6ae1361940f3e8596fc5ae5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "504ec031e9747e114a5749b54b63eb5fea69839220b7012896a33b0fb46c7aff", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54e0590dd32a8e28dabc8a28adb25a7e335243b64ff764f70a3acfe4c2107a9b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b1af72a5e9560c70cc12e548ab0af781fa037efddde59d9f3a14327ca4514c9b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7b02c31633e7d87aff34102fd8cefce33449d5f271f61746133a30fb5e246928", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e86d4bc79959bbf8d773d833989226b7b14257df5d03143fd140793727bea055", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d1726c317d36ff6c61efd8be1d0661ac19e0f957c8edb6137f2eb2dd9a2fb2e7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "100fba9d7fe335c51dcea52652a58277842e351a7f1278cabe38e6613bd3755e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7de108c6e9782800646cf9df30a99bb86ce15ee39eab182e3214a35687161bda", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e44a75086a87516bcd3f9b9c78a73b84448dc5dcd11c90cbb2c8c061a8301cdd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "11c0702ebee8f70591f7ecfa875a11c7e54a21ea4322ecca625d086effc98bc7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dab57f562c72dd815534eb8f9fc11fd3fbecf7ea89450a3a806ca9525d991aed", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2638e799047467aa015b7349c2f8ff839bf348bd5d64d36066a4e1a6c406ea59", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "23234de0df2a8e06031a36ec44e73c486d9ab2fe21a413addc7bdcb2b0d64003", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bc3e47d7a26d03d95762940398c1271de705ca4bd00e93e6d4a8ba51f2ddd547", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5432d8c2e321915f766eb811bec13483ed402ff74436c65b42dce681b98a2032", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9d36213535b9dd9a9085934e020f9076d3c0f3aae52a8baa0a46adbe0c6080d9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f7b0b361c4268df22aa5f572dffb084e4517668a367a6755503a43a2ceae877b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "751703c4344a23ed4033edbd0edb6b07d1b71458ce5d5c3861d774d6b9afdcec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f61811decc0629af92d4af9de3274480706b4de19f08aeb3baafdb9ffce1a4f4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1cb6544a45182800eecd4d7e7496097b43dd4ec2d61e6f2999f568994a01b9ac", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "55456c4b5da942a2e486640dd0266df1a512af49e3aab2c6ead2d528e8157946", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48ec13a559a14df70439fe5bf597382f400d83e76860a369064688515bd9d8d2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ee9245d72e772d82f94e6b86f6a0a4838b608dd7f42ee6b679b87364d0b3c029", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d0cb52756a9e70ebbd8984a359229bbd32400234ebc557f952c7b373c0da4cb7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: bad-block-hash-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(BadBlockHash([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 143, + read_count: 4, + runtime: 1585, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__block_time_not_available.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__block_time_not_available.snap new file mode 100644 index 00000000000..5f5dc5ad20e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__block_time_not_available.snap @@ -0,0 +1,64 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "a2c09adc85e779a149a71dfd4ed95228d7dc1e260ff7ef702db6e09d0c65d536", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: no-block-time-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: 219, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16360, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 219, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 16360, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0f2bdaa772cb1287fe3b4ed57fdf5c35001cfa915d582e1f9160fda84459bb47", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: no-block-time-Epoch3_3-Clarity4, function_name: trigger, function_args: [[UInt(1)]])", + vm_error: "Some(BlockTimeNotAvailable) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 201, + read_count: 6, + runtime: 9048, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 201, + read_count: 6, + runtime: 9048, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__defunct_pox_contracts.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__defunct_pox_contracts.snap new file mode 100644 index 00000000000..29da62b43d8 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__defunct_pox_contracts.snap @@ -0,0 +1,175 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: results +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "fe011cc5e8f486397470764fd5c155388c407a457fe03331a433dd2c564b154e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST000000000000000000002AMW42H, contract_name: pox, function_name: stack-stx, function_args: [[UInt(1000000000000000000), Tuple(TupleData { type_signature: TupleTypeSignature { \"hashbytes\": (buff 20), \"version\": (buff 1),}, data_map: {ClarityName(\"hashbytes\"): Sequence(Buffer(f942874ce525e87f21bbe8c121b12fac831d02f4)), ClarityName(\"version\"): Sequence(Buffer(00))} }), UInt(48), UInt(1)]])", + vm_error: "Some(DefunctPoxContract) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 488, + write_count: 4, + read_length: 31964, + read_count: 21, + runtime: 367029, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 488, + write_count: 4, + read_length: 31964, + read_count: 21, + runtime: 367029, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7a40a6957dbc2655e6b2742581fe6015b711688b3ac55e1f20c23df6dadfef88", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST000000000000000000002AMW42H, contract_name: pox-2, function_name: stack-stx, function_args: [[UInt(1000000000000000000), Tuple(TupleData { type_signature: TupleTypeSignature { \"hashbytes\": (buff 20), \"version\": (buff 1),}, data_map: {ClarityName(\"hashbytes\"): Sequence(Buffer(f942874ce525e87f21bbe8c121b12fac831d02f4)), ClarityName(\"version\"): Sequence(Buffer(00))} }), UInt(48), UInt(1)]])", + vm_error: "Some(DefunctPoxContract) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 531, + write_count: 4, + read_length: 67749, + read_count: 21, + runtime: 592784, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 531, + write_count: 4, + read_length: 67749, + read_count: 21, + runtime: 592784, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d51b6e7f763553e684018a89f105c297351e026bb54f512875bebe20a4ecf2fd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST000000000000000000002AMW42H, contract_name: pox-3, function_name: stack-stx, function_args: [[UInt(1000000000000000000), Tuple(TupleData { type_signature: TupleTypeSignature { \"hashbytes\": (buff 20), \"version\": (buff 1),}, data_map: {ClarityName(\"hashbytes\"): Sequence(Buffer(f942874ce525e87f21bbe8c121b12fac831d02f4)), ClarityName(\"version\"): Sequence(Buffer(00))} }), UInt(48), UInt(1)]])", + vm_error: "Some(DefunctPoxContract) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 545, + write_count: 4, + read_length: 68458, + read_count: 21, + runtime: 593569, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 545, + write_count: 4, + read_length: 68458, + read_count: 21, + runtime: 593569, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "954afb805735ea33808096c3469019694b711584820c4c1fe45f584641c57696", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST000000000000000000002AMW42H, contract_name: pox-4, function_name: stack-stx, function_args: [[UInt(1000000000000000000), Tuple(TupleData { type_signature: TupleTypeSignature { \"hashbytes\": (buff 20), \"version\": (buff 1),}, data_map: {ClarityName(\"hashbytes\"): Sequence(Buffer(f942874ce525e87f21bbe8c121b12fac831d02f4)), ClarityName(\"version\"): Sequence(Buffer(00))} }), UInt(48), UInt(1), Optional(OptionalData { data: Some(Sequence(Buffer(0c275bdb023a1f8de3d1c99e821268f36e16cbf82d8747f19abee8bd454459ca34aca028eff0ad9ddb6b742ef5b065f2db0b40d93f63b82cde2024cb00ac67cb01))) }), Sequence(Buffer(02b37b7f1553fa17fe0ad71c57538f4a93bfada632947c04e1ca6fcdad65e8106d)), UInt(340282366920938463463374607431768211455), UInt(1)]])", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Tuple(TupleData( + type_signature: TupleTypeSignature( + type_map: { + ClarityName("lock-amount"): UIntType, + ClarityName("signer-key"): SequenceType(BufferType(BufferLength(33))), + ClarityName("stacker"): PrincipalType, + ClarityName("unlock-burn-height"): UIntType, + }, + ), + data_map: { + ClarityName("lock-amount"): UInt(1000000000000000000), + ClarityName("signer-key"): Sequence(Buffer(BuffData( + data: [ + 2, + 179, + 123, + 127, + 21, + 83, + 250, + 23, + 254, + 10, + 215, + 28, + 87, + 83, + 143, + 74, + 147, + 191, + 173, + 166, + 50, + 148, + 124, + 4, + 225, + 202, + 111, + 205, + 173, + 101, + 232, + 16, + 109, + ], + ))), + ClarityName("stacker"): Principal(Standard(StandardPrincipalData(26, (249, 66, 135, 76, 229, 37, 232, 127, 33, 187, 232, 193, 33, 177, 47, 172, 131, 29, 2, 244)))), + ClarityName("unlock-burn-height"): UInt(56), + }, + )), + )), + cost: ExecutionCost( + write_length: 838, + write_count: 6, + read_length: 77538, + read_count: 23, + runtime: 710119, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 838, + write_count: 6, + read_length: 77538, + read_count: 23, + runtime: 710119, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_ccall.snap new file mode 100644 index 00000000000..ffcdd46532c --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "6e6fcf6bb7386cb5fda1c46fe6fea74bed2f0233c843a033614b0da9fb848c7e", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 479000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 479000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c9d493888da30ac7381c5cf11b94f0e99fbaf0445809a15bf68e447669e09b05", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 303891, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 303891, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d5439a3ee33d92c3ddb5c45b31bdbe20bca0efb07dc4357fe10942437c62f007", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5a273e1d664b4089f2aa37d19709f8039aeb32a809ea5ac3781e3df4c55d939", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "24c95bcb2253d6483bd4b63ebaf9242c485d572a4c022544f25e94bdc0640251", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "87b2dda1b1e0653891176a7f211ec0eaf23402dd068e833bacd03f412cfd1f35", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bc133f58efd53424e657a2c220c0bad4c687645f23f0d03f83fa790327edf1cd", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "373e9f89c311686b034ebcfe41d3c85e67c7eab0ce91451c39aa59249533b676", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b341841b2047279e8d4ba3a9f862dd54a8ee693ede495d53a52b4e99efb41efe", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_4-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "09837132073f48ccf24fdf4b92ea58617f59a9d4f427a410b9e5530d4dd6280c", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_4-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "466517a5693454357363fb94e3094d3de3c3ccf2f7390e5602915eac93f64a06", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_5-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dfacaece16420b610f9eac4f7287a584f0ed7561c35ccda633b8a0debce86dc7", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch2_5-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6dbd45341638818714669e4bcd13e956e93440e6faa1c6bff7ad3c8b72a83b3", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_0-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "02fb11f0dfaa3f911d56e82d2ce603c8944488434baebf42ea7cb04107bbbe72", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_0-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "128b2970c45f43d2707fdc2b8f8b2c9a7ae091bb63fdabd809b2bd1f6a7da26d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_0-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "832e156f8495b2638ea24848702b5643845d7057d4472a80818a9ba5dcfdab32", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "10d2b68dd78aa259e2ec00ff99f5cc0d9255fa3df151dd8da78e3984677b5f76", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0facd0ea01e407b74feb2d0c015a491635d69825188827cf5b540cdce6503b34", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_1-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fd08c184f2acf89ac6cab3c017e296816ba4c387754a9209a106e9846436aea6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d0a7bcfaf706bfef2b71dd3a80d81fe4ccb29e7012c00c6e00cafb789e958384", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f63c9634b6e9c74b316aad7a26deec1dde0b8e1973c304fb8a8cc3f30eca6d86", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "461afa5750b7d4e070f1fdcfdb67086649693706e8186851eb92a09846398582", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "09ffb25a76d4f38fc52502292eafdbe03411473b2aa56eae73cd72f043757750", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "97e20f07e4de8c68dacaa1da633c8cd5e0bb35bc04f0182fc17c96f9b805890f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c73021aed86daa9d0fd909898894e6d1147bfb4863fde31c0a6871131e066bb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-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: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 51, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9523, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ee3310ca37aec829b5052b6703febeff8525a46e0eb1d18a0828dbcf8e5daf6c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "490328a1cf5363224bbf66d004c77eae053a99651e3fb5378e69d39481486484", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b9c29e94bfcc18cfaecb37014eca7de160f0f945ca7d5f06bb177fb38b87e194", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e6fad870dc150dd19086d5392a4618ccda2a5bcdc28f6dcacfe69a5c364d9ce5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "040db6bb0698373ab9f7e523558d496de81ee44690eb508f275e7d8ff9297539", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ec636df9b34efd8c6bf1912ab5321a34a864759e0720d887fa77a7d95949b46a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f065b859805249c503d407b0b22b559ba1fba0455f13d00ef26a25ebc8da0086", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39383489af9d50c92eb83da4ffe2bbf2164e53771cb493f91254db1b52ff39c4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "77c193072b7167bd08afbf410959deb261f4643c7dc144522ef5a4b2fa73d695", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1bb1bb8b3699d2cc54abe2a3734eca59b9c23b6eb721482c03bcaa91b91ee167", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a263b5ab2c04166f3b175e9153b34fc7c82343de01db1356236f385457ae542c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "950efa8adae41ebf4b349d1ffdfc6d567b588458ec9770161dcd9ef6727c70cf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9bcc6d666e7201482214b59f892789767cf340d12d64731fbbfffeaa2b7cfb48", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "821552bc44d8dde401fdcc00e830263290afd9ea19f38ae5eaf6e2124fe1d66b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "346902c91c0f4f04b8148a60ce91964fc8d547f147ff66cf0fe8be9f7a138e66", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad7928b7780dd6ae7cae107f9a25eed1a308b3e34a447dd9f7cf58a4f8aff31f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2572fb6f09a86938924f3d56d70c6551e99fc9a01f12a060a39fb89dd869cbab", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9308065f59e31aca970fb1aa6865d9fdb1baca153836d9bb0e980dfae251f0df", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9487a55a4faadcfc831bfca9b2ddbcd312a7e11340c15f439146241ea2f18783", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f4a85bbdfe48758c80c55c6d96aa72a840bb11408d43795cb4a70adcd35b097a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c9bfde9a625327ea94cf8f85595c8836c3d910c1a68b7dd1461f8782a6790fc1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "57a8a9366e9c18003f619982d5bdf065c20d342b4481d1161c878099069ec1db", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8fa75e7fe87df661a834ea3c690db4bb1034a741023084eef21ee0e2dc44a962", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6fa32f028983f253537e03cbab1d6474537f5ff51733d4c7b82b176ade9702e5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6d04440da386663fdc231def96628ffed75893e33bf5a6ea808d16d9b700f738", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 42, + read_count: 3, + runtime: 293, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_cdeploy.snap new file mode 100644 index 00000000000..57b25bcef34 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "ffa3b803b8f265d11fba465d54eccf469db85763d8f9158d759d670d18eb876a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9ea81274680c4db9c2d02d3a4b26a5a97f52dc7cc0b2430402aa42d951c42b03", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d83481efe98840828b6a5971b64a97e6efa3efd839f48cf1e3ac5d84e61accfb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "247b22a51239ee28ded314e87ba1c462fbf3df1f634022728831094524a96b6c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 44, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9244, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_mod_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_mod_ccall.snap new file mode 100644 index 00000000000..3f5bdad311c --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_mod_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "d558e197bb17998dd9ba7b2f8ef690ced040f665f824ab40d9f2c3d1b073aad4", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 501000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 501000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d56f03943b61d665821297dde392f3e8bf41aa9e41f7b3e152ce0edf5b389076", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 304261, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 304261, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e3f3c3be782be8db0048a023d4d7b01ee9ce39a3013db53ef0f9ce4b28eb48f5", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_1-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "17508a61ebc2674937ac4d631680b6f485eec7c4732498ca4a1cf22ecaee5dec", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_1-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6417ae73ca2925a905bd8b0f93959fe1331a8b7fa1a0aff194dc697803b6d60", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8b7b5b43dba4d704ac0d247e3eba4a100b3605b03cae0ec5e5e586e1e709d1b2", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "93b85e3d7010fa9e999c71ddea404ca6dc7c2d2f000b1c5d5ab1b1fc28e1a7ed", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fcfe58ea49795a8410d38a1e3701b25385cbc5cb3fe0ba74dbd8f489efdd9016", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d34f428ca62ba6294a8c490ff9ab30c0ff936e3fd61cdb7404d43a40fc3ffdee", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_4-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "abfdf08fdc51c16c42f4627d335049f87b0a54fd9f97b0c594e0c47dc94c8831", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_4-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b4322312057d096b22076eeea1f07381d96132f12e51459a3b66552b82371960", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_5-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5b4853db1f12631c99ef9e95db230b9cefca32a7455880157a6b1ea1df26c460", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch2_5-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c1d64af018770273c093d8c88ad65403439464536413e74f62d9a10eed3965fe", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_0-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7002021a3fa270efebb43b9de04b63718ca821e37ac4eb795d0abdd9279d39a9", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_0-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7428ed4f085074b5776c4651b1fbb3ba5a68f978da8207e5545495008db6e33c", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_0-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8426c7fe2e05fc2b7047368fb23e11b43be30a74c2dc1731c0867adc36bd41aa", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_1-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dac8cafe31ab89dbebfa373d22f10e53b546e1e4458d2aec57832bb5706a0cc1", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_1-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "06059ac66749d289fef459bdc5f4a331b0566793eff0cd8490e5d9c22bc3884c", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_1-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fad26d18f162e182079a9af75010c0bcbe658989e6d742b6905c6e4fcfa1795c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9d06b4b8d92e9adeaedb6f5f5bad3b32f591dac178955ef31a458057701b1509", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5828a2638089f88b076fa73a10bc857a50847d357c5c95d46aff8f9b691715b2", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a178c5bae18af35a9085d51608daf63dccd6edc7447f80025284c0051905d8ca", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "66f071e2f098c4bac6816dc67562493c3822325057f02f337647169f3213639b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54e9701358c130b38bbeddbc42bd94aa5df83eeb443a2faee8712d86f855d1ce", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "755dd08a0faaf568c172a8f9da169e31aa089ff9be5fac7db0589fbfec639012", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-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: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 53, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9599, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8f2d2c131321cc89fdc456caa65045d3645080c3cc122c664d2742fcaa166bb7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "15d1c54b777821a2f9321225e5c5370155eea379a7163e8951c7ef8b1d49f859", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cc0ad8a5caa34bab59ca07f6111bcaec1634491f1225ff2008079f949d2977d7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fab1652347857976812fbb1d29e9de74fe74278b5c56ce4e8af51c796df63bcb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "66eabafc106517605578ce389138e1a9c2ce5baba28a53c125db136dcad7cff2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "387bcc946e2c8fa4c5c8e42bd278506073eafd836740bf458b7945292714232e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "722f2b0945ad70eddeabf52aa24773fe1d5b09cecfe3734a9c2669ad125b993b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "75b01af059bf647aafdb43d7cf04ec9e2483d9866479bd2e8af65ad3e0cd2d97", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "656c0d234f8903c8b214909a160e6e81e2ad0770cc85ea86a4d2ff15a5982c3c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fbdb2cec193042f07023817078df50f63f101b1569b93b60aa7a0de90af85e8a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "423929ca282499f322178f9f28e5a1e31d0e06d6d404d5a2261630507a1ceb76", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "85b272de44d647093973d2169c21c4bb210581e7832084871ddacf287196a3e8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "19a293e34afec3d8e4dcfa3bf35cd263ef46398b9bb018aad1fef34996c5f1a5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cbff1c218c96d546a6f6df98a90e995c3b49bbe67db26f997c9224d77cc10f5f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "69f945049a81b8d6cf27d1fe565681936b71fc5f4ed96780318479a06198a939", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4712355c7f1521734cf004b0f28705358bcf0be89bb4974981f3d974e39b804b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "438400a43822d9ded785a011ac439dcd3808e02f337188c6a979bc3362a4ec64", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "72cc863c222a6ea240dcb6cd4f6a4008f0c1d1f4699be68e553972edfaa15b2d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5ce9b8019e54a447488a995bf5036719839b25fb279023d5d3b14ce122f4fd3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "50bcf89f829ccd6a0b1c7d3549a4f7d37d8d9d446baf9b7ef46fe2521628792a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4b9add27784500285dbaf9b3064ea6c26e142453babad8a829c4f4e3f037d1c0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1389045603bc686ad66db81fb866e528eda657af4b7e0abc3d147e387be606a8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "105b2c2657aa52a0538d297611debe65eafc5bc865dfbf47336bca31d9bf7c7a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b61f2138bcc79bcf243de7ac4080a568eb6018d86557e9b52482ab743b063117", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4fa543f49148058b3880c61e62ab2ecd5b51df73a04124df0d0c1240f2f9f635", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: division-by-zero-mod-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 44, + read_count: 3, + runtime: 285, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_mod_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_mod_cdeploy.snap new file mode 100644 index 00000000000..cb576af9855 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__division_by_zero_mod_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "61770b852c70404d767e86a6b34d7c126f33502ac8ff8f399a34a81728b90d05", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ec1f22e495c6d54b1d151174ecddb6857f2a5c8294a1fbe90f30c7fb5bae34a7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bcc5dcc85cc36491b6da28ad30b89432c95d2056345fd3ab6179f6643d6f265d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dcc071439b1245868f73b5f68458c2bfcf9ed24a9bb9b6e96c9cf6f11900b97c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: division-by-zero-mod-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(DivisionByZero) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 46, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9310, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__ft_mint_overflow.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__ft_mint_overflow.snap new file mode 100644 index 00000000000..45019b92d67 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__ft_mint_overflow.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "450bb80eea27de0b629f3441df2755e27dbd0d2d1d13a677ea72b39d3d3388fb", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 2295000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 2295000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0d530738ce145230b3a4cf24b91685e3198a27098e97e5fc89de27a9f97d261e", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 336629, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 336629, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c7bcd8ecda3ac38e0065dcab4d04758879717c05888745a5775b2ede071eb3c", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_1-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d769ec3199c2435bfdfa3873ab95e6c1845a9ae8cf704b8f96440da54778107d", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_1-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7fee1794fb705617864b2664cbe159fd13db7ae1b6d6cc01ea5b6772fdd7f6bd", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d2282a495d600b33cf3d269a2f0161895f897a611807a73efd9909ceada68915", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5d7cba7d60b291f7d5a1792b6b04e09c05fc6b9d2ba324a1460629483d5b57af", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d690ea8f238cdf862c7904bc8d6844f8bdf8c72096b64ecfb0e1177d05b49b6f", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8e71137e16f4258b0ddd94af5622a129cc6d62df543bbea9007de980c5f110e9", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_4-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "aad63d3b7668c9b6c565ad1a2de6e895b415a59fc4e2184ea863b3b2f92ca75b", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_4-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "739bf66ae32c825ecf3f4def2fd92e9a2b86526b082e1ad38195b43162a7cafa", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_5-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "66af750f793345dc45b533199ae559b197b8fc4a16f52704a1f5c9510b748da4", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch2_5-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d45f328175b7b5a110bcd1d81be35bbbc7e1032f5dc8aa812fe7d6c3b373b95c", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch3_0-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0d1f7af407145181aec9f1d71b7a9775936a6ec1932e319991059bb415a3a99d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch3_0-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "854f659fd7e37a59daef0db2f957ddcf95aa5c3c0a81158b2075d90e2d052373", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch3_0-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f689263e8d88ca1065000a0099d7dd8c0601c99c47f08240240d8aaa65972f1c", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch3_1-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e2d26123da6c9359f49e256430771cbdb9bd8cef056cfaa24c13f743792251c8", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch3_1-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fcba7eac94b8a72585bfdf2a65caaef4981ca7f6f8d345cac37de2661c26f062", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-Epoch3_1-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a974249bcc8c5d9442d84486d78cadd9806c78bc9487b54e339b032daf08307e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c5d5b7ad93754675142b57c638c27d0c8b32b5eb1c441e05f84be8406d1730b6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6e231bb95ba66731bdc4dc22d2fa1a3b697e7b42805db08af86994bd20fd9771", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3b739713c40e6c5d6270d52511288daba1a09ff89b767dd1ffc70ab7b2dceceb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18477, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "420ea3e1e95c4873efedfc496ea56e045927134b0dd5578a6ed5d2183a483fa4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "aff87043542e84f058b656b12b833fbf4f33eab0222724f761a23448b4c29eac", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b6c045f4ae8a5ea3ae5fd2bac65c379bc93c1e03293c3b320c2c59b3f2fa8641", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-mint-overflow-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: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 225, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18473, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d63140210137bcf8e75cd439256dbab2404f169e8c353df88b237ae0324522f4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_0-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "273bfb8d47025b9beeaddb2538737e4c66a925e3b1badefcf66bf4809e5146bd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_05-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "46d2a3a6c67b5d7330475420c4d2a6010faf70c370f870e7ecc00c99e22e13e3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_1-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f7160da2264c6fc4c8e5b9976e8e55234087eea848c20127f3a2088e92070af5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_1-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "334f5915e7ffb5e984bc44db487e9592ee58aa9767dd7e9a7f1127f191526d03", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_2-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b564d7e1837f12ec1a4e931b703d77da8ccc521655a1db5e0e4b89e9e123a8a6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_2-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5f6f5036316050ed9cbdc550273ebd24c04630dba10d5619fc1ea0641388c382", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_3-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9edafa81d3704cc46bf2058cc5f6b0fbc7d62ff4e2ebf3b7eae8290621741707", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_3-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0f55aa1d6dd50e17bc9244be167daa55fbb5b7694983f1d97f23d37276921551", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_4-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c627d5ed8ce8fb5ed148bca2270473f995d0a2f4ea99bc4e1570a191d9dad820", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_4-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b74090c127430beb8958d55443d351b1fefe358fb58c9088963fb8cf44ace645", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_5-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6a232a74ad71bdbe95e92eb8682da5b69749e30e893022120c364f63500303bb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch2_5-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "22604db30d1e66beb686eeac9ad4a4e41d9e26dc15ac6ee27ab56aa6396cf906", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_0-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a3696a0f5162f4465e83e9badd54078cf8c417fe8c480f19865d2a4880d72397", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_0-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5af7c625fcf1cabcf20e08dca3f293eeb8cec838a24156948c25af0e2687e7e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_0-Clarity3, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "74fe8e3f25cc5487440dd044472403d12ad72343694ec7deff30b6adb07e74ca", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_1-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f8d7b97526a1faeea7b5ad8d1ff185abae739838f03958f7a8c073830c3df34", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_1-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f1b7b86d1d693d98f94d0a2aa3cc94d7975a346fe0fede986eb5a982bf5fa87", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_1-Clarity3, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c16a3dc0fd6d9f783b7071707dd5dbfc6291b575066d528251cebf913a6f7b92", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_2-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f5b075d0372fb09b58810de939ae957c65d8a968eb5ba3a6c535ba4ad608247e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_2-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9aeae853b959182356f298b06e1453062bd9ba4443dd76561e02cb47daeb27ee", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_2-Clarity3, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2e64e23a607d5a92f4315ff1524df7153e41073cbe1b494878c6330c40d10fd1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_3-Clarity1, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d242393da33c5009a556281364f9f9ddedd506ff72e2e0e5302523d54f265ac4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_3-Clarity2, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6ed90495bcaf7d311ed095ce68f5711152aca5fde603915f07b4ad84965db02", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_3-Clarity3, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1a20e87c935a602d11d0bbd32aa355d44b68fe652f6d0449adf399a781f85af4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-mint-overflow-Epoch3_3-Clarity4, function_name: trigger-ft-mint-overflow, function_args: [[]])", + vm_error: "Some(ArithmeticOverflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 204, + read_count: 7, + runtime: 3548, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__ft_mint_supply_overflow.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__ft_mint_supply_overflow.snap new file mode 100644 index 00000000000..1b7a4102f79 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__ft_mint_supply_overflow.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "aafb0a188bb2b553a6a57ef44c4650fc8f3dc0abd0d6a803547465a787bd2c0f", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 2158000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 2158000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8c5816984683e1be8fbfae0d98536731cac116df9c48e41095170f5d50cf03b4", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 334351, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 334351, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a7340c231982f15de1bf8d0821fcaaf3f5187f369f5b7d1a213b2d7bd19b8203", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_1-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f5c3a44d0e3bb72e8caf19c5cae3b4191861f777bc4fcde41256eccde1ea56e", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_1-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "34d39273f0d65d330b14554cde0e99ebb58f229f9fd8a40e28712e6278baa195", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f1733edcdc731ee5a81242afeef724e3a9be3124f8c325cca12566a774d6f174", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c32c892a0655fd9e775899817df0573597cb42862e538120a33ad8f06cba4c98", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8e95af2c87d5c13a0b57946caa077f045612a6152ba13a55bfb9ecc67ce86181", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a01d5423812b113c464d9347538291b00df26a52475a67e372d26e6ed1875aed", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_4-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6c57b440637088a07b968bd3db3936baddb16b7cef4de975c74cc1253530915a", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_4-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5e810eab5e13d04dce1cb6de21f9ba90c7ca4cc71d8d5524c2a2540cb7a022d4", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_5-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e6736c4deb1dfeff749722ba1b5032104ebbbe6f76d23b6137c95fa6efbeaff7", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch2_5-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3ca4d4b72e8761b53f95b345d530442a43c9c22a52d8111ad836df6d26fdabc6", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch3_0-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2bee0d3578ed0f3e66a78dcec733b32972aab3e83c8e6180c85322c2e7e67ca9", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch3_0-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "26fc1626820283621274f75a595b84d5bcf46c0a68614b16e700dfa050fe380f", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch3_0-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "caec553d78f6ab25a58f051a112a294e4eeef072b17d6a3871ba7385c4a31d19", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch3_1-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "934e270d6b13e82e07b92cc3f67ba324d874662683a901de3c3b2bf2e8bae021", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch3_1-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "835e90eaf9dd502052db80de30c6cde7e8bade558f876113900c830438ba7836", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-Epoch3_1-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "77822ba7f76ba7ef14df53fee79e10c3c126683dc4f86a81405ac6a8a5184a43", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "116e9ff0bc724a7ab2cedbc1c6247e4b10234f11a318bb26b332a1b3031b445f", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8ea59c026352a1dbe267557fcc36ea0f176303c339ebc56c1e7edb81b42447cd", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "371d4593e1d5f6db050e33d8e9451f8ba8dacde0b2e0e519323ec7086dc6a1d5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18110, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a4b55212471d272ddc398a09b1d7d6c8764de05e42ddf5e6abbdf2f98c5f1627", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e3fc8fcbe742f8ffc5d704a48664b4d44c599175e6219d59d299364288f0bed7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "efdb92daf825c2b6df2fe8605984218b6210104cd6d04f08c5c65dcbe296dfed", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: ft-supply-overflow-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: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 213, + write_count: 4, + read_length: 1, + read_count: 1, + runtime: 18105, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1dc04b23e8e5bde45d558fb80e5f0d398946ce9727224c6588a2a7637abf41f6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_0-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e0a1e17efda4fe4271b422dcfca5c60724a20ac8eaf5df32658546b3ac985320", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_05-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d05637e6da48d4670f67db2aada880b072057a36d51b78b84c9662cdfded0c77", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_1-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0706b9b33ba2ab9cc7af0d35e10124ab7d24787c243ca8315b1aa967f53c423c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_1-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5a058f0d972c87b6f3f6cecab4ec9c5255ca887d84a1aa9b9447ebfa301cb8d8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_2-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2bc3c9c5c6f5d8e009ab83a2c4f45efa7e0e8d3c2b964d0e0af77f3923f6d899", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_2-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4baa3cb4f23d5daa184f22823c79e76f24d85ed520b22aa7878064d603932d3c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_3-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff40652eff459364de0a183592adcc7176afa32d04ebd8ac48e2440a3da70606", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_3-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f81ddeb7e495d68a2cfc839db790b957d1d7fd86d2af874e9d52020e74575ce5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_4-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fb64de8b83b9b0a8e9640b1c65ff4c4343f79d9e729c54b7d0a8b31fe55bc6a1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_4-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "df92e65b24eb2ae2249bf2759fd184de78242d30849aefb8a7cf96b757cfa231", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_5-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "79306fad706edb47677d25442674cd3efe27fe72da4c50d256baad07b2840158", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch2_5-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b1cf75860d0bdffb343f88ec31fceb891fbea3a10216952a897fb546d085ec3e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_0-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f36f65d767681871a8d903c0ec9a43fb4c198778bc480902fe465c8ee48b8e10", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_0-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5528a71ad0d4cc41e2d1b2776651ed38950a075ae06579954852862c1453b6c2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_0-Clarity3, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "678bd670790b9a41c539b0ceebfff05eab36504c9c516d241d5700b42df86e74", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_1-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c20c4b0aed9b1540d92a799bbc37eb13d384622eeb6676204dd473060186027", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_1-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7990d7a9751cc0962e2438ac9f8b50b75ffd4baaa74d9aea974dceca846dd7fe", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_1-Clarity3, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cf4c2f3e67d3301029f3df2796ae48b13db588dc9d54d77fd9b80bf757fbc77b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_2-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cfc954a52d3b7075d84eff9f9947ea8c8e9e28040f5429ecc342e63ee34b6a38", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_2-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "88fd560b2d989fcc858b23e9107180d4a238553d84269f20761b47b4731d1cd8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_2-Clarity3, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e530f03c30d4f35afcd7062ec853e4d46d7c6363172ac3eeb51d41d4e6d56041", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_3-Clarity1, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d47270afb9c047b20093ce674c8447e989c24f1f904dbac8e2eda478d7ea9466", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_3-Clarity2, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "65dca916d11e2df978b2805a9026b4cefb389e2155aabfd0ee33a74a9567c85c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_3-Clarity3, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d815a1196e85cdb9f91da6da6b72301d30474a83c8061be3e3632ef5c619416b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: ft-supply-overflow-Epoch3_3-Clarity4, function_name: trigger-ft-supply-overflow, function_args: [[]])", + vm_error: "Some(SupplyOverflow(1100000, 1000000)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 2, + write_count: 4, + read_length: 191, + read_count: 7, + runtime: 3535, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__principal_wrong_byte_length.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__principal_wrong_byte_length.snap new file mode 100644 index 00000000000..7b13e177fb5 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__principal_wrong_byte_length.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "caf9202e5fa4e693cae41d170567c116c69ce3438b0accf5a77fc8802085e63c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: wrong-byte-length-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: 3267, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3267, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a61752ad93c7e338798c1fd9b72bea5f8d36bec18b29f9a91782b97d8aae3755", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: wrong-byte-length-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: 3267, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3267, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6d9e7ffbc94ff61b835053152f25fec4c35f7a33b6025f4e54d8ed43a0af7c42", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: wrong-byte-length-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: 3267, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3267, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "17c9cfe6d2d38d6966f50b91d36034f6d7cd7ac905bea2ea148c090913cab6a0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: wrong-byte-length-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: 3267, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3267, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__stack_depth_too_deep_call_chain_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__stack_depth_too_deep_call_chain_ccall.snap new file mode 100644 index 00000000000..cabdce72db3 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__stack_depth_too_deep_call_chain_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "d56fe849996d0e3b6587486393881d3690835f7b26a47714f593de8211e08469", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 50662000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 50662000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e53c112dbbabc0878441484142896abd914420164bf8d0b7c24f9a53c62359de", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1165852, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1165852, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "94eee840db810acea0de9b2fbdad13f001c85e6a276f66f80cf8ba1ee3c2d925", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_1-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1b752de37ab44262fcc3de1aac1068319293ceb5880f2c3b22a87825586de083", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_1-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cfe573f0796af8f7fb572269e8eddd262a92155bd2bd946349aed88e27a2f1fd", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c5a4c22915e5a107989db02f205c81b626eb7637cdfe892b7f4cbdec119db81", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f4299dc05eb32869a81cb4bcf6c65e409fae9b9a2243453cdcbbc5cb8baf316", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "23812931a479c18a47a608a1f48353195bc3d9eeae7bd17986071e5e6b1f17de", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3a42009f475c52c30cd741a3d1e9090e4da6da87b291f51efc6736e017e57356", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_4-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "86eb589a779a0acc1ccabe1a6a17aa90fdfdbbcecc63fc41a3c81a33a92bf3ab", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_4-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "71d4878eb8d8ae3193a6c999d0bbcc326a465e0a840dc0f8ad973869e78d3dcb", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_5-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f2f12b6687929e156f8b01f591f3a203a04fb1cb9faa681102c4519a72a0736", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch2_5-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3c8a4e9c0e5b7c7e59aa3edb2b1473f5ae3a7c1c7511838636fbbff5b2543588", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch3_0-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "450cdf893256c0b83c32224d5c4f8314c623bf889c1587d5873f2a21ec9939ce", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch3_0-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6ba0c783029db574703f08e836172f0418b171cdd73773e908a6be2c6d4becca", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch3_0-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "34ada898bff66e805e75d2217b7fe887f00c52a6f1faf863cf29c403d8d85967", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch3_1-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d877fa511b03ee74ee71eb24e3859c7da6c28ba00c0b3aad412de2b5827f17d0", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch3_1-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "28834c86c1a728873bd7043db1c3e2db12222c7c097eb8414bd09f3c2d2202ec", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-Epoch3_1-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "23b9a4ce875ea4f97bf5e70bd8ca370bd5e09973872b80dfd3d2311cc5f3227f", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f9543e13f31693776d5768af36ba3441950fd887e46ce00f74a8952529a26508", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3a4dd02ae9addf6ac5c09a0f46fe350444471bdfe09e6287eb176210bf1fb6a4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "24f8b629dcf903c4b34a9c0dd305dbc863080077f2a695341f24b0a96b12dc4d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233609, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8e19bcadcb8ae355356b989031abf19643a776da07a78109389fdae996495402", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0085d916e049390516bcf97806dce379f909384e978c9970d1593b9a7f343478", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3e63b15deb31bf463cb4f30889711422381d71de762ed7d4531f09439c31b5a4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: context-depth-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: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 5481, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 233544, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "11738638fc960859bc60de67e0449e2ad0ca837f6f6d6ad2c5bc5aa2fe291c96", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c5c9381c1e5a3a2dbd1f94715abf1aa12ec024632f39e3eeb6a7dad78a65226f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6a544a158641d93991d9584c459c8cd0ef83b51fd3a4378f842d9976cc6f5fd7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a06f2db61404462a50aa61a30a5ba03c2cf70771fc5426b4c762f218b819ab53", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f670aa09e86ea95a5f907ca5efbc0bdcd52ea7d83d192301d16967568926f6fd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5c4a23aae793c9ac2ad5e8390b81143d33575e0aae396037392e06fad1c46428", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d28d0b5b9ed5431cd68a1f2794dec52a02e1a16f26127c0bb9a2af6b9aad46ec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "30e23497c3c4d7db1df919a2d6e4e1dfd25f61eef0be4cb6fed18f63ea8e7918", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4b4e73421e70285e4ebbcc7961a920887713c52d5a059b8d57e75e5973d44b0b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ec6f91ce7a93638a1f09aa8bb503f82920918781fde9b964a6f946f9cacce444", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "91f89ccd6a3a5d79ab8194c56e469f8adf5fb2e2ed5749cee7a759cfb52c5cdf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "66c700426eb7b686eecd13c7543012b5da26b1b6460cf90e3e22651172b33e29", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f03e6db938f7529ecc8f52b0a0eb00a96c56d903023faaa024d2ff91283eec9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "30734c62817f03c023351edb2279aaab97ded74eacc2b3b98f9242580f92b5a3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "15953a5f19fc1a11f0522f0ae563277704d0f80780e89c211911752931e6f487", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b568b58286cb03f377239ac60a5492021068e4ea714fac7acf3dca6439139742", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0d726e34295d6bfbbb170322ce009733b0df7969485c565a8f235b5b67045b08", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "67b19724ab70c0dfc5d449c11c260e9acac2dcbca0b68d96bd2cd90144d758de", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "783edd6841c30587a2ed30ed0232a69ebb73aa564bb3a981178a98d0ad36ddcd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "093165d02dee5bc5aed91c56d86eb78205bee1b1d0da0ccb8e097ff0d27b488a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f70c5a6f5ba531bbb6c7d2fca89cbec6acbfe662a41d9a292bf3a3df1aa1614c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ad65b6eecee569e1111782fb48eac719c88b262bd899d7b4c82b1e94af5952f9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9115cb1084826bdd27d3566ad924fa21b3228770b2f7e3ea3fc3ff7884c454fd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8cef53d598ad2b6a940c7056d717b259867de77e66f41c18065e63dfdb3871ef", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "da62b0259898684a266014da197affeef26bb2894dd2c7da0d59a05fa8af03e8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: context-depth-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 4238, + read_count: 3, + runtime: 17649, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__stack_depth_too_deep_call_chain_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__stack_depth_too_deep_call_chain_cdeploy.snap new file mode 100644 index 00000000000..9d27749adf0 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__stack_depth_too_deep_call_chain_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "edeed51d3c2b980a4566b07e4b51da9ed4496f0a545725af47d07efed69df698", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: max-stack-depth-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203377, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203377, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "22b629fa40233f750983d6f6c83a63962c1adbf52f19d992c4663fad0a7f67bf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: max-stack-depth-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203313, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203313, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5980c268c3a8974a5cb893a85cddc520adc566ecaa2af62afe1ed60336a9f707", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: max-stack-depth-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203313, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203313, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "969a2f6123528cccde34748a8bd96e0e3a27e43d130814b246107375df15f614", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: max-stack-depth-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(MaxStackDepthReached) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203313, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 4080, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 203313, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_arg_len_underflow_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_arg_len_underflow_ccall.snap new file mode 100644 index 00000000000..d20fb21a97a --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_arg_len_underflow_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "1dec7cea1ce69b9852767f85fb436ca0c09f3b671b87e7a454f0e1a136d52ad7", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 462000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 462000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5d338ace43c773684752c81c2268153439dfe143de2c6c1d71d9e902375b484e", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 303579, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 303579, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "39a72e1d5406d05dda29cfa36d6c7d18cd523644a764b76ccdb2d2cdbd6ecc0f", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_1-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f069ad247aec51c9d1adb947420149b7134fd1e68cb8336fe4c4dacc57a7bc3", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_1-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2d604cddd052539b66d297d7c8df168e3c3b924110bf8b0b0cf168eab8155ea9", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3d74975d3dab5a5ea9721de686c4891969628c3fbe5f4010c1610a1fe39c8f1f", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7da39926af3d5399688e159f661112d564c6971af268343e26ba2a921e6de492", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5f62a97680f8b87e9c9633889d951b50859ec096a5421a0b83d8bb0bda46dc4", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1cac3c38947c86db8dc266a2bf9db20737022cc51b2a1ad724e5e1b0ec3d5c88", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_4-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c6bb0cb1e28ee0deee49a22167bd459cac80ff428628e9e7e1ef2245b6c2041b", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_4-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5267f1e55a61b8b9e8aa34dfc0b9c530011158e9342fa659b2fe4e33b7a5503", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_5-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "29c5a5bf67263c6bc2139b3df617689d3b88486961048f8688d3ae02df4ff193", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch2_5-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "52e6e9e367f1c7b0169ae4fa4aaf24a981951960fced107c4402797399e9499d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_0-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c561d97d29450023f613515b7886bb94206036e037d3d8dfcf9c395e6bc6067b", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_0-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "415b0ad96f0d05884859a1de2f5570f8959108398e8deb05492b04d24c93f376", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_0-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "706c1c623fd004a0dcefd2f0b7a733064e37a5eda64d32ba9f0733bf793c9a80", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_1-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "455a7f237a04f85f466627b9699905108ece40c55c2d79ba9374f29a311e162a", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_1-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e1292c9bccf65e7e53393e3eec1a4846930a03b8bb3e35b2f8716ec1b1b07f89", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_1-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4fdd01d17e8cc5c2b8aadf674dd44f747387f3bcee6a2e37c7cbcb474e25a793", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ee43f8eefec73f1547b7d0a78880a14716e954aeab4fcf99e98fde36d84d94dc", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5431f67e1936e5647699141bce6f86494b2ce887f93b960d6f035de0de008e92", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "739bb07ab58484b9f25cc1347fb4cf1ac4ea2b6086f79c8a9c05fdb534752cc3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "932fb91f4c8b73eb4ac376031d494dae9eb1ead89280ed9e87764edee3af931d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "17d2351e95c5eeb881cad564db6f4234325b2a695fb34899facef56d57170cbf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3b4c897457de02743989e762ba022db100af31b4fb3969e63b8264d2e2efef3c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-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: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 49, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9358, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "28563f55e4533b176a8397cdb6ba74b515672eb2dbe6620c9b5e6d3919a7d0de", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b831377e7aafb23259c12e9e1d53d4a1582d6849462fde7b846acdaa7fd00138", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c696a22784b46cfeebcf388e4fa94c82e33f03e64a235773296c67fec88f658", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "041cec961b74dd96f61a3db83840ab85911a4f868d269755841fdec77b868314", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f469f47936c48ff3f1eafdc72fbe32f2c782a5b815b58de54382098532b5b3c6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b37a52a62e958e8893deab3a145b383b92ee40b13759bc0454a3b7edea642d75", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b4137493a1271fa8412c915eead9df58fb9a61147bccc7cd00fd4b5167c2b2d8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "418027588e1937683d3b54937b5a0c5587e1ff9161c306c1f7b95b351d738db4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "77709ec7dc16c34e1c85677edaf536fe89081ba6418ee4f4df039a41bea0a140", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7deaeec05f8b3152f71b97598ef436525f8ef8505059fd8908e2165b8f531819", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a12bd4c3a67e9be4045909a5c00d0ebe1b28dcc843845d0979b39618fd0d231c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4c36fc8c5f897e3e17daf7be648b290acea835ad97c003cc8f799ed7031aeb0e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "156bba499f0308e16c9dfdc2046548ca250c48bca1a8b6bec47d2d964854cc2c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fcf033e593e825872545c052836a9cf7e25ecbe24c1d1d47331d08f6af773526", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4eba3726132f06deccfe0971bf2771cf9747deeba87478978f47473a9ffc4f8c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8aed09ccfbca399fbc7ae2f8fd39208ee7d45f6a47a95e63becdbd351597f586", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "860e60ab471628a599559e4fece6399c5c90172175c58688428e938c3f7ead43", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b6eea5ec9f060cb6c7bcc81b903dc7ecc828ce060a8d3584154becd4336cea4b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4909643ee9ada0af27340f9698c06dca04bfd4af6c0c15cca5c4bb70bfbf75a3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a19d0e73659702b3d9deacbbb22a7f41505a53b143f5a0cd1a73a27f49c20c70", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f13f7859b824a07dd536cdb3c2a0ab19bd960d8120e5f5f6261778e8b3d91ea0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9b7f4f85179e2627e94df0cb0f7d3a0f2c4d6ef9bb0f073f76d20384262b2934", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "917ce2d663fface67eb406aa58d632aec5060239cb135a18858d1c9fa2b3ea9b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8c1668922bea52a4edb44656a0633aee9f7660e1571090a9416d50b154d85c84", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "46c727b18f80ac48db9b4fef368b380a1b0b6e9feda13cf1dc3a104f75b56f53", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: arg-len-underflow-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 41, + read_count: 3, + runtime: 277, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_arg_len_underflow_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_arg_len_underflow_cdeploy.snap new file mode 100644 index 00000000000..e8dda328447 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_arg_len_underflow_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "649dbc0fcb271409512009fd37644542578f70d371499e7e9ba1139a37bea3f4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "17dff28755ca7f70da915e3486c57599cb438a9d3df734123519a299d046968c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d96d73046bbb910c5f9e6321a8b8672f8de04743b4085ca2ce0bd198caf51640", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5087cb41951a8d67876d58ac0f29f6ed9fd75cb8b0fe333f3e0f922bc96ea50f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: arg-len-underflow-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 41, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9026, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_underflow_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_underflow_ccall.snap new file mode 100644 index 00000000000..cb4b2654edd --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_underflow_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "4ad4e1f895a4094b248ea324d5451fc4700fd0a9a34137c533893a345c76c156", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 622000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 622000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6e643a9986471a264e624706a9fc8b600bf9d057b81f69ce6cbac0cc215590e1", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 306296, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 306296, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "40576ca43bf2d46c1644c57a9f0ccd0df20e6da028f9afe3030157fdd2867bdf", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_1-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d4072f21086eb2d7722d5006de95d0f9e4f3ad336a4277fdf89a51ae7fcf72bb", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_1-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c9ca915e383736448258a33b39824b26ddad8fbbc657c1c0a2d62b91ce66f97d", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e77a4094397e046d51a415bbc5e7a1d532d134e1220044d7f1929a880480e090", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "31542580f216943ad73d4e6fa5edb18cc28c62b4f02279074cf7418fa0a27932", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "20cd2b4659073e708f60a39eab37664cbf697d2fde92ac4eee7d6bcabd762c63", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4dd7c0b2d3734fc568668d2cb343634f2234255f27c05e99f03c6e5d20a20c1b", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_4-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f932b3fdcb5bd2bba96a02bee3f4b620b9a0b427710c208ecb195cbd73e8a3c1", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_4-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "684d017fb925181ad4ca69ecaf5565477b32344dc9d586a804105f227283c45e", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_5-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "07f1041ada4323f52e91e5549242b042ed4f744b5b7c681ef381c5a6a7a6a5e2", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch2_5-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "027781148e617131ffdeeddd38482aecd4696995c4693050b939f3dd755d7052", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch3_0-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "92419c3fb93b590d5eeb4f68fe625b2a7682cb6fb183d3017fa1d315efed25ac", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch3_0-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "78fb3def4109169ddd8d3b125e457d94fa7156db09d3b53d5d9b417e82f5c158", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch3_0-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "db34ad06a85696d8eaab64770f2332fb4895433140ba90a560169edf88a03fbc", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch3_1-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "099c8604fd51d621f60f2fa5ddb9c95f299d608f276c74b409375a70d27dd8e5", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch3_1-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e9a4a0b0e08eb76c23e79e8df16dc3089f1107878c932f375e7450c17e51bab3", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-Epoch3_1-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "246d14df6944988c279329ecba7f42d35dc2a660e31ac03519c3260a9755d18e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b073fa6e8e07384ab1fe40e348525e7ed479a93d8afd3e6e4deb3af9dc651f01", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3b3912688629d32a012e3924304b6d7cfacc80a4f9714a1acdf267e5fdcab480", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e0251be613d018550b78480e471742f7ab0fbf6643046da14f942daaa0360dbb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e6784d05c6c66ceaffccd6c627f258b01b51ca54b501fc9868624c389e6d1af8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a440c7d5b95553e7332d62e73eee9e573a8bacfebdfe9e036d5b68c7076ca2ef", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b34b522d063faabd4ed6bf2571e42225c9279a222bf308028857b15cbd5274f1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-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: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 64, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 10017, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7d0a05d5a16af370ec7f7941c64de0b3ba5bedfd8e9a8e694f6b95306b7b738e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_0-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "76700742e2e9eabaa4b2d5c72747c5f7559d725577936c33f61b1984f2109de7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_05-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e1e625959f7461add84fd48e39b660f22ddbe8606c03d3ac0b7d5d8b180289b2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_1-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a74b8833cb614a90ac1554042e3dae78f1ace974240d58a64565a7a2602518c9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_1-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5f3aad990b0c1f5d0506aaa0c16c8f8b67c8a20f9e863c74d1e8b4e164eaa37d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_2-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dd822a32f6fcb8066606dbd76a36aa7237a110bec2cf6c37127e61068b52f87e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_2-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6b8fc3a0d42062f97dd98ab47f2ffe1d32c14648ecb2f8b7b129a3e385100768", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_3-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9f4cd72defc35f21bd6d14e425bf3ad1924c8ded32c184fccef59ad9b54c6a54", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_3-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ccfec0411438dd751c162a7f8a1caf97cf2ad5538a8c075ca65ce63005bbadce", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_4-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bc00b8426a600f4b38428663b418e109f3e09ae375768e52a9a7a223e8e6ef80", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_4-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e79be9f04cc88d128578dd084e64d6902ba2bd164085c7095a33e71e2ad4ecad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_5-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "781e50e1bf714706599729e9e91f1c744ce5baef6d87e7fbf5fc2ff6565ee681", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch2_5-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0eaa64629076a6c271e3738521c8dd70fcb384d767b40bcd29e75bb7bced7d27", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_0-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ab655e8419ac82b047016d9f24862e6588a229d9e975b325ddcd7b5ebe84b086", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_0-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c16e0c2059a6ab3af429d99b31937375803a5c8630fdfa501682e093e5cfdc08", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_0-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ebdb6237f178838a21aeba453fab0f31d3e35e3af424467e896c11a39f76a962", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_1-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "35525c2d8f3b2789dfc3c94d5684a679f1e13eeac0400c99e194034adace0fa6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_1-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "95a448265c16b1b5859353b6acb4cb3da95dc587697e7c04289372f2e9c2e620", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_1-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8b05e166548a5cb79dc122c71498b3feb588d746782494f93f82e91837e9aa3d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_2-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9369a79b722b92ecb982e4f5e8521f59ef09357bb8c09e849b5c91d3b3c77862", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_2-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1543b0d37297ec64d4e249a39416a8b1a3345d7559d580be856700adad508c7f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_2-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "78fe76dd260404492cff175a420f4a6f25b97c78efaee24da8078d86b53a6af9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_3-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5be5e4ede6124454e957b317e7009a78fdc2f3418f43aacd125b35dfe8eba25", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_3-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54f5b97b93a41e96a7a8843c52be3410b011dd8e61375760945118d560b1f0fe", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_3-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1e9d880812a16c2231ca4ee851d60720450ad9c503e8e287f14586c8a32a341c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: sub-underflow-Epoch3_3-Clarity4, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 55, + read_count: 3, + runtime: 302, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_underflow_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_underflow_cdeploy.snap new file mode 100644 index 00000000000..31c7a2054a3 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__sub_underflow_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "dce217f957d6d3d623cfba04618bd21ec2c598fd4b895020c8be66f84749da43", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-deploy-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bc85409436f5aaaec7a2b9c9048e1889fb16c7239325dad91db39b3c0d00c30c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-deploy-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b6ce69f6bd030c18b9033172feefb1b42e02bf7c1899b4a26e9995f68016ba18", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-deploy-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "69004f87f1a74c2d762d1afdc9d60d7a2d5e53f68892ac10007fb66afff668db", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: sub-underflow-deploy-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 47, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9354, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__to_uint_underflow_ccall.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__to_uint_underflow_ccall.snap new file mode 100644 index 00000000000..68b2b439372 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__to_uint_underflow_ccall.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "b9642a249a9bd39247f15dae03202f6e970cef64b50b59412919ca3da24b4607", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 638000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 638000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "97922f2dc0ef2d84b7f819dc960599991a6337ddb4fa823be70f73e46e8450e2", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 306539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 306539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "103f108f2038017644f3de30f9e7b04e1a2c7c4855ade9190f2cfb7f69d7e1cf", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_1-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "90b1bdacb0524ffd5b62f54d9ee58813f3de0a672f6c4dbccde95dd112187004", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_1-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5c28c3f76d7898e5a9e5bc16c5ee00538b0a51d16b61d963935e798f227ee2e", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f2917f4028cb0bf054119ae132489ef8c33e67bba2fdd51bab7ce777d4559f7b", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c3b32ef4c90f38c2346cf0e69ebf20af62fc35fb9970222fc71ecb4a7f007e9c", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "18e8fa9298ba84b032dddc8fc150aca8f66b5eb5b9bdfc83ae45a3f2483e109c", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c337c0b43b291ffd2341b4e38f66479ee195b8737bf275c96e50237724d959fc", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_4-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2f92cd7710c56df449dd9d4b49bdfccc7d2ae300639c870a396a27949cd826c1", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_4-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "152c7b841f3940789dd78366303b6c0abdb284b1c0616ad74a51dea701fe18c1", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_5-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fcc73f22d65642c4878bc81d41a35fa1b383bcf9098ac3f98e66a7a7a14e8912", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch2_5-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bc02874b1d66c94aebca0d86c0d87ba30fb1f5fc28cc3457026dd43b4df344a7", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_0-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "14b17ba5c52cd41305a3163e88057280186238f5ffb0a218149f96d76f93c983", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_0-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3e755e6e8b7ae30d4f717fc8f96f768036c681bea294bec5f84be3db427c1148", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_0-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "640fdfb2721e465d6d12526608bbb6b2e284938e89319b36c8b7e05405563da4", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_1-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "13f39fc80e2e6158384c2e41fad3a46e17944205a0c0f6ca5c2d351a7a6f70a8", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_1-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a51d2b6c10adb81455adf9d58190512710a1d339f97e0892d196b6cb87b19381", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_1-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a67a7a10ad6a159044e2f869435c8a7b195f5c98dad2dc5e123ead14b98812cd", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a6c7fece5d2dff6e0f171aacdfe9bd66486b9d80dd1d6278cc30d8c3203d855e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "697d78772831c47261f6d746ff0dfec019ecae40f910d85290f51d413cc5922c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b6494488b631592375eef0c2e2f9067f9a5d74a58ad3f43b15c78dc5edaa8b96", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48163d9871df2001dcb2f4954648a62230354e1e4e63a6bc035f8eaebb481338", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c226c04dfc153039e8014e7c1473da87627003408dedb4de62423ae864839660", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "288953b883048982ba270860d64d116fbabfae57372ee409b4315e66ead9208a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-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: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 65, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9966, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0c94918696a504cd2f1090d7ad78f561393fe94caad8f5c9d91e18986cdf2b57", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_0-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3c8de5c716d7a38b17824a66388fa189b055ac403fe2c8e122c67361c6c5a5be", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_05-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2ef5542ae6107adef80251f0f5e889bdeef9ddd6ffc7e6e1db07be4f347d83e1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_1-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "28947302613af3cf959c22aecd45a80e1603167422e07cadc00d145b4831c114", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_1-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b1ab57f463c5e5ac0aa994dbd0c7850465e5ef983aa29864f752e3774bab6cd1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_2-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f33478765c070cd3d56fd074c247471220f69c58a4980e82efa054bd4c3c76c3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_2-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8f5768d16fdf660d7c61e35d13ee1725348eb2dcb2760f90a27148393f8b3d3f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_3-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "da05c762d4714ac4ef44b50c6f2316fabc39ad1209cc8b75649a9fef1aeb9f14", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_3-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "963fd2b586cb90f652c7caa909c748d574079899b747f3ab5f015ff6106dd346", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_4-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4d345afb86d0d89412d17e16a6c31fd21007d4acb4151d6e3f8fc15ef0320001", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_4-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f1fd046bc97c38586413eda1c319a01bb31ebc2c2500d75a0ac49edc33a528eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_5-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "59dc47b3fcc2af9fd9ff0674aaabd0fd9f950a9598dea30e7887bc94b5f1ecdd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch2_5-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c75b3b34d187fd4792b5be9e06300017025402fe62252c17c5132674717c2c89", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_0-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "69d7aeac5e66a692ed617574a17786ca62d3847272fd9f4184feba3a47d3bc9a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_0-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d22528f0236783f3e446c847e55ec31b712326ee1d29abc342342e5fc7f82ea6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_0-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ffad89468ef8a2b05b909889a7a96999f21e50b3facfd4ca0a8313b359d3a64", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_1-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "666cf9c8c7f1882a0596942ac05b7a7468a6e02a22ba567921f50620595f0b0f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_1-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8d6e8dae0faa92b562fcc8dab96bb49e12439d281c37d8afbfb17cb6f667ab75", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_1-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "09d704f741b449e489d50334157e5032761d05e47364d4793b2444b349abe1a0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_2-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "40fe7ad5b93d3fad78e19507f3098c814eadd467de2fd4fefc57244ba069e2b8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_2-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1151bb933e237901b3ee70fb21d6d9acb3001411617b57ab1957a8170232230f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_2-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a97ceff540a0ea1e204c1ba6a5338c506ada475a9ba3aff4d6e1207eda0878e3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_3-Clarity1, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2caac0e5f21f34e5a8ae0c7a287f1e41b27bb35bb3dfb1afbeba2f5d90b0cd11", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_3-Clarity2, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "021f7ec7ba80c5cfe1a21f70088e1878aa6eda7b3a2a61f96199fed133003bbc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_3-Clarity3, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "783836f866530365342fa8a8422f69bb6c5cd8536c00b85e6b66ca4dc1309969", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: to-uint-negative-Epoch3_3-Clarity4, function_name: trigger-underflow, function_args: [[]])", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 57, + read_count: 3, + runtime: 292, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__to_uint_underflow_cdeploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__to_uint_underflow_cdeploy.snap new file mode 100644 index 00000000000..8dcc3f88221 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__to_uint_underflow_cdeploy.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "e98fcb2f30a5cca370fc492fca335c2094657af7c8229458cf187a26f82b8bbf", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cf1af25581cb9d57bff365a77bd13845ac599b43a450817a54825297ec823ff8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9544dc80c5523a2ca709ac057b48af572df8bd4269ccf3fc41143eca796bf6c1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e11d599b8198d54b3655c9072b9eb6acc95465f2cb60280d9fd9f41dd5a2441b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: to-uint-negative-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(ArithmeticUnderflow) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 48, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 9291, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unknown_block_header_hash_fork.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unknown_block_header_hash_fork.snap new file mode 100644 index 00000000000..8e9edf3e0e3 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unknown_block_header_hash_fork.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "63dc062baae6a6d57af715d6fcba2ffcbf981e3400f9b02ad9172fbdcf61b83d", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1652000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1652000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d01133992e1fba3b788f13a9f7db245d255ee7da9c5ec043681345e36000e67f", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 323756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 323756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "04cb9da17776ed1762be63c599961e2b23b1941f7384d46acb58c6d3ff394daf", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_1-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b93b1ff925cbe6f40693398bf458cec8ccdab2b1cf8cb8f455fb1c7080dd4d21", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_1-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9b9dd6370f5b5a0430548943b962bdcc54154af14dd4caca5ccc9a4e42e5f56a", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4153a29461a6e44eb3d43fc963888a9dc858783455913915919d740899c0dbc4", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d5f62ffa140183814e6eb539fc37da78b600e83ce29b445900d0bf766755c6c2", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "27590d10040cd6ce2731a2cbf78c936dcb6c34000e36eb0eda2944d9bd511b45", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff3189cd8d3ce65d1b2ffecda71fb43cf112e98972dcf9585ee6658156922585", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_4-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ea0b3f18dd20a1e10980cb9a27d35abd4a2122d24e4414d428a91486b68c259e", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_4-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "169a8fa93b89ab91e4ce1013aa67aa4e0ac1b7fcc1a88d12890ed92f1eba2ff5", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_5-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "523fabb8977fd1a3d8877bf9518a41a42831279b1a96b25d0d34cf8e6d0c8984", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch2_5-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6e450c83a3130f6f1f9f6cbb7d550f119c406e1e432d2d873def6949c0fbe154", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch3_0-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3f1b3b4236f1c30369451eaa18efae8cf43c2aab987259fdf0ee8f108131af68", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch3_0-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "64512f2c7d02d4064ac16769234b7c0baec802a398536b6354a99d878d31c3ed", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch3_0-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "789fc7fd1e1a474e62058f7213d4aac4c2b87bddfebc53ca744bf49112e84f82", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch3_1-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "234da95f8c88813048a35e518dc0caabd4182d7372900be0fb416375c5d08103", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch3_1-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7e6cd55b0458368e704b251ec936d1fce75046cb348aa7dc8790e5a9def443a8", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-Epoch3_1-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d80875a876e8a5f7fcc4e71c8d4779fa823f3f94bbddb39832f0b744dd26d76a", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bbcea02015f41c086a567c8334f034a5b8f111d4e121f1b71bfa53cf3485b21e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54ed0e520425675c7c5add320df60b40bc520f638ac3fbc0906f5bc935ae434e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f5ad74e431b0326d17b9d971bc7e672018aa3858693040a356858a769573f064", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14097, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8cb836b2d76b9220d31f89b742f69c0bd427513be580e147a7ab39924d0ab53f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1727d62d1e90a001832e29795501d845fdaf6ef496e7bc2d24b04efc56edb307", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "21f18b077c5e83661dae715aa8557a7a481a543abe14472903bc62940747deb4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unknown-hash-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: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 160, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 14096, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e5780b9f2fbfd89ab41b96d119348f001645ffccee486b18cea0f17d51e9e8da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "df849004f962404abc40ef6086fc9137214c3e21ddc28d8de4e87da67b45a6ea", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_05-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "71fe78442e3de0b15b45915da7ae5b1a88b710b8dab3a8483269ae299483a375", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "414f138f0f34719010c214e25eb89e93c5c900b5af8086e67b3154cadb5a9e34", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1bf986c1d36d01a3f24d7be494423125aad008126f957561f5ff4292bd08c2bb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "668ef45d80b96aa6787e02632e5f1391d34dbe78a474e633a1b70b0d799a110f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3e41dfa75f8b1a347f5792b854c8dd20edd5395faf6acac87fbb6d028483ee5a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "58c86e9de3af8ffdd3e66fabc31699a8dd33bf5e5bda803e375104e4e1121c57", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "129700b8bc54133ae449a63c9ac5038e88b038e2c30054e100c9f909320321ae", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_4-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e289ce4b6bb3cd75ebfd514a280ae1e677c8eb4bdb008c68be0cf86c7aa7dc91", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_4-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3087abd4f9029e03e616636a1d98b6dcbccf466344262e7aaf2e22702b5b5140", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_5-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "892560626dfec35655c3640d756428cce176d9b9cf04c7a69dfbe28aacfda318", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch2_5-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "13d46c12f95356d4952526a4bf81c4810e07ae596e285c79bf3151cf67041313", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_0-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "12ba064f3a463f6fc5305745ff3401c6b9382526601530e332fbd749ff4cdece", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_0-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6dd8e8c6c296294278c501fc581bd686b4df206188e37965b97663d3256aacad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_0-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "20a768c7f1ea56169f888d825381797b82140d02af80ad64aa3099171bf0c495", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_1-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eddab2f40abe524f308489378e6a207009721be242403486e9c061a623fb99c1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_1-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5963e3717baf855a5fb1b34536d8cf190a70267e2518791b719037bcd0cdb5a6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_1-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "97e0a67bc0c30bb591a90368e07cec66ce8dc143b19d651a07156971ed38897e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_2-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5fdd293ff0977ea35fbf7952773248c01c3ab605702057e1bb487dc7de5ad5f2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_2-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c3c777961d152bc7321db4f0b989bc58f6dc2a30b16e108db295944bd9f6f3a1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_2-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dda0a00166f35de75877e6f9e82bce0f43aa56535dd5b7dfce66e114f40a60b0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_3-Clarity1, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5c8d6e110e4b8f30ef1a2487f061708e8e6dd842abe43a7f5720a613b1514517", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_3-Clarity2, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2c9789ebc4d2a29ddfba06552ee40bcb2317100b2522adff507a7492b9ee68b6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_3-Clarity3, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2e41a5a2141f2f173900314ce10fbd2cbde34c10a1d046c52d6589fa1fa2fd97", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unknown-hash-Epoch3_3-Clarity4, function_name: trigger, function_args: [[]])", + vm_error: "Some(UnknownBlockHeaderHash(0202020202020202020202020202020202020202020202020202020202020202)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 147, + read_count: 4, + runtime: 1589, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unwrap_err_panic_on_ok_runtime.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unwrap_err_panic_on_ok_runtime.snap new file mode 100644 index 00000000000..1944678e15d --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unwrap_err_panic_on_ok_runtime.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "cb3e9a1b9a5c1b5aabfa9deb7b5eb95756dba1aba2ccd1b973e8497ac62fa9ed", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1048000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 1048000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "921e5b259d6a4cfdc9d2d7a42ffe9d50732b4dee86158424eb2bd92a7e0bd646", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 313014, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 313014, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e8a98c013ad8aa278f7f37829cbe416620fd57b3f8be7d70365b38d9b6e13cd3", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_1-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c2e8b9849f6aea5bf42c90f5c7d84d8d17a3f5f981939454ca0366c9a1729658", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_1-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d5f922fe31a35dbe05681b981f2ee8a30ae3f5739d4e56165ca9afb41f6d9b99", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d92967b937e6dd4e036656c7c98b8ee23727e6797bb2cb68b6347ee3380a21cb", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2c770eb4f9572c7f923c6b12ad685076e60f1e0a26564890cfb3033149dcc867", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "21f8fcbe6cab03c6e2ec7f0cd45ad5ea2a8a7ce0b2c25bcb8c68ff96b0c0be91", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c2aae7cf06156eeff0946148c1a7ccb3cdf593485c28a20c68c0ae1f5fd6d8c7", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_4-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "43351786cc490f513baa11c8c067f2dcf53e46250db82c2eebe3f5318fa76b99", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_4-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48ac165cffd00948ad0dfc6a33768b15a078fdde60100203909622cb34398d65", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_5-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c20d53fe06a8c7b7bcfbf00cbcd061488531031e5b7dea9d1dd9a2065aa97c4f", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch2_5-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "472b626a9e686a7a17e824856f6a9bb970663b64f1e5faacb139fc2ab671a717", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch3_0-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "83f0ae799b3633bd9bf32c8039d8fb47fbda9a3d93977789562689558a8a4692", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch3_0-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "70e2c456f5dcbb869ec40b987240ea761b740315f1946ebe0c02e6f3937908d4", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch3_0-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4c11093c8dd5fab69296d1e93075bf13c0a05607041faca8f8efd827494fdd54", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch3_1-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ebe4597d19bc46ee8aa66c85346b46dfa6ce7211fb5f55e7b323f0be2ae85527", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch3_1-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0e50965676b20aea80dfaefcd6490b92262ba1b27fc97507f3315c944c354087", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-Epoch3_1-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8a885876d0ede67d094d0e24cb7841c2338eae115adc93d29f75e50a448bfd5b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8e964be063b0d5c63d196cd9bd68b9e1232276e57fd78b04e5bda1baaf612b16", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8c84a980c89e4b06b255716ca356649f4570946ade58acf311844588739c2ba6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "745f58c84b525420e9bd213139939c886b8ff0377e53c3cb652a7939c0da0bd9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1e2cf41e6301fa8012abb536ebe7bdc0e33f2ed5d8656d6a1179da9c7cb7f3da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d8e56a5d8eb933ee578196c485bdb137add32ea0655eb6162411efe3541d279c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "822e1bd7cf5ab05cf7434074c39f1f57a3b757459ac0262fbcd6e1a4381633ae", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-ok-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: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 108, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "383765fdd81c761234f14621530506a926490243764fd3fa668eb388e72862fb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_0-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "069c721e86976b3b2df02c8b7696c4ba2e4a0d2ef4a3041e482daa5a2561f6b0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_05-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ae74f3def614523ed8e4dd76c65153a239e1459259f0e1c9e15b0a816867bd4", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_1-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "63898bb7b14bcc2e25f8440408bcaa5daacfea24a2d58daf6c45c68a7fe3f67c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_1-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "40e24ea225ea2fa0718c34bc8b5537beb9e9fa541601933f2c81e26d122d12f0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_2-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f63e0ca65c53cd082948b05f6fb99b3f0c5eb6b1db81d40547b1205fda0d652", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_2-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b697b7ec0c2e87fe117455885d3f4655f7909f1c93c771db948eba97c2a2b952", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_3-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c53e725ee67f7fcdde091ad1deaa41168c19e69a6713bbcdf6f136029539de13", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_3-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "acd9fb3e1f39d280ff8e6771d6f06ace48c7224ba7cc5d0d1549613dcc3ddd23", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_4-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eba481b765318774edc355c656bf5ee0510297cfaaea8ffda7a75583d716a199", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_4-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "95907352a24aff814d545756739b7ff2796656e1e6e29f12001c37a22e00df66", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_5-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d34c1b683f098e7556a21ecd3b3b87b0d6f924324f26bfe3e43ffbc18fa56a57", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch2_5-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "40885cdfc921f97209e5799397132c8a150a9e9347aae2272cb9ad3fbe7cf566", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_0-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8faceba7c93c74406cd208d29c08b9db3e153a08d2f7e135fc2a9dca3c0419c9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_0-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "54e5b3d3ba7dbd6a8d13df999a15e1826b16323a6e37b77b418055f9196d6e37", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_0-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a42442dfe7554ed20c06b0527d744d57d52081c97bdc91dde3dca445548d3283", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_1-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d5d6f01526a2dcc028a9f8f2faa4f09993363e078263d69ac9fb55ea69788a34", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_1-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7b7267ccc55265120910e134a6cf9eb7460a7111368777ade64b042ad0e15646", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_1-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5ee538f3d82582ea66fb243b5aca8c30b9b6806f7a6b16f1c3fd8921ca3a39a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_2-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "13d26208ae2f7972fcb26a6924f00547c726cae33ac5320a55d5608aed5a45d8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_2-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4be9c8bbcb949faf37f5c2395a6ac54494855e299b3be91be98e48677c615d2c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_2-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "40223f98b240e3ab9abdea46ef0eb70bfc437045e43c4ec1d640f3327bc1e419", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_3-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "81da9e7326765a11852607918144f98f61236cd00b8e8f85c5f1448760329f2c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_3-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d6f592fa2e65314cdfbfd941b6b4ec784542696fb07b26516793d6078d91c6c7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_3-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "92f1467f42c1455397d1c70fd077f1b46eb9d9d1d997aa4f8b229d0f536e21f2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-ok-Epoch3_3-Clarity4, function_name: trigger, function_args: [[Response(ResponseData { committed: true, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 92, + read_count: 3, + runtime: 557, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unwrap_panic_on_err_runtime.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unwrap_panic_on_err_runtime.snap new file mode 100644 index 00000000000..9b45649f988 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__runtime_tests__unwrap_panic_on_err_runtime.snap @@ -0,0 +1,1456 @@ +--- +source: stackslib/src/chainstate/tests/runtime_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "001497656647c5b5bd13d51e2210830a35538d5d9f41499aedcb0fcf2445522b", + evaluated_epoch: Epoch20, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_0-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 971000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 971000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f1c39012d625f9a65192c7dbf00928f7daa840d8aff862ec2f5868b90732f354", + evaluated_epoch: Epoch2_05, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_05-Clarity1, code_body: [..], clarity_version: None)", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 311719, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 311719, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "816504ecb55d5359e9bb780dbaca9a65f8df0457b9dea1542c2ab8fa8b0bad12", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_1-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "45451515810c2988fd6beb86272b9d3c91b85bf2766dcf3449298ff119182214", + evaluated_epoch: Epoch21, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_1-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6375bd87f3988782d93463931c2de8eaabca8f7cc034c8c87ea3f447c87bfbfd", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8784a59c30562f2b74d6fdd843fca0788060fb5b242d18a3cc85fdfdf91724ad", + evaluated_epoch: Epoch22, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "24e355ef6f9a290f80db02efcbaa01d6241748e75790acbdbbca366432d733b6", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ebcdbd5b607f7c6bcc4e6ac66d0ac8cd617cd2379e2a52291ede2e14d191635b", + evaluated_epoch: Epoch23, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4c33be41a666b7f599526921b87de431181c7bbab75a4d99a2a7e5d7d3890359", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_4-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2b3a8b7f02cc44c3053bbb6254d7f8335e986f70ef64686f8c40654cfacd8d3d", + evaluated_epoch: Epoch24, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_4-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b5b0affb12686a5739ce12ff6adb76aa17621c048d6f48a80bdecb803ba702ff", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_5-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1312e346df101ad6d7a2d31f78b40dc25e33a8f63ca95b1c0e1e7fa7834554f7", + evaluated_epoch: Epoch25, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch2_5-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "49ae3b6ee0dfe7e409bbc75c70ee4b82cfc546f2e3a5727d1840899eb2772af0", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "821432cea3cc312276ca1320c2e1029e15bf07ff705e5a15f116122be67e367d", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "90e1a74e490a060a41971a1cd19c5e2e39636b1c3520a64fc52cf9972a1789c5", + evaluated_epoch: Epoch30, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_0-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7eb001c24a645c28a6c326dc3c75acc8070552059cda81c38cae990404f6eec8", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "298c4054595fee5c1aeee88592e3afd32f8cfa811b238789ab7dcb443fe8f1d2", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "311a7849f6c8b76861e24d4d148ced609d31a03e3640088163d872f0bff2be87", + evaluated_epoch: Epoch31, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-Epoch3_1-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9f05ed7d10dea9e03cf14d1a3cf085d5838032c615df58eab3ccb8bbaf21d5c4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "61913f74a9b04a8f82432d7689b4ec5f86aea8ac0c150cfdb02f287e785d9403", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f8989961f6ee08100698dcc1de53788df6c5b3bbe1792422531810f7b3d901bf", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3321fa91a808dd3b5f741f3accc76026ca7a70d4ed3a269efb58bfdfd23c097f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f48dc0c5aa16163d55bd0472be85df7868b0fa36d00cf731891783d476e17c27", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6f2ffcd751fbd874ee2effed387af41ab58ab911194236047902540ee26a00ec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bf5bc97060fab1b59474bc665bc611ea0cf35f770970dbea168c5b02e8586d04", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: unwrap-err-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: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 101, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11000, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "05af86491c7dca400c0de7bcb7b8eafbc9b8bc9462e75e2a45bdd7a1044cbc25", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_0-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dd4ae025014e349acb2e676f4949dec2417e8eb2335f5f2d30c07a1af6758557", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_05-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6a0aee731564274557eacbdb0af921251860e5f570997547e4aadcbac83c55db", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_1-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "462d5ea4b5f1ea68520939b750524cacf95f047ed9c0dee61ef581a94b274484", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_1-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c0583ffec3fbb3e6bec64853d6d809f1e1a650aa9f29c8c0a36be29b09ed3677", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_2-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d220a380cbabba2311a826d44e4a5ac1e402a83f3e0164985ece228802501fbd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_2-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ca433064e49f4e003207b3b77c6304738c193de6081a46374f8bf2556bb02d40", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_3-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b774e5146de93a08928a7fc0bb7dec69eafb6066e598d4c73727d92f365b2086", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_3-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "413b2fba2338beaae47b98e08aee7bca2cf3ce1b0cc4fa199e9d2dc94736dd8d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_4-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eaeaa03b9ee50479b13c1a856c8b521fe27ec777faa54a749cdaeac2465a8fc3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_4-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4170a90ad2c61f9a98926e9dfb0e513651f1446b3145e0fe86f36caf4cfcf40f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_5-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4de7b2846c9a5bd82d868e4302e322d6a84a9a96926db6e1dc52f1db33f923eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch2_5-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9ea2cf207c03fb20129e4db758283b68e2a666a0993c85aa596ad85b972a27e9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "dce5e16df72097dda16627f9a22b6384cc48e88221778ef60429f364a342b582", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d85165cba8eedb1767fa8349d949d1c93c926912e42b9447d9ce04163c730387", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_0-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "103a0e8fd4c23df1b60ee8cd9ee1117abdbc9a2f796c81e9fcb314ba3541ff20", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "afd975dae51fd22dac788fcb5c8c3dcb37f56ef0ff03347bd41cee040abb8310", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "195acc9e86fd95896a3fc954e93390e2f0def35339c75956edc41935026e533f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_1-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "404998d4425fa6077227690d1f24447158a7c59b65aac38dcd98c27f282dadb2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7f2b06cae1a324808c8ffe3ec5ae3c217aa1c1931d966ad260400c73892d4453", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "aa61d218e006492873c0cd69af8a44f02811b77e106beb585f7e50572eac4539", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_2-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "41900f46c92442dfd981e4a5509ad3a79e56c1f5cea1f8b6289be3cd7da1a538", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity1, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "34c3884339b6fc73e36625e50cef07baa225bcf7da4536b38d5ceb527d42ad2b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity2, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c2963f8eac0d43e6fc2c3e5757769b0981360c15a23881128cf05f8b008383b7", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity3, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "68c06c2fce5e3cc5efc98c1912fc83a0493ea2b2b66dd62ea7c15a65c197bf30", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "ContractCall(address: ST1AW6EKPGT61SQ9FNVDS17RKNWT8ZP582VF9HSCP, contract_name: unwrap-err-Epoch3_3-Clarity4, function_name: trigger, function_args: [[Response(ResponseData { committed: false, data: UInt(3) })]])", + vm_error: "Some(UnwrapFailure) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 85, + read_count: 3, + runtime: 554, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__static_analysis_tests__static_check_error_memory_balance_exceeded.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__static_analysis_tests__static_check_error_memory_balance_exceeded.snap new file mode 100644 index 00000000000..f573d01d5f5 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__static_analysis_tests__static_check_error_memory_balance_exceeded.snap @@ -0,0 +1,22 @@ +--- +source: stackslib/src/chainstate/tests/static_analysis_tests.rs +expression: result +--- +[ + Failure(ExpectedFailureOutput( + evaluated_epoch: Epoch33, + error: "Invalid Stacks block 11671b31203d0d4d40aa50dd96ad65e2e3301f20012bfc8cfb9af9df4ec28d5e: CostOverflowError(ExecutionCost { write_length: 0, write_count: 0, read_length: 0, read_count: 0, runtime: 0 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 })", + )), + Failure(ExpectedFailureOutput( + evaluated_epoch: Epoch33, + error: "Invalid Stacks block a5c3e9050714c3db4e00eee6102b3962dfcaec6554c9c9bff5720758bac2098d: CostOverflowError(ExecutionCost { write_length: 0, write_count: 0, read_length: 0, read_count: 0, runtime: 0 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 })", + )), + Failure(ExpectedFailureOutput( + evaluated_epoch: Epoch33, + error: "Invalid Stacks block 904c4cfe137c389df7b0574992fa8cef38e87599e17a4e94f3e6676a1ae599bb: CostOverflowError(ExecutionCost { write_length: 0, write_count: 0, read_length: 0, read_count: 0, runtime: 0 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 })", + )), + Failure(ExpectedFailureOutput( + evaluated_epoch: Epoch33, + error: "Invalid Stacks block c16c14ee3bab0c89016d672c300585ae4152c61bdd7d5820a6fc67aaa473e9ed: CostOverflowError(ExecutionCost { write_length: 0, write_count: 0, read_length: 0, read_count: 0, runtime: 0 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 }, ExecutionCost { write_length: 18446744073709551615, write_count: 18446744073709551615, read_length: 18446744073709551615, read_count: 18446744073709551615, runtime: 18446744073709551615 })", + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__static_analysis_tests__static_check_error_public_function_must_return_response.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__static_analysis_tests__static_check_error_public_function_must_return_response.snap new file mode 100644 index 00000000000..e4a94dfd6d8 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__static_analysis_tests__static_check_error_public_function_must_return_response.snap @@ -0,0 +1,126 @@ +--- +source: stackslib/src/chainstate/tests/static_analysis_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "ffa3b803b8f265d11fba465d54eccf469db85763d8f9158d759d670d18eb876a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: non-response-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(:0:0: public functions must return an expression of type \'response\', found \'bool\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2bfcb7eeedde001a27e5644f364850f9bb6681644591b1a8d27c5c0645a2e391", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: non-response-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(:0:0: public functions must return an expression of type \'response\', found \'bool\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cdbec54872e34bfc60228cd9be1338410b091c6a2763b2982581e880a55bd37c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: non-response-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(:0:0: public functions must return an expression of type \'response\', found \'bool\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7b212a20bd02b53803dfd87332e364c379039d94e237041512cb536275bc2c15", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: non-response-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(:0:0: public functions must return an expression of type \'response\', found \'bool\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 6, + write_count: 1, + read_length: 1, + read_count: 1, + runtime: 1288, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/static_analysis_tests.rs b/stackslib/src/chainstate/tests/static_analysis_tests.rs index 0f09a5eab2f..1b918fd2945 100644 --- a/stackslib/src/chainstate/tests/static_analysis_tests.rs +++ b/stackslib/src/chainstate/tests/static_analysis_tests.rs @@ -13,14 +13,14 @@ // 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 CheckErrorKind errors that happens during contract analysis. +//! This module contains consensus tests related to Clarity StaticCheckErrorKind errors that happens during contract analysis. use std::collections::HashMap; use clarity::types::StacksEpochId; use clarity::vm::analysis::type_checker::v2_1::{MAX_FUNCTION_PARAMETERS, MAX_TRAIT_METHODS}; #[allow(unused_imports)] -use clarity::vm::analysis::CheckErrorKind; +use clarity::vm::analysis::StaticCheckErrorKind; use clarity::vm::types::MAX_TYPE_DEPTH; use clarity::vm::ClarityVersion; @@ -31,7 +31,155 @@ use crate::chainstate::tests::consensus::{ use crate::core::BLOCK_LIMIT_MAINNET_21; use crate::util_lib::boot::boot_code_test_addr; -/// CheckErrorKind: [`CheckErrorKind::CostBalanceExceeded`] +/// Generates a coverage classification report for a specific [`StaticCheckErrorKind`] 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. +/// - 🚫 **Unreachable** — not testable from consensus test side for reasons. +#[allow(dead_code)] +fn variant_coverage_report(variant: StaticCheckErrorKind) { + enum VariantCoverage { + // 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. 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 StaticCheckErrorKind::*; + use VariantCoverage::*; + + _ = match variant { + CostOverflow => Unreachable_ExpectLike, // Should exceed u64 + CostBalanceExceeded(execution_cost, execution_cost1) => Tested(vec![static_check_error_cost_balance_exceeded]), + MemoryBalanceExceeded(_, _) => Tested(vec![static_check_error_memory_balance_exceeded]), + CostComputationFailed(_) => Unreachable_ExpectLike, + ExecutionTimeExpired => Unreachable_Functionally("Can only be triggered at runtime."), + ValueTooLarge => Tested(vec![static_check_error_value_too_large]), + ValueOutOfBounds => Tested(vec![static_check_error_value_out_of_bounds]), + TypeSignatureTooDeep => Tested(vec![static_check_error_type_signature_too_deep]), + ExpectedName => Tested(vec![static_check_error_expected_name]), + SupertypeTooLarge => Tested(vec![static_check_error_supertype_too_large]), + Expects(_) => Unreachable_ExpectLike, + BadMatchOptionSyntax(static_check_error_kind) => { + Tested(vec![static_check_error_bad_match_option_syntax]) + } + BadMatchResponseSyntax(static_check_error_kind) => { + Tested(vec![static_check_error_bad_match_response_syntax]) + } + BadMatchInput(type_signature) => Tested(vec![static_check_error_bad_match_input]), + ConstructedListTooLarge => Tested(vec![static_check_error_constructed_list_too_large]), + TypeError(type_signature, type_signature1) => Tested(vec![static_check_error_type_error]), + InvalidTypeDescription => Tested(vec![static_check_error_invalid_type_description]), + UnknownTypeName(_) => Tested(vec![static_check_error_unknown_type_name]), + UnionTypeError(type_signatures, type_signature) => { + Tested(vec![static_check_error_union_type_error]) + } + ExpectedOptionalType(type_signature) => { + Tested(vec![static_check_error_expected_optional_type]) + } + ExpectedResponseType(type_signature) => { + Tested(vec![static_check_error_expected_response_type]) + } + ExpectedOptionalOrResponseType(type_signature) => { + Tested(vec![static_check_error_expected_optional_or_response_type]) + } + CouldNotDetermineResponseOkType => Tested(vec![ + static_check_error_could_not_determine_response_ok_type, + ]), + CouldNotDetermineResponseErrType => Tested(vec![ + static_check_error_could_not_determine_response_err_type, + ]), + CouldNotDetermineSerializationType => Tested(vec![ + static_check_error_could_not_determine_serialization_type, + ]), + UncheckedIntermediaryResponses => Tested(vec![static_check_error_unchecked_intermediary_responses]), + CouldNotDetermineMatchTypes => Tested(vec![static_check_error_could_not_determine_match_types]), + CouldNotDetermineType => Tested(vec![static_check_error_could_not_determine_type]), + TypeAlreadyAnnotatedFailure => Unreachable_Functionally("The AST assigner gives each node a unique `id`, and the type checker visits each node exactly once, so duplicate annotations cannot occur."), + CheckerImplementationFailure => Unreachable_ExpectLike, + BadTokenName => Tested(vec![static_check_error_bad_token_name]), + DefineNFTBadSignature => Tested(vec![static_check_error_define_nft_bad_signature]), + NoSuchNFT(_) => Tested(vec![static_check_error_no_such_nft]), + NoSuchFT(_) => Tested(vec![static_check_error_no_such_ft]), + BadTupleFieldName => Tested(vec![static_check_error_bad_tuple_field_name]), + ExpectedTuple(type_signature) => Tested(vec![static_check_error_expected_tuple]), + NoSuchTupleField(_, tuple_type_signature) => Tested(vec![static_check_error_no_such_tuple_field]), + EmptyTuplesNotAllowed => Tested(vec![static_check_error_empty_tuples_not_allowed]), + BadTupleConstruction(_) => Tested(vec![static_check_error_bad_tuple_construction]), + NoSuchDataVariable(_) => Tested(vec![static_check_error_no_such_data_variable]), + BadMapName => Tested(vec![static_check_error_bad_map_name]), + NoSuchMap(_) => Tested(vec![static_check_error_no_such_map]), + DefineFunctionBadSignature => Tested(vec![static_check_error_define_function_bad_signature]), + BadFunctionName => Tested(vec![static_check_error_bad_function_name]), + BadMapTypeDefinition => Tested(vec![static_check_error_bad_map_type_definition]), + PublicFunctionMustReturnResponse(type_signature) => Tested(vec![static_check_error_public_function_must_return_response]), + DefineVariableBadSignature => Tested(vec![static_check_error_define_variable_bad_signature]), + ReturnTypesMustMatch(type_signature, type_signature1) => Tested(vec![static_check_error_return_types_must_match]), + NoSuchContract(_) => Tested(vec![static_check_error_no_such_contract]), + NoSuchPublicFunction(_, _) => Tested(vec![static_check_error_no_such_public_function]), + ContractAlreadyExists(_) => Unreachable_Functionally("During normal operations, `StacksChainState::process_transaction_payload` will check if the contract exists already, invalidating the block before executing analysis. see `error_invalid_stacks_transaction_duplicate_contract`"), + ContractCallExpectName => Tested(vec![static_check_error_contract_call_expect_name]), + ExpectedCallableType(type_signature) => Tested(vec![static_check_error_expected_callable_type]), + NoSuchBlockInfoProperty(_) => Tested(vec![static_check_error_no_such_block_info_property]), + NoSuchStacksBlockInfoProperty(_) => Tested(vec![static_check_error_no_such_stacks_block_info_property]), + NoSuchTenureInfoProperty(_) => Tested(vec![static_check_error_no_such_tenure_info_property]), + GetBlockInfoExpectPropertyName => Tested(vec![static_check_error_get_block_info_expect_property_name]), + GetBurnBlockInfoExpectPropertyName => Tested(vec![static_check_error_get_burn_block_info_expect_property_name]), + GetStacksBlockInfoExpectPropertyName => Tested(vec![static_check_error_get_stacks_block_info_expect_property_name]), + GetTenureInfoExpectPropertyName => Tested(vec![static_check_error_get_tenure_info_expect_property_name]), + NameAlreadyUsed(_) => Tested(vec![static_check_error_name_already_used]), + ReservedWord(_) => Tested(vec![static_check_error_reserved_word]), + NonFunctionApplication => Tested(vec![static_check_error_non_function_application]), + ExpectedListApplication => Tested(vec![static_check_error_expected_list_application]), + ExpectedSequence(type_signature) => Tested(vec![static_check_error_expected_sequence]), + MaxLengthOverflow => Unreachable_ExpectLike, // Should exceed u32 elements in memory. + BadLetSyntax => Tested(vec![static_check_error_bad_let_syntax]), + BadSyntaxBinding(syntax_binding_error) => Tested(vec![static_check_error_bad_syntax_binding]), + MaxContextDepthReached => Unreachable_Functionally("Before type checking runs, the parser enforces an AST nesting limit of (5 + 64). Any contract exceeding depth 69 fails with `ParseErrorKind::ExpressionStackDepthTooDeep`"), + UndefinedVariable(_) => Tested(vec![static_check_error_undefined_variable]), + RequiresAtLeastArguments(_, _) => Tested(vec![static_check_error_requires_at_least_arguments]), + RequiresAtMostArguments(_, _) => Tested(vec![static_check_error_requires_at_most_arguments]), + IncorrectArgumentCount(_, _) => Tested(vec![static_check_error_incorrect_argument_count]), + IfArmsMustMatch(type_signature, type_signature1) => Tested(vec![static_check_error_if_arms_must_match]), + MatchArmsMustMatch(type_signature, type_signature1) => Tested(vec![static_check_error_match_arms_must_match]), + DefaultTypesMustMatch(type_signature, type_signature1) => Tested(vec![static_check_error_default_types_must_match]), + IllegalOrUnknownFunctionApplication(_) => Tested(vec![static_check_error_illegal_or_unknown_function_application]), + UnknownFunction(_) => Tested(vec![static_check_error_unknown_function]), + TooManyFunctionParameters(_, _) => Tested(vec![static_check_error_too_many_function_parameters]), + NoSuchTrait(_, _) => Unreachable_Functionally("Trait identifiers are validated by the parser and TraitsResolver before type checking; invalid or missing traits trigger TraitReferenceUnknown earlier, so this error is never returned."), + TraitReferenceUnknown(_) => Tested(vec![static_check_error_trait_reference_unknown]), + TraitMethodUnknown(_, _) => Tested(vec![static_check_error_trait_method_unknown]), + ExpectedTraitIdentifier => Unreachable_Functionally("`use-trait` or `impl-trait` with an invalid second argument fails in the AST stage, raising ParseErrorKind::ImportTraitBadSignature/ImplTraitBadSignature before static checks run."), + BadTraitImplementation(_, _) => Tested(vec![static_check_error_bad_trait_implementation]), + DefineTraitBadSignature => Tested(vec![static_check_error_define_trait_bad_signature]), + DefineTraitDuplicateMethod(_) => Tested(vec![static_check_error_define_trait_duplicate_method]), + UnexpectedTraitOrFieldReference => Tested(vec![static_check_error_unexpected_trait_or_field_reference]), + ContractOfExpectsTrait => Tested(vec![static_check_error_contract_of_expects_trait]), + IncompatibleTrait(trait_identifier, trait_identifier1) => Tested(vec![static_check_error_incompatible_trait]), + TraitTooManyMethods(_, _) => Tested(vec![static_check_error_trait_too_many_methods]), + WriteAttemptedInReadOnly => Tested(vec![static_check_error_write_attempted_in_read_only]), + AtBlockClosureMustBeReadOnly => Tested(vec![static_check_error_at_block_closure_must_be_read_only]), + ExpectedListOfAllowances(_, _) => Tested(vec![static_check_error_expected_list_of_allowances]), + AllowanceExprNotAllowed => Tested(vec![static_check_error_allowance_expr_not_allowed]), + ExpectedAllowanceExpr(_) => Tested(vec![static_check_error_expected_allowance_expr]), + WithAllAllowanceNotAllowed => Tested(vec![static_check_error_with_all_allowance_not_allowed]), + WithAllAllowanceNotAlone => Tested(vec![static_check_error_with_all_allowance_not_alone]), + WithNftExpectedListOfIdentifiers => Tested(vec![static_check_error_with_nft_expected_list_of_identifiers]), + MaxIdentifierLengthExceeded(_, _) => Tested(vec![static_check_error_max_identifier_length_exceeded]), + TooManyAllowances(_, _) => Tested(vec![static_check_error_too_many_allowances]), + } +} + +/// StaticCheckErrorKind: [`StaticCheckErrorKind::CostBalanceExceeded`] /// Caused by: exceeding the static-read analysis budget during contract deployment. /// The contract repeatedly performs static-dispatch `contract-call?` lookups against the boot /// `.costs-3` contract, forcing the type checker to fetch the remote function signature enough @@ -59,7 +207,41 @@ fn static_check_error_cost_balance_exceeded() { ); } -/// CheckErrorKind: [`CheckErrorKind::ValueTooLarge`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::MemoryBalanceExceeded`] +/// Caused by: This test creates a contract that fails during analysis phase. +/// The contract defines large nested tuple constants that exhaust +/// the 100MB memory limit during analysis. +/// Outcome: block rejected. +#[test] +fn static_check_error_memory_balance_exceeded() { + contract_deploy_consensus_test!( + contract_name: "analysis-memory-test", + contract_code: &{ + let mut contract = String::new(); + // size: t0: 36 bytes + contract.push_str("(define-constant t0 (tuple (f0 0x00) (f1 0x00) (f2 0x00) (f3 0x00)))"); + // size: t1: 160 bytes + contract.push_str("(define-constant t1 (tuple (f0 t0) (f1 t0) (f2 t0) (f3 t0)))"); + // size: t2: 656 bytes + contract.push_str("(define-constant t2 (tuple (f0 t1) (f1 t1) (f2 t1) (f3 t1)))"); + // size: t3: 2640 bytes + contract.push_str("(define-constant t3 (tuple (f0 t2) (f1 t2) (f2 t2) (f3 t2)))"); + // size: t4: 10576 bytes + contract.push_str("(define-constant t4 (tuple (f0 t3) (f1 t3) (f2 t3) (f3 t3)))"); + // size: t5: 42320 bytes + contract.push_str("(define-constant t5 (tuple (f0 t4) (f1 t4) (f2 t4) (f3 t4)))"); + // size: t6: 126972 bytes + contract.push_str("(define-constant t6 (tuple (f0 t5) (f1 t5) (f2 t5)))"); + // 126972 bytes * 800 ~= 101577600. Triggers MemoryBalanceExceeded during analysis. + for i in 0..800 { + contract.push_str(&format!("(define-constant l{} t6)", i + 1)); + } + contract + }, + ); +} + +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ValueTooLarge`] /// Caused by: Value exceeds the maximum allowed size for type-checking /// Outcome: block accepted. #[test] @@ -70,7 +252,7 @@ fn static_check_error_value_too_large() { ); } -/// CheckErrorKind: [`CheckErrorKind::ValueOutOfBounds`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ValueOutOfBounds`] /// Caused by: Value is outside the acceptable range for its type /// Outcome: block accepted. #[test] @@ -82,7 +264,7 @@ fn static_check_error_value_out_of_bounds() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedName`] /// Caused by: Expected a name (e.g., variable) but found an different expression. /// Outcome: block accepted. #[test] @@ -93,7 +275,7 @@ fn static_check_error_expected_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedResponseType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedResponseType`] /// Caused by: Expected a response type but found a different type. /// Outcome: block accepted. #[test] @@ -104,7 +286,7 @@ fn static_check_error_expected_response_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::CouldNotDetermineResponseOkType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::CouldNotDetermineResponseOkType`] /// Caused by: `unwrap!` on literal `(err 3)` leaves the response `ok` type unknown. /// Outcome: block accepted. #[test] @@ -115,7 +297,7 @@ fn static_check_error_could_not_determine_response_ok_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::CouldNotDetermineResponseErrType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::CouldNotDetermineResponseErrType`] /// Caused by: `unwrap-err-panic` on `(ok 3)` gives no way to infer the response `err` type. /// Outcome: block accepted. #[test] @@ -126,7 +308,7 @@ fn static_check_error_could_not_determine_response_err_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::CouldNotDetermineMatchTypes`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::CouldNotDetermineMatchTypes`] /// Caused by: matching a bare `none` provides no option type, leaving branch types ambiguous. /// Outcome: block accepted. #[test] @@ -137,7 +319,7 @@ fn static_check_error_could_not_determine_match_types() { ); } -/// CheckErrorKind: [`CheckErrorKind::MatchArmsMustMatch`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::MatchArmsMustMatch`] /// Caused by: the `some` arm yields an int while the `none` arm yields a bool. /// Outcome: block accepted. #[test] @@ -148,7 +330,7 @@ fn static_check_error_match_arms_must_match() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadMatchOptionSyntax`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadMatchOptionSyntax`] /// Caused by: option `match` expecting 4 arguments, got 3. /// Outcome: block accepted. #[test] @@ -159,7 +341,7 @@ fn static_check_error_bad_match_option_syntax() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadMatchResponseSyntax`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadMatchResponseSyntax`] /// Caused by: response `match` expecting 5 arguments, got 3. /// Outcome: block accepted. #[test] @@ -170,7 +352,7 @@ fn static_check_error_bad_match_response_syntax() { ); } -/// CheckErrorKind: [`CheckErrorKind::RequiresAtLeastArguments`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::RequiresAtLeastArguments`] /// Caused by: invoking `match` with no arguments. /// Outcome: block accepted. #[test] @@ -181,7 +363,7 @@ fn static_check_error_requires_at_least_arguments() { ); } -/// CheckErrorKind: [`CheckErrorKind::RequiresAtMostArguments`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::RequiresAtMostArguments`] /// Caused by: `principal-construct?` is called with too many arguments. /// Outcome: block accepted. #[test] @@ -192,7 +374,7 @@ fn static_check_error_requires_at_most_arguments() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadMatchInput`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadMatchInput`] /// Caused by: `match` input is the integer `1`, not an option or response. /// Outcome: block accepted. #[test] @@ -203,7 +385,7 @@ fn static_check_error_bad_match_input() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedOptionalType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedOptionalType`] /// Caused by: `default-to` second argument `5` is not an optional value. /// Outcome: block accepted. #[test] @@ -214,7 +396,7 @@ fn static_check_error_expected_optional_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadTraitImplementation`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadTraitImplementation`] /// Caused by: trying to implement a trait with a bad implementation. /// Outcome: block accepted. #[test] @@ -233,7 +415,7 @@ fn static_check_error_bad_trait_implementation() { ); } -/// CheckErrorKind: [`CheckErrorKind::NameAlreadyUsed`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NameAlreadyUsed`] /// Caused by: redefining constant `foo` a second time. /// Outcome: block accepted. #[test] @@ -246,7 +428,7 @@ fn static_check_error_name_already_used() { ); } -/// CheckErrorKind: [`CheckErrorKind::ReturnTypesMustMatch`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ReturnTypesMustMatch`] /// Caused by: `unwrap!` default returns `err 1` while the function returns `err false`, so response types diverge. /// Outcome: block accepted. #[test] @@ -263,7 +445,7 @@ fn static_check_error_return_types_must_match() { ); } -/// CheckErrorKind: [`CheckErrorKind::TypeError`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TypeError`] /// Caused by: initializing `define-data-var cursor int` with the boolean `true`. /// Outcome: block accepted. #[test] @@ -274,7 +456,7 @@ fn static_check_error_type_error() { ); } -/// CheckErrorKind: [`CheckErrorKind::DefineVariableBadSignature`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::DefineVariableBadSignature`] /// Caused by: `define-data-var` is provided only a name and value, missing the required type. /// Outcome: block accepted. #[test] @@ -285,7 +467,7 @@ fn static_check_error_define_variable_bad_signature() { ); } -/// CheckErrorKind: [`CheckErrorKind::InvalidTypeDescription`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::InvalidTypeDescription`] /// Caused by: `define-data-var` uses `0x00` where a valid type description is required. /// Outcome: block accepted. #[test] @@ -296,7 +478,7 @@ fn static_check_error_invalid_type_description() { ); } -/// CheckErrorKind: [`CheckErrorKind::TypeSignatureTooDeep`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TypeSignatureTooDeep`] /// Caused by: parameter type nests `optional` wrappers deeper than [`MAX_TYPE_DEPTH`]. /// Outcome: block accepted. #[test] @@ -319,7 +501,7 @@ fn static_check_error_type_signature_too_deep() { ); } -/// CheckErrorKind: [`CheckErrorKind::SupertypeTooLarge`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::SupertypeTooLarge`] /// Caused by: combining tuples with `buff 600000` and `buff 10` forces a supertype beyond the size limit. /// Outcome: block rejected. #[test] @@ -335,7 +517,7 @@ fn static_check_error_supertype_too_large() { ); } -/// CheckErrorKind: [`CheckErrorKind::ConstructedListTooLarge`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ConstructedListTooLarge`] /// Caused by: mapping `sha512` over a list capped at 65,535 elements constructs a list past [`MAX_VALUE_SIZE`]. /// Outcome: block accepted. #[test] @@ -352,7 +534,7 @@ fn static_check_error_constructed_list_too_large() { ); } -/// CheckErrorKind: [`CheckErrorKind::UnknownTypeName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::UnknownTypeName`] /// Caused by: `from-consensus-buff?` references an undefined type named `foo`. /// Outcome: block accepted. /// Note: during analysis, this error can only be triggered by `from-consensus-buff?` @@ -369,7 +551,18 @@ fn static_check_error_unknown_type_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::UnionTypeError`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::PublicFunctionMustReturnResponse`] +/// Caused by: defining a public function that does not return a response (ok or err). +/// Outcome: block accepted. +#[test] +fn static_check_error_public_function_must_return_response() { + contract_deploy_consensus_test!( + contract_name: "non-response", + contract_code: "(define-public (non-response) true)", + ); +} + +/// StaticCheckErrorKind: [`StaticCheckErrorKind::UnionTypeError`] /// Caused by: `map` applies subtraction to booleans. /// Outcome: block accepted. #[test] @@ -380,7 +573,7 @@ fn static_check_error_union_type_error() { ); } -/// CheckErrorKind: [`CheckErrorKind::UndefinedVariable`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::UndefinedVariable`] /// Caused by: `x`, `y`, and `z` are referenced without being defined. /// Outcome: block accepted. #[test] @@ -391,7 +584,7 @@ fn static_check_error_undefined_variable() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadMapTypeDefinition`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadMapTypeDefinition`] /// Caused by: Invalid map type definition in a `(define-map ...)` expression. /// Outcome: block accepted. #[test] @@ -402,7 +595,7 @@ fn static_check_error_bad_map_type_definition() { ); } -/// CheckErrorKind: [`CheckErrorKind::CouldNotDetermineType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::CouldNotDetermineType`] /// Caused by: `(index-of (list) none)` supplies no concrete element types. /// Outcome: block accepted. #[test] @@ -413,7 +606,7 @@ fn static_check_error_could_not_determine_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedSequence`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedSequence`] /// Caused by: passing integer `3` as the sequence argument to `index-of` instead of a list or string. /// Outcome: block accepted. #[test] @@ -424,7 +617,7 @@ fn static_check_error_expected_sequence() { ); } -/// CheckErrorKind: [`CheckErrorKind::CouldNotDetermineSerializationType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::CouldNotDetermineSerializationType`] /// Caused by: `to-consensus-buff?` over a list of trait references lacks a serialization type. /// Outcome: block accepted. /// Note: during analysis, this error can only be triggered by `from-consensus-buff?` @@ -443,7 +636,7 @@ fn static_check_error_could_not_determine_serialization_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::IllegalOrUnknownFunctionApplication`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::IllegalOrUnknownFunctionApplication`] /// Caused by: calling `map` with `if` (a non-function) as its function argument. /// Outcome: block accepted. #[test] @@ -454,7 +647,7 @@ fn static_check_error_illegal_or_unknown_function_application() { ); } -/// CheckErrorKind: [`CheckErrorKind::UnknownFunction`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::UnknownFunction`] /// Caused by: invoking the undefined function `ynot`. /// Outcome: block accepted. #[test] @@ -465,7 +658,7 @@ fn static_check_error_unknown_function() { ); } -/// CheckErrorKind: [`CheckErrorKind::IncorrectArgumentCount`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::IncorrectArgumentCount`] /// Caused by: `len` receives two arguments even though it expects exactly one. /// Outcome: block accepted. #[test] @@ -476,7 +669,7 @@ fn static_check_error_incorrect_argument_count() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadLetSyntax`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadLetSyntax`] /// Caused by: `let` is used without a binding list. /// Outcome: block accepted. #[test] @@ -487,7 +680,7 @@ fn static_check_error_bad_let_syntax() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadSyntaxBinding`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadSyntaxBinding`] /// Caused by: `let` binding `((1))` is not a two-element list. /// Outcome: block accepted. #[test] @@ -498,7 +691,7 @@ fn static_check_error_bad_syntax_binding() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedOptionalOrResponseType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedOptionalOrResponseType`] /// Caused by: expected an optional or response type, but got a value /// Outcome: block accepted. #[test] @@ -509,7 +702,7 @@ fn static_check_error_expected_optional_or_response_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::DefineTraitBadSignature`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::DefineTraitBadSignature`] /// Caused by: calling `define-trait` with a method signature that is not valid. /// Outcome: block accepted. #[test] @@ -520,7 +713,7 @@ fn static_check_error_define_trait_bad_signature() { ); } -/// CheckErrorKind: [`CheckErrorKind::DefineTraitDuplicateMethod`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::DefineTraitDuplicateMethod`] /// Caused by: trait definition contains duplicate method names /// Outcome: block accepted. /// Note: This error was added in Clarity 2. Clarity 1 will accept the contract. @@ -536,7 +729,7 @@ fn static_check_error_define_trait_duplicate_method() { ); } -/// CheckErrorKind: [`CheckErrorKind::UnexpectedTraitOrFieldReference`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::UnexpectedTraitOrFieldReference`] /// Caused by: unexpected use of trait reference or field /// Outcome: block accepted. #[test] @@ -547,7 +740,7 @@ fn static_check_error_unexpected_trait_or_field_reference() { ); } -/// CheckErrorKind: [`CheckErrorKind::IncompatibleTrait`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::IncompatibleTrait`] /// Caused by: pass a trait to a trait parameter which is not compatible. /// Outcome: block accepted. /// Note: Added in Clarity 2. Clarity 1 will trigger a [`CheckErrorKind::TypeError`]. @@ -569,7 +762,7 @@ fn static_check_error_incompatible_trait() { ); } -/// CheckErrorKind: [`CheckErrorKind::TraitTooManyMethods`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TraitTooManyMethods`] /// Caused by: a trait has too many methods. /// Outcome: block accepted. #[test] @@ -586,7 +779,7 @@ fn static_check_error_trait_too_many_methods() { ); } -/// CheckErrorKind: [`CheckErrorKind::TooManyFunctionParameters`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TooManyFunctionParameters`] /// Caused by: a function has too many parameters. /// Outcome: block accepted. #[test] @@ -603,7 +796,7 @@ fn static_check_error_too_many_function_parameters() { ); } -/// CheckErrorKind: [`CheckErrorKind::ReservedWord`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ReservedWord`] /// Caused by: name is a reserved word /// Outcome: block accepted. /// Note: This error was added in Clarity 3. Clarity 1 and 2 @@ -616,7 +809,7 @@ fn static_check_error_reserved_word() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchBlockInfoProperty`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchBlockInfoProperty`] /// Caused by: referenced an unknown property of a burn block /// Outcome: block accepted. #[test] @@ -627,7 +820,7 @@ fn static_check_error_no_such_block_info_property() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchStacksBlockInfoProperty`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchStacksBlockInfoProperty`] /// Caused by: referenced an unknown property of a stacks block /// Outcome: block accepted. /// Note: This error was added in Clarity 3. Clarity 1, and 2 @@ -640,7 +833,7 @@ fn static_check_error_no_such_stacks_block_info_property() { ); } -/// CheckErrorKind: [`CheckErrorKind::UncheckedIntermediaryResponses`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::UncheckedIntermediaryResponses`] /// Caused by: Intermediate `(ok ...)` expressions inside a `begin` block that are not unwrapped. /// Outcome: block accepted. #[test] @@ -655,7 +848,7 @@ fn static_check_error_unchecked_intermediary_responses() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchFT`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchFT`] /// Caused by: calling `ft-get-balance` with a non-existent FT name. /// Outcome: block accepted. #[test] @@ -666,7 +859,7 @@ fn static_check_error_no_such_ft() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchNFT`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchNFT`] /// Caused by: calling `nft-get-owner?` with a non-existent NFT name. /// Outcome: block accepted. #[test] @@ -677,7 +870,7 @@ fn static_check_error_no_such_nft() { ); } -/// CheckErrorKind: [`CheckErrorKind::DefineNFTBadSignature`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::DefineNFTBadSignature`] /// Caused by: malformed signature in a `(define-non-fungible-token ...)` expression /// Outcome: block accepted. #[test] @@ -688,7 +881,7 @@ fn static_check_error_define_nft_bad_signature() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadTokenName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadTokenName`] /// Caused by: calling `ft-get-balance` with a non-valid token name. /// Outcome: block accepted. #[test] @@ -699,7 +892,7 @@ fn static_check_error_bad_token_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::EmptyTuplesNotAllowed`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::EmptyTuplesNotAllowed`] /// Caused by: calling `set-cursor` with an empty tuple. /// Outcome: block accepted. #[test] @@ -712,7 +905,7 @@ fn static_check_error_empty_tuples_not_allowed() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchDataVariable`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchDataVariable`] /// Caused by: calling var-get with a non-existent variable. /// Outcome: block accepted. #[test] @@ -725,7 +918,7 @@ fn static_check_error_no_such_data_variable() { ); } -/// CheckErrorKind: [`CheckErrorKind::NonFunctionApplication`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NonFunctionApplication`] /// Caused by: attempt to apply a non-function value as a function. /// Outcome: block accepted. #[test] @@ -736,7 +929,7 @@ fn static_check_error_non_function_application() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedListApplication`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedListApplication`] /// Caused by: calling append with lhs that is not a list. /// Outcome: block accepted. #[test] @@ -747,7 +940,7 @@ fn static_check_error_expected_list_application() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchContract`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchContract`] /// Caused by: calling contract-call? with a non-existent contract name. /// Outcome: block accepted. #[test] @@ -758,7 +951,7 @@ fn static_check_error_no_such_contract() { ); } -/// CheckErrorKind: [`CheckErrorKind::ContractCallExpectName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ContractCallExpectName`] /// Caused by: calling contract-call? without a contract function name. /// Outcome: block accepted. #[test] @@ -769,7 +962,7 @@ fn static_check_error_contract_call_expect_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedCallableType`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedCallableType`] /// Caused by: passing a non-callable constant as the contract principal in `contract-call?`. /// Outcome: block accepted. /// Note: This error was added in Clarity 2. Clarity 1 will trigger a [`CheckErrorKind::TraitReferenceUnknown`] @@ -783,7 +976,7 @@ fn static_check_error_expected_callable_type() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchPublicFunction`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchPublicFunction`] /// Caused by: calling a non-existent public or read-only function on a contract literal. /// Outcome: block accepted. #[test] @@ -795,7 +988,7 @@ fn static_check_error_no_such_public_function() { ); } -/// CheckErrorKind: [`CheckErrorKind::DefaultTypesMustMatch`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::DefaultTypesMustMatch`] /// Caused by: calling `default-to` with a default value that does not match the expected type. /// Outcome: block accepted. #[test] @@ -808,7 +1001,7 @@ fn static_check_error_default_types_must_match() { ); } -/// CheckErrorKind: [`CheckErrorKind::IfArmsMustMatch`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::IfArmsMustMatch`] /// Caused by: calling `if` with arms that do not match the same type. /// Outcome: block accepted. #[test] @@ -819,7 +1012,7 @@ fn static_check_error_if_arms_must_match() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedTuple`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedTuple`] /// Caused by: `(get ...)` is given `(some 1)` instead of a tuple value. /// Outcome: block accepted. #[test] @@ -830,7 +1023,7 @@ fn static_check_error_expected_tuple() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchTupleField`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchTupleField`] /// Caused by: tuple argument only contains `name`, so requesting `value` fails. /// Outcome: block accepted. #[test] @@ -841,7 +1034,7 @@ fn static_check_error_no_such_tuple_field() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchMap`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchMap`] /// Caused by: `map-get?` refers to map `non-existent`, which is never defined. /// Outcome: block accepted. #[test] @@ -852,7 +1045,7 @@ fn static_check_error_no_such_map() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadFunctionName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadFunctionName`] /// Caused by: defining a function whose signature does not start with an atom name. /// Outcome: block accepted. #[test] @@ -863,7 +1056,7 @@ fn static_check_error_bad_function_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::DefineFunctionBadSignature`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::DefineFunctionBadSignature`] /// Caused by: defining a function with an empty signature list. /// Outcome: block accepted. #[test] @@ -874,7 +1067,7 @@ fn static_check_error_define_function_bad_signature() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadTupleFieldName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadTupleFieldName`] /// Caused by: using `(get ...)` with a tuple field argument that is not an atom. /// Outcome: block accepted. #[test] @@ -885,7 +1078,7 @@ fn static_check_error_bad_tuple_field_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadMapName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadMapName`] /// Caused by: passing a literal instead of a map identifier to `map-get?`. /// Outcome: block accepted. #[test] @@ -896,7 +1089,7 @@ fn static_check_error_bad_map_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::GetBlockInfoExpectPropertyName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::GetBlockInfoExpectPropertyName`] /// Caused by: calling `get-block-info` with a non-atom property argument. /// Outcome: block accepted. /// Note: Only Clarity 1 and 2 will trigger this error. Clarity 3 and 4 @@ -910,7 +1103,7 @@ fn static_check_error_get_block_info_expect_property_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::GetBurnBlockInfoExpectPropertyName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::GetBurnBlockInfoExpectPropertyName`] /// Caused by: calling `get-burn-block-info` with a non-atom property argument. /// Outcome: block accepted. /// Note: This error was added in Clarity 2. Clarity 1 will trigger @@ -924,7 +1117,7 @@ fn static_check_error_get_burn_block_info_expect_property_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::GetStacksBlockInfoExpectPropertyName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::GetStacksBlockInfoExpectPropertyName`] /// Caused by: calling `get-stacks-block-info` with a non-atom property argument. /// Outcome: block accepted. /// Note: This error was added in Clarity 3. Clarity 1 and 2 will trigger @@ -938,7 +1131,7 @@ fn static_check_error_get_stacks_block_info_expect_property_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::GetTenureInfoExpectPropertyName`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::GetTenureInfoExpectPropertyName`] /// Caused by: calling `get-tenure-info` with a non-atom property argument. /// Outcome: block accepted. /// Note: This error was added in Clarity 3. Clarity 1 and 2 will trigger @@ -952,7 +1145,7 @@ fn static_check_error_get_tenure_info_expect_property_name() { ); } -/// CheckErrorKind: [`CheckErrorKind::NoSuchTenureInfoProperty`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::NoSuchTenureInfoProperty`] /// Caused by: referenced an unknown property of a tenure /// Outcome: block accepted. /// Note: This error was added in Clarity 3. Clarity 1, and 2 @@ -966,7 +1159,7 @@ fn static_check_error_no_such_tenure_info_property() { ); } -/// CheckErrorKind: [`CheckErrorKind::TraitReferenceUnknown`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TraitReferenceUnknown`] /// Caused by: referenced trait is unknown /// Outcome: block accepted. #[test] @@ -977,7 +1170,7 @@ fn static_check_error_trait_reference_unknown() { ); } -/// CheckErrorKind: [`CheckErrorKind::ContractOfExpectsTrait`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ContractOfExpectsTrait`] /// Caused by: calling `contract-of` with a non-trait argument. /// Outcome: block accepted. #[test] @@ -988,7 +1181,7 @@ fn static_check_error_contract_of_expects_trait() { ); } -/// CheckErrorKind: [`CheckErrorKind::TraitMethodUnknown`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TraitMethodUnknown`] /// Caused by: defining a method that is not declared in the trait /// Outcome: block accepted. #[test] @@ -1003,7 +1196,7 @@ fn static_check_error_trait_method_unknown() { ); } -/// CheckErrorKind: [`CheckErrorKind::WriteAttemptedInReadOnly`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::WriteAttemptedInReadOnly`] /// Caused by: read-only function `silly` invoking `map-delete`, which performs a write. /// Outcome: block accepted. #[test] @@ -1017,7 +1210,7 @@ fn static_check_error_write_attempted_in_read_only() { ); } -/// CheckErrorKind: [`CheckErrorKind::AtBlockClosureMustBeReadOnly`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::AtBlockClosureMustBeReadOnly`] /// Caused by: `at-block` closure must be read-only but contains write operations. /// Outcome: block accepted. #[test] @@ -1032,7 +1225,7 @@ fn static_check_error_at_block_closure_must_be_read_only() { ); } -/// CheckErrorKind: [`CheckErrorKind::AllowanceExprNotAllowed`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::AllowanceExprNotAllowed`] /// Caused by: using an allowance expression outside of `restrict-assets?` or `as-contract?`. /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1046,7 +1239,7 @@ fn static_check_error_allowance_expr_not_allowed() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedListOfAllowances`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedListOfAllowances`] /// Caused by: post-condition expects a list of asset allowances but received invalid input. /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1060,7 +1253,7 @@ fn static_check_error_expected_list_of_allowances() { ); } -/// CheckErrorKind: [`CheckErrorKind::ExpectedAllowanceExpr`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::ExpectedAllowanceExpr`] /// Caused by: allowance list contains a non-allowance expression. /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1074,7 +1267,7 @@ fn static_check_error_expected_allowance_expr() { ); } -/// CheckErrorKind: [`CheckErrorKind::WithAllAllowanceNotAllowed`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::WithAllAllowanceNotAllowed`] /// Caused by: `restrict-assets?` allowance list contains `with-all-assets-unsafe`, which is forbidden. /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1088,7 +1281,7 @@ fn static_check_error_with_all_allowance_not_allowed() { ); } -/// CheckErrorKind: [`CheckErrorKind::WithAllAllowanceNotAlone`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::WithAllAllowanceNotAlone`] /// Caused by: combining `with-all-assets-unsafe` with another allowance inside `as-contract?`. /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1102,7 +1295,7 @@ fn static_check_error_with_all_allowance_not_alone() { ); } -/// CheckErrorKind: [`CheckErrorKind::WithNftExpectedListOfIdentifiers`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::WithNftExpectedListOfIdentifiers`] /// Caused by: the third argument to `with-nft` is not a list of identifiers. /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1116,7 +1309,7 @@ fn static_check_error_with_nft_expected_list_of_identifiers() { ); } -/// CheckErrorKind: [`CheckErrorKind::MaxIdentifierLengthExceeded`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::MaxIdentifierLengthExceeded`] /// Caused by: `with-nft` lists 130 identifiers, surpassing [`MAX_NFT_IDENTIFIERS`] (128). /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1135,7 +1328,7 @@ fn static_check_error_max_identifier_length_exceeded() { ); } -/// CheckErrorKind: [`CheckErrorKind::TooManyAllowances`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::TooManyAllowances`] /// Caused by: allowance list supplies 130 entries, exceeding [`MAX_ALLOWANCES`] (128). /// Outcome: block accepted. /// Note: This error was added in Clarity 4. Clarity 1, 2, and 3 @@ -1154,7 +1347,7 @@ fn static_check_error_too_many_allowances() { ); } -/// CheckErrorKind: [`CheckErrorKind::BadTupleConstruction`] +/// StaticCheckErrorKind: [`StaticCheckErrorKind::BadTupleConstruction`] /// Caused by: tuple literal repeats the `name` field twice. /// Outcome: block accepted. #[test] diff --git a/stackslib/src/clarity_vm/database/marf.rs b/stackslib/src/clarity_vm/database/marf.rs index e0add1f2520..0df22c0d093 100644 --- a/stackslib/src/clarity_vm/database/marf.rs +++ b/stackslib/src/clarity_vm/database/marf.rs @@ -796,6 +796,11 @@ impl ClarityBackingStore for PersistentWritableMarfStore<'_> { .check_ancestor_block_hash(&bhh) .map_err(|e| match e { Error::NotFoundError => { + // This branch will almost never be hit in normal execution because + // the MARF always contains at least the genesis block and subsequent + // blocks. NotFoundError only occurs if the backing store is completely + // empty or uninitialized, which is not possible during normal contract + // deployment or runtime execution. test_debug!("No such block {:?} (NotFoundError)", &bhh); RuntimeError::UnknownBlockHeaderHash(BlockHeaderHash(bhh.0)) } diff --git a/stackslib/src/clarity_vm/tests/analysis_costs.rs b/stackslib/src/clarity_vm/tests/analysis_costs.rs index 45b03e4f5b6..183b3abb21a 100644 --- a/stackslib/src/clarity_vm/tests/analysis_costs.rs +++ b/stackslib/src/clarity_vm/tests/analysis_costs.rs @@ -16,7 +16,7 @@ use clarity::vm::clarity::{ClarityError, TransactionConnection}; use clarity::vm::costs::ExecutionCost; -use clarity::vm::errors::CheckErrorKind; +use clarity::vm::errors::StaticCheckErrorKind; use clarity::vm::functions::NativeFunctions; use clarity::vm::test_util::TEST_HEADER_DB; use clarity::vm::tests::{test_only_mainnet_to_chain_id, UnitTestBurnStateDB}; @@ -320,7 +320,7 @@ fn undefined_top_variable_error(#[case] use_mainnet: bool, #[case] epoch: Stacks let Err(ClarityError::StaticCheck(check_error)) = analysis_result else { panic!("Bad analysis result: {analysis_result:?}"); }; - let CheckErrorKind::UndefinedVariable(var_name) = *check_error.err else { + let StaticCheckErrorKind::UndefinedVariable(var_name) = *check_error.err else { panic!("Bad analysis error: {check_error:?}"); }; assert_eq!(var_name, "foo".to_string()); diff --git a/stackslib/src/clarity_vm/tests/contracts.rs b/stackslib/src/clarity_vm/tests/contracts.rs index bc8a2c96dd5..ce90e4a8ecb 100644 --- a/stackslib/src/clarity_vm/tests/contracts.rs +++ b/stackslib/src/clarity_vm/tests/contracts.rs @@ -16,7 +16,7 @@ use clarity::types::StacksEpochId; use clarity::vm::clarity::ClarityError; -use clarity::vm::errors::{CheckErrorKind, VmExecutionError}; +use clarity::vm::errors::{CheckErrorKind, StaticCheckErrorKind, VmExecutionError}; use clarity::vm::types::SequenceData::Buffer; use clarity::vm::types::{ BuffData, OptionalData, PrincipalData, QualifiedContractIdentifier, TupleData, TypeSignature, @@ -49,7 +49,7 @@ fn test_get_burn_block_info_eval() { let res = clarity_db.analyze_smart_contract(&contract_identifier, clarity_version, contract); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::UnknownFunction(func_name) = *check_error.err { + if let StaticCheckErrorKind::UnknownFunction(func_name) = *check_error.err { assert_eq!(func_name, "get-burn-block-info?"); } else { panic!("Bad analysis error: {:?}", &check_error); @@ -70,7 +70,7 @@ fn test_get_burn_block_info_eval() { let res = clarity_db.analyze_smart_contract(&contract_identifier, clarity_version, contract); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::UnknownFunction(func_name) = *check_error.err { + if let StaticCheckErrorKind::UnknownFunction(func_name) = *check_error.err { assert_eq!(func_name, "get-burn-block-info?"); } else { panic!("Bad analysis error: {:?}", &check_error); @@ -162,7 +162,7 @@ fn test_get_block_info_eval_v210() { let res = clarity_db.analyze_smart_contract(&contract_identifier, clarity_version, contract); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::NoSuchBlockInfoProperty(name) = *check_error.err { + if let StaticCheckErrorKind::NoSuchBlockInfoProperty(name) = *check_error.err { assert_eq!(name, "block-reward"); } else { panic!("Bad analysis error: {:?}", &check_error); @@ -183,7 +183,7 @@ fn test_get_block_info_eval_v210() { let res = clarity_db.analyze_smart_contract(&contract_identifier, clarity_version, contract); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::NoSuchBlockInfoProperty(name) = *check_error.err { + if let StaticCheckErrorKind::NoSuchBlockInfoProperty(name) = *check_error.err { assert_eq!(name, "block-reward"); } else { panic!("Bad analysis error: {:?}", &check_error); @@ -345,7 +345,7 @@ fn trait_invocation_205_with_stored_principal() { .unwrap_err(); match error { ClarityError::StaticCheck(ref e) => match *e.err { - CheckErrorKind::TypeError(..) => (), + StaticCheckErrorKind::TypeError(..) => (), _ => panic!("Unexpected error: {:?}", error), }, _ => panic!("Unexpected error: {:?}", error), @@ -876,7 +876,7 @@ fn test_block_heights() { contract_clarity3, ); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::UndefinedVariable(var_name) = *check_error.err { + if let StaticCheckErrorKind::UndefinedVariable(var_name) = *check_error.err { assert_eq!(var_name, "stacks-block-height"); } else { panic!("Bad analysis error: {:?}", &check_error); @@ -910,7 +910,7 @@ fn test_block_heights() { contract_clarity3, ); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::UndefinedVariable(var_name) = *check_error.err { + if let StaticCheckErrorKind::UndefinedVariable(var_name) = *check_error.err { assert_eq!(var_name, "stacks-block-height"); } else { panic!("Bad analysis error: {:?}", &check_error); @@ -926,7 +926,7 @@ fn test_block_heights() { contract_clarity1, ); if let Err(ClarityError::StaticCheck(check_error)) = res { - if let CheckErrorKind::UndefinedVariable(var_name) = *check_error.err { + if let StaticCheckErrorKind::UndefinedVariable(var_name) = *check_error.err { assert_eq!(var_name, "block-height"); } else { panic!("Bad analysis error: {:?}", &check_error); diff --git a/stackslib/src/clarity_vm/tests/large_contract.rs b/stackslib/src/clarity_vm/tests/large_contract.rs index 06a154ffd1d..949b522077c 100644 --- a/stackslib/src/clarity_vm/tests/large_contract.rs +++ b/stackslib/src/clarity_vm/tests/large_contract.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use std::collections::HashMap; + use clarity::util::get_epoch_time_secs; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::clarity::{ClarityConnection, TransactionConnection}; @@ -22,7 +24,10 @@ use clarity::vm::database::HeadersDB; use clarity::vm::errors::VmExecutionError; use clarity::vm::test_util::*; use clarity::vm::tests::{test_clarity_versions, BurnStateDB}; -use clarity::vm::types::{PrincipalData, QualifiedContractIdentifier, Value}; +use clarity::vm::types::{ + OptionalData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value as ClarityValue, + Value, +}; use clarity::vm::version::ClarityVersion; use clarity::vm::{ast, ContractContext, MAX_CALL_STACK_DEPTH}; #[cfg(test)] @@ -35,6 +40,9 @@ use stacks_common::types::StacksEpochId; use crate::chainstate::stacks::boot::{BOOT_CODE_COSTS_2, BOOT_CODE_COSTS_3, BOOT_CODE_COSTS_4}; use crate::chainstate::stacks::index::ClarityMarfTrieId; +use crate::chainstate::tests::consensus::{ + ConsensusTest, ConsensusUtils, ExpectedResult, TestBlock, +}; use crate::clarity_vm::clarity::{ClarityBlockConnection, ClarityError, ClarityInstance}; use crate::clarity_vm::database::marf::MarfedKV; use crate::clarity_vm::database::MemoryBackingStore; @@ -71,7 +79,7 @@ const SIMPLE_TOKENS: &str = "(define-map tokens { account: principal } { balance (token-credit! to amount))))) (define-public (faucet) (let ((original-sender tx-sender)) - (as-contract (print (token-transfer (print original-sender) u1))))) + (as-contract (print (token-transfer (print original-sender) u1))))) (define-public (mint-after (block-to-release uint)) (if (>= block-height block-to-release) (faucet) @@ -512,7 +520,7 @@ fn inner_test_simple_naming_system(owned_env: &mut OwnedEnvironment, version: Cl \"not enough balance\") (err 1) (err 3))))) - (define-public (register + (define-public (register (recipient-principal principal) (name int) (salt int)) @@ -1359,3 +1367,112 @@ fn test_deep_type_nesting() { block.rollback_block(); } } + +/// Tests that when `MemoryBalanceExceeded` error occurs in a block, the transactions fail, but are +/// still committed to the block, and the "valid" transactions are still executed without errors. +/// +/// 1. Deploy the memory-test-contract once in epoch 3.2 +/// 2. Create a second block with 21 transactions: +/// - 20 transactions that call the contract (should fail with MemoryBalanceExceeded) +/// - 1 transaction that is expected to succeed +#[test] +fn test_memory_balance_exceeded_multiple_calls() { + // Generate the same contract code as chainstate_error_memory_balance_exceeded_during_contract_call + let contract_name = "memory-test-contract"; + let contract_code = { + // Procedurally generate a contract with large buffer constants and a function + // that creates many references to them, similar to argument_memory_test + let mut contract = String::new(); + + // Create buff-0 through buff-20 via repeated doubling: buff-20 = 1MB + contract.push_str("(define-constant buff-0 0x00)\n"); + for i in 0..20 { + contract.push_str(&format!( + "(define-constant buff-{} (concat buff-{i} buff-{i}))\n", + i + 1 + )); + } + + // Create a public function that makes many references to buff-20 + contract.push_str("\n(define-public (create-many-references)\n"); + contract.push_str(" (ok (is-eq "); + + // Create 100 references to buff-20 (1MB each = ~100MB total) + for _ in 0..100 { + contract.push_str("buff-20 "); + } + + contract.push_str(")))\n"); + contract.push_str("(define-public (foo) (ok 1))"); + contract + }; + + let mut nonce = 0; + + let deploy_tx = ConsensusUtils::new_deploy_tx( + nonce, + contract_name, + &contract_code, + Some(ClarityVersion::Clarity4), + ); + + let block1 = TestBlock { + transactions: vec![deploy_tx], + }; + + // Block 2: 50 transactions calling the contract + let mut call_transactions = Vec::new(); + + for _ in 0..20 { + nonce += 1; + let call_tx = ConsensusUtils::new_call_tx(nonce, contract_name, "create-many-references"); + call_transactions.push(call_tx); + } + nonce += 1; + let call_tx = ConsensusUtils::new_call_tx(nonce, contract_name, "foo"); + call_transactions.push(call_tx); + + let block2 = TestBlock { + transactions: call_transactions, + }; + + // Create epoch blocks map - both blocks in the latest epoch + let mut epoch_blocks = HashMap::new(); + epoch_blocks.insert(StacksEpochId::latest(), vec![block1, block2]); + + let result = ConsensusTest::new(function_name!(), vec![], epoch_blocks).run(); + if let ExpectedResult::Success(expected_block_output) = &result[0] { + assert_eq!(expected_block_output.transactions.len(), 1); + assert_eq!( + expected_block_output.transactions[0].return_type, + ClarityValue::Response(ResponseData { + committed: true, + data: Box::new(ClarityValue::Bool(true)), + }) + ); + } else { + panic!("First block should be successful"); + } + if let ExpectedResult::Success(expected_block_output) = &result[1] { + assert_eq!(expected_block_output.transactions.len(), 21); + let expected_vm_error = Some("MemoryBalanceExceeded(100665664, 100000000)".to_string()); + let expected_failure_return_type = ClarityValue::Response(ResponseData { + committed: false, + data: Box::new(ClarityValue::Optional(OptionalData { data: None })), + }); + + for transaction in &expected_block_output.transactions[..20] { + assert_eq!(transaction.return_type, expected_failure_return_type); + assert_eq!(transaction.vm_error, expected_vm_error); + } + assert_eq!( + expected_block_output.transactions[20].return_type, + ClarityValue::Response(ResponseData { + committed: true, + data: Box::new(ClarityValue::Int(1)), + }) + ); + } else { + panic!("Second block should be successful"); + } +} diff --git a/stackslib/src/lib.rs b/stackslib/src/lib.rs index 90559fa4898..c0a2e805b45 100644 --- a/stackslib/src/lib.rs +++ b/stackslib/src/lib.rs @@ -69,6 +69,11 @@ pub mod cost_estimates; pub mod deps; pub mod monitoring; +#[cfg(test)] +/// Utilities and strategy definitions for proptesting +/// common stackslib arguments +pub mod proptest_utils; + // set via _compile-time_ envars const GIT_BRANCH_ENV: Option<&'static str> = option_env!("GIT_BRANCH"); const GIT_COMMIT_ENV: Option<&'static str> = option_env!("GIT_COMMIT"); diff --git a/stackslib/src/net/api/blockreplay.rs b/stackslib/src/net/api/blockreplay.rs index 5937e8dfa5e..62f1f3312ce 100644 --- a/stackslib/src/net/api/blockreplay.rs +++ b/stackslib/src/net/api/blockreplay.rs @@ -22,6 +22,7 @@ use stacks_common::types::net::PeerHost; use stacks_common::util::hash::Sha512Trunc256Sum; use stacks_common::util::secp256k1::MessageSignature; use stacks_common::util::serde_serializers::prefix_hex_codec; +use url::form_urlencoded; use crate::burnchains::Txid; use crate::chainstate::burn::db::sortdb::SortitionDB; @@ -39,10 +40,114 @@ use crate::net::http::{ use crate::net::httpcore::{RPCRequestHandler, StacksHttpResponse}; use crate::net::{Error as NetError, StacksHttpRequest, StacksNodeState}; +#[cfg(all(feature = "profiler", target_os = "linux", target_arch = "x86_64"))] +struct BlockReplayProfiler { + perf_event_cpu_instructions: Option, + perf_event_cpu_cycles: Option, + perf_event_cpu_ref_cycles: Option, +} + +#[cfg(not(all(feature = "profiler", target_os = "linux", target_arch = "x86_64")))] +struct BlockReplayProfiler(); + +#[derive(Default)] +struct BlockReplayProfilerResult { + cpu_instructions: Option, + cpu_cycles: Option, + cpu_ref_cycles: Option, +} + +#[cfg(all(feature = "profiler", target_os = "linux", target_arch = "x86_64"))] +impl BlockReplayProfiler { + fn new() -> Self { + let mut perf_event_cpu_instructions: Option = None; + let mut perf_event_cpu_cycles: Option = None; + let mut perf_event_cpu_ref_cycles: Option = None; + + if let Ok(mut perf_event_cpu_instructions_result) = + perf_event::Builder::new(perf_event::events::Hardware::INSTRUCTIONS).build() + { + if perf_event_cpu_instructions_result.enable().is_ok() { + perf_event_cpu_instructions = Some(perf_event_cpu_instructions_result); + } + } + + if let Ok(mut perf_event_cpu_cycles_result) = + perf_event::Builder::new(perf_event::events::Hardware::CPU_CYCLES).build() + { + if perf_event_cpu_cycles_result.enable().is_ok() { + perf_event_cpu_cycles = Some(perf_event_cpu_cycles_result); + } + } + + if let Ok(mut perf_event_cpu_ref_cycles_result) = + perf_event::Builder::new(perf_event::events::Hardware::REF_CPU_CYCLES).build() + { + if perf_event_cpu_ref_cycles_result.enable().is_ok() { + perf_event_cpu_ref_cycles = Some(perf_event_cpu_ref_cycles_result); + } + } + + Self { + perf_event_cpu_instructions, + perf_event_cpu_cycles, + perf_event_cpu_ref_cycles, + } + } + + fn collect(self) -> BlockReplayProfilerResult { + let mut cpu_instructions: Option = None; + let mut cpu_cycles: Option = None; + let mut cpu_ref_cycles: Option = None; + + if let Some(mut perf_event_cpu_instructions) = self.perf_event_cpu_instructions { + if perf_event_cpu_instructions.disable().is_ok() { + if let Ok(value) = perf_event_cpu_instructions.read() { + cpu_instructions = Some(value); + } + } + } + + if let Some(mut perf_event_cpu_cycles) = self.perf_event_cpu_cycles { + if perf_event_cpu_cycles.disable().is_ok() { + if let Ok(value) = perf_event_cpu_cycles.read() { + cpu_cycles = Some(value); + } + } + } + + if let Some(mut perf_event_cpu_ref_cycles) = self.perf_event_cpu_ref_cycles { + if perf_event_cpu_ref_cycles.disable().is_ok() { + if let Ok(value) = perf_event_cpu_ref_cycles.read() { + cpu_ref_cycles = Some(value); + } + } + } + + BlockReplayProfilerResult { + cpu_instructions, + cpu_cycles, + cpu_ref_cycles, + } + } +} + +#[cfg(not(all(feature = "profiler", target_os = "linux", target_arch = "x86_64")))] +impl BlockReplayProfiler { + fn new() -> Self { + warn!("BlockReplay Profiler is not available in this build."); + Self {} + } + fn collect(self) -> BlockReplayProfilerResult { + BlockReplayProfilerResult::default() + } +} + #[derive(Clone)] pub struct RPCNakamotoBlockReplayRequestHandler { pub block_id: Option, pub auth: Option, + pub profiler: bool, } impl RPCNakamotoBlockReplayRequestHandler { @@ -50,6 +155,7 @@ impl RPCNakamotoBlockReplayRequestHandler { Self { block_id: None, auth, + profiler: false, } } @@ -160,6 +266,13 @@ impl RPCNakamotoBlockReplayRequestHandler { for (i, tx) in block.txs.iter().enumerate() { let tx_len = tx.tx_len(); + let mut profiler: Option = None; + let mut profiler_result = BlockReplayProfilerResult::default(); + + if self.profiler { + profiler = Some(BlockReplayProfiler::new()); + } + let tx_result = builder.try_mine_tx_with_len( &mut tenure_tx, tx, @@ -168,9 +281,14 @@ impl RPCNakamotoBlockReplayRequestHandler { None, &mut total_receipts, ); + + if let Some(profiler) = profiler { + profiler_result = profiler.collect(); + } + let err = match tx_result { TransactionResult::Success(tx_result) => { - txs_receipts.push(tx_result.receipt); + txs_receipts.push((tx_result.receipt, profiler_result)); Ok(()) } _ => Err(format!("Problematic tx {i}")), @@ -195,8 +313,8 @@ impl RPCNakamotoBlockReplayRequestHandler { let mut rpc_replayed_block = RPCReplayedBlock::from_block(block, block_fees, tenure_id, parent_block_id); - for receipt in &txs_receipts { - let transaction = RPCReplayedBlockTransaction::from_receipt(receipt); + for (receipt, profiler_result) in &txs_receipts { + let transaction = RPCReplayedBlockTransaction::from_receipt(receipt, &profiler_result); rpc_replayed_block.transactions.push(transaction); } @@ -232,10 +350,17 @@ pub struct RPCReplayedBlockTransaction { pub post_condition_aborted: bool, /// optional vm error pub vm_error: Option, + /// profiling data based on linux perf_events + pub cpu_instructions: Option, + pub cpu_cycles: Option, + pub cpu_ref_cycles: Option, } impl RPCReplayedBlockTransaction { - pub fn from_receipt(receipt: &StacksTransactionReceipt) -> Self { + fn from_receipt( + receipt: &StacksTransactionReceipt, + profiler_result: &BlockReplayProfilerResult, + ) -> Self { let events = receipt .events .iter() @@ -275,6 +400,9 @@ impl RPCReplayedBlockTransaction { events, post_condition_aborted: receipt.post_condition_aborted, vm_error: receipt.vm_error.clone(), + cpu_instructions: profiler_result.cpu_instructions, + cpu_cycles: profiler_result.cpu_cycles, + cpu_ref_cycles: profiler_result.cpu_ref_cycles, } } } @@ -388,6 +516,17 @@ impl HttpRequest for RPCNakamotoBlockReplayRequestHandler { self.block_id = Some(block_id); + if let Some(query_string) = query { + for (key, value) in form_urlencoded::parse(query_string.as_bytes()) { + if key == "profiler" { + if value == "1" { + self.profiler = true; + } + break; + } + } + } + Ok(HttpRequestContents::new().query_string(query)) } } @@ -452,6 +591,23 @@ impl StacksHttpRequest { ) .expect("FATAL: failed to construct request from infallible data") } + + pub fn new_block_replay_with_profiler( + host: PeerHost, + block_id: &StacksBlockId, + profiler: bool, + ) -> StacksHttpRequest { + StacksHttpRequest::new_for_peer( + host, + "GET".into(), + format!("/v3/blocks/replay/{block_id}"), + HttpRequestContents::new().query_arg( + "profiler".into(), + if profiler { "1".into() } else { "0".into() }, + ), + ) + .expect("FATAL: failed to construct request from infallible data") + } } /// Decode the HTTP response diff --git a/stackslib/src/net/api/get_tenure_tip_meta.rs b/stackslib/src/net/api/get_tenure_tip_meta.rs new file mode 100644 index 00000000000..547810571ff --- /dev/null +++ b/stackslib/src/net/api/get_tenure_tip_meta.rs @@ -0,0 +1,158 @@ +// Copyright (C) 2026 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 regex::{Captures, Regex}; +use stacks_common::types::chainstate::ConsensusHash; + +use crate::chainstate::nakamoto::NakamotoChainState; +use crate::chainstate::stacks::db::StacksBlockHeaderTypes; +use crate::net::http::{ + parse_json, Error, HttpNotFound, HttpRequest, HttpRequestContents, HttpRequestPreamble, + HttpResponse, HttpResponseContents, HttpResponsePayload, HttpResponsePreamble, HttpServerError, +}; +use crate::net::httpcore::{request, RPCRequestHandler, StacksHttpResponse}; +use crate::net::{Error as NetError, StacksNodeState}; + +#[derive(Clone)] +pub struct NakamotoTenureTipMetadataRequestHandler { + pub(crate) consensus_hash: Option, +} + +#[derive(Serialize, Deserialize, PartialEq, Debug)] +pub struct BlockHeaderWithMetadata { + pub anchored_header: StacksBlockHeaderTypes, + pub burn_view: Option, +} + +impl NakamotoTenureTipMetadataRequestHandler { + pub fn new() -> Self { + Self { + consensus_hash: None, + } + } +} + +/// Decode the HTTP request +impl HttpRequest for NakamotoTenureTipMetadataRequestHandler { + fn verb(&self) -> &'static str { + "GET" + } + + fn path_regex(&self) -> Regex { + Regex::new(r#"^/v3/tenures/tip_metadata/(?P[0-9a-f]{40})$"#).unwrap() + } + + fn metrics_identifier(&self) -> &str { + "/v3/tenures/tip_metadata/:consensus_hash" + } + + /// Try to decode this request. + /// There's nothing to load here, so just make sure the request is well-formed. + fn try_parse_request( + &mut self, + preamble: &HttpRequestPreamble, + captures: &Captures, + query: Option<&str>, + _body: &[u8], + ) -> Result { + if preamble.get_content_length() != 0 { + return Err(Error::DecodeError( + "Invalid Http request: expected 0-length body".to_string(), + )); + } + let consensus_hash = request::get_consensus_hash(captures, "consensus_hash")?; + self.consensus_hash = Some(consensus_hash); + Ok(HttpRequestContents::new().query_string(query)) + } +} + +impl RPCRequestHandler for NakamotoTenureTipMetadataRequestHandler { + /// Reset internal state + fn restart(&mut self) { + self.consensus_hash = None; + } + + /// Make the response + fn try_handle_request( + &mut self, + preamble: HttpRequestPreamble, + _contents: HttpRequestContents, + node: &mut StacksNodeState, + ) -> Result<(HttpResponsePreamble, HttpResponseContents), NetError> { + let consensus_hash = self + .consensus_hash + .take() + .ok_or(NetError::SendError("`consensus_hash` not set".into()))?; + + let tenure_tip_resp = + node.with_node_state(|_network, sortdb, chainstate, _mempool, _rpc_args| { + let header_info = + match NakamotoChainState::find_highest_known_block_header_in_tenure( + &chainstate, + sortdb, + &consensus_hash, + ) { + Ok(Some(header)) => header, + Ok(None) => { + let msg = format!("No blocks in tenure {}", &consensus_hash); + debug!("{}", &msg); + return Err(StacksHttpResponse::new_error( + &preamble, + &HttpNotFound::new(msg), + )); + } + Err(e) => { + let msg = format!( + "Failed to query tenure blocks by consensus '{}': {:?}", + consensus_hash, &e + ); + error!("{}", &msg); + return Err(StacksHttpResponse::new_error( + &preamble, + &HttpServerError::new(msg), + )); + } + }; + Ok(header_info) + }); + + let tenure_tip = match tenure_tip_resp { + Ok(tenure_tip) => tenure_tip, + Err(response) => { + return response.try_into_contents().map_err(NetError::from); + } + }; + + let preamble = HttpResponsePreamble::ok_json(&preamble); + let body = HttpResponseContents::try_from_json(&BlockHeaderWithMetadata { + anchored_header: tenure_tip.anchored_header, + burn_view: tenure_tip.burn_view, + })?; + + Ok((preamble, body)) + } +} + +/// Decode the HTTP response +impl HttpResponse for NakamotoTenureTipMetadataRequestHandler { + fn try_parse_response( + &self, + preamble: &HttpResponsePreamble, + body: &[u8], + ) -> Result { + let tenure_tip: BlockHeaderWithMetadata = parse_json(preamble, body)?; + Ok(HttpResponsePayload::try_from_json(tenure_tip)?) + } +} diff --git a/stackslib/src/net/api/gettenuretip.rs b/stackslib/src/net/api/gettenuretip.rs index d150ea240a0..595491c40fe 100644 --- a/stackslib/src/net/api/gettenuretip.rs +++ b/stackslib/src/net/api/gettenuretip.rs @@ -166,8 +166,11 @@ impl StacksHttpResponse { pub fn decode_tenure_tip(self) -> Result { let contents = self.get_http_payload_ok()?; let response_json: serde_json::Value = contents.try_into()?; - let tenure_tip: StacksBlockHeaderTypes = serde_json::from_value(response_json) - .map_err(|_e| Error::DecodeError("Failed to decode JSON".to_string()))?; + let tenure_tip: StacksBlockHeaderTypes = + serde_json::from_value(response_json).map_err(|e| { + error!("Failed to decode JSON"; "err" => ?e); + Error::DecodeError("Failed to decode JSON".to_string()) + })?; Ok(tenure_tip) } } diff --git a/stackslib/src/net/api/gettransaction.rs b/stackslib/src/net/api/gettransaction.rs index 10efaa38d34..1cd5d67db04 100644 --- a/stackslib/src/net/api/gettransaction.rs +++ b/stackslib/src/net/api/gettransaction.rs @@ -33,6 +33,8 @@ pub struct TransactionResponse { pub index_block_hash: StacksBlockId, pub tx: String, pub result: String, + pub block_height: Option, + pub is_canonical: bool, } #[derive(Clone)] @@ -91,7 +93,7 @@ impl RPCRequestHandler for RPCGetTransactionRequestHandler { fn try_handle_request( &mut self, preamble: HttpRequestPreamble, - _contents: HttpRequestContents, + contents: HttpRequestContents, node: &mut StacksNodeState, ) -> Result<(HttpResponsePreamble, HttpResponseContents), NetError> { if !node.txindex { @@ -108,6 +110,13 @@ impl RPCRequestHandler for RPCGetTransactionRequestHandler { .take() .ok_or(NetError::SendError("`txid` no set".into()))?; + let tip = match node.load_stacks_chain_tip(&preamble, &contents) { + Ok(tip) => tip, + Err(error_resp) => { + return error_resp.try_into_contents().map_err(NetError::from); + } + }; + node.with_node_state(|_network, _sortdb, chainstate, _mempool, _rpc_args| { let index_block_hash_and_tx_hex_opt = match NakamotoChainState::get_tx_info_from_txid( chainstate.index_conn().conn(), @@ -126,11 +135,21 @@ impl RPCRequestHandler for RPCGetTransactionRequestHandler { match index_block_hash_and_tx_hex_opt { Some((index_block_hash, tx_hex, result)) => { + let block_height = chainstate + .index_conn() + .get_ancestor_block_height(&index_block_hash, &tip)?; + let is_canonical = chainstate + .index_conn() + .get_ancestor_block_height(&index_block_hash, &tip) + .map(|height_opt| height_opt.is_some()) + .unwrap_or(false); let preamble = HttpResponsePreamble::ok_json(&preamble); let body = HttpResponseContents::try_from_json(&TransactionResponse { - index_block_hash, + index_block_hash: index_block_hash.clone(), tx: tx_hex, result, + block_height, + is_canonical, })?; return Ok((preamble, body)); } diff --git a/stackslib/src/net/api/mod.rs b/stackslib/src/net/api/mod.rs index a5777a751d9..8e770f563cc 100644 --- a/stackslib/src/net/api/mod.rs +++ b/stackslib/src/net/api/mod.rs @@ -20,6 +20,7 @@ use crate::net::Error as NetError; pub mod blockreplay; pub mod callreadonly; pub mod fastcallreadonly; +pub mod get_tenure_tip_meta; pub mod get_tenures_fork_info; pub mod getaccount; pub mod getattachment; @@ -126,6 +127,9 @@ impl StacksHttp { self.register_rpc_endpoint(gettenure::RPCNakamotoTenureRequestHandler::new()); self.register_rpc_endpoint(gettenureinfo::RPCNakamotoTenureInfoRequestHandler::new()); self.register_rpc_endpoint(gettenuretip::RPCNakamotoTenureTipRequestHandler::new()); + self.register_rpc_endpoint( + get_tenure_tip_meta::NakamotoTenureTipMetadataRequestHandler::new(), + ); self.register_rpc_endpoint(gettenureblocks::RPCNakamotoTenureBlocksRequestHandler::new()); self.register_rpc_endpoint( gettenureblocksbyhash::RPCNakamotoTenureBlocksByHashRequestHandler::new(), diff --git a/stackslib/src/net/api/postblock_proposal.rs b/stackslib/src/net/api/postblock_proposal.rs index 431af423519..042cbc08dce 100644 --- a/stackslib/src/net/api/postblock_proposal.rs +++ b/stackslib/src/net/api/postblock_proposal.rs @@ -193,6 +193,9 @@ impl BlockValidateResponse { #[cfg(any(test, feature = "testing"))] fn fault_injection_validation_delay() { let delay = TEST_VALIDATE_DELAY_DURATION_SECS.get(); + if delay == 0 { + return; + } warn!("Sleeping for {} seconds to simulate slow processing", delay); thread::sleep(Duration::from_secs(delay)); } diff --git a/stackslib/src/net/api/tests/blockreplay.rs b/stackslib/src/net/api/tests/blockreplay.rs index 305c1c79eaf..b012691dc07 100644 --- a/stackslib/src/net/api/tests/blockreplay.rs +++ b/stackslib/src/net/api/tests/blockreplay.rs @@ -72,6 +72,43 @@ fn test_try_parse_request() { let (preamble, contents) = parsed_request.destruct(); assert_eq!(&preamble, request.preamble()); + assert_eq!(handler.profiler, false); +} + +#[test] +fn test_try_parse_request_with_profiler() { + let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 33333); + let mut http = StacksHttp::new(addr.clone(), &ConnectionOptions::default()); + + let mut request = StacksHttpRequest::new_block_replay_with_profiler( + addr.into(), + &StacksBlockId([0x01; 32]), + true, + ); + + // add the authorization header + request.add_header("authorization".into(), "password".into()); + + let bytes = request.try_serialize().unwrap(); + + debug!("Request:\n{}\n", std::str::from_utf8(&bytes).unwrap()); + + let (parsed_preamble, offset) = http.read_preamble(&bytes).unwrap(); + + let mut handler = + blockreplay::RPCNakamotoBlockReplayRequestHandler::new(Some("password".into())); + + let parsed_request = http + .handle_try_parse_request( + &mut handler, + &parsed_preamble.expect_request(), + &bytes[offset..], + ) + .unwrap(); + + let (preamble, contents) = parsed_request.destruct(); + + assert_eq!(handler.profiler, true); } #[test] @@ -110,8 +147,11 @@ fn test_try_make_response() { let mut requests = vec![]; // query existing, non-empty Nakamoto block - let mut request = - StacksHttpRequest::new_block_replay(addr.clone().into(), &rpc_test.canonical_tip); + let mut request = StacksHttpRequest::new_block_replay_with_profiler( + addr.clone().into(), + &rpc_test.canonical_tip, + true, + ); // add the authorization header request.add_header("authorization".into(), "password".into()); requests.push(request); diff --git a/stackslib/src/net/api/tests/mod.rs b/stackslib/src/net/api/tests/mod.rs index aacc86a0fcd..c58d4d1a6ad 100644 --- a/stackslib/src/net/api/tests/mod.rs +++ b/stackslib/src/net/api/tests/mod.rs @@ -185,8 +185,8 @@ fn convo_send_recv(sender: &mut ConversationHttp, receiver: &mut ConversationHtt let all_relays_flushed = receiver.num_pending_outbound() == 0 && sender.num_pending_outbound() == 0; - let nw = sender.send(&mut pipe_write).unwrap(); - let nr = receiver.recv(&mut pipe_read).unwrap(); + let nw = sender.send(&mut pipe_write).expect("Invalid send"); + let nr = receiver.recv(&mut pipe_read).expect("Invalid receive"); debug!( "test_rpc: all_relays_flushed = {} ({},{}), nr = {}, nw = {}", diff --git a/stackslib/src/proptest_utils.rs b/stackslib/src/proptest_utils.rs new file mode 100644 index 00000000000..8ec107fd033 --- /dev/null +++ b/stackslib/src/proptest_utils.rs @@ -0,0 +1,85 @@ +// 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 std::ops::Range; + +use proptest::array::{uniform20, uniform32}; +use proptest::prelude::{any, prop, Strategy}; +use proptest::prop_oneof; +use stacks_common::types::chainstate::StacksAddress; +use stacks_common::util::hash::Hash160; + +use crate::chainstate::stacks::address::{PoxAddress, PoxAddressType20, PoxAddressType32}; +use crate::chainstate::stacks::boot::RawRewardSetEntry; + +/// Generate a PoxAddress::Standard with uniform sampling over the 4 +/// standard network versions and the 20-byte Hash160. +pub fn pox_address_standard() -> impl Strategy { + ( + prop::sample::select(&[20u8, 21, 22, 26]), + uniform20(any::()), + ) + .prop_map(|(version, bytes)| -> PoxAddress { + PoxAddress::Standard(StacksAddress::new(version, Hash160(bytes)).unwrap(), None) + }) +} + +/// Generate a PoxAddress::Addr20 with uniform sampling over +/// mainnet/testnet and 20 bytes +pub fn pox_address_addr20() -> impl Strategy { + ( + any::(), + prop::sample::select(&[PoxAddressType20::P2WPKH]), + uniform20(any::()), + ) + .prop_map(|(mainnet, addr_ty, bytes)| PoxAddress::Addr20(mainnet, addr_ty, bytes)) +} + +/// Generate a PoxAddress::Addr32 with uniform sampling over +/// mainnet/testnet, P2TR/P2WSH and 32 bytes +pub fn pox_address_addr32() -> impl Strategy { + ( + any::(), + prop::sample::select(&[PoxAddressType32::P2TR, PoxAddressType32::P2WSH]), + uniform32(any::()), + ) + .prop_map(|(mainnet, addr_ty, bytes)| PoxAddress::Addr32(mainnet, addr_ty, bytes)) +} + +/// Generate a PoxAddress with uniform sampling over Addr20, Addr32, +/// and Standard PoxAddresses, using `pox_address_standard`, +/// `pox_address_addr32` and `pox_address_addr20` to generate. +pub fn pox_address_strategy() -> impl Strategy { + prop_oneof![ + pox_address_standard(), + pox_address_addr32(), + pox_address_addr20() + ] +} + +/// Generate `RawRewardSetEntry`s, using the `pox_address_strategy` and the supplied range of u128s for generating +/// the total amount stacked. +pub fn reward_set_entry_strategy( + amount_stacked: Range, +) -> impl Strategy { + (pox_address_strategy(), amount_stacked).prop_map(|(reward_address, amount_stacked)| { + RawRewardSetEntry { + reward_address, + amount_stacked, + stacker: None, + signer: None, + } + }) +} diff --git a/versions.toml b/versions.toml index 2f541dd0180..bc23c0af1c2 100644 --- a/versions.toml +++ b/versions.toml @@ -1,4 +1,4 @@ # Update these values when a new release is created. # `stacks-common/build.rs` will automatically update `versions.rs` with these values. -stacks_node_version = "3.3.0.0.2" -stacks_signer_version = "3.3.0.0.2.0" +stacks_node_version = "3.3.0.0.4" +stacks_signer_version = "3.3.0.0.4.0"