Skip to content
Open
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
83ae404
use clarity-serializaton in clarity
Jiloc Jul 21, 2025
96dddb8
use CodecError instead of SerializationError
Jiloc Jul 21, 2025
59d9bf2
add From<ClarityCodecError> for ClientError
Jiloc Jul 21, 2025
cfa3cf6
add CodecError conversions for stackslib
Jiloc Jul 21, 2025
04a9323
cargo fmt
Jiloc Jul 21, 2025
3eabeb4
Merge branch 'feat/clarity-serialization-crate' into feat/clarity-dep…
Jiloc Jul 21, 2025
1f1c190
update Cargo.lock
Jiloc Jul 21, 2025
7848406
fix cli tests
Jiloc Jul 21, 2025
738bea8
Merge branch 'feat/clarity-serialization-crate' into feat/clarity-dep…
Jiloc Jul 21, 2025
526cec1
remove hashbrown
Jiloc Jul 21, 2025
1944b20
Merge branch 'feat/clarity-serialization-crate' into feat/clarity-dep…
Jiloc Jul 21, 2025
47cfbfe
remove hashbrown from stackslib
Jiloc Jul 21, 2025
9475370
cargo format
Jiloc Jul 21, 2025
dd8ad84
Merge branch 'feat/clarity-serialization-crate' into feat/clarity-dep…
Jiloc Jul 21, 2025
228bdee
Merge branch 'feat/clarity-serialization-crate' into feat/clarity-dep…
Jiloc Jul 22, 2025
05931c8
Merge branch 'feat/move-clarity-serialization-to-root' into feat/clar…
Jiloc Jul 23, 2025
5462de1
add testing utils for conversion
Jiloc Jul 23, 2025
28036bc
cargo fmt
Jiloc Jul 23, 2025
9660ae2
Merge branch 'feat/move-clarity-serialization-to-root' into feat/clar…
Jiloc Jul 23, 2025
1c05004
Merge branch 'develop' into feat/clarity-depend-on-clarity-serialization
Jiloc Aug 1, 2025
4ba0a36
Merge branch 'develop' into feat/clarity-depend-on-clarity-serialization
Jiloc Aug 1, 2025
355d0ef
add wasm-web forwarding to clarity-serialization
Jiloc Aug 1, 2025
40a95ee
drop CodecError in favor of original clarity errors
Jiloc Aug 6, 2025
b0957e3
clippy
Jiloc Aug 6, 2025
fa6d7d7
remove old file
Jiloc Aug 6, 2025
aef2fe9
remove unnecessary map_err
Jiloc Aug 6, 2025
a1090c4
add comment for parsing traits
Jiloc Aug 6, 2025
454d7e0
revert to original implementation of parse_*_type_repr
Jiloc Aug 6, 2025
15ae223
remove redundant clarity-serialization dependency with testing flag
Jiloc Aug 6, 2025
7b42ca5
fix blockstack_cli tests
Jiloc Aug 6, 2025
9eabf67
add missing copyrights
Jiloc Aug 6, 2025
69a1941
Merge branch 'develop' into feat/clarity-depend-on-clarity-serialization
Jiloc Aug 7, 2025
abccbe9
add clarity to cargo check for wasm32
Jiloc Aug 7, 2025
4a35628
re-add rustqlite in testing
Jiloc Aug 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions clarity-serialization/src/types/mod.rs
Copy link
Member

@jcnelson jcnelson Aug 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, so, the obnoxious thing about the way we've structured this series of PRs is that the stakes are much, much higher on this specific PR, whereas lots of potential bugs are present in the previous #6297 PR that this PR depends on. #6297 was merged due to expediency more than correctness since (1) it didn't affect any production code paths and (2) it was supposedly, ostensibly, release-blockingly important that clarity-serialization be a crate in Stacks Core as part of the last release instead of when it could be given due consideration for how it would impact consensus in the future. This has now made my job of reviewing this PR and your job of acting on feedback a lot more difficult than it needed to be.

Here are some correctness-related bugs introduced in #6297 that will need to be fixed in this PR.

  • in src/types/mod.rs, the function StandardPrincipalData::new() now returns a CodecError instead of an InterpreterError. This is a consensus bug, because this PR treats CodecError as a CheckErrors instead of an InterpreterError. A transaction can be mined if it encountered a CheckErrors, but it cannot be mined if it encountered an InterpreterError. StandardPrincipalData::new() will need to be modified to return an InterpreterError as it did before.

  • The above goes for QualifiedContractIdentifier::local() and QualifiedContractIdentifier::parse(). These need to continue to return InterpreterError, not CodecError (which this PR really treats as a CheckErrors).

  • The above goes for TraitIdentifier::parse_fully_qualified(), TraitIdentifier::parse_sugared_syntax(), and TraitIdentifier::parse() -- these need to return InterpreterError.

There are more (many) places where you've replaced an existing error type with CodecError in #6297. You will need to revert all of these changes. You should instead consolidate every error type, including their associated From, TryFrom, Display, etc. implementations, in the clarity create exactly as they are defined into clarity-serialization. You should also drop CodecError entirely -- it was not needed before, so it will not be needed post-refactoring.

Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ use serde::{Deserialize, Serialize};
use stacks_common::address::c32;
use stacks_common::types::StacksEpochId;
use stacks_common::types::chainstate::StacksAddress;
#[cfg(feature = "testing")]
use stacks_common::types::chainstate::StacksPrivateKey;
use stacks_common::util::hash;

pub use self::signatures::{
Expand Down Expand Up @@ -122,6 +124,23 @@ impl fmt::Debug for StandardPrincipalData {
}
}

#[cfg(any(test, feature = "testing"))]
impl From<&StacksPrivateKey> for StandardPrincipalData {
fn from(o: &StacksPrivateKey) -> StandardPrincipalData {
use stacks_common::address::{AddressHashMode, C32_ADDRESS_VERSION_TESTNET_SINGLESIG};
use stacks_common::types::chainstate::StacksPublicKey;

let stacks_addr = StacksAddress::from_public_keys(
C32_ADDRESS_VERSION_TESTNET_SINGLESIG,
&AddressHashMode::SerializeP2PKH,
1,
&vec![StacksPublicKey::from_private(o)],
)
.unwrap();
StandardPrincipalData::from(stacks_addr)
}
}

#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
pub struct QualifiedContractIdentifier {
pub issuer: StandardPrincipalData,
Expand Down Expand Up @@ -178,6 +197,13 @@ pub enum PrincipalData {
Contract(QualifiedContractIdentifier),
}

#[cfg(any(test, feature = "testing"))]
impl From<&StacksPrivateKey> for PrincipalData {
fn from(o: &StacksPrivateKey) -> PrincipalData {
PrincipalData::Standard(StandardPrincipalData::from(o))
}
}

pub enum ContractIdentifier {
Relative(ContractName),
Qualified(QualifiedContractIdentifier),
Expand Down Expand Up @@ -1268,6 +1294,13 @@ impl fmt::Display for Value {
}
}

#[cfg(any(test, feature = "testing"))]
impl From<&StacksPrivateKey> for Value {
fn from(o: &StacksPrivateKey) -> Value {
Value::from(StandardPrincipalData::from(o))
}
}

impl PrincipalData {
pub fn version(&self) -> u8 {
match self {
Expand Down
8 changes: 5 additions & 3 deletions clarity/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ name = "clarity"
path = "./src/libclarity.rs"

[dependencies]
clarity-serialization = { package = "clarity-serialization", path = "../clarity-serialization", default-features = false }
serde = "1"
serde_derive = "1"
regex = "1"
Expand All @@ -27,7 +28,6 @@ slog = { version = "2.5.2", features = [ "max_level_trace" ] }
stacks_common = { package = "stacks-common", path = "../stacks-common", default-features = false }
rstest = { version = "0.17.0", optional = true }
rstest_reuse = { version = "0.5.0", optional = true }
hashbrown = { workspace = true }
rusqlite = { workspace = true, optional = true }

[dependencies.serde_json]
Expand All @@ -39,6 +39,8 @@ assert-json-diff = "1.0.0"
mutants = "0.0.3"
rstest = { version = "0.17.0" }
rstest_reuse = { version = "0.5.0" }
clarity-serialization = { package = "clarity-serialization", path = "../clarity-serialization", default-features = false, features = ["testing"] }

# a nightly rustc regression (35dbef235 2021-03-02) prevents criterion from compiling
# but it isn't necessary for tests: only benchmarks. therefore, commenting out for now.
# criterion = "0.3"
Expand All @@ -51,8 +53,8 @@ default = ["rusqlite"]
developer-mode = ["stacks_common/developer-mode"]
slog_json = ["stacks_common/slog_json"]
rusqlite = ["stacks_common/rusqlite", "dep:rusqlite"]
testing = ["rstest", "rstest_reuse"]
testing = ["rstest", "rstest_reuse", "clarity-serialization/testing"]
devtools = []
rollback_value_check = []
disable-costs = []
wasm-web = ["stacks_common/wasm-web"]
wasm-web = ["stacks_common/wasm-web", "clarity-serialization/wasm-web"]
5 changes: 3 additions & 2 deletions clarity/src/vm/analysis/analysis_db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,17 @@

use std::collections::{BTreeMap, BTreeSet};

use clarity_serialization::representations::ClarityName;
use clarity_serialization::types::{QualifiedContractIdentifier, TraitIdentifier};
use stacks_common::types::StacksEpochId;

use crate::vm::analysis::errors::{CheckErrors, CheckResult};
use crate::vm::analysis::type_checker::ContractAnalysis;
use crate::vm::database::{
ClarityBackingStore, ClarityDeserializable, ClaritySerializable, RollbackWrapper,
};
use crate::vm::representations::ClarityName;
use crate::vm::types::signatures::FunctionSignature;
use crate::vm::types::{FunctionType, QualifiedContractIdentifier, TraitIdentifier};
use crate::vm::types::FunctionType;
use crate::vm::ClarityVersion;

pub struct AnalysisDatabase<'a> {
Expand Down
4 changes: 3 additions & 1 deletion clarity/src/vm/analysis/arithmetic_checker/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,18 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use clarity_serialization::representations::ClarityName;

pub use super::errors::{
check_argument_count, check_arguments_at_least, CheckError, CheckErrors, CheckResult,
};
use crate::vm::analysis::types::ContractAnalysis;
use crate::vm::functions::define::{DefineFunctions, DefineFunctionsParsed};
use crate::vm::functions::NativeFunctions;
use crate::vm::representations::SymbolicExpression;
use crate::vm::representations::SymbolicExpressionType::{
Atom, AtomValue, Field, List, LiteralValue, TraitReference,
};
use crate::vm::representations::{ClarityName, SymbolicExpression};
use crate::vm::variables::NativeVariables;
use crate::vm::ClarityVersion;

Expand Down
53 changes: 52 additions & 1 deletion clarity/src/vm/analysis/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@

use std::{error, fmt};

use clarity_serialization::errors::CodecError;
use clarity_serialization::types::{TraitIdentifier, TupleTypeSignature, TypeSignature, Value};

use crate::vm::costs::{CostErrors, ExecutionCost};
use crate::vm::diagnostic::{DiagnosableError, Diagnostic};
use crate::vm::representations::SymbolicExpression;
use crate::vm::types::{TraitIdentifier, TupleTypeSignature, TypeSignature, Value};

pub type CheckResult<T> = Result<T, CheckError>;

Expand Down Expand Up @@ -493,3 +495,52 @@ impl DiagnosableError for CheckErrors {
}
}
}

impl From<CodecError> for CheckErrors {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of doing this, why not just create a single CheckErrors::Codec(ce: CodecError) variant? Why attempt to add more variants to CheckErrors that only serve to represent (some) variants of CodecError?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodecError dropped in 40a95ee

fn from(err: CodecError) -> Self {
match err {
CodecError::ValueTooLarge => CheckErrors::ValueTooLarge,
CodecError::ValueOutOfBounds => CheckErrors::ValueOutOfBounds,
CodecError::TypeSignatureTooDeep => CheckErrors::TypeSignatureTooDeep,
CodecError::SupertypeTooLarge => CheckErrors::SupertypeTooLarge,
CodecError::EmptyTuplesNotAllowed => CheckErrors::EmptyTuplesNotAllowed,
CodecError::ListTypesMustMatch => CheckErrors::ListTypesMustMatch,
CodecError::CouldNotDetermineType => CheckErrors::CouldNotDetermineType,
CodecError::CouldNotDetermineSerializationType => {
CheckErrors::CouldNotDetermineSerializationType
}
CodecError::InvalidStringCharacters => CheckErrors::InvalidCharactersDetected,
CodecError::InvalidUtf8Encoding => CheckErrors::InvalidUTF8Encoding,
CodecError::NoSuchTupleField(name, sig) => CheckErrors::NoSuchTupleField(name, sig),
CodecError::TypeError { expected, found } => CheckErrors::TypeError(*expected, *found),
CodecError::TypeValueError { expected, found } => {
CheckErrors::TypeValueError(*expected, *found)
}
CodecError::Expect(s) => CheckErrors::Expects(s),
// These errors don't have a match in CheckErrors, so we convert
// them to a descriptive string inside the `Expects` variant.
// Based on the current code, this should never happen.
CodecError::Io(_)
| CodecError::Serialization(_)
| CodecError::Deserialization(_)
| CodecError::DeserializeExpected(_)
| CodecError::UnexpectedSerialization
| CodecError::LeftoverBytesInDeserialization
| CodecError::ParseError(_)
| CodecError::BadTypeConstruction
| CodecError::FailureConstructingTupleWithType
| CodecError::FailureConstructingListWithType
| CodecError::NameAlreadyUsedInTuple(_)
| CodecError::InvalidClarityName(_, _)
| CodecError::InvalidContractName(_, _) => {
CheckErrors::Expects(format!("Unexpected error: {err:?}"))
}
}
}
}

impl From<CodecError> for CheckError {
fn from(err: CodecError) -> Self {
CheckError::new(err.into())
}
}
8 changes: 5 additions & 3 deletions clarity/src/vm/analysis/read_only_checker/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use hashbrown::HashMap;
use std::collections::HashMap;

use clarity_serialization::representations::ClarityName;
use clarity_serialization::types::{PrincipalData, Value};
use stacks_common::types::StacksEpochId;

pub use super::errors::{
Expand All @@ -27,8 +30,7 @@ use crate::vm::functions::NativeFunctions;
use crate::vm::representations::SymbolicExpressionType::{
Atom, AtomValue, Field, List, LiteralValue, TraitReference,
};
use crate::vm::representations::{ClarityName, SymbolicExpression, SymbolicExpressionType};
use crate::vm::types::{PrincipalData, Value};
use crate::vm::representations::{SymbolicExpression, SymbolicExpressionType};
use crate::vm::ClarityVersion;

#[cfg(test)]
Expand Down
3 changes: 1 addition & 2 deletions clarity/src/vm/analysis/type_checker/contexts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use std::collections::HashSet;
use std::collections::{HashMap, HashSet};

use hashbrown::HashMap;
use stacks_common::types::StacksEpochId;

use crate::vm::analysis::errors::{CheckError, CheckErrors, CheckResult};
Expand Down
4 changes: 1 addition & 3 deletions clarity/src/vm/analysis/type_checker/v2_05/contexts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use std::collections::BTreeMap;

use hashbrown::{HashMap, HashSet};
use std::collections::{BTreeMap, HashMap, HashSet};

use crate::vm::analysis::errors::{CheckError, CheckErrors, CheckResult};
use crate::vm::analysis::types::ContractAnalysis;
Expand Down
2 changes: 1 addition & 1 deletion clarity/src/vm/analysis/type_checker/v2_05/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ use crate::vm::representations::SymbolicExpressionType::{
Atom, AtomValue, Field, List, LiteralValue, TraitReference,
};
use crate::vm::representations::{depth_traverse, ClarityName, SymbolicExpression};
use crate::vm::types::signatures::FunctionSignature;
use crate::vm::types::signatures::{FunctionSignature, TypeSignatureExt as _};
use crate::vm::types::{
parse_name_type_pairs, FixedFunction, FunctionArg, FunctionType, PrincipalData,
QualifiedContractIdentifier, TypeSignature, Value,
Expand Down
5 changes: 2 additions & 3 deletions clarity/src/vm/analysis/type_checker/v2_05/natives/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,8 @@ fn check_special_list_cons(
type_arg.type_size()?,
)?;
}
TypeSignature::parent_list_type(&typed_args)
.map_err(|x| x.into())
.map(TypeSignature::from)
let list_type = TypeSignature::parent_list_type(&typed_args).map_err(CheckError::from)?;
Copy link
Member

@jcnelson jcnelson Aug 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert this change. You should assume that all error types are consensus-critical, along with their valid conversations.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done in 40a95ee

Ok(TypeSignature::from(list_type))
}

fn check_special_print(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use clarity_serialization::representations::ClarityName;
use clarity_serialization::types::TypeSignature;
use stacks_common::types::StacksEpochId;

use crate::vm::analysis::type_checker::v2_05::{
Expand All @@ -22,8 +24,7 @@ use crate::vm::analysis::type_checker::v2_05::{
};
use crate::vm::costs::cost_functions::ClarityCostFunction;
use crate::vm::costs::{analysis_typecheck_cost, runtime_cost};
use crate::vm::representations::{ClarityName, SymbolicExpression};
use crate::vm::types::TypeSignature;
use crate::vm::representations::SymbolicExpression;

pub fn check_special_okay(
checker: &mut TypeChecker,
Expand Down
5 changes: 3 additions & 2 deletions clarity/src/vm/analysis/type_checker/v2_05/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ use crate::vm::types::SequenceSubtype::*;
use crate::vm::types::StringSubtype::*;
use crate::vm::types::TypeSignature::{BoolType, IntType, PrincipalType, UIntType};
use crate::vm::types::{
FixedFunction, FunctionType, QualifiedContractIdentifier, TypeSignature, BUFF_32, BUFF_64,
FixedFunction, FunctionType, QualifiedContractIdentifier, TypeSignature, TypeSignatureExt as _,
BUFF_32, BUFF_64,
};
use crate::vm::ClarityVersion;

Expand Down Expand Up @@ -1293,7 +1294,7 @@ fn test_high_order_map() {
fn test_function_order_tuples() {
let snippet = "
(define-read-only (get-score)
(ok
(ok
(tuple
(score (get-zero))
)
Expand Down
4 changes: 1 addition & 3 deletions clarity/src/vm/analysis/type_checker/v2_1/contexts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use std::collections::BTreeMap;

use hashbrown::{HashMap, HashSet};
use std::collections::{BTreeMap, HashMap, HashSet};

use crate::vm::analysis::errors::{CheckError, CheckErrors, CheckResult};
use crate::vm::analysis::type_checker::is_reserved_word;
Expand Down
2 changes: 1 addition & 1 deletion clarity/src/vm/analysis/type_checker/v2_1/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ use crate::vm::types::{
parse_name_type_pairs, FixedFunction, FunctionArg, FunctionType, ListData, ListTypeData,
OptionalData, PrincipalData, QualifiedContractIdentifier, ResponseData, SequenceData,
SequenceSubtype, StringSubtype, TraitIdentifier, TupleData, TupleTypeSignature, TypeSignature,
Value, MAX_TYPE_DEPTH,
TypeSignatureExt as _, Value, MAX_TYPE_DEPTH,
};
use crate::vm::variables::NativeVariables;
use crate::vm::ClarityVersion;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use super::{TypeChecker, TypeResult};
use crate::vm::analysis::read_only_checker::check_argument_count;
use crate::vm::analysis::type_checker::contexts::TypingContext;
use crate::vm::analysis::CheckError;
use crate::vm::types::{BufferLength, SequenceSubtype, TypeSignature};
use crate::vm::types::{BufferLength, SequenceSubtype, TypeSignature, TypeSignatureExt as _};
use crate::vm::SymbolicExpression;

/// `to-consensus-buff?` admits exactly one argument:
Expand Down
19 changes: 11 additions & 8 deletions clarity/src/vm/analysis/type_checker/v2_1/natives/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,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(CheckErrors::from)
});
let cost = checked
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert this and use the original error conversions.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done in 40a95ee

.type_size()
.map_err(CheckErrors::from)
.and_then(|ty_size| {
checker
.compute_cost(
ClarityCostFunction::AnalysisListItemsCheck,
&[ty_size.into()],
)
.map_err(CheckErrors::from)
});
costs.push(cost);

if let Some(cur_size) = entries_size {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

use clarity_serialization::representations::ClarityName;
use clarity_serialization::types::TypeSignature;
use stacks_common::types::StacksEpochId;

use super::{
Expand All @@ -22,8 +24,7 @@ use super::{
use crate::vm::analysis::type_checker::contexts::TypingContext;
use crate::vm::costs::cost_functions::ClarityCostFunction;
use crate::vm::costs::{analysis_typecheck_cost, runtime_cost, CostErrors, CostTracker};
use crate::vm::representations::{ClarityName, SymbolicExpression};
use crate::vm::types::TypeSignature;
use crate::vm::representations::SymbolicExpression;

pub fn check_special_okay(
checker: &mut TypeChecker,
Expand Down
Loading