From 33203d23b23790812056cc24543b011c49370cdd Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 12:01:57 -0500 Subject: [PATCH 01/33] began refactor of memo --- src/vm/analysis/arithmetic_checker/mod.rs | 4 +-- src/vm/analysis/arithmetic_checker/tests.rs | 4 ++- src/vm/analysis/read_only_checker/mod.rs | 5 +-- .../analysis/type_checker/natives/assets.rs | 34 +++++++++++++----- src/vm/analysis/type_checker/natives/mod.rs | 3 ++ src/vm/costs/cost_functions.rs | 1 + src/vm/docs/mod.rs | 1 + src/vm/functions/assets.rs | 36 +++++++++++++------ src/vm/functions/mod.rs | 2 ++ src/vm/tests/costs.rs | 1 + 10 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/vm/analysis/arithmetic_checker/mod.rs b/src/vm/analysis/arithmetic_checker/mod.rs index dd326d9ad4..90c388af2e 100644 --- a/src/vm/analysis/arithmetic_checker/mod.rs +++ b/src/vm/analysis/arithmetic_checker/mod.rs @@ -167,8 +167,8 @@ impl ArithmeticOnlyChecker { match function { FetchVar | GetBlockInfo | GetTokenBalance | GetAssetOwner | FetchEntry | SetEntry | DeleteEntry | InsertEntry | SetVar | MintAsset | MintToken | TransferAsset - | TransferToken | ContractCall | StxTransfer | StxBurn | AtBlock | GetStxBalance - | GetTokenSupply | BurnToken | BurnAsset => { + | TransferToken | ContractCall | StxTransfer | StxTransferMemo | StxBurn | AtBlock + | GetStxBalance | GetTokenSupply | BurnToken | BurnAsset => { return Err(Error::FunctionNotPermitted(function)); } Append | Concat | AsMaxLen | ContractOf | PrincipalOf | ListCons | Print diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index 502523f84d..6a29457bfe 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -166,8 +166,10 @@ fn test_functions() { FunctionNotPermitted(NativeFunctions::GetStxBalance)), ("(stx-burn? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)", FunctionNotPermitted(NativeFunctions::StxBurn)), - (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x00)"#, + (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)"#, FunctionNotPermitted(NativeFunctions::StxTransfer)), + (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x00)"#, + FunctionNotPermitted(NativeFunctions::StxTransferMemo)), ("(define-private (foo (a (list 3 uint))) (map log2 a))", FunctionNotPermitted(NativeFunctions::Map)), diff --git a/src/vm/analysis/read_only_checker/mod.rs b/src/vm/analysis/read_only_checker/mod.rs index 76e21bae9e..3cddcefae8 100644 --- a/src/vm/analysis/read_only_checker/mod.rs +++ b/src/vm/analysis/read_only_checker/mod.rs @@ -194,8 +194,9 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { check_argument_count(2, args)?; self.check_all_read_only(args) } - StxTransfer | StxBurn | SetEntry | DeleteEntry | InsertEntry | SetVar | MintAsset - | MintToken | TransferAsset | TransferToken | BurnAsset | BurnToken => { + StxTransfer | StxTransferMemo | StxBurn | SetEntry | DeleteEntry | InsertEntry + | SetVar | MintAsset | MintToken | TransferAsset | TransferToken | BurnAsset + | BurnToken => { self.check_all_read_only(args)?; Ok(false) } diff --git a/src/vm/analysis/type_checker/natives/assets.rs b/src/vm/analysis/type_checker/natives/assets.rs index 9ae619747c..25a1a17be2 100644 --- a/src/vm/analysis/type_checker/natives/assets.rs +++ b/src/vm/analysis/type_checker/natives/assets.rs @@ -195,12 +195,30 @@ pub fn check_special_stx_transfer( args: &[SymbolicExpression], context: &TypingContext, ) -> TypeResult { - let memo_passed = if let Ok(()) = check_argument_count(4, args) { - true - } else { - check_argument_count(3, args)?; - false - }; + check_argument_count(4, args); + + let amount_type: TypeSignature = TypeSignature::UIntType; + let from_type: TypeSignature = TypeSignature::PrincipalType; + let to_type: TypeSignature = TypeSignature::PrincipalType; + + runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 0)?; + + checker.type_check_expects(&args[0], context, &amount_type)?; + checker.type_check_expects(&args[1], context, &from_type)?; + checker.type_check_expects(&args[2], context, &to_type)?; + + Ok( + TypeSignature::ResponseType(Box::new((TypeSignature::BoolType, TypeSignature::UIntType))) + .into(), + ) +} + +pub fn check_special_stx_transfer_memo( + checker: &mut TypeChecker, + args: &[SymbolicExpression], + context: &TypingContext, +) -> TypeResult { + check_argument_count(4, args); let amount_type: TypeSignature = TypeSignature::UIntType; let from_type: TypeSignature = TypeSignature::PrincipalType; @@ -214,9 +232,7 @@ pub fn check_special_stx_transfer( checker.type_check_expects(&args[0], context, &amount_type)?; checker.type_check_expects(&args[1], context, &from_type)?; checker.type_check_expects(&args[2], context, &to_type)?; - if memo_passed { - checker.type_check_expects(&args[3], context, &memo_type)?; - } + checker.type_check_expects(&args[3], context, &memo_type)?; Ok( TypeSignature::ResponseType(Box::new((TypeSignature::BoolType, TypeSignature::UIntType))) diff --git a/src/vm/analysis/type_checker/natives/mod.rs b/src/vm/analysis/type_checker/natives/mod.rs index 3fd6f37edb..71f460a9f8 100644 --- a/src/vm/analysis/type_checker/natives/mod.rs +++ b/src/vm/analysis/type_checker/natives/mod.rs @@ -646,6 +646,9 @@ impl TypedNativeFunction { .unwrap(), }))), StxTransfer => Special(SpecialNativeFunction(&assets::check_special_stx_transfer)), + StxTransferMemo => Special(SpecialNativeFunction( + &assets::check_special_stx_transfer_memo, + )), GetTokenBalance => Special(SpecialNativeFunction(&assets::check_special_get_balance)), GetAssetOwner => Special(SpecialNativeFunction(&assets::check_special_get_owner)), TransferToken => Special(SpecialNativeFunction(&assets::check_special_transfer_token)), diff --git a/src/vm/costs/cost_functions.rs b/src/vm/costs/cost_functions.rs index ec21602ba8..5174beefb9 100644 --- a/src/vm/costs/cost_functions.rs +++ b/src/vm/costs/cost_functions.rs @@ -120,6 +120,7 @@ define_named_enum!(ClarityCostFunction { BlockInfo("cost_block_info"), StxBalance("cost_stx_balance"), StxTransfer("cost_stx_transfer"), + StxTransferMemo("cost_stx_transfer"), FtMint("cost_ft_mint"), FtTransfer("cost_ft_transfer"), FtBalance("cost_ft_balance"), diff --git a/src/vm/docs/mod.rs b/src/vm/docs/mod.rs index b36618911e..536793a821 100644 --- a/src/vm/docs/mod.rs +++ b/src/vm/docs/mod.rs @@ -1659,6 +1659,7 @@ fn make_api_reference(function: &NativeFunctions) -> FunctionAPI { AtBlock => make_for_special(&AT_BLOCK, name), GetStxBalance => make_for_simple_native(&STX_GET_BALANCE, &GetStxBalance, name), StxTransfer => make_for_special(&STX_TRANSFER, name), + StxTransferMemo => make_for_special(&STX_TRANSFER, name), StxBurn => make_for_simple_native(&STX_BURN, &StxBurn, name), } } diff --git a/src/vm/functions/assets.rs b/src/vm/functions/assets.rs index 6d555b0697..e170a0e281 100644 --- a/src/vm/functions/assets.rs +++ b/src/vm/functions/assets.rs @@ -145,24 +145,40 @@ pub fn special_stx_transfer( env: &mut Environment, context: &LocalContext, ) -> Result { - let memo_passed; - if let Ok(()) = check_argument_count(4, args) { - memo_passed = true; + check_argument_count(3, args)?; + + runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; + + let amount_val = eval(&args[0], env, context)?; + let from_val = eval(&args[1], env, context)?; + let to_val = eval(&args[2], env, context)?; + let memo_val = Value::Sequence(SequenceData::Buffer(BuffData::empty())); + + if let ( + Value::Principal(ref from), + Value::Principal(ref to), + Value::UInt(amount), + Value::Sequence(SequenceData::Buffer(ref memo)), + ) = (from_val, to_val, amount_val, memo_val) + { + stx_transfer_consolidated(env, from, to, amount, memo) } else { - check_argument_count(3, args)?; - memo_passed = false; + Err(CheckErrors::BadTransferSTXArguments.into()) } +} +pub fn special_stx_transfer_memo( + args: &[SymbolicExpression], + env: &mut Environment, + context: &LocalContext, +) -> Result { + check_argument_count(4, args); runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; let amount_val = eval(&args[0], env, context)?; let from_val = eval(&args[1], env, context)?; let to_val = eval(&args[2], env, context)?; - let memo_val = if memo_passed { - eval(&args[3], env, context)? - } else { - Value::Sequence(SequenceData::Buffer(BuffData::empty())) - }; + let memo_val = eval(&args[3], env, context)?; if let ( Value::Principal(ref from), diff --git a/src/vm/functions/mod.rs b/src/vm/functions/mod.rs index fc483f6369..0a74aefa58 100644 --- a/src/vm/functions/mod.rs +++ b/src/vm/functions/mod.rs @@ -131,6 +131,7 @@ define_named_enum!(NativeFunctions { BurnAsset("nft-burn?"), GetStxBalance("stx-get-balance"), StxTransfer("stx-transfer?"), + StxTransferMemo("stx-transfer-memo?"), StxBurn("stx-burn?"), }); @@ -396,6 +397,7 @@ pub fn lookup_reserved_functions(name: &str) -> Option { AtBlock => SpecialFunction("special_at_block", &database::special_at_block), GetStxBalance => SpecialFunction("special_stx_balance", &assets::special_stx_balance), StxTransfer => SpecialFunction("special_stx_transfer", &assets::special_stx_transfer), + StxTransferMemo => SpecialFunction("special_stx_transfer_memo", &assets::special_stx_transfer_memo), StxBurn => SpecialFunction("special_stx_burn", &assets::special_stx_burn), }; Some(callable) diff --git a/src/vm/tests/costs.rs b/src/vm/tests/costs.rs index 9546cdbb77..bdfc3b3e70 100644 --- a/src/vm/tests/costs.rs +++ b/src/vm/tests/costs.rs @@ -135,6 +135,7 @@ pub fn get_simple_test(function: &NativeFunctions) -> &'static str { AtBlock => "(at-block 0x55c9861be5cff984a20ce6d99d4aa65941412889bdc665094136429b84f8c2ee 1)", // first stacksblockid GetStxBalance => "(stx-get-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", StxTransfer => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, + StxTransferMemo => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, StxBurn => "(stx-burn? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", } } From d48c09b24fce79f1d16d9c84f41eeec1bc5ca26a Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 12:17:00 -0500 Subject: [PATCH 02/33] fixed some of the tests --- src/vm/functions/mod.rs | 5 ++++- src/vm/tests/simple_apply_eval.rs | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vm/functions/mod.rs b/src/vm/functions/mod.rs index 0a74aefa58..1785649505 100644 --- a/src/vm/functions/mod.rs +++ b/src/vm/functions/mod.rs @@ -397,7 +397,10 @@ pub fn lookup_reserved_functions(name: &str) -> Option { AtBlock => SpecialFunction("special_at_block", &database::special_at_block), GetStxBalance => SpecialFunction("special_stx_balance", &assets::special_stx_balance), StxTransfer => SpecialFunction("special_stx_transfer", &assets::special_stx_transfer), - StxTransferMemo => SpecialFunction("special_stx_transfer_memo", &assets::special_stx_transfer_memo), + StxTransferMemo => SpecialFunction( + "special_stx_transfer_memo", + &assets::special_stx_transfer_memo, + ), StxBurn => SpecialFunction("special_stx_burn", &assets::special_stx_burn), }; Some(callable) diff --git a/src/vm/tests/simple_apply_eval.rs b/src/vm/tests/simple_apply_eval.rs index e9a3e52621..9bf15c9dfa 100644 --- a/src/vm/tests/simple_apply_eval.rs +++ b/src/vm/tests/simple_apply_eval.rs @@ -677,9 +677,9 @@ fn test_options_errors() { fn test_stx_ops_errors() { let tests = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, - r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x000000000000000000000000000000000000000000000000000000000000000000)"#, - r#"(stx-transfer? u4 u3 u2 0x00)"#, - r#"(stx-transfer? u100 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, + r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + r#"(stx-transfer? u4 u3 u2)"#, + r#"(stx-transfer? true 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", ]; From 7dd9f4942122313f0883afd523d921ad638cee1c Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 12:37:27 -0500 Subject: [PATCH 03/33] added a test for memo's --- src/vm/tests/events.rs | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index 508e87c84f..6e08cf7249 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -22,7 +22,9 @@ use vm::contexts::{Environment, GlobalContext, OwnedEnvironment}; use vm::errors::{CheckErrors, Error, RuntimeErrorType}; use vm::tests::execute; use vm::types::TypeSignature::UIntType; -use vm::types::{AssetIdentifier, PrincipalData, QualifiedContractIdentifier, ResponseData, Value}; +use vm::types::{ + AssetIdentifier, BuffData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value, +}; fn helper_execute(contract: &str, method: &str) -> (Value, Vec) { let contract_id = QualifiedContractIdentifier::local("contract").unwrap(); @@ -107,6 +109,41 @@ fn test_emit_stx_transfer_ok() { }; } +#[test] +fn test_emit_stx_transfer_memo_ok() { + let contract = r#"(define-constant sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) + (define-constant recipient 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G) + (define-fungible-token token) + (define-public (emit-event-ok) + (begin + (unwrap-panic (stx-transfer-memo? u10 sender recipient 0x010203)) + (ok u1)))"#; + + let (value, mut events) = helper_execute(contract, "emit-event-ok"); + assert_eq!(value, Value::okay(Value::UInt(1)).unwrap()); + assert_eq!(events.len(), 1); + match events.pop() { + Some(StacksTransactionEvent::STXEvent(STXEventType::STXTransferEvent(data))) => { + assert_eq!(data.amount, 10u128); + assert_eq!( + Value::Principal(data.sender), + execute("'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR") + ); + assert_eq!( + Value::Principal(data.recipient), + execute("'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G") + ); + assert_eq!( + data.memo, + BuffData { + data: vec![1, 2, 3] + } + ); + } + _ => panic!("assertion failed"), + }; +} + #[test] fn test_emit_stx_transfer_nok() { let contract = r#"(define-constant sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) From 2a9a3dc5de37313623cdee72444a60549fdadbc5 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 13:03:50 -0500 Subject: [PATCH 04/33] added tranfer-memo to the docs --- src/vm/analysis/arithmetic_checker/tests.rs | 2 +- src/vm/docs/mod.rs | 23 ++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index 6a29457bfe..eab742ca0a 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -168,7 +168,7 @@ fn test_functions() { FunctionNotPermitted(NativeFunctions::StxBurn)), (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)"#, FunctionNotPermitted(NativeFunctions::StxTransfer)), - (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x00)"#, + (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x010203)"#, FunctionNotPermitted(NativeFunctions::StxTransferMemo)), ("(define-private (foo (a (list 3 uint))) (map log2 a))", diff --git a/src/vm/docs/mod.rs b/src/vm/docs/mod.rs index 536793a821..a1f26794ac 100644 --- a/src/vm/docs/mod.rs +++ b/src/vm/docs/mod.rs @@ -1530,10 +1530,9 @@ principal isn't materialized, it returns 0. const STX_TRANSFER: SpecialAPI = SpecialAPI { input_type: "uint, principal, principal, buff", output_type: "(response bool uint)", - signature: "(stx-transfer? amount sender recipient memo)", + signature: "(stx-transfer? amount sender recipient)", description: "`stx-transfer?` is used to increase the STX balance for the `recipient` principal by debiting the `sender` principal. The `sender` principal _must_ be equal to the current context's `tx-sender`. -The `memo` field is optional, and can be omitted. This function returns (ok true) if the transfer is successful. In the event of an unsuccessful transfer it returns one of the following error codes: @@ -1547,9 +1546,23 @@ one of the following error codes: (as-contract (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)) ;; Returns (ok true) (as-contract - (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x00)) ;; Returns (ok true) + (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)) ;; Returns (ok true) +(as-contract + (stx-transfer? u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR tx-sender)) ;; Returns (err u4) +"# +}; + +const STX_TRANSFER_MEMO: SpecialAPI = SpecialAPI { + input_type: "uint, principal, principal, buff", + output_type: "(response bool uint)", + signature: "(stx-transfer-memo? amount sender recipient memo)", + description: "`stx-transfer-memo?` is similar to `stx-transfer?`, except that it adds a `memo` field. + +This function returns (ok true) if the transfer is successful, or, on an error, returns the same codes as `stx-transfer?`. +", + example: r#" (as-contract - (stx-transfer? u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR tx-sender 0x00)) ;; Returns (err u4) + (stx-transfer-memo? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x010203)) ;; Returns (ok true) "# }; @@ -1659,7 +1672,7 @@ fn make_api_reference(function: &NativeFunctions) -> FunctionAPI { AtBlock => make_for_special(&AT_BLOCK, name), GetStxBalance => make_for_simple_native(&STX_GET_BALANCE, &GetStxBalance, name), StxTransfer => make_for_special(&STX_TRANSFER, name), - StxTransferMemo => make_for_special(&STX_TRANSFER, name), + StxTransferMemo => make_for_special(&STX_TRANSFER_MEMO, name), StxBurn => make_for_simple_native(&STX_BURN, &StxBurn, name), } } From 6b472caff51b5e60b31c45b51ada4a8593ac9f21 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 13:10:41 -0500 Subject: [PATCH 05/33] fixed test::events --- src/vm/tests/events.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index 6e08cf7249..f9e2599551 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -87,7 +87,7 @@ fn test_emit_stx_transfer_ok() { (define-fungible-token token) (define-public (emit-event-ok) (begin - (unwrap-panic (stx-transfer? u10 sender recipient 0x67)) + (unwrap-panic (stx-transfer? u10 sender recipient)) (ok u1)))"#; let (value, mut events) = helper_execute(contract, "emit-event-ok"); @@ -104,6 +104,12 @@ fn test_emit_stx_transfer_ok() { Value::Principal(data.recipient), execute("'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G") ); + assert_eq!( + data.memo, + BuffData { + data: vec![] + } + ); } _ => panic!("assertion failed"), }; @@ -151,7 +157,7 @@ fn test_emit_stx_transfer_nok() { (define-fungible-token token) (define-public (emit-event-nok) (begin - (unwrap-panic (stx-transfer? u10 sender recipient 0x99)) + (unwrap-panic (stx-transfer? u10 sender recipient)) (err u1)))"#; let (value, events) = helper_execute(contract, "emit-event-nok"); From d7b54d723810d51e79c2122f7e98cdbb81e9b2c0 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 14:43:43 -0500 Subject: [PATCH 06/33] fixed a costs test --- src/vm/tests/costs.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm/tests/costs.rs b/src/vm/tests/costs.rs index bdfc3b3e70..80ba36669b 100644 --- a/src/vm/tests/costs.rs +++ b/src/vm/tests/costs.rs @@ -134,8 +134,8 @@ pub fn get_simple_test(function: &NativeFunctions) -> &'static str { GetTokenSupply => "(ft-get-supply ft-foo)", AtBlock => "(at-block 0x55c9861be5cff984a20ce6d99d4aa65941412889bdc665094136429b84f8c2ee 1)", // first stacksblockid GetStxBalance => "(stx-get-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", - StxTransfer => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, - StxTransferMemo => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, + StxTransfer => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + StxTransferMemo => r#"(stx-transfer-memo? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, StxBurn => "(stx-burn? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", } } From c6b78d145fc1d0b7ac7309ca9262e1c78d6ab4bd Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Thu, 24 Jun 2021 12:33:45 -0500 Subject: [PATCH 07/33] rust fmt --- src/vm/tests/events.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index f9e2599551..fa431c4f47 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -104,12 +104,7 @@ fn test_emit_stx_transfer_ok() { Value::Principal(data.recipient), execute("'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G") ); - assert_eq!( - data.memo, - BuffData { - data: vec![] - } - ); + assert_eq!(data.memo, BuffData { data: vec![] }); } _ => panic!("assertion failed"), }; From 3d0e7ab74d3eab8fb951abcb292e26ffe1cde184 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Thu, 24 Jun 2021 13:40:37 -0500 Subject: [PATCH 08/33] change version in arithemtic checker --- src/vm/analysis/arithmetic_checker/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index 0c93a92be1..b3196975d7 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -39,7 +39,7 @@ fn arithmetic_check(contract: &str) -> Result<(), Error> { contract_identifier, expressions, LimitedCostTracker::new_free(), - ClarityVersion::Clarity1, + ClarityVersion::Clarity2, ); ArithmeticOnlyChecker::run(&analysis) From 678f270947ea996a28e23a4c1e0e43195eb9503c Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Thu, 24 Jun 2021 15:13:30 -0500 Subject: [PATCH 09/33] fix test_stx_ops --- src/vm/analysis/type_checker/natives/assets.rs | 4 ++-- src/vm/analysis/type_checker/tests/mod.rs | 12 +++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/vm/analysis/type_checker/natives/assets.rs b/src/vm/analysis/type_checker/natives/assets.rs index 25a1a17be2..ac8b24858e 100644 --- a/src/vm/analysis/type_checker/natives/assets.rs +++ b/src/vm/analysis/type_checker/natives/assets.rs @@ -195,7 +195,7 @@ pub fn check_special_stx_transfer( args: &[SymbolicExpression], context: &TypingContext, ) -> TypeResult { - check_argument_count(4, args); + check_argument_count(3, args)?; let amount_type: TypeSignature = TypeSignature::UIntType; let from_type: TypeSignature = TypeSignature::PrincipalType; @@ -218,7 +218,7 @@ pub fn check_special_stx_transfer_memo( args: &[SymbolicExpression], context: &TypingContext, ) -> TypeResult { - check_argument_count(4, args); + check_argument_count(4, args)?; let amount_type: TypeSignature = TypeSignature::UIntType; let from_type: TypeSignature = TypeSignature::PrincipalType; diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index d8a613aff3..cd958e47f5 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -188,13 +188,9 @@ fn test_stx_ops() { let good = [ "(stx-burn? u10 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, - r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x00)"#, - r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x935699)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; let expected = [ - "(response bool uint)", - "(response bool uint)", "(response bool uint)", "(response bool uint)", "uint", @@ -202,11 +198,10 @@ fn test_stx_ops() { let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, - r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x000000)"#, + r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00)"#, - r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x00)"#, - r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00)"#, - r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, + r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, "(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", @@ -221,7 +216,6 @@ fn test_stx_ops() { CheckErrors::IncorrectArgumentCount(3, 5), CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), - CheckErrors::TypeError(SequenceType(BufferType(BufferLength(34))), BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), CheckErrors::IncorrectArgumentCount(2, 1), CheckErrors::TypeError(UIntType, IntType), From 1cc1badc4bea1ecba2ec0d180ef786f91da5497c Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Fri, 25 Jun 2021 11:29:35 -0500 Subject: [PATCH 10/33] cleaning up some imports --- src/vm/tests/events.rs | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index fa431c4f47..f7c51c8334 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::clarity_vm::database::MemoryBackingStore; +use clarity_vm::database::MemoryBackingStore; +use vm::database::{NULL_BURN_STATE_DB, NULL_HEADER_DB, NULL_BURN_STATE_DB_2_1}; use chainstate::stacks::events::*; use std::convert::TryInto; use vm::analysis::errors::CheckError; @@ -25,14 +26,48 @@ use vm::types::TypeSignature::UIntType; use vm::types::{ AssetIdentifier, BuffData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value, }; +use clarity_vm::database::marf::MarfedKV; +use clarity_vm::clarity::ClarityInstance; +use vm::costs::ExecutionCost; +use types::chainstate::{StacksBlockId, StacksBlockHeader}; +use types::proof::ClarityMarfTrieId; + +use core::EMPTY_MICROBLOCK_PARENT_HASH; +use core::FIRST_BURNCHAIN_CONSENSUS_HASH; +use core::FIRST_STACKS_BLOCK_HASH; fn helper_execute(contract: &str, method: &str) -> (Value, Vec) { let contract_id = QualifiedContractIdentifier::local("contract").unwrap(); let address = "'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR"; let sender = execute(address).expect_principal(); - let mut marf_kv = MemoryBackingStore::new(); - let mut owned_env = OwnedEnvironment::new(marf_kv.as_clarity_db()); + let marf_kv = MarfedKV::temporary(); + let mut clarity_instance = ClarityInstance::new(false, marf_kv, ExecutionCost::max_value()); + clarity_instance + .begin_test_genesis_block( + &StacksBlockId::sentinel(), + &StacksBlockHeader::make_index_block_hash( + &FIRST_BURNCHAIN_CONSENSUS_HASH, + &FIRST_STACKS_BLOCK_HASH, + ), + &NULL_HEADER_DB, + &NULL_BURN_STATE_DB, + ) + .commit_block(); + + let mut marf_kv = clarity_instance.destroy(); + + let mut store = marf_kv.begin( + &StacksBlockHeader::make_index_block_hash( + &FIRST_BURNCHAIN_CONSENSUS_HASH, + &FIRST_STACKS_BLOCK_HASH, + ), + &StacksBlockId([1 as u8; 32]), + ); + + let mut owned_env = OwnedEnvironment::new_max_limit( + store.as_clarity_db(&NULL_HEADER_DB, &NULL_BURN_STATE_DB_2_1), + ); { let mut env = owned_env.get_exec_environment(None, None); From 6ae02b94abdc9863610e11ba8ebf09572e1f0a30 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Fri, 25 Jun 2021 11:38:16 -0500 Subject: [PATCH 11/33] rearranged the vm tests --- src/vm/analysis/type_checker/tests/mod.rs | 6 +----- src/vm/ast/definition_sorter/mod.rs | 9 ++++---- src/vm/tests/events.rs | 25 ++++++++--------------- 3 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index cd958e47f5..554efc2319 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -190,11 +190,7 @@ fn test_stx_ops() { r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; - let expected = [ - "(response bool uint)", - "(response bool uint)", - "uint", - ]; + let expected = ["(response bool uint)", "(response bool uint)", "uint"]; let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, diff --git a/src/vm/ast/definition_sorter/mod.rs b/src/vm/ast/definition_sorter/mod.rs index 59a0904dbc..5be8ef12ba 100644 --- a/src/vm/ast/definition_sorter/mod.rs +++ b/src/vm/ast/definition_sorter/mod.rs @@ -213,12 +213,11 @@ impl<'a> DefinitionSorter { } } else if let Some(native_function) = // NOTE: can use ClarityVersion::latest() here only as long as NO NEW FUNCTIONS are special cased - // in the definition sorter. + // in the definition sorter. NativeFunctions::lookup_by_name_at_version( - function_name, - &ClarityVersion::latest(), - ) - { + function_name, + &ClarityVersion::latest(), + ) { match native_function { NativeFunctions::ContractCall => { // Args: [contract-name, function-name, ...]: ignore contract-name, function-name, handle rest diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index f7c51c8334..8945b0bb86 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -14,27 +14,20 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use clarity_vm::database::MemoryBackingStore; -use vm::database::{NULL_BURN_STATE_DB, NULL_HEADER_DB, NULL_BURN_STATE_DB_2_1}; use chainstate::stacks::events::*; -use std::convert::TryInto; -use vm::analysis::errors::CheckError; -use vm::contexts::{Environment, GlobalContext, OwnedEnvironment}; -use vm::errors::{CheckErrors, Error, RuntimeErrorType}; +use clarity_vm::clarity::ClarityInstance; +use clarity_vm::database::marf::MarfedKV; +use types::chainstate::{StacksBlockHeader, StacksBlockId}; +use types::proof::ClarityMarfTrieId; +use vm::contexts::OwnedEnvironment; +use vm::costs::ExecutionCost; +use vm::database::{NULL_BURN_STATE_DB, NULL_BURN_STATE_DB_2_1, NULL_HEADER_DB}; use vm::tests::execute; -use vm::types::TypeSignature::UIntType; use vm::types::{ - AssetIdentifier, BuffData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value, + AssetIdentifier, BuffData, QualifiedContractIdentifier, Value, }; -use clarity_vm::database::marf::MarfedKV; -use clarity_vm::clarity::ClarityInstance; -use vm::costs::ExecutionCost; -use types::chainstate::{StacksBlockId, StacksBlockHeader}; -use types::proof::ClarityMarfTrieId; -use core::EMPTY_MICROBLOCK_PARENT_HASH; -use core::FIRST_BURNCHAIN_CONSENSUS_HASH; -use core::FIRST_STACKS_BLOCK_HASH; +use core::{FIRST_BURNCHAIN_CONSENSUS_HASH, FIRST_STACKS_BLOCK_HASH}; fn helper_execute(contract: &str, method: &str) -> (Value, Vec) { let contract_id = QualifiedContractIdentifier::local("contract").unwrap(); From 1358e285b2b28ce49978329ed14c4da9ccf2c63f Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Mon, 28 Jun 2021 14:27:00 -0500 Subject: [PATCH 12/33] copied tests in test_stx_ops to create memo tests --- src/vm/analysis/type_checker/tests/mod.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index 554efc2319..fc123c8702 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -188,9 +188,10 @@ fn test_stx_ops() { let good = [ "(stx-burn? u10 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, + r#"(stx-transfer-memo? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; - let expected = ["(response bool uint)", "(response bool uint)", "uint"]; + let expected = ["(response bool uint)", "(response bool uint)", "(response bool uint)", "uint"]; let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, @@ -198,7 +199,13 @@ fn test_stx_ops() { r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00)"#, r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, - "(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", + r#"(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, + r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759 0x0102)"#, + r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00) 0x0102"#, + r#"(stx-transfer-memo? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x0102)"#, + r#"(stx-transfer-memo? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", "(stx-burn? u4 true)", @@ -213,6 +220,12 @@ fn test_stx_ops() { CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), + CheckErrors::TypeError(PrincipalType, SequenceType(BufferType(BufferLength(2)))), + CheckErrors::TypeError(UIntType, IntType), + CheckErrors::IncorrectArgumentCount(4, 5), + CheckErrors::TypeError(PrincipalType, UIntType), + CheckErrors::TypeError(PrincipalType, BoolType), + CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), CheckErrors::IncorrectArgumentCount(2, 1), CheckErrors::TypeError(UIntType, IntType), CheckErrors::TypeError(PrincipalType, BoolType), From a5463152305f17b04d78a49287806568b7c97410 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Mon, 28 Jun 2021 15:36:06 -0500 Subject: [PATCH 13/33] added some memo tests to simple_apply_eval --- src/vm/functions/assets.rs | 2 +- src/vm/tests/simple_apply_eval.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/vm/functions/assets.rs b/src/vm/functions/assets.rs index c318fbb666..840149be3c 100644 --- a/src/vm/functions/assets.rs +++ b/src/vm/functions/assets.rs @@ -174,7 +174,7 @@ pub fn special_stx_transfer_memo( env: &mut Environment, context: &LocalContext, ) -> Result { - check_argument_count(4, args); + check_argument_count(4, args)?; runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; let amount_val = eval(&args[0], env, context)?; diff --git a/src/vm/tests/simple_apply_eval.rs b/src/vm/tests/simple_apply_eval.rs index dba4851146..b00e608ad0 100644 --- a/src/vm/tests/simple_apply_eval.rs +++ b/src/vm/tests/simple_apply_eval.rs @@ -30,7 +30,7 @@ use vm::tests::execute; use vm::types::signatures::BufferLength; use vm::types::{BuffData, QualifiedContractIdentifier, TypeSignature}; use vm::types::{PrincipalData, ResponseData, SequenceData, SequenceSubtype}; -use vm::{eval, execute as vm_execute}; +use vm::{eval, execute as vm_execute, execute_v2 as vm_execute_v2}; use vm::{CallStack, ContractContext, Environment, GlobalContext, LocalContext, Value}; use crate::types::chainstate::StacksAddress; @@ -683,6 +683,10 @@ fn test_stx_ops_errors() { r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? u4 u3 u2)"#, r#"(stx-transfer? true 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? u4 u3 u2 0x0102)"#, + r#"(stx-transfer-memo? true 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", ]; @@ -692,12 +696,16 @@ fn test_stx_ops_errors() { CheckErrors::BadTransferSTXArguments.into(), CheckErrors::BadTransferSTXArguments.into(), CheckErrors::BadTransferSTXArguments.into(), + CheckErrors::IncorrectArgumentCount(4, 3).into(), + CheckErrors::BadTransferSTXArguments.into(), + CheckErrors::BadTransferSTXArguments.into(), + CheckErrors::BadTransferSTXArguments.into(), CheckErrors::IncorrectArgumentCount(2, 1).into(), CheckErrors::BadTransferSTXArguments.into(), ]; for (program, expectation) in tests.iter().zip(expectations.iter()) { - assert_eq!(*expectation, vm_execute(program).unwrap_err()); + assert_eq!(*expectation, vm_execute_v2(program).unwrap_err()); } } From 340bddfbee42bff0a1f9ee204cfad9adca86cb2c Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Mon, 28 Jun 2021 15:49:36 -0500 Subject: [PATCH 14/33] revert change to ast --- src/vm/ast/definition_sorter/mod.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vm/ast/definition_sorter/mod.rs b/src/vm/ast/definition_sorter/mod.rs index 5be8ef12ba..59a0904dbc 100644 --- a/src/vm/ast/definition_sorter/mod.rs +++ b/src/vm/ast/definition_sorter/mod.rs @@ -213,11 +213,12 @@ impl<'a> DefinitionSorter { } } else if let Some(native_function) = // NOTE: can use ClarityVersion::latest() here only as long as NO NEW FUNCTIONS are special cased - // in the definition sorter. + // in the definition sorter. NativeFunctions::lookup_by_name_at_version( - function_name, - &ClarityVersion::latest(), - ) { + function_name, + &ClarityVersion::latest(), + ) + { match native_function { NativeFunctions::ContractCall => { // Args: [contract-name, function-name, ...]: ignore contract-name, function-name, handle rest From 1c179afbec8763778aff2219d0fa4e0fa7917595 Mon Sep 17 00:00:00 2001 From: Gregory Coppola <60008382+gregorycoppola@users.noreply.github.com> Date: Wed, 30 Jun 2021 16:57:42 -0500 Subject: [PATCH 15/33] new test cases for test_stx_ops --- src/vm/analysis/type_checker/tests/mod.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index fc123c8702..c5ff1364bb 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -191,7 +191,12 @@ fn test_stx_ops() { r#"(stx-transfer-memo? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; - let expected = ["(response bool uint)", "(response bool uint)", "(response bool uint)", "uint"]; + let expected = [ + "(response bool uint)", + "(response bool uint)", + "(response bool uint)", + "uint", + ]; let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, @@ -200,12 +205,14 @@ fn test_stx_ops() { r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, r#"(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, + r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, // valid arguments for stx-transfer-memo r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759 0x0102)"#, r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00) 0x0102"#, r#"(stx-transfer-memo? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x0102)"#, r#"(stx-transfer-memo? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, + r#"(stx-transfer-memo? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, // valid arguments for stx-transfer "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", "(stx-burn? u4 true)", @@ -220,12 +227,14 @@ fn test_stx_ops() { CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), + CheckErrors::IncorrectArgumentCount(3, 4), CheckErrors::TypeError(PrincipalType, SequenceType(BufferType(BufferLength(2)))), CheckErrors::TypeError(UIntType, IntType), CheckErrors::IncorrectArgumentCount(4, 5), CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), + CheckErrors::IncorrectArgumentCount(4, 3), CheckErrors::IncorrectArgumentCount(2, 1), CheckErrors::TypeError(UIntType, IntType), CheckErrors::TypeError(PrincipalType, BoolType), From 221e669a46155c0c57bd429f07efcd4158afb7ca Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 12:01:57 -0500 Subject: [PATCH 16/33] began refactor of memo --- src/vm/analysis/arithmetic_checker/mod.rs | 4 +-- src/vm/analysis/arithmetic_checker/tests.rs | 4 ++- src/vm/analysis/read_only_checker/mod.rs | 5 +-- .../analysis/type_checker/natives/assets.rs | 34 +++++++++++++----- src/vm/analysis/type_checker/natives/mod.rs | 3 ++ src/vm/costs/cost_functions.rs | 1 + src/vm/docs/mod.rs | 1 + src/vm/functions/assets.rs | 36 +++++++++++++------ src/vm/functions/mod.rs | 2 ++ src/vm/tests/costs.rs | 1 + 10 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/vm/analysis/arithmetic_checker/mod.rs b/src/vm/analysis/arithmetic_checker/mod.rs index 49076c6f47..77f50f8b7d 100644 --- a/src/vm/analysis/arithmetic_checker/mod.rs +++ b/src/vm/analysis/arithmetic_checker/mod.rs @@ -173,8 +173,8 @@ impl<'a> ArithmeticOnlyChecker<'a> { match function { FetchVar | GetBlockInfo | GetTokenBalance | GetAssetOwner | FetchEntry | SetEntry | DeleteEntry | InsertEntry | SetVar | MintAsset | MintToken | TransferAsset - | TransferToken | ContractCall | StxTransfer | StxBurn | AtBlock | GetStxBalance - | GetTokenSupply | BurnToken | BurnAsset | StxGetAccount => { + | TransferToken | ContractCall | StxTransfer | StxTransferMemo | StxBurn | AtBlock + | GetStxBalance | GetTokenSupply | BurnToken | BurnAsset | StxGetAccount => { return Err(Error::FunctionNotPermitted(function)); } Append | Concat | AsMaxLen | ContractOf | PrincipalOf | ListCons | Print diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index a5b1095870..081bf87168 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -169,8 +169,10 @@ fn test_functions() { FunctionNotPermitted(NativeFunctions::GetStxBalance)), ("(stx-burn? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)", FunctionNotPermitted(NativeFunctions::StxBurn)), - (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x00)"#, + (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)"#, FunctionNotPermitted(NativeFunctions::StxTransfer)), + (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x00)"#, + FunctionNotPermitted(NativeFunctions::StxTransferMemo)), ("(define-private (foo (a (list 3 uint))) (map log2 a))", FunctionNotPermitted(NativeFunctions::Map)), diff --git a/src/vm/analysis/read_only_checker/mod.rs b/src/vm/analysis/read_only_checker/mod.rs index 692c6e31b0..c39682070e 100644 --- a/src/vm/analysis/read_only_checker/mod.rs +++ b/src/vm/analysis/read_only_checker/mod.rs @@ -202,8 +202,9 @@ impl<'a, 'b> ReadOnlyChecker<'a, 'b> { check_argument_count(2, args)?; self.check_all_read_only(args) } - StxTransfer | StxBurn | SetEntry | DeleteEntry | InsertEntry | SetVar | MintAsset - | MintToken | TransferAsset | TransferToken | BurnAsset | BurnToken => { + StxTransfer | StxTransferMemo | StxBurn | SetEntry | DeleteEntry | InsertEntry + | SetVar | MintAsset | MintToken | TransferAsset | TransferToken | BurnAsset + | BurnToken => { self.check_all_read_only(args)?; Ok(false) } diff --git a/src/vm/analysis/type_checker/natives/assets.rs b/src/vm/analysis/type_checker/natives/assets.rs index 9ae619747c..25a1a17be2 100644 --- a/src/vm/analysis/type_checker/natives/assets.rs +++ b/src/vm/analysis/type_checker/natives/assets.rs @@ -195,12 +195,30 @@ pub fn check_special_stx_transfer( args: &[SymbolicExpression], context: &TypingContext, ) -> TypeResult { - let memo_passed = if let Ok(()) = check_argument_count(4, args) { - true - } else { - check_argument_count(3, args)?; - false - }; + check_argument_count(4, args); + + let amount_type: TypeSignature = TypeSignature::UIntType; + let from_type: TypeSignature = TypeSignature::PrincipalType; + let to_type: TypeSignature = TypeSignature::PrincipalType; + + runtime_cost(ClarityCostFunction::AnalysisTypeLookup, checker, 0)?; + + checker.type_check_expects(&args[0], context, &amount_type)?; + checker.type_check_expects(&args[1], context, &from_type)?; + checker.type_check_expects(&args[2], context, &to_type)?; + + Ok( + TypeSignature::ResponseType(Box::new((TypeSignature::BoolType, TypeSignature::UIntType))) + .into(), + ) +} + +pub fn check_special_stx_transfer_memo( + checker: &mut TypeChecker, + args: &[SymbolicExpression], + context: &TypingContext, +) -> TypeResult { + check_argument_count(4, args); let amount_type: TypeSignature = TypeSignature::UIntType; let from_type: TypeSignature = TypeSignature::PrincipalType; @@ -214,9 +232,7 @@ pub fn check_special_stx_transfer( checker.type_check_expects(&args[0], context, &amount_type)?; checker.type_check_expects(&args[1], context, &from_type)?; checker.type_check_expects(&args[2], context, &to_type)?; - if memo_passed { - checker.type_check_expects(&args[3], context, &memo_type)?; - } + checker.type_check_expects(&args[3], context, &memo_type)?; Ok( TypeSignature::ResponseType(Box::new((TypeSignature::BoolType, TypeSignature::UIntType))) diff --git a/src/vm/analysis/type_checker/natives/mod.rs b/src/vm/analysis/type_checker/natives/mod.rs index f2044942fc..17d29f3686 100644 --- a/src/vm/analysis/type_checker/natives/mod.rs +++ b/src/vm/analysis/type_checker/natives/mod.rs @@ -682,6 +682,9 @@ impl TypedNativeFunction { .unwrap(), }))), StxTransfer => Special(SpecialNativeFunction(&assets::check_special_stx_transfer)), + StxTransferMemo => Special(SpecialNativeFunction( + &assets::check_special_stx_transfer_memo, + )), GetTokenBalance => Special(SpecialNativeFunction(&assets::check_special_get_balance)), GetAssetOwner => Special(SpecialNativeFunction(&assets::check_special_get_owner)), TransferToken => Special(SpecialNativeFunction(&assets::check_special_transfer_token)), diff --git a/src/vm/costs/cost_functions.rs b/src/vm/costs/cost_functions.rs index 9632fb8839..a43130c4f6 100644 --- a/src/vm/costs/cost_functions.rs +++ b/src/vm/costs/cost_functions.rs @@ -120,6 +120,7 @@ define_named_enum!(ClarityCostFunction { BlockInfo("cost_block_info"), StxBalance("cost_stx_balance"), StxTransfer("cost_stx_transfer"), + StxTransferMemo("cost_stx_transfer"), FtMint("cost_ft_mint"), FtTransfer("cost_ft_transfer"), FtBalance("cost_ft_balance"), diff --git a/src/vm/docs/mod.rs b/src/vm/docs/mod.rs index ad0e9c1b1d..d15fd8ea74 100644 --- a/src/vm/docs/mod.rs +++ b/src/vm/docs/mod.rs @@ -1782,6 +1782,7 @@ fn make_api_reference(function: &NativeFunctions) -> FunctionAPI { GetStxBalance => make_for_simple_native(&STX_GET_BALANCE, &GetStxBalance, name), StxGetAccount => make_for_simple_native(&STX_GET_BALANCE, &StxGetAccount, name), StxTransfer => make_for_special(&STX_TRANSFER, name), + StxTransferMemo => make_for_special(&STX_TRANSFER, name), StxBurn => make_for_simple_native(&STX_BURN, &StxBurn, name), } } diff --git a/src/vm/functions/assets.rs b/src/vm/functions/assets.rs index 53354059fe..51c684df79 100644 --- a/src/vm/functions/assets.rs +++ b/src/vm/functions/assets.rs @@ -147,24 +147,40 @@ pub fn special_stx_transfer( env: &mut Environment, context: &LocalContext, ) -> Result { - let memo_passed; - if let Ok(()) = check_argument_count(4, args) { - memo_passed = true; + check_argument_count(3, args)?; + + runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; + + let amount_val = eval(&args[0], env, context)?; + let from_val = eval(&args[1], env, context)?; + let to_val = eval(&args[2], env, context)?; + let memo_val = Value::Sequence(SequenceData::Buffer(BuffData::empty())); + + if let ( + Value::Principal(ref from), + Value::Principal(ref to), + Value::UInt(amount), + Value::Sequence(SequenceData::Buffer(ref memo)), + ) = (from_val, to_val, amount_val, memo_val) + { + stx_transfer_consolidated(env, from, to, amount, memo) } else { - check_argument_count(3, args)?; - memo_passed = false; + Err(CheckErrors::BadTransferSTXArguments.into()) } +} +pub fn special_stx_transfer_memo( + args: &[SymbolicExpression], + env: &mut Environment, + context: &LocalContext, +) -> Result { + check_argument_count(4, args); runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; let amount_val = eval(&args[0], env, context)?; let from_val = eval(&args[1], env, context)?; let to_val = eval(&args[2], env, context)?; - let memo_val = if memo_passed { - eval(&args[3], env, context)? - } else { - Value::Sequence(SequenceData::Buffer(BuffData::empty())) - }; + let memo_val = eval(&args[3], env, context)?; if let ( Value::Principal(ref from), diff --git a/src/vm/functions/mod.rs b/src/vm/functions/mod.rs index 3b85f9351e..1b859719cd 100644 --- a/src/vm/functions/mod.rs +++ b/src/vm/functions/mod.rs @@ -138,6 +138,7 @@ define_versioned_named_enum!(NativeFunctions(ClarityVersion) { BurnAsset("nft-burn?", ClarityVersion::Clarity1), GetStxBalance("stx-get-balance", ClarityVersion::Clarity1), StxTransfer("stx-transfer?", ClarityVersion::Clarity1), + StxTransferMemo("stx-transfer-memo?", ClarityVersion::Clarity2), StxBurn("stx-burn?", ClarityVersion::Clarity1), StxGetAccount("stx-account", ClarityVersion::Clarity2), }); @@ -443,6 +444,7 @@ pub fn lookup_reserved_functions(name: &str, version: &ClarityVersion) -> Option AtBlock => SpecialFunction("special_at_block", &database::special_at_block), GetStxBalance => SpecialFunction("special_stx_balance", &assets::special_stx_balance), StxTransfer => SpecialFunction("special_stx_transfer", &assets::special_stx_transfer), + StxTransferMemo => SpecialFunction("special_stx_transfer_memo", &assets::special_stx_transfer_memo), StxBurn => SpecialFunction("special_stx_burn", &assets::special_stx_burn), StxGetAccount => SpecialFunction("stx_get_account", &assets::special_stx_account), }; diff --git a/src/vm/tests/costs.rs b/src/vm/tests/costs.rs index 6fb4676876..d47c7792c2 100644 --- a/src/vm/tests/costs.rs +++ b/src/vm/tests/costs.rs @@ -139,6 +139,7 @@ pub fn get_simple_test(function: &NativeFunctions) -> &'static str { AtBlock => "(at-block 0x55c9861be5cff984a20ce6d99d4aa65941412889bdc665094136429b84f8c2ee 1)", // first stacksblockid GetStxBalance => "(stx-get-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", StxTransfer => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, + StxTransferMemo => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, StxBurn => "(stx-burn? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", StxGetAccount => "(stx-account 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", } From b0f6049d18424cf9892ab54e33024c7d877b434a Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 12:17:00 -0500 Subject: [PATCH 17/33] fixed some of the tests --- src/vm/functions/mod.rs | 5 ++++- src/vm/tests/simple_apply_eval.rs | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vm/functions/mod.rs b/src/vm/functions/mod.rs index 1b859719cd..27565839f6 100644 --- a/src/vm/functions/mod.rs +++ b/src/vm/functions/mod.rs @@ -444,7 +444,10 @@ pub fn lookup_reserved_functions(name: &str, version: &ClarityVersion) -> Option AtBlock => SpecialFunction("special_at_block", &database::special_at_block), GetStxBalance => SpecialFunction("special_stx_balance", &assets::special_stx_balance), StxTransfer => SpecialFunction("special_stx_transfer", &assets::special_stx_transfer), - StxTransferMemo => SpecialFunction("special_stx_transfer_memo", &assets::special_stx_transfer_memo), + StxTransferMemo => SpecialFunction( + "special_stx_transfer_memo", + &assets::special_stx_transfer_memo, + ), StxBurn => SpecialFunction("special_stx_burn", &assets::special_stx_burn), StxGetAccount => SpecialFunction("stx_get_account", &assets::special_stx_account), }; diff --git a/src/vm/tests/simple_apply_eval.rs b/src/vm/tests/simple_apply_eval.rs index 32413e6f23..dba4851146 100644 --- a/src/vm/tests/simple_apply_eval.rs +++ b/src/vm/tests/simple_apply_eval.rs @@ -680,9 +680,9 @@ fn test_options_errors() { fn test_stx_ops_errors() { let tests = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, - r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x000000000000000000000000000000000000000000000000000000000000000000)"#, - r#"(stx-transfer? u4 u3 u2 0x00)"#, - r#"(stx-transfer? u100 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, + r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + r#"(stx-transfer? u4 u3 u2)"#, + r#"(stx-transfer? true 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", ]; From 11fe41e585c68993be87f5ef1f5b267be89182c5 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 12:37:27 -0500 Subject: [PATCH 18/33] added a test for memo's --- src/vm/tests/events.rs | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index 508e87c84f..6e08cf7249 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -22,7 +22,9 @@ use vm::contexts::{Environment, GlobalContext, OwnedEnvironment}; use vm::errors::{CheckErrors, Error, RuntimeErrorType}; use vm::tests::execute; use vm::types::TypeSignature::UIntType; -use vm::types::{AssetIdentifier, PrincipalData, QualifiedContractIdentifier, ResponseData, Value}; +use vm::types::{ + AssetIdentifier, BuffData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value, +}; fn helper_execute(contract: &str, method: &str) -> (Value, Vec) { let contract_id = QualifiedContractIdentifier::local("contract").unwrap(); @@ -107,6 +109,41 @@ fn test_emit_stx_transfer_ok() { }; } +#[test] +fn test_emit_stx_transfer_memo_ok() { + let contract = r#"(define-constant sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) + (define-constant recipient 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G) + (define-fungible-token token) + (define-public (emit-event-ok) + (begin + (unwrap-panic (stx-transfer-memo? u10 sender recipient 0x010203)) + (ok u1)))"#; + + let (value, mut events) = helper_execute(contract, "emit-event-ok"); + assert_eq!(value, Value::okay(Value::UInt(1)).unwrap()); + assert_eq!(events.len(), 1); + match events.pop() { + Some(StacksTransactionEvent::STXEvent(STXEventType::STXTransferEvent(data))) => { + assert_eq!(data.amount, 10u128); + assert_eq!( + Value::Principal(data.sender), + execute("'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR") + ); + assert_eq!( + Value::Principal(data.recipient), + execute("'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G") + ); + assert_eq!( + data.memo, + BuffData { + data: vec![1, 2, 3] + } + ); + } + _ => panic!("assertion failed"), + }; +} + #[test] fn test_emit_stx_transfer_nok() { let contract = r#"(define-constant sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) From abf221ed692f31cfafa4cdbab5b3b7cbdc967f9f Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 13:03:50 -0500 Subject: [PATCH 19/33] added tranfer-memo to the docs --- src/vm/analysis/arithmetic_checker/tests.rs | 2 +- src/vm/docs/mod.rs | 23 ++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index 081bf87168..0c93a92be1 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -171,7 +171,7 @@ fn test_functions() { FunctionNotPermitted(NativeFunctions::StxBurn)), (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)"#, FunctionNotPermitted(NativeFunctions::StxTransfer)), - (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x00)"#, + (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x010203)"#, FunctionNotPermitted(NativeFunctions::StxTransferMemo)), ("(define-private (foo (a (list 3 uint))) (map log2 a))", diff --git a/src/vm/docs/mod.rs b/src/vm/docs/mod.rs index d15fd8ea74..1413e076c1 100644 --- a/src/vm/docs/mod.rs +++ b/src/vm/docs/mod.rs @@ -1648,10 +1648,9 @@ principal isn't materialized, it returns 0. const STX_TRANSFER: SpecialAPI = SpecialAPI { input_type: "uint, principal, principal, buff", output_type: "(response bool uint)", - signature: "(stx-transfer? amount sender recipient memo)", + signature: "(stx-transfer? amount sender recipient)", description: "`stx-transfer?` is used to increase the STX balance for the `recipient` principal by debiting the `sender` principal. The `sender` principal _must_ be equal to the current context's `tx-sender`. -The `memo` field is optional, and can be omitted. This function returns (ok true) if the transfer is successful. In the event of an unsuccessful transfer it returns one of the following error codes: @@ -1665,9 +1664,23 @@ one of the following error codes: (as-contract (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)) ;; Returns (ok true) (as-contract - (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x00)) ;; Returns (ok true) + (stx-transfer? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)) ;; Returns (ok true) +(as-contract + (stx-transfer? u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR tx-sender)) ;; Returns (err u4) +"# +}; + +const STX_TRANSFER_MEMO: SpecialAPI = SpecialAPI { + input_type: "uint, principal, principal, buff", + output_type: "(response bool uint)", + signature: "(stx-transfer-memo? amount sender recipient memo)", + description: "`stx-transfer-memo?` is similar to `stx-transfer?`, except that it adds a `memo` field. + +This function returns (ok true) if the transfer is successful, or, on an error, returns the same codes as `stx-transfer?`. +", + example: r#" (as-contract - (stx-transfer? u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR tx-sender 0x00)) ;; Returns (err u4) + (stx-transfer-memo? u60 tx-sender 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x010203)) ;; Returns (ok true) "# }; @@ -1782,7 +1795,7 @@ fn make_api_reference(function: &NativeFunctions) -> FunctionAPI { GetStxBalance => make_for_simple_native(&STX_GET_BALANCE, &GetStxBalance, name), StxGetAccount => make_for_simple_native(&STX_GET_BALANCE, &StxGetAccount, name), StxTransfer => make_for_special(&STX_TRANSFER, name), - StxTransferMemo => make_for_special(&STX_TRANSFER, name), + StxTransferMemo => make_for_special(&STX_TRANSFER_MEMO, name), StxBurn => make_for_simple_native(&STX_BURN, &StxBurn, name), } } From c8297455eace4d0d14f19219772b81b5fe135ba5 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 13:10:41 -0500 Subject: [PATCH 20/33] fixed test::events --- src/vm/tests/events.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index 6e08cf7249..f9e2599551 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -87,7 +87,7 @@ fn test_emit_stx_transfer_ok() { (define-fungible-token token) (define-public (emit-event-ok) (begin - (unwrap-panic (stx-transfer? u10 sender recipient 0x67)) + (unwrap-panic (stx-transfer? u10 sender recipient)) (ok u1)))"#; let (value, mut events) = helper_execute(contract, "emit-event-ok"); @@ -104,6 +104,12 @@ fn test_emit_stx_transfer_ok() { Value::Principal(data.recipient), execute("'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G") ); + assert_eq!( + data.memo, + BuffData { + data: vec![] + } + ); } _ => panic!("assertion failed"), }; @@ -151,7 +157,7 @@ fn test_emit_stx_transfer_nok() { (define-fungible-token token) (define-public (emit-event-nok) (begin - (unwrap-panic (stx-transfer? u10 sender recipient 0x99)) + (unwrap-panic (stx-transfer? u10 sender recipient)) (err u1)))"#; let (value, events) = helper_execute(contract, "emit-event-nok"); From 4cdd7d7e9dd7cc82302d267ef99f0a4c7a744777 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Tue, 22 Jun 2021 14:43:43 -0500 Subject: [PATCH 21/33] fixed a costs test --- src/vm/tests/costs.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm/tests/costs.rs b/src/vm/tests/costs.rs index d47c7792c2..fd0cc384da 100644 --- a/src/vm/tests/costs.rs +++ b/src/vm/tests/costs.rs @@ -138,8 +138,8 @@ pub fn get_simple_test(function: &NativeFunctions) -> &'static str { GetTokenSupply => "(ft-get-supply ft-foo)", AtBlock => "(at-block 0x55c9861be5cff984a20ce6d99d4aa65941412889bdc665094136429b84f8c2ee 1)", // first stacksblockid GetStxBalance => "(stx-get-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", - StxTransfer => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, - StxTransferMemo => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, + StxTransfer => r#"(stx-transfer? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + StxTransferMemo => r#"(stx-transfer-memo? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x89995432)"#, StxBurn => "(stx-burn? u1 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", StxGetAccount => "(stx-account 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", } From 309249d7856c687eaf06809cce73c5d9b8cfb9dd Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Thu, 24 Jun 2021 12:33:45 -0500 Subject: [PATCH 22/33] rust fmt --- src/vm/tests/events.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index f9e2599551..fa431c4f47 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -104,12 +104,7 @@ fn test_emit_stx_transfer_ok() { Value::Principal(data.recipient), execute("'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G") ); - assert_eq!( - data.memo, - BuffData { - data: vec![] - } - ); + assert_eq!(data.memo, BuffData { data: vec![] }); } _ => panic!("assertion failed"), }; From fb5be93dbcb39a44329d70b1d4e0cc2e3141855a Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Thu, 24 Jun 2021 13:40:37 -0500 Subject: [PATCH 23/33] change version in arithemtic checker --- src/vm/analysis/arithmetic_checker/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index 0c93a92be1..b3196975d7 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -39,7 +39,7 @@ fn arithmetic_check(contract: &str) -> Result<(), Error> { contract_identifier, expressions, LimitedCostTracker::new_free(), - ClarityVersion::Clarity1, + ClarityVersion::Clarity2, ); ArithmeticOnlyChecker::run(&analysis) From 6ffbc577ba18fc01a421f17d435bb5169c57c1b1 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Thu, 24 Jun 2021 15:13:30 -0500 Subject: [PATCH 24/33] fix test_stx_ops --- src/vm/analysis/type_checker/natives/assets.rs | 4 ++-- src/vm/analysis/type_checker/tests/mod.rs | 12 +++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/vm/analysis/type_checker/natives/assets.rs b/src/vm/analysis/type_checker/natives/assets.rs index 25a1a17be2..ac8b24858e 100644 --- a/src/vm/analysis/type_checker/natives/assets.rs +++ b/src/vm/analysis/type_checker/natives/assets.rs @@ -195,7 +195,7 @@ pub fn check_special_stx_transfer( args: &[SymbolicExpression], context: &TypingContext, ) -> TypeResult { - check_argument_count(4, args); + check_argument_count(3, args)?; let amount_type: TypeSignature = TypeSignature::UIntType; let from_type: TypeSignature = TypeSignature::PrincipalType; @@ -218,7 +218,7 @@ pub fn check_special_stx_transfer_memo( args: &[SymbolicExpression], context: &TypingContext, ) -> TypeResult { - check_argument_count(4, args); + check_argument_count(4, args)?; let amount_type: TypeSignature = TypeSignature::UIntType; let from_type: TypeSignature = TypeSignature::PrincipalType; diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index d8a613aff3..cd958e47f5 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -188,13 +188,9 @@ fn test_stx_ops() { let good = [ "(stx-burn? u10 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, - r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x00)"#, - r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x935699)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; let expected = [ - "(response bool uint)", - "(response bool uint)", "(response bool uint)", "(response bool uint)", "uint", @@ -202,11 +198,10 @@ fn test_stx_ops() { let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, - r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x000000)"#, + r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00)"#, - r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x00)"#, - r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00)"#, - r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, + r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, "(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", @@ -221,7 +216,6 @@ fn test_stx_ops() { CheckErrors::IncorrectArgumentCount(3, 5), CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), - CheckErrors::TypeError(SequenceType(BufferType(BufferLength(34))), BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), CheckErrors::IncorrectArgumentCount(2, 1), CheckErrors::TypeError(UIntType, IntType), From c3d2b237b4141ae33dad0470982f3e7532d814fc Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Fri, 25 Jun 2021 11:29:35 -0500 Subject: [PATCH 25/33] cleaning up some imports --- src/vm/tests/events.rs | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index fa431c4f47..f7c51c8334 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::clarity_vm::database::MemoryBackingStore; +use clarity_vm::database::MemoryBackingStore; +use vm::database::{NULL_BURN_STATE_DB, NULL_HEADER_DB, NULL_BURN_STATE_DB_2_1}; use chainstate::stacks::events::*; use std::convert::TryInto; use vm::analysis::errors::CheckError; @@ -25,14 +26,48 @@ use vm::types::TypeSignature::UIntType; use vm::types::{ AssetIdentifier, BuffData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value, }; +use clarity_vm::database::marf::MarfedKV; +use clarity_vm::clarity::ClarityInstance; +use vm::costs::ExecutionCost; +use types::chainstate::{StacksBlockId, StacksBlockHeader}; +use types::proof::ClarityMarfTrieId; + +use core::EMPTY_MICROBLOCK_PARENT_HASH; +use core::FIRST_BURNCHAIN_CONSENSUS_HASH; +use core::FIRST_STACKS_BLOCK_HASH; fn helper_execute(contract: &str, method: &str) -> (Value, Vec) { let contract_id = QualifiedContractIdentifier::local("contract").unwrap(); let address = "'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR"; let sender = execute(address).expect_principal(); - let mut marf_kv = MemoryBackingStore::new(); - let mut owned_env = OwnedEnvironment::new(marf_kv.as_clarity_db()); + let marf_kv = MarfedKV::temporary(); + let mut clarity_instance = ClarityInstance::new(false, marf_kv, ExecutionCost::max_value()); + clarity_instance + .begin_test_genesis_block( + &StacksBlockId::sentinel(), + &StacksBlockHeader::make_index_block_hash( + &FIRST_BURNCHAIN_CONSENSUS_HASH, + &FIRST_STACKS_BLOCK_HASH, + ), + &NULL_HEADER_DB, + &NULL_BURN_STATE_DB, + ) + .commit_block(); + + let mut marf_kv = clarity_instance.destroy(); + + let mut store = marf_kv.begin( + &StacksBlockHeader::make_index_block_hash( + &FIRST_BURNCHAIN_CONSENSUS_HASH, + &FIRST_STACKS_BLOCK_HASH, + ), + &StacksBlockId([1 as u8; 32]), + ); + + let mut owned_env = OwnedEnvironment::new_max_limit( + store.as_clarity_db(&NULL_HEADER_DB, &NULL_BURN_STATE_DB_2_1), + ); { let mut env = owned_env.get_exec_environment(None, None); From 59f3b60a972bb8d943f78a86113851bc9ce77b14 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Fri, 25 Jun 2021 11:38:16 -0500 Subject: [PATCH 26/33] rearranged the vm tests --- src/vm/analysis/type_checker/tests/mod.rs | 6 +----- src/vm/ast/definition_sorter/mod.rs | 9 ++++---- src/vm/tests/events.rs | 25 ++++++++--------------- 3 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index cd958e47f5..554efc2319 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -190,11 +190,7 @@ fn test_stx_ops() { r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; - let expected = [ - "(response bool uint)", - "(response bool uint)", - "uint", - ]; + let expected = ["(response bool uint)", "(response bool uint)", "uint"]; let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, diff --git a/src/vm/ast/definition_sorter/mod.rs b/src/vm/ast/definition_sorter/mod.rs index 59a0904dbc..5be8ef12ba 100644 --- a/src/vm/ast/definition_sorter/mod.rs +++ b/src/vm/ast/definition_sorter/mod.rs @@ -213,12 +213,11 @@ impl<'a> DefinitionSorter { } } else if let Some(native_function) = // NOTE: can use ClarityVersion::latest() here only as long as NO NEW FUNCTIONS are special cased - // in the definition sorter. + // in the definition sorter. NativeFunctions::lookup_by_name_at_version( - function_name, - &ClarityVersion::latest(), - ) - { + function_name, + &ClarityVersion::latest(), + ) { match native_function { NativeFunctions::ContractCall => { // Args: [contract-name, function-name, ...]: ignore contract-name, function-name, handle rest diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index f7c51c8334..8945b0bb86 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -14,27 +14,20 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use clarity_vm::database::MemoryBackingStore; -use vm::database::{NULL_BURN_STATE_DB, NULL_HEADER_DB, NULL_BURN_STATE_DB_2_1}; use chainstate::stacks::events::*; -use std::convert::TryInto; -use vm::analysis::errors::CheckError; -use vm::contexts::{Environment, GlobalContext, OwnedEnvironment}; -use vm::errors::{CheckErrors, Error, RuntimeErrorType}; +use clarity_vm::clarity::ClarityInstance; +use clarity_vm::database::marf::MarfedKV; +use types::chainstate::{StacksBlockHeader, StacksBlockId}; +use types::proof::ClarityMarfTrieId; +use vm::contexts::OwnedEnvironment; +use vm::costs::ExecutionCost; +use vm::database::{NULL_BURN_STATE_DB, NULL_BURN_STATE_DB_2_1, NULL_HEADER_DB}; use vm::tests::execute; -use vm::types::TypeSignature::UIntType; use vm::types::{ - AssetIdentifier, BuffData, PrincipalData, QualifiedContractIdentifier, ResponseData, Value, + AssetIdentifier, BuffData, QualifiedContractIdentifier, Value, }; -use clarity_vm::database::marf::MarfedKV; -use clarity_vm::clarity::ClarityInstance; -use vm::costs::ExecutionCost; -use types::chainstate::{StacksBlockId, StacksBlockHeader}; -use types::proof::ClarityMarfTrieId; -use core::EMPTY_MICROBLOCK_PARENT_HASH; -use core::FIRST_BURNCHAIN_CONSENSUS_HASH; -use core::FIRST_STACKS_BLOCK_HASH; +use core::{FIRST_BURNCHAIN_CONSENSUS_HASH, FIRST_STACKS_BLOCK_HASH}; fn helper_execute(contract: &str, method: &str) -> (Value, Vec) { let contract_id = QualifiedContractIdentifier::local("contract").unwrap(); From 149355c1d41f5e74fe25544c835bc2db43f67f70 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Mon, 28 Jun 2021 14:27:00 -0500 Subject: [PATCH 27/33] copied tests in test_stx_ops to create memo tests --- src/vm/analysis/type_checker/tests/mod.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index 554efc2319..fc123c8702 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -188,9 +188,10 @@ fn test_stx_ops() { let good = [ "(stx-burn? u10 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, + r#"(stx-transfer-memo? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; - let expected = ["(response bool uint)", "(response bool uint)", "uint"]; + let expected = ["(response bool uint)", "(response bool uint)", "(response bool uint)", "uint"]; let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, @@ -198,7 +199,13 @@ fn test_stx_ops() { r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00)"#, r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, - "(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", + r#"(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, + r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759 0x0102)"#, + r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00) 0x0102"#, + r#"(stx-transfer-memo? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x0102)"#, + r#"(stx-transfer-memo? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", "(stx-burn? u4 true)", @@ -213,6 +220,12 @@ fn test_stx_ops() { CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), + CheckErrors::TypeError(PrincipalType, SequenceType(BufferType(BufferLength(2)))), + CheckErrors::TypeError(UIntType, IntType), + CheckErrors::IncorrectArgumentCount(4, 5), + CheckErrors::TypeError(PrincipalType, UIntType), + CheckErrors::TypeError(PrincipalType, BoolType), + CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), CheckErrors::IncorrectArgumentCount(2, 1), CheckErrors::TypeError(UIntType, IntType), CheckErrors::TypeError(PrincipalType, BoolType), From 0108e7b5510c56fbdd6969fa3af2ce8aa101bf42 Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Mon, 28 Jun 2021 15:36:06 -0500 Subject: [PATCH 28/33] added some memo tests to simple_apply_eval --- src/vm/functions/assets.rs | 2 +- src/vm/tests/simple_apply_eval.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/vm/functions/assets.rs b/src/vm/functions/assets.rs index 51c684df79..3f37458861 100644 --- a/src/vm/functions/assets.rs +++ b/src/vm/functions/assets.rs @@ -174,7 +174,7 @@ pub fn special_stx_transfer_memo( env: &mut Environment, context: &LocalContext, ) -> Result { - check_argument_count(4, args); + check_argument_count(4, args)?; runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; let amount_val = eval(&args[0], env, context)?; diff --git a/src/vm/tests/simple_apply_eval.rs b/src/vm/tests/simple_apply_eval.rs index dba4851146..b00e608ad0 100644 --- a/src/vm/tests/simple_apply_eval.rs +++ b/src/vm/tests/simple_apply_eval.rs @@ -30,7 +30,7 @@ use vm::tests::execute; use vm::types::signatures::BufferLength; use vm::types::{BuffData, QualifiedContractIdentifier, TypeSignature}; use vm::types::{PrincipalData, ResponseData, SequenceData, SequenceSubtype}; -use vm::{eval, execute as vm_execute}; +use vm::{eval, execute as vm_execute, execute_v2 as vm_execute_v2}; use vm::{CallStack, ContractContext, Environment, GlobalContext, LocalContext, Value}; use crate::types::chainstate::StacksAddress; @@ -683,6 +683,10 @@ fn test_stx_ops_errors() { r#"(stx-transfer? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? u4 u3 u2)"#, r#"(stx-transfer? true 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, + r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, + r#"(stx-transfer-memo? u4 u3 u2 0x0102)"#, + r#"(stx-transfer-memo? true 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", ]; @@ -692,12 +696,16 @@ fn test_stx_ops_errors() { CheckErrors::BadTransferSTXArguments.into(), CheckErrors::BadTransferSTXArguments.into(), CheckErrors::BadTransferSTXArguments.into(), + CheckErrors::IncorrectArgumentCount(4, 3).into(), + CheckErrors::BadTransferSTXArguments.into(), + CheckErrors::BadTransferSTXArguments.into(), + CheckErrors::BadTransferSTXArguments.into(), CheckErrors::IncorrectArgumentCount(2, 1).into(), CheckErrors::BadTransferSTXArguments.into(), ]; for (program, expectation) in tests.iter().zip(expectations.iter()) { - assert_eq!(*expectation, vm_execute(program).unwrap_err()); + assert_eq!(*expectation, vm_execute_v2(program).unwrap_err()); } } From eae8745763c99a40bc0eece13336dd36a0d3688c Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Mon, 28 Jun 2021 15:49:36 -0500 Subject: [PATCH 29/33] revert change to ast --- src/vm/ast/definition_sorter/mod.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vm/ast/definition_sorter/mod.rs b/src/vm/ast/definition_sorter/mod.rs index 5be8ef12ba..59a0904dbc 100644 --- a/src/vm/ast/definition_sorter/mod.rs +++ b/src/vm/ast/definition_sorter/mod.rs @@ -213,11 +213,12 @@ impl<'a> DefinitionSorter { } } else if let Some(native_function) = // NOTE: can use ClarityVersion::latest() here only as long as NO NEW FUNCTIONS are special cased - // in the definition sorter. + // in the definition sorter. NativeFunctions::lookup_by_name_at_version( - function_name, - &ClarityVersion::latest(), - ) { + function_name, + &ClarityVersion::latest(), + ) + { match native_function { NativeFunctions::ContractCall => { // Args: [contract-name, function-name, ...]: ignore contract-name, function-name, handle rest From 948aeb0d881f00aeb0db5b294b402be14f492523 Mon Sep 17 00:00:00 2001 From: Gregory Coppola <60008382+gregorycoppola@users.noreply.github.com> Date: Wed, 30 Jun 2021 16:57:42 -0500 Subject: [PATCH 30/33] new test cases for test_stx_ops --- src/vm/analysis/type_checker/tests/mod.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vm/analysis/type_checker/tests/mod.rs b/src/vm/analysis/type_checker/tests/mod.rs index fc123c8702..c5ff1364bb 100644 --- a/src/vm/analysis/type_checker/tests/mod.rs +++ b/src/vm/analysis/type_checker/tests/mod.rs @@ -191,7 +191,12 @@ fn test_stx_ops() { r#"(stx-transfer-memo? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, "(stx-get-balance 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)", ]; - let expected = ["(response bool uint)", "(response bool uint)", "(response bool uint)", "uint"]; + let expected = [ + "(response bool uint)", + "(response bool uint)", + "(response bool uint)", + "uint", + ]; let bad = [ r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759)"#, @@ -200,12 +205,14 @@ fn test_stx_ops() { r#"(stx-transfer? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)"#, r#"(stx-transfer? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true)"#, r#"(stx-transfer? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, + r#"(stx-transfer? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, // valid arguments for stx-transfer-memo r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x7759 0x0102)"#, r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, r#"(stx-transfer-memo? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x00) 0x0102"#, r#"(stx-transfer-memo? u4 u3 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x0102)"#, r#"(stx-transfer-memo? u4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR true 0x0102)"#, r#"(stx-transfer-memo? u10 tx-sponsor? 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G 0x0102)"#, + r#"(stx-transfer-memo? u10 tx-sender 'SM2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQVX8X0G)"#, // valid arguments for stx-transfer "(stx-burn? u4)", "(stx-burn? 4 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR)", "(stx-burn? u4 true)", @@ -220,12 +227,14 @@ fn test_stx_ops() { CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), + CheckErrors::IncorrectArgumentCount(3, 4), CheckErrors::TypeError(PrincipalType, SequenceType(BufferType(BufferLength(2)))), CheckErrors::TypeError(UIntType, IntType), CheckErrors::IncorrectArgumentCount(4, 5), CheckErrors::TypeError(PrincipalType, UIntType), CheckErrors::TypeError(PrincipalType, BoolType), CheckErrors::TypeError(PrincipalType, OptionalType(Box::from(PrincipalType))), + CheckErrors::IncorrectArgumentCount(4, 3), CheckErrors::IncorrectArgumentCount(2, 1), CheckErrors::TypeError(UIntType, IntType), CheckErrors::TypeError(PrincipalType, BoolType), From 1f7e8cf105113401d0fa71205a3ebfcbe232e9f5 Mon Sep 17 00:00:00 2001 From: Gregory Coppola <60008382+gregorycoppola@users.noreply.github.com> Date: Fri, 2 Jul 2021 12:35:33 -0500 Subject: [PATCH 31/33] using Unimplemented as the cost --- src/vm/costs/cost_functions.rs | 1 - src/vm/functions/assets.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vm/costs/cost_functions.rs b/src/vm/costs/cost_functions.rs index a43130c4f6..9632fb8839 100644 --- a/src/vm/costs/cost_functions.rs +++ b/src/vm/costs/cost_functions.rs @@ -120,7 +120,6 @@ define_named_enum!(ClarityCostFunction { BlockInfo("cost_block_info"), StxBalance("cost_stx_balance"), StxTransfer("cost_stx_transfer"), - StxTransferMemo("cost_stx_transfer"), FtMint("cost_ft_mint"), FtTransfer("cost_ft_transfer"), FtBalance("cost_ft_balance"), diff --git a/src/vm/functions/assets.rs b/src/vm/functions/assets.rs index 3f37458861..517fd7dcd9 100644 --- a/src/vm/functions/assets.rs +++ b/src/vm/functions/assets.rs @@ -175,7 +175,7 @@ pub fn special_stx_transfer_memo( context: &LocalContext, ) -> Result { check_argument_count(4, args)?; - runtime_cost(ClarityCostFunction::StxTransfer, env, 0)?; + runtime_cost(ClarityCostFunction::Unimplemented, env, 0)?; let amount_val = eval(&args[0], env, context)?; let from_val = eval(&args[1], env, context)?; From 5070968a0baca9ebf76f9faa4d96dcaad3a222c0 Mon Sep 17 00:00:00 2001 From: Gregory Coppola <60008382+gregorycoppola@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:24:09 -0500 Subject: [PATCH 32/33] arithmetic_checker separates Clarity1 vs Clarity2 functions --- src/vm/analysis/arithmetic_checker/tests.rs | 114 ++++++++++++-------- src/vm/tests/events.rs | 4 +- 2 files changed, 72 insertions(+), 46 deletions(-) diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index b3196975d7..0dc8fb1d9e 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -31,7 +31,7 @@ use vm::variables::NativeVariables; /// Checks whether or not a contract only contains arithmetic expressions (for example, defining a /// map would not pass this check). /// This check is useful in determining the validity of new potential cost functions. -fn arithmetic_check(contract: &str) -> Result<(), Error> { +fn arithmetic_check(contract: &str, version: ClarityVersion) -> Result<(), Error> { let contract_identifier = QualifiedContractIdentifier::transient(); let expressions = parse(&contract_identifier, contract).unwrap(); @@ -39,7 +39,7 @@ fn arithmetic_check(contract: &str) -> Result<(), Error> { contract_identifier, expressions, LimitedCostTracker::new_free(), - ClarityVersion::Clarity2, + version, ); ArithmeticOnlyChecker::run(&analysis) @@ -69,7 +69,7 @@ fn test_bad_defines() { for (contract, error) in tests.iter() { assert_eq!( - arithmetic_check(contract), + arithmetic_check(contract, ClarityVersion::Clarity1), Err(error.clone()), "Check contract:\n {}", contract @@ -112,7 +112,7 @@ fn test_variables_fail_arithmetic_check() { for (contract, error) in tests.iter() { assert_eq!( - arithmetic_check(contract), + arithmetic_check(contract, ClarityVersion::Clarity1), Err(error.clone()), "Check contract:\n {}", contract @@ -130,97 +130,125 @@ fn test_variables_fail_arithmetic_check() { } #[test] -fn test_functions() { - let bad_tests = [ +fn test_functions_clarity1() { + // Tests all functions against Clarity1 VM. Results should be different for Clarity1 vs Clarity2 functions. + let tests = [ + // Clarity1 functions. ("(define-private (foo) (at-block 0x0202020202020202020202020202020202020202020202020202020202020202 (+ 1 2)))", - FunctionNotPermitted(NativeFunctions::AtBlock)), + Err(FunctionNotPermitted(NativeFunctions::AtBlock))), ("(define-private (foo) (map-get? foo-map {a: u1}))", - FunctionNotPermitted(NativeFunctions::FetchEntry)), + Err(FunctionNotPermitted(NativeFunctions::FetchEntry))), ("(define-private (foo) (map-delete foo-map {a: u1}))", - FunctionNotPermitted(NativeFunctions::DeleteEntry)), + Err(FunctionNotPermitted(NativeFunctions::DeleteEntry))), ("(define-private (foo) (map-set foo-map {a: u1} {b: u2}))", - FunctionNotPermitted(NativeFunctions::SetEntry)), + Err(FunctionNotPermitted(NativeFunctions::SetEntry))), ("(define-private (foo) (map-insert foo-map {a: u1} {b: u2}))", - FunctionNotPermitted(NativeFunctions::InsertEntry)), + Err(FunctionNotPermitted(NativeFunctions::InsertEntry))), ("(define-private (foo) (var-get foo-var))", - FunctionNotPermitted(NativeFunctions::FetchVar)), + Err(FunctionNotPermitted(NativeFunctions::FetchVar))), ("(define-private (foo) (var-set foo-var u2))", - FunctionNotPermitted(NativeFunctions::SetVar)), + Err(FunctionNotPermitted(NativeFunctions::SetVar))), ("(define-private (foo (a principal)) (ft-get-balance tokaroos a))", - FunctionNotPermitted(NativeFunctions::GetTokenBalance)), + Err(FunctionNotPermitted(NativeFunctions::GetTokenBalance))), ("(define-private (foo (a principal)) (ft-transfer? stackaroo u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF))", - FunctionNotPermitted(NativeFunctions::TransferToken)), + Err(FunctionNotPermitted(NativeFunctions::TransferToken))), ("(define-private (foo (a principal)) (ft-mint? stackaroo u100 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR))", - FunctionNotPermitted(NativeFunctions::MintToken)), + Err(FunctionNotPermitted(NativeFunctions::MintToken))), ("(define-private (foo (a principal)) (nft-mint? stackaroo \"Roo\" 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR))", - FunctionNotPermitted(NativeFunctions::MintAsset)), + Err(FunctionNotPermitted(NativeFunctions::MintAsset))), ("(nft-transfer? stackaroo \"Roo\" 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)", - FunctionNotPermitted(NativeFunctions::TransferAsset)), + Err(FunctionNotPermitted(NativeFunctions::TransferAsset))), ("(nft-get-owner? stackaroo \"Roo\")", - FunctionNotPermitted(NativeFunctions::GetAssetOwner)), + Err(FunctionNotPermitted(NativeFunctions::GetAssetOwner))), ("(get-block-info? id-header-hash 0)", - FunctionNotPermitted(NativeFunctions::GetBlockInfo)), + Err(FunctionNotPermitted(NativeFunctions::GetBlockInfo))), ("(define-private (foo) (contract-call? .bar outer-call))", - FunctionNotPermitted(NativeFunctions::ContractCall)), + Err(FunctionNotPermitted(NativeFunctions::ContractCall))), ("(stx-get-balance 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)", - FunctionNotPermitted(NativeFunctions::GetStxBalance)), + Err(FunctionNotPermitted(NativeFunctions::GetStxBalance))), ("(stx-burn? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)", - FunctionNotPermitted(NativeFunctions::StxBurn)), + Err(FunctionNotPermitted(NativeFunctions::StxBurn))), (r#"(stx-transfer? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF)"#, - FunctionNotPermitted(NativeFunctions::StxTransfer)), - (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x010203)"#, - FunctionNotPermitted(NativeFunctions::StxTransferMemo)), + Err(FunctionNotPermitted(NativeFunctions::StxTransfer))), ("(define-private (foo (a (list 3 uint))) (map log2 a))", - FunctionNotPermitted(NativeFunctions::Map)), + Err(FunctionNotPermitted(NativeFunctions::Map))), ("(define-private (foo (a (list 3 (optional uint)))) (filter is-none a))", - FunctionNotPermitted(NativeFunctions::Filter)), + Err(FunctionNotPermitted(NativeFunctions::Filter))), ("(define-private (foo (a (list 3 uint))) (append a u4))", - FunctionNotPermitted(NativeFunctions::Append)), + Err(FunctionNotPermitted(NativeFunctions::Append))), ("(define-private (foo (a (list 3 uint))) (concat a a))", - FunctionNotPermitted(NativeFunctions::Concat)), + Err(FunctionNotPermitted(NativeFunctions::Concat))), ("(define-private (foo (a (list 3 uint))) (as-max-len? a u4))", - FunctionNotPermitted(NativeFunctions::AsMaxLen)), + Err(FunctionNotPermitted(NativeFunctions::AsMaxLen))), ("(define-private (foo) (print 10))", - FunctionNotPermitted(NativeFunctions::Print)), + Err(FunctionNotPermitted(NativeFunctions::Print))), ("(define-private (foo) (list 3 4 10))", - FunctionNotPermitted(NativeFunctions::ListCons)), + Err(FunctionNotPermitted(NativeFunctions::ListCons))), ("(define-private (foo) (keccak256 0))", - FunctionNotPermitted(NativeFunctions::Keccak256)), + Err(FunctionNotPermitted(NativeFunctions::Keccak256))), ("(define-private (foo) (hash160 0))", - FunctionNotPermitted(NativeFunctions::Hash160)), + Err(FunctionNotPermitted(NativeFunctions::Hash160))), ("(define-private (foo) (secp256k1-recover? 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301))", - FunctionNotPermitted(NativeFunctions::Secp256k1Recover)), + Err(FunctionNotPermitted(NativeFunctions::Secp256k1Recover))), ("(define-private (foo) (secp256k1-verify 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a13 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110))", - FunctionNotPermitted(NativeFunctions::Secp256k1Verify)), + Err(FunctionNotPermitted(NativeFunctions::Secp256k1Verify))), ("(define-private (foo) (sha256 0))", - FunctionNotPermitted(NativeFunctions::Sha256)), + Err(FunctionNotPermitted(NativeFunctions::Sha256))), ("(define-private (foo) (sha512 0))", - FunctionNotPermitted(NativeFunctions::Sha512)), + Err(FunctionNotPermitted(NativeFunctions::Sha512))), ("(define-private (foo) (sha512/256 0))", - FunctionNotPermitted(NativeFunctions::Sha512Trunc256)), + Err(FunctionNotPermitted(NativeFunctions::Sha512Trunc256))), + // Clarity2 functions. + (r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x010203)"#, + Ok(())), ]; - for (contract, error) in bad_tests.iter() { + for (contract, result) in tests.iter() { eprintln!("{}", contract); assert_eq!( - arithmetic_check(contract), - Err(error.clone()), + arithmetic_check(contract, ClarityVersion::Clarity1), + result.clone(), + "Check contract:\n {}", + contract + ); + } +} + +#[test] +fn test_functions_clarity2() { + // Tests Clarity2 functions against Clarity2 VM. + let tests = [ + // Clarity2 functions. + ( + r#"(stx-transfer-memo? u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF 0x010203)"#, + Err(FunctionNotPermitted(NativeFunctions::StxTransferMemo)), + ), + ]; + + for (contract, result) in tests.iter() { + eprintln!("{}", contract); + assert_eq!( + arithmetic_check(contract, ClarityVersion::Clarity2), + result.clone(), "Check contract:\n {}", contract ); } +} +#[test] +fn test_functions_contract() { let good_tests = [ "(match (if (is-eq 0 1) (ok 1) (err 2)) ok-val (+ 1 ok-val) diff --git a/src/vm/tests/events.rs b/src/vm/tests/events.rs index 8945b0bb86..cde70c56bd 100644 --- a/src/vm/tests/events.rs +++ b/src/vm/tests/events.rs @@ -23,9 +23,7 @@ use vm::contexts::OwnedEnvironment; use vm::costs::ExecutionCost; use vm::database::{NULL_BURN_STATE_DB, NULL_BURN_STATE_DB_2_1, NULL_HEADER_DB}; use vm::tests::execute; -use vm::types::{ - AssetIdentifier, BuffData, QualifiedContractIdentifier, Value, -}; +use vm::types::{AssetIdentifier, BuffData, QualifiedContractIdentifier, Value}; use core::{FIRST_BURNCHAIN_CONSENSUS_HASH, FIRST_STACKS_BLOCK_HASH}; From 7178574e625cfbdfd9ed3f8ffe9987817b7c809f Mon Sep 17 00:00:00 2001 From: Gregory Coppola <60008382+gregorycoppola@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:25:22 -0500 Subject: [PATCH 33/33] remove some prinln's --- src/vm/analysis/arithmetic_checker/tests.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vm/analysis/arithmetic_checker/tests.rs b/src/vm/analysis/arithmetic_checker/tests.rs index 0dc8fb1d9e..3f5f9e7d6d 100644 --- a/src/vm/analysis/arithmetic_checker/tests.rs +++ b/src/vm/analysis/arithmetic_checker/tests.rs @@ -215,7 +215,6 @@ fn test_functions_clarity1() { ]; for (contract, result) in tests.iter() { - eprintln!("{}", contract); assert_eq!( arithmetic_check(contract, ClarityVersion::Clarity1), result.clone(), @@ -237,7 +236,6 @@ fn test_functions_clarity2() { ]; for (contract, result) in tests.iter() { - eprintln!("{}", contract); assert_eq!( arithmetic_check(contract, ClarityVersion::Clarity2), result.clone(), @@ -283,7 +281,6 @@ fn test_functions_contract() { ]; for contract in good_tests.iter() { - eprintln!("{}", contract); check_good(contract); } }