Skip to content

Commit 7c95397

Browse files
Merge pull request #6862 from federico-stacks/aac/runtime-expect-acceptable
aac: runtime check error to expect acceptable
2 parents 04a17ca + 8e993ca commit 7c95397

File tree

28 files changed

+827
-895
lines changed

28 files changed

+827
-895
lines changed

clarity-types/src/errors/analysis.rs

Lines changed: 35 additions & 195 deletions
Large diffs are not rendered by default.

clarity/fuzz/fuzz_targets/fuzz_sanitize.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,9 @@ pub fn strict_admits(me: &TypeSignature, x: &ClarityValue) -> Result<bool, Runti
245245
}
246246
TypeSignature::CallableType(_)
247247
| TypeSignature::ListUnionType(_)
248-
| TypeSignature::TraitReferenceType(_) => Err(
249-
RuntimeCheckErrorKind::TraitReferenceUnknown("Unknown trait reference".into()),
250-
),
248+
| TypeSignature::TraitReferenceType(_) => Err(RuntimeCheckErrorKind::ExpectsAcceptable(
249+
"Trait reference unknown".into(),
250+
)),
251251
}
252252
}
253253

clarity/fuzz/fuzz_targets/fuzz_value_sanitize.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,8 @@ pub fn strict_admits(me: &TypeSignature, x: &ClarityValue) -> Result<bool, Runti
251251
}
252252
TypeSignature::CallableType(_)
253253
| TypeSignature::ListUnionType(_)
254-
| TypeSignature::TraitReferenceType(_) => Err(RuntimeCheckErrorKind::TraitReferenceUnknown(
255-
"Unknown trait reference".into(),
254+
| TypeSignature::TraitReferenceType(_) => Err(RuntimeCheckErrorKind::ExpectsAcceptable(
255+
"Trait reference unknown".into(),
256256
)),
257257
}
258258
}

clarity/src/vm/callables.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,16 +329,16 @@ impl DefinedFunction {
329329
let trait_name = trait_identifier.name.to_string();
330330
let constraining_trait = contract_defining_trait
331331
.lookup_trait_definition(&trait_name)
332-
.ok_or(RuntimeCheckErrorKind::TraitReferenceUnknown(
333-
trait_name.to_string(),
334-
))?;
332+
.ok_or(RuntimeCheckErrorKind::ExpectsAcceptable(format!(
333+
"Trait reference unknown: {trait_name}"
334+
)))?;
335335
let expected_sig =
336336
constraining_trait
337337
.get(&self.name)
338-
.ok_or(RuntimeCheckErrorKind::TraitMethodUnknown(
339-
trait_name.to_string(),
340-
self.name.to_string(),
341-
))?;
338+
.ok_or(RuntimeCheckErrorKind::ExpectsAcceptable(format!(
339+
"Trait method unknown: {trait_name}.{}",
340+
self.name
341+
)))?;
342342

343343
let args = self.arg_types.to_vec();
344344
if !expected_sig.check_args_trait_compliance(epoch, args)? {

clarity/src/vm/contexts.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> {
11701170
if !allow_private && !func.is_public() {
11711171
return Err(RuntimeCheckErrorKind::NoSuchPublicFunction(contract_identifier.to_string(), tx_name.to_string()).into());
11721172
} else if read_only && !func.is_read_only() {
1173-
return Err(RuntimeCheckErrorKind::PublicFunctionNotReadOnly(contract_identifier.to_string(), tx_name.to_string()).into());
1173+
return Err(RuntimeCheckErrorKind::ExpectsAcceptable(format!("Public function not read-only: {contract_identifier} {tx_name}")).into());
11741174
}
11751175

11761176
let args: Result<Vec<Value>, VmExecutionError> = args.iter()
@@ -1338,9 +1338,9 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> {
13381338
.database
13391339
.has_contract(&contract_identifier)
13401340
{
1341-
return Err(RuntimeCheckErrorKind::ContractAlreadyExists(
1342-
contract_identifier.to_string(),
1343-
)
1341+
return Err(RuntimeCheckErrorKind::ExpectsAcceptable(format!(
1342+
"Contract already exists: {contract_identifier}"
1343+
))
13441344
.into());
13451345
}
13461346

@@ -1876,12 +1876,11 @@ impl<'a, 'hooks> GlobalContext<'a, 'hooks> {
18761876
self.commit()?;
18771877
Ok(result)
18781878
} else {
1879-
Err(
1880-
RuntimeCheckErrorKind::PublicFunctionMustReturnResponse(Box::new(
1881-
TypeSignature::type_of(&result)?,
1882-
))
1883-
.into(),
1884-
)
1879+
Err(RuntimeCheckErrorKind::ExpectsAcceptable(format!(
1880+
"Public function must return response: {}",
1881+
TypeSignature::type_of(&result)?
1882+
))
1883+
.into())
18851884
}
18861885
} else {
18871886
self.roll_back()?;
@@ -2504,9 +2503,11 @@ mod test {
25042503
.initialize_contract_from_ast(contract_id.clone(), version, &ast, contract_src)
25052504
.unwrap_err();
25062505

2507-
assert!(matches!(
2506+
assert_eq!(
25082507
err,
2509-
VmExecutionError::RuntimeCheck(RuntimeCheckErrorKind::ContractAlreadyExists(_))
2510-
));
2508+
VmExecutionError::RuntimeCheck(RuntimeCheckErrorKind::ExpectsAcceptable(
2509+
"Contract already exists: S1G2081040G2081040G2081040G208105NK8PE5.dup".to_string()
2510+
))
2511+
);
25112512
}
25122513
}

clarity/src/vm/database/clarity_db.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,8 +1537,12 @@ impl ClarityDatabase<'_> {
15371537
) -> Result<DataVariableMetadata, VmExecutionError> {
15381538
let key = ClarityDatabase::make_metadata_key(StoreType::VariableMeta, variable_name);
15391539

1540-
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?
1541-
.ok_or(RuntimeCheckErrorKind::NoSuchDataVariable(variable_name.to_string()).into())
1540+
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?.ok_or(
1541+
RuntimeCheckErrorKind::ExpectsAcceptable(format!(
1542+
"No such data variable: {variable_name}"
1543+
))
1544+
.into(),
1545+
)
15421546
}
15431547

15441548
#[cfg(any(test, feature = "testing"))]
@@ -1678,8 +1682,9 @@ impl ClarityDatabase<'_> {
16781682
) -> Result<DataMapMetadata, VmExecutionError> {
16791683
let key = ClarityDatabase::make_metadata_key(StoreType::DataMapMeta, map_name);
16801684

1681-
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?
1682-
.ok_or(RuntimeCheckErrorKind::NoSuchMap(map_name.to_string()).into())
1685+
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?.ok_or(
1686+
RuntimeCheckErrorKind::ExpectsAcceptable(format!("No such map: {map_name}")).into(),
1687+
)
16831688
}
16841689

16851690
pub fn make_key_for_data_map_entry(
@@ -2042,8 +2047,9 @@ impl ClarityDatabase<'_> {
20422047
) -> Result<FungibleTokenMetadata, VmExecutionError> {
20432048
let key = ClarityDatabase::make_metadata_key(StoreType::FungibleTokenMeta, token_name);
20442049

2045-
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?
2046-
.ok_or(RuntimeCheckErrorKind::NoSuchFT(token_name.to_string()).into())
2050+
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?.ok_or(
2051+
RuntimeCheckErrorKind::ExpectsAcceptable(format!("No such FT: {token_name}")).into(),
2052+
)
20472053
}
20482054

20492055
pub fn create_non_fungible_token(
@@ -2068,8 +2074,9 @@ impl ClarityDatabase<'_> {
20682074
) -> Result<NonFungibleTokenMetadata, VmExecutionError> {
20692075
let key = ClarityDatabase::make_metadata_key(StoreType::NonFungibleTokenMeta, token_name);
20702076

2071-
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?
2072-
.ok_or(RuntimeCheckErrorKind::NoSuchNFT(token_name.to_string()).into())
2077+
map_no_contract_as_none(self.fetch_metadata(contract_identifier, &key))?.ok_or(
2078+
RuntimeCheckErrorKind::ExpectsAcceptable(format!("No such NFT: {token_name}")).into(),
2079+
)
20732080
}
20742081

20752082
pub fn checked_increase_token_supply(

clarity/src/vm/functions/arithmetic.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -601,10 +601,10 @@ pub fn native_bitwise_left_shift(input: Value, pos: Value) -> Result<Value, VmEx
601601
let result = input.wrapping_shl(shamt);
602602
Ok(Value::UInt(result))
603603
}
604-
_ => Err(RuntimeCheckErrorKind::UnionTypeError(
605-
vec![TypeSignature::IntType, TypeSignature::UIntType],
606-
Box::new(TypeSignature::type_of(&input)?),
607-
)
604+
_ => Err(RuntimeCheckErrorKind::ExpectsAcceptable(format!(
605+
"Union type error {}",
606+
TypeSignature::type_of(&input)?
607+
))
608608
.into()),
609609
}
610610
} else {
@@ -630,10 +630,10 @@ pub fn native_bitwise_right_shift(input: Value, pos: Value) -> Result<Value, VmE
630630
let result = input.wrapping_shr(shamt);
631631
Ok(Value::UInt(result))
632632
}
633-
_ => Err(RuntimeCheckErrorKind::UnionTypeError(
634-
vec![TypeSignature::IntType, TypeSignature::UIntType],
635-
Box::new(TypeSignature::type_of(&input)?),
636-
)
633+
_ => Err(RuntimeCheckErrorKind::ExpectsAcceptable(format!(
634+
"Union type error {}",
635+
TypeSignature::type_of(&input)?
636+
))
637637
.into()),
638638
}
639639
} else {

0 commit comments

Comments
 (0)