From ec563370e12804949ea6d8f91657c7372725708b Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 23 Sep 2022 06:14:26 -0400 Subject: [PATCH 01/13] fix: wasm-lsp should target published v0.33.0 --- Cargo.lock | 41 ++++++++++++++++--- components/clarinet-deployments/Cargo.toml | 5 ++- components/clarinet-deployments/src/lib.rs | 3 +- .../clarinet-deployments/src/requirements.rs | 2 + components/clarinet-deployments/src/types.rs | 2 + components/clarinet-files/Cargo.toml | 5 ++- .../clarinet-files/src/network_manifest.rs | 2 + .../clarinet-files/src/project_manifest.rs | 2 + components/clarity-lsp/Cargo.toml | 5 ++- components/clarity-lsp/src/common/backend.rs | 2 + components/clarity-lsp/src/common/state.rs | 2 + components/clarity-lsp/src/utils/mod.rs | 2 + 12 files changed, 60 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db6a71950..e17ed669e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -734,7 +734,7 @@ dependencies = [ "clarinet-files", "clarinet-utils", "clarity-lsp", - "clarity-repl", + "clarity-repl 0.33.0", "crossbeam-channel", "crossterm 0.22.1", "ctrlc", @@ -792,7 +792,8 @@ name = "clarinet-deployments" version = "0.1.0" dependencies = [ "clarinet-files", - "clarity-repl", + "clarity-repl 0.33.0", + "clarity-repl 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "orchestra-types", "reqwest", "serde", @@ -808,7 +809,8 @@ dependencies = [ "bip39", "bitcoin 0.28.1", "clarinet-utils", - "clarity-repl", + "clarity-repl 0.33.0", + "clarity-repl 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys", "libsecp256k1 0.7.1", "orchestra-types", @@ -838,7 +840,8 @@ version = "0.1.0" dependencies = [ "clarinet-deployments", "clarinet-files", - "clarity-repl", + "clarity-repl 0.33.0", + "clarity-repl 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "console_error_panic_hook", "js-sys", "lsp-types 0.93.1", @@ -886,6 +889,32 @@ dependencies = [ "wasm-bindgen-futures", ] +[[package]] +name = "clarity-repl" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b1b781c5449848251ba41384459924da377d43944dc3d6c8fc4f316b2bca949" +dependencies = [ + "ansi_term", + "atty", + "getrandom 0.2.7", + "integer-sqrt", + "lazy_static", + "libsecp256k1 0.5.0", + "rand 0.7.3", + "rand_pcg 0.3.1", + "rand_seeder", + "regex", + "ripemd160", + "serde", + "serde_derive", + "serde_json", + "sha2 0.9.9", + "sha3", + "wasm-bindgen", + "wasm-bindgen-futures", +] + [[package]] name = "clipboard-win" version = "4.4.2" @@ -3192,7 +3221,7 @@ dependencies = [ "bitcoincore-rpc-json", "clap 3.2.20", "clap_generate", - "clarity-repl", + "clarity-repl 0.33.0", "ctrlc", "orchestra-types", "reqwest", @@ -4675,7 +4704,7 @@ dependencies = [ name = "stacks-rpc-client" version = "0.1.0" dependencies = [ - "clarity-repl", + "clarity-repl 0.33.0", "reqwest", "serde", "serde_derive", diff --git a/components/clarinet-deployments/Cargo.toml b/components/clarinet-deployments/Cargo.toml index 8d0986c6f..6bcb42b60 100644 --- a/components/clarinet-deployments/Cargo.toml +++ b/components/clarinet-deployments/Cargo.toml @@ -7,7 +7,8 @@ edition = "2021" serde = "1" serde_json = "1" serde_derive = "1" -clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false } +clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.0", default-features = false, optional = true } clarinet_files = { package = "clarinet-files", path = "../clarinet-files", default-features = false } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } serde_yaml = "0.8.23" @@ -21,7 +22,7 @@ reqwest = { version = "0.11", default-features = false, features = [ [features] default = ["cli"] cli = ["clarity_repl/cli", "clarinet_files/cli"] -wasm = ["clarity_repl/wasm", "clarinet_files/wasm"] +wasm = ["clarity_repl_wasm/wasm", "clarinet_files/wasm"] [lib] name = "clarinet_deployments" diff --git a/components/clarinet-deployments/src/lib.rs b/components/clarinet-deployments/src/lib.rs index eced6c462..f4f48226c 100644 --- a/components/clarinet-deployments/src/lib.rs +++ b/components/clarinet-deployments/src/lib.rs @@ -18,7 +18,6 @@ use types::RequirementPublishSpecification; use types::TransactionSpecification; use clarinet_files::{NetworkManifest, ProjectManifest}; - use clarity_repl::analysis::ast_dependency_detector::{ASTDependencyDetector, DependencySet}; use clarity_repl::clarity::ast::ContractAST; use clarity_repl::clarity::diagnostic::Diagnostic; @@ -26,6 +25,8 @@ use clarity_repl::clarity::types::{PrincipalData, QualifiedContractIdentifier}; use clarity_repl::clarity::ContractName; use clarity_repl::repl::SessionSettings; use clarity_repl::repl::{ExecutionResult, Session}; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use orchestra_types::StacksNetwork; use std::collections::{BTreeMap, HashMap, VecDeque}; diff --git a/components/clarinet-deployments/src/requirements.rs b/components/clarinet-deployments/src/requirements.rs index 7e5241065..ba1a2406b 100644 --- a/components/clarinet-deployments/src/requirements.rs +++ b/components/clarinet-deployments/src/requirements.rs @@ -1,5 +1,7 @@ use clarinet_files::{FileAccessor, FileLocation}; use clarity_repl::clarity::types::QualifiedContractIdentifier; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use reqwest; pub async fn retrieve_contract( diff --git a/components/clarinet-deployments/src/types.rs b/components/clarinet-deployments/src/types.rs index c2f89cd9c..2aefee8d0 100644 --- a/components/clarinet-deployments/src/types.rs +++ b/components/clarinet-deployments/src/types.rs @@ -2,6 +2,8 @@ use clarinet_files::FileLocation; use clarity_repl::clarity::types::{ PrincipalData, QualifiedContractIdentifier, StandardPrincipalData, }; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use clarity_repl::clarity::{ClarityName, ContractName}; diff --git a/components/clarinet-files/Cargo.toml b/components/clarinet-files/Cargo.toml index 4e9c735b4..533c2c1b9 100644 --- a/components/clarinet-files/Cargo.toml +++ b/components/clarinet-files/Cargo.toml @@ -9,7 +9,8 @@ serde_derive = "1" clarinet_utils = { package = "clarinet-utils", path = "../clarinet-utils" } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } bip39 = { version = "1.0.1", default-features = false } -clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false } +clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.0", default-features = false, optional = true } libsecp256k1 = "0.7.0" toml = { version = "0.5.6", features = ["preserve_order"] } url = { version = "2.2.2", features = ["serde"] } @@ -32,7 +33,7 @@ wasm = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "clarity_repl/wasm", + "clarity_repl_wasm/wasm", ] [lib] diff --git a/components/clarinet-files/src/network_manifest.rs b/components/clarinet-files/src/network_manifest.rs index f213f9313..f4cec923a 100644 --- a/components/clarinet-files/src/network_manifest.rs +++ b/components/clarinet-files/src/network_manifest.rs @@ -5,6 +5,8 @@ use clarity_repl::clarity::types::QualifiedContractIdentifier; use clarity_repl::clarity::util::hash::bytes_to_hex; use clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; use clarity_repl::clarity::util::StacksAddress; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use libsecp256k1::{PublicKey, SecretKey}; use orchestra_types::{BitcoinNetwork, StacksNetwork}; use std::collections::BTreeMap; diff --git a/components/clarinet-files/src/project_manifest.rs b/components/clarinet-files/src/project_manifest.rs index 87947aec8..a862f7fc4 100644 --- a/components/clarinet-files/src/project_manifest.rs +++ b/components/clarinet-files/src/project_manifest.rs @@ -2,6 +2,8 @@ use crate::FileAccessor; use super::FileLocation; use clarity_repl::repl; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use std::collections::BTreeMap; use toml::value::Value; diff --git a/components/clarity-lsp/Cargo.toml b/components/clarity-lsp/Cargo.toml index 69691d97f..e1e09e2b7 100644 --- a/components/clarity-lsp/Cargo.toml +++ b/components/clarity-lsp/Cargo.toml @@ -6,7 +6,6 @@ version = "0.1.0" [dependencies] lsp-types = "0.93" serde = "1" -clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false } clarinet_deployments = { package = "clarinet-deployments", path = "../clarinet-deployments", default-features = false } clarinet_files = { package = "clarinet-files", path = "../clarinet-files", default-features = false } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } @@ -18,6 +17,8 @@ serde-wasm-bindgen = { version = "0.4", optional = true } wasm-bindgen = { version = "0.2", optional = true } wasm-bindgen-futures = { version = "0.4", optional = true } web-sys = { version = "0.3", features = ["console"], optional = true } +clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.0", default-features = false, optional = true } [features] default = ["cli"] @@ -35,7 +36,7 @@ wasm = [ "web-sys", "console_error_panic_hook", "clarinet_deployments/wasm", - "clarity_repl/wasm", + "clarity_repl_wasm/wasm", "clarinet_files/wasm", ] diff --git a/components/clarity-lsp/src/common/backend.rs b/components/clarity-lsp/src/common/backend.rs index d55840d79..ad14d6788 100644 --- a/components/clarity-lsp/src/common/backend.rs +++ b/components/clarity-lsp/src/common/backend.rs @@ -3,6 +3,8 @@ use crate::state::{build_state, EditorState, ProtocolState}; use crate::types::{CompletionItem, CompletionItemKind}; use clarinet_files::{FileAccessor, FileLocation}; use clarity_repl::clarity::diagnostic::Diagnostic; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] diff --git a/components/clarity-lsp/src/common/state.rs b/components/clarity-lsp/src/common/state.rs index 7c66026bd..29951aa3a 100644 --- a/components/clarity-lsp/src/common/state.rs +++ b/components/clarity-lsp/src/common/state.rs @@ -11,6 +11,8 @@ use clarity_repl::clarity::analysis::ContractAnalysis; use clarity_repl::clarity::diagnostic::{Diagnostic as ClarityDiagnostic, Level as ClarityLevel}; use clarity_repl::clarity::types::QualifiedContractIdentifier; use clarity_repl::repl::ast::ContractAST; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use lsp_types::MessageType; use orchestra_types::StacksNetwork; use std::borrow::BorrowMut; diff --git a/components/clarity-lsp/src/utils/mod.rs b/components/clarity-lsp/src/utils/mod.rs index eb17dc95a..56d3aa9fb 100644 --- a/components/clarity-lsp/src/utils/mod.rs +++ b/components/clarity-lsp/src/utils/mod.rs @@ -9,6 +9,8 @@ use clarity_repl::clarity::functions::define::DefineFunctions; use clarity_repl::clarity::functions::NativeFunctions; use clarity_repl::clarity::types::{BlockInfoProperty, FunctionType}; use clarity_repl::clarity::variables::NativeVariables; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use lsp_types::Diagnostic as LspDiagnostic; use lsp_types::Url; use lsp_types::{DiagnosticSeverity, Position, Range}; From 2405eb78acb97a2875425290cfe5a54a438e52c8 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 23 Sep 2022 15:26:16 -0400 Subject: [PATCH 02/13] fix: simplify dependency graph --- Cargo.lock | 77 ++++++++++--------- .../src/chainhooks/mod.rs | 2 +- .../src/indexer/stacks/mod.rs | 4 +- components/clarinet-cli/Cargo.toml | 1 + .../clarinet-cli/src/deployments/mod.rs | 10 +-- components/clarinet-cli/src/frontend/cli.rs | 2 +- .../src/integrate/chains_coordinator.rs | 6 +- components/clarinet-cli/src/runner/mod.rs | 2 +- components/clarinet-deployments/Cargo.toml | 2 +- components/clarinet-deployments/src/lib.rs | 20 ++--- .../clarinet-deployments/src/requirements.rs | 2 +- components/clarinet-deployments/src/types.rs | 2 +- components/clarinet-files/Cargo.toml | 2 +- components/clarinet-files/src/lib.rs | 4 +- .../clarinet-files/src/network_manifest.rs | 2 +- components/clarity-lsp/Cargo.toml | 2 +- components/clarity-lsp/src/common/state.rs | 9 ++- components/clarity-lsp/src/utils/mod.rs | 8 +- components/clarity-repl/src/codec/mod.rs | 16 ++-- components/clarity-repl/src/lib.rs | 5 +- components/clarity-repl/src/macros.rs | 8 +- .../stacks-rpc-client/src/rpc_client.rs | 4 +- .../src/indexer/stacks/mod.rs | 2 +- 23 files changed, 94 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74c85296c..7e5501b02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -181,9 +181,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "ast_node" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a614981a880a40522cf6fbe8b1a8365eb253655939f812a9db03e8ba4e2cb1f" +checksum = "cf94863c5fdfee166d0907c44e5fee970123b2b7307046d35d1e671aa93afbba" dependencies = [ "darling", "pmutil", @@ -876,6 +876,7 @@ dependencies = [ "regex", "reqwest", "ring", + "rsa", "segment", "semver-parser 0.10.2", "serde", @@ -915,7 +916,7 @@ name = "clarinet-deployments" version = "0.1.0" dependencies = [ "clarinet-files", - "clarity-repl 0.33.0", + "clarity-repl 0.33.1", "clarity-repl 0.34.0", "orchestra-types", "reqwest", @@ -932,7 +933,7 @@ dependencies = [ "bip39", "bitcoin 0.28.1", "clarinet-utils", - "clarity-repl 0.33.0", + "clarity-repl 0.33.1", "clarity-repl 0.34.0", "js-sys", "libsecp256k1 0.7.1", @@ -987,7 +988,7 @@ version = "0.1.0" dependencies = [ "clarinet-deployments", "clarinet-files", - "clarity-repl 0.33.0", + "clarity-repl 0.33.1", "clarity-repl 0.34.0", "console_error_panic_hook", "js-sys", @@ -1002,9 +1003,9 @@ dependencies = [ [[package]] name = "clarity-repl" -version = "0.33.0" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1b781c5449848251ba41384459924da377d43944dc3d6c8fc4f316b2bca949" +checksum = "245286ebe20cce1aa236f0a30fabbf262898b0546152220f4788fb61a3dab701" dependencies = [ "ansi_term", "atty", @@ -1849,9 +1850,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" dependencies = [ "block-buffer 0.10.3", "crypto-common", @@ -1995,9 +1996,9 @@ checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2" [[package]] name = "ecdsa" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e852f4174d2a8646a0fa8a34b55797856c722f86267deb0aa1e93f7f247f800e" +checksum = "85789ce7dfbd0f0624c07ef653a08bb2ebf43d3e16531361f46d36dd54334fed" dependencies = [ "der", "elliptic-curve", @@ -2033,7 +2034,7 @@ dependencies = [ "base16ct", "crypto-bigint", "der", - "digest 0.10.3", + "digest 0.10.5", "ff", "generic-array 0.14.6", "group", @@ -2625,7 +2626,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.5", ] [[package]] @@ -2905,9 +2906,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] @@ -2926,9 +2927,9 @@ checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" [[package]] name = "jobserver" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" dependencies = [ "libc", ] @@ -3481,9 +3482,9 @@ dependencies = [ [[package]] name = "netif" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ea59a9e719be226ab85078ed524f1cf62b43c0ebf3014d50aa22f988996dfe" +checksum = "d29a01b9f018d6b7b277fef6c79fdbd9bf17bb2d1e298238055cafab49baa5ee" dependencies = [ "libc", "winapi", @@ -3906,7 +3907,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.3", + "digest 0.10.5", "hmac 0.12.1", "password-hash", "sha2 0.10.5", @@ -4544,11 +4545,11 @@ dependencies = [ [[package]] name = "ripemd" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1facec54cb5e0dc08553501fa740091086d0259ad0067e0d4103448e4cb22ed3" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.3", + "digest 0.10.5", ] [[package]] @@ -4680,7 +4681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6168b9a0f38e487db90dc109ad6d8f37fc5590183b7bfe8d8687e0b86116d53f" dependencies = [ "byteorder", - "digest 0.10.3", + "digest 0.10.5", "num-bigint-dig", "num-integer", "num-iter", @@ -4781,7 +4782,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.13", + "semver 1.0.14", ] [[package]] @@ -5051,9 +5052,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" [[package]] name = "semver-parser" @@ -5235,7 +5236,7 @@ checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest 0.10.5", ] [[package]] @@ -5286,7 +5287,7 @@ checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest 0.10.5", "sha2-asm 0.6.2", ] @@ -5322,11 +5323,11 @@ dependencies = [ [[package]] name = "sha3" -version = "0.10.4" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaedf34ed289ea47c2b741bb72e5357a209512d67bcd4bda44359e5bf0470f56" +checksum = "e2904bea16a1ae962b483322a1c7b81d976029203aea1f461e51cd7705db7ba9" dependencies = [ - "digest 0.10.3", + "digest 0.10.5", "keccak", ] @@ -5378,11 +5379,11 @@ dependencies = [ [[package]] name = "signature" -version = "1.6.0" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ea32af43239f0d353a7dd75a22d94c329c8cdaafdcb4c1c1335aa10c298a4a" +checksum = "deb766570a2825fa972bceff0d195727876a9cdf2460ab2e52d455dc2de47fd9" dependencies = [ - "digest 0.10.3", + "digest 0.10.5", "rand_core 0.6.3", ] @@ -5551,7 +5552,7 @@ dependencies = [ "serde_json", "serde_stacker", "sha2 0.10.5", - "sha3 0.10.4", + "sha3 0.10.5", "slog", "slog-term", "time 0.2.27", @@ -6817,9 +6818,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-id" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fe8d9274f490a36442acb4edfd0c4e473fdfc6a8b5cd32f28a0235761aedbe" +checksum = "d70b6494226b36008c8366c288d77190b3fad2eb4c10533139c1c1f461127f1a" [[package]] name = "unicode-ident" diff --git a/components/chainhook-event-observer/src/chainhooks/mod.rs b/components/chainhook-event-observer/src/chainhooks/mod.rs index 7d04c24ae..3b9e18d4a 100644 --- a/components/chainhook-event-observer/src/chainhooks/mod.rs +++ b/components/chainhook-event-observer/src/chainhooks/mod.rs @@ -16,7 +16,7 @@ use chainhook_types::{ }; use clarity_repl::clarity::codec::StacksMessageCodec; use clarity_repl::clarity::util::hash::{hex_bytes, to_hex, Hash160}; -use clarity_repl::clarity::types::{CharType, SequenceData, Value as ClarityValue}; +use clarity_repl::clarity::vm::types::{CharType, SequenceData, Value as ClarityValue}; use reqwest::{Client, Method}; use serde::Serialize; use std::collections::HashMap; diff --git a/components/chainhook-event-observer/src/indexer/stacks/mod.rs b/components/chainhook-event-observer/src/indexer/stacks/mod.rs index 4112b4d96..51d688a0b 100644 --- a/components/chainhook-event-observer/src/indexer/stacks/mod.rs +++ b/components/chainhook-event-observer/src/indexer/stacks/mod.rs @@ -6,10 +6,10 @@ use crate::indexer::AssetClassCache; use crate::indexer::{IndexerConfig, StacksChainContext}; use bitcoincore_rpc::bitcoin::Block; use chainhook_types::*; -use clarinet_utils::transactions::{StacksTransaction, TransactionAuth, TransactionPayload}; +use clarinet_utils::codec::{StacksTransaction, TransactionAuth, TransactionPayload}; use clarity_repl::clarity::codec::StacksMessageCodec; use clarity_repl::clarity::util::hash::hex_bytes; -use clarity_repl::clarity::types::Value as ClarityValue; +use clarity_repl::clarity::vm::types::Value as ClarityValue; use rocket::serde::json::Value as JsonValue; use rocket::serde::Deserialize; use std::collections::{hash_map::Entry, BTreeMap, BTreeSet, HashMap, HashSet}; diff --git a/components/clarinet-cli/Cargo.toml b/components/clarinet-cli/Cargo.toml index e22fc505a..34355a22e 100644 --- a/components/clarinet-cli/Cargo.toml +++ b/components/clarinet-cli/Cargo.toml @@ -63,6 +63,7 @@ deno_broadcast_channel = "0.58.0" hyper = { version = "0.14.18", features = ["server", "stream", "http1", "http2", "runtime"] } http = "0.2.6" ### +rsa = "=0.7.0-pre" deno_fetch = { version = "0.87.0", optional = true } deno_crypto = { version = "0.78.0", optional = true } import_map = { version = "=0.12.1", optional = true } diff --git a/components/clarinet-cli/src/deployments/mod.rs b/components/clarinet-cli/src/deployments/mod.rs index 1e4f8b7cd..9eedb179c 100644 --- a/components/clarinet-cli/src/deployments/mod.rs +++ b/components/clarinet-cli/src/deployments/mod.rs @@ -4,11 +4,11 @@ mod ui; use bitcoincore_rpc::{Auth, Client}; -use clarity_repl::clarity::types::chainstate::StacksAddress; +use clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; use clarity_repl::clarity::util::secp256k1::{ MessageSignature, Secp256k1PrivateKey, Secp256k1PublicKey, }; -use clarity_repl::clarity::types::StandardPrincipalData; +use clarity_repl::clarity::vm::types::StandardPrincipalData; use clarity_repl::clarity::vm::{ClarityName, EvaluationResult, Value}; use reqwest::Url; pub use ui::start_ui; @@ -22,18 +22,18 @@ use clarinet_deployments::types::{ use clarinet_files::{AccountConfig, FileLocation, NetworkManifest, ProjectManifest}; use clarinet_utils::get_bip39_seed_from_mnemonic; -use clarinet_utils::transactions::{ +use clarity_repl::clarity::codec::StacksMessageCodec; +use clarity_repl::codec::{ SinglesigHashMode, SinglesigSpendingCondition, StacksString, StacksTransaction, StacksTransactionSigner, TransactionAnchorMode, TransactionAuth, TransactionContractCall, TransactionPayload, TransactionPostConditionMode, TransactionPublicKeyEncoding, TransactionSmartContract, TransactionSpendingCondition, TransactionVersion, }; -use clarity_repl::clarity::codec::StacksMessageCodec; use clarity_repl::clarity::address::{ AddressHashMode, C32_ADDRESS_VERSION_MAINNET_SINGLESIG, C32_ADDRESS_VERSION_TESTNET_SINGLESIG, }; -use clarity_repl::clarity::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use clarity_repl::clarity::vm::ContractName; use clarity_repl::repl::Session; diff --git a/components/clarinet-cli/src/frontend/cli.rs b/components/clarinet-cli/src/frontend/cli.rs index 1b7dea2b6..b67954574 100644 --- a/components/clarinet-cli/src/frontend/cli.rs +++ b/components/clarinet-cli/src/frontend/cli.rs @@ -20,7 +20,7 @@ use clarity_repl::analysis::call_checker::ContractAnalysis; use clarity_repl::clarity::vm::analysis::AnalysisDatabase; use clarity_repl::clarity::vm::costs::LimitedCostTracker; use clarity_repl::clarity::vm::diagnostic::{Diagnostic, Level}; -use clarity_repl::clarity::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use clarity_repl::repl::diagnostic::{output_code, output_diagnostic}; use clarity_repl::{analysis, repl, Terminal}; use orchestra_types::Chain; diff --git a/components/clarinet-cli/src/integrate/chains_coordinator.rs b/components/clarinet-cli/src/integrate/chains_coordinator.rs index 777c9a875..6b07bac0e 100644 --- a/components/clarinet-cli/src/integrate/chains_coordinator.rs +++ b/components/clarinet-cli/src/integrate/chains_coordinator.rs @@ -9,12 +9,12 @@ use bitcoincore_rpc::{Auth, Client, RpcApi}; use clarinet_deployments::types::DeploymentSpecification; use clarinet_files::{self, AccountConfig, DevnetConfig, NetworkManifest, ProjectManifest}; -use clarinet_utils::transactions; use clarity_repl::clarity::address::AddressHashMode; use clarity_repl::clarity::util::hash::{hex_bytes, Hash160}; -use clarity_repl::clarity::types::{BuffData, SequenceData, TupleData}; +use clarity_repl::clarity::vm::types::{BuffData, SequenceData, TupleData}; use clarity_repl::clarity::vm::ClarityName; use clarity_repl::clarity::vm::Value as ClarityValue; +use clarity_repl::codec; use orchestra_event_observer::observer::{ start_event_observer, EventObserverConfig, ObserverCommand, ObserverEvent, StacksChainMempoolEvent, @@ -516,7 +516,7 @@ pub async fn publish_stacking_orders( let addr_bytes = Hash160::from_bytes(&addr_bytes[1..21]).unwrap(); let addr_version = AddressHashMode::SerializeP2PKH; - let stack_stx_tx = transactions::build_contrat_call_transaction( + let stack_stx_tx = codec::build_contrat_call_transaction( pox_contract_id, "stack-stx".into(), vec![ diff --git a/components/clarinet-cli/src/runner/mod.rs b/components/clarinet-cli/src/runner/mod.rs index 5ac7275df..dd9dfc69b 100644 --- a/components/clarinet-cli/src/runner/mod.rs +++ b/components/clarinet-cli/src/runner/mod.rs @@ -9,7 +9,7 @@ use clarity_repl::clarity::vm::analysis::contract_interface_builder::{ build_contract_interface, ContractInterface, }; use clarity_repl::clarity::vm::ast::ContractAST; -use clarity_repl::clarity::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use clarity_repl::clarity::vm::EvaluationResult; use clarity_repl::repl::{session::CostsReport, Session}; use deno_core::error::AnyError; diff --git a/components/clarinet-deployments/Cargo.toml b/components/clarinet-deployments/Cargo.toml index 6bcb42b60..3ac0f5028 100644 --- a/components/clarinet-deployments/Cargo.toml +++ b/components/clarinet-deployments/Cargo.toml @@ -8,7 +8,7 @@ serde = "1" serde_json = "1" serde_derive = "1" clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.0", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } clarinet_files = { package = "clarinet-files", path = "../clarinet-files", default-features = false } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } serde_yaml = "0.8.23" diff --git a/components/clarinet-deployments/src/lib.rs b/components/clarinet-deployments/src/lib.rs index b09e53872..58853352c 100644 --- a/components/clarinet-deployments/src/lib.rs +++ b/components/clarinet-deployments/src/lib.rs @@ -16,16 +16,16 @@ use self::types::{ use clarinet_files::FileAccessor; use clarinet_files::{NetworkManifest, ProjectManifest}; -use crate::clarity_repl::analysis::ast_dependency_detector::{ASTDependencyDetector, DependencySet}; -use crate::clarity_repl::clarity::vm::ast::ContractAST; -use crate::clarity_repl::clarity::vm::diagnostic::Diagnostic; -use crate::clarity_repl::clarity::types::PrincipalData; -use crate::clarity_repl::clarity::types::QualifiedContractIdentifier; -use crate::clarity_repl::clarity::vm::ContractName; -use crate::clarity_repl::clarity::vm::EvaluationResult; -use crate::clarity_repl::clarity::vm::ExecutionResult; -use crate::clarity_repl::repl::Session; -use crate::clarity_repl::repl::SessionSettings; +use clarity_repl::analysis::ast_dependency_detector::{ASTDependencyDetector, DependencySet}; +use clarity_repl::clarity::vm::ast::ContractAST; +use clarity_repl::clarity::vm::diagnostic::Diagnostic; +use clarity_repl::clarity::vm::types::PrincipalData; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::ContractName; +use clarity_repl::clarity::vm::EvaluationResult; +use clarity_repl::clarity::vm::ExecutionResult; +use clarity_repl::repl::Session; +use clarity_repl::repl::SessionSettings; use orchestra_types::StacksNetwork; use std::collections::{BTreeMap, HashMap, VecDeque}; use types::ContractPublishSpecification; diff --git a/components/clarinet-deployments/src/requirements.rs b/components/clarinet-deployments/src/requirements.rs index 5aba444e0..4efe192e2 100644 --- a/components/clarinet-deployments/src/requirements.rs +++ b/components/clarinet-deployments/src/requirements.rs @@ -1,5 +1,5 @@ use clarinet_files::{FileAccessor, FileLocation}; -use clarity_repl::clarity::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use reqwest; pub async fn retrieve_contract( diff --git a/components/clarinet-deployments/src/types.rs b/components/clarinet-deployments/src/types.rs index a185eb5f1..d4a496010 100644 --- a/components/clarinet-deployments/src/types.rs +++ b/components/clarinet-deployments/src/types.rs @@ -2,7 +2,7 @@ use clarinet_files::FileLocation; use clarity_repl::clarity::vm::analysis::ContractAnalysis; use clarity_repl::clarity::vm::ast::ContractAST; use clarity_repl::clarity::vm::diagnostic::Diagnostic; -use clarity_repl::clarity::types::{ +use clarity_repl::clarity::vm::types::{ PrincipalData, QualifiedContractIdentifier, StandardPrincipalData, }; #[cfg(feature = "wasm")] diff --git a/components/clarinet-files/Cargo.toml b/components/clarinet-files/Cargo.toml index 533c2c1b9..466b05186 100644 --- a/components/clarinet-files/Cargo.toml +++ b/components/clarinet-files/Cargo.toml @@ -10,7 +10,7 @@ clarinet_utils = { package = "clarinet-utils", path = "../clarinet-utils" } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } bip39 = { version = "1.0.1", default-features = false } clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.0", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } libsecp256k1 = "0.7.0" toml = { version = "0.5.6", features = ["preserve_order"] } url = { version = "2.2.2", features = ["serde"] } diff --git a/components/clarinet-files/src/lib.rs b/components/clarinet-files/src/lib.rs index b412ecf07..2145a1e27 100644 --- a/components/clarinet-files/src/lib.rs +++ b/components/clarinet-files/src/lib.rs @@ -1,7 +1,7 @@ -#[cfg(feature = "wasm")] -pub use clarity_repl_wasm as clarity_repl; #[cfg(not(feature = "wasm"))] pub use clarity_repl; +#[cfg(feature = "wasm")] +pub use clarity_repl_wasm as clarity_repl; extern crate serde; diff --git a/components/clarinet-files/src/network_manifest.rs b/components/clarinet-files/src/network_manifest.rs index d7ec1dbf3..c834ae338 100644 --- a/components/clarinet-files/src/network_manifest.rs +++ b/components/clarinet-files/src/network_manifest.rs @@ -5,7 +5,7 @@ use clarity_repl::clarity::address::AddressHashMode; use clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; use clarity_repl::clarity::util::hash::bytes_to_hex; use clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; -use clarity_repl::clarity::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use libsecp256k1::{PublicKey, SecretKey}; use orchestra_types::{BitcoinNetwork, StacksNetwork}; use std::collections::BTreeMap; diff --git a/components/clarity-lsp/Cargo.toml b/components/clarity-lsp/Cargo.toml index e1e09e2b7..85871ebca 100644 --- a/components/clarity-lsp/Cargo.toml +++ b/components/clarity-lsp/Cargo.toml @@ -18,7 +18,7 @@ wasm-bindgen = { version = "0.2", optional = true } wasm-bindgen-futures = { version = "0.4", optional = true } web-sys = { version = "0.3", features = ["console"], optional = true } clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.0", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } [features] default = ["cli"] diff --git a/components/clarity-lsp/src/common/state.rs b/components/clarity-lsp/src/common/state.rs index 8489cd195..85dc09209 100644 --- a/components/clarity-lsp/src/common/state.rs +++ b/components/clarity-lsp/src/common/state.rs @@ -6,13 +6,14 @@ use clarinet_deployments::{ }; use clarinet_files::ProjectManifest; use clarinet_files::{FileAccessor, FileLocation}; -#[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; use clarity_repl::analysis::ast_dependency_detector::DependencySet; use clarity_repl::clarity::analysis::ContractAnalysis; use clarity_repl::clarity::diagnostic::{Diagnostic as ClarityDiagnostic, Level as ClarityLevel}; -use clarity_repl::clarity::types::QualifiedContractIdentifier; -use clarity_repl::repl::ast::ContractAST; +use clarity_repl::clarity::vm::ast::ContractAST; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::EvaluationResult; +#[cfg(feature = "wasm")] +use clarity_repl_wasm as clarity_repl; use lsp_types::MessageType; use orchestra_types::StacksNetwork; use std::borrow::BorrowMut; diff --git a/components/clarity-lsp/src/utils/mod.rs b/components/clarity-lsp/src/utils/mod.rs index b0f7f18c2..0b19f0ed1 100644 --- a/components/clarity-lsp/src/utils/mod.rs +++ b/components/clarity-lsp/src/utils/mod.rs @@ -1,5 +1,8 @@ use super::types::*; use clarinet_files::FileLocation; +use clarity_repl::clarity::functions::define::DefineFunctions; +use clarity_repl::clarity::functions::NativeFunctions; +use clarity_repl::clarity::variables::NativeVariables; use clarity_repl::clarity::vm::analysis::ContractAnalysis; use clarity_repl::clarity::vm::diagnostic::{ Diagnostic as ClarityDiagnostic, Level as ClarityLevel, @@ -7,10 +10,7 @@ use clarity_repl::clarity::vm::diagnostic::{ use clarity_repl::clarity::vm::docs::{ make_api_reference, make_define_reference, make_keyword_reference, }; -use clarity_repl::clarity::functions::define::DefineFunctions; -use clarity_repl::clarity::functions::NativeFunctions; -use clarity_repl::clarity::types::{BlockInfoProperty, FunctionType}; -use clarity_repl::clarity::variables::NativeVariables; +use clarity_repl::clarity::vm::types::{BlockInfoProperty, FunctionType}; #[cfg(feature = "wasm")] use clarity_repl_wasm as clarity_repl; use lsp_types::Diagnostic as LspDiagnostic; diff --git a/components/clarity-repl/src/codec/mod.rs b/components/clarity-repl/src/codec/mod.rs index 84de6ece5..ef95f884a 100644 --- a/components/clarity-repl/src/codec/mod.rs +++ b/components/clarity-repl/src/codec/mod.rs @@ -1,8 +1,3 @@ -use std::convert::TryInto; -use std::fmt; -use std::io::{Read, Write}; -use std::ops::Deref; -use std::ops::DerefMut; use crate::impl_byte_array_newtype; use clarity::address::AddressHashMode; use clarity::address::{ @@ -10,10 +5,7 @@ use clarity::address::{ C32_ADDRESS_VERSION_TESTNET_MULTISIG, C32_ADDRESS_VERSION_TESTNET_SINGLESIG, }; use clarity::codec::MAX_MESSAGE_LEN; -use clarity::codec::{ - read_next, write_next, Error as CodecError, StacksMessageCodec, -}; -use std::convert::TryFrom; +use clarity::codec::{read_next, write_next, Error as CodecError, StacksMessageCodec}; use clarity::stacks_common::types::chainstate::{ BlockHeaderHash, BurnchainHeaderHash, ConsensusHash, StacksWorkScore, TrieHash, }; @@ -34,6 +26,12 @@ use clarity::{ impl_byte_array_serde, }; use serde::{Deserialize, Serialize}; +use std::convert::TryFrom; +use std::convert::TryInto; +use std::fmt; +use std::io::{Read, Write}; +use std::ops::Deref; +use std::ops::DerefMut; pub const MAX_BLOCK_LEN: u32 = 2 * 1024 * 1024; pub const MAX_TRANSACTION_LEN: u32 = MAX_BLOCK_LEN; diff --git a/components/clarity-repl/src/lib.rs b/components/clarity-repl/src/lib.rs index de7a1b7e4..066516d48 100644 --- a/components/clarity-repl/src/lib.rs +++ b/components/clarity-repl/src/lib.rs @@ -25,16 +25,15 @@ mod macros; #[cfg(feature = "wasm")] use wasm_bindgen::prelude::*; - pub mod analysis; +pub mod codec; pub mod repl; pub mod utils; -pub mod codec; pub mod clarity { + pub use ::clarity::stacks_common::*; pub use ::clarity::vm::*; pub use ::clarity::*; - pub use ::clarity::stacks_common::*; } struct GlobalContext { diff --git a/components/clarity-repl/src/macros.rs b/components/clarity-repl/src/macros.rs index 6d27baf5d..6f926a530 100644 --- a/components/clarity-repl/src/macros.rs +++ b/components/clarity-repl/src/macros.rs @@ -137,17 +137,13 @@ macro_rules! impl_byte_array_newtype { impl $thing { /// Instantiates from a hex string #[allow(dead_code)] - pub fn from_hex( - hex_str: &str, - ) -> Result<$thing, clarity::util::HexError> { + pub fn from_hex(hex_str: &str) -> Result<$thing, clarity::util::HexError> { use clarity::util::hash::hex_bytes; let _hex_len = $len * 2; match (hex_str.len(), hex_bytes(hex_str)) { (_hex_len, Ok(bytes)) => { if bytes.len() != $len { - return Err(clarity::util::HexError::BadLength( - hex_str.len(), - )); + return Err(clarity::util::HexError::BadLength(hex_str.len())); } let mut ret = [0; $len]; ret.copy_from_slice(&bytes); diff --git a/components/stacks-rpc-client/src/rpc_client.rs b/components/stacks-rpc-client/src/rpc_client.rs index f2f866dc8..9630c0733 100644 --- a/components/stacks-rpc-client/src/rpc_client.rs +++ b/components/stacks-rpc-client/src/rpc_client.rs @@ -1,11 +1,11 @@ use clarity_repl::clarity::codec::StacksMessageCodec; use clarity_repl::clarity::util::hash::{bytes_to_hex, hex_bytes}; -use clarity_repl::clarity::types::Value; +use clarity_repl::clarity::vm::types::Value; use reqwest::blocking::Client; use std::io::Cursor; -use clarinet_utils::transactions::StacksTransaction; +use clarity_repl::codec::StacksTransaction; #[derive(Debug)] pub enum RpcError { diff --git a/vendor/orchestra-event-observer/src/indexer/stacks/mod.rs b/vendor/orchestra-event-observer/src/indexer/stacks/mod.rs index b9b9e53f4..d8e7abfd6 100644 --- a/vendor/orchestra-event-observer/src/indexer/stacks/mod.rs +++ b/vendor/orchestra-event-observer/src/indexer/stacks/mod.rs @@ -5,10 +5,10 @@ pub use blocks_pool::StacksBlockPool; use crate::indexer::AssetClassCache; use crate::indexer::{IndexerConfig, StacksChainContext}; use bitcoincore_rpc::bitcoin::Block; -use clarinet_utils::transactions::{StacksTransaction, TransactionAuth, TransactionPayload}; use clarity_repl::clarity::codec::StacksMessageCodec; use clarity_repl::clarity::util::hash::hex_bytes; use clarity_repl::clarity::vm::Value as ClarityValue; +use clarity_repl::codec::{StacksTransaction, TransactionAuth, TransactionPayload}; use orchestra_types::*; use rocket::serde::json::Value as JsonValue; use rocket::serde::Deserialize; From 7efada82a37422355fa14995e881358dbf03db1a Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 26 Sep 2022 09:59:00 -0400 Subject: [PATCH 03/13] fix: windows builds --- Cargo.lock | 16 +++------------- components/clarity-repl/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e5501b02..7e16fbcef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -962,7 +962,7 @@ dependencies = [ [[package]] name = "clarity" version = "0.0.1" -source = "git+https://github.com/stacks-network/stacks-blockchain.git?branch=chore/update-rusqlite#edf24fe41b75803550d4bbd4c9f97d133d4e5109" +source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=f00a50167febe6ab603c1acfaa256632aa83339c#f00a50167febe6ab603c1acfaa256632aa83339c" dependencies = [ "integer-sqrt", "lazy_static", @@ -976,7 +976,7 @@ dependencies = [ "serde_derive", "serde_json", "serde_stacker", - "sha2-asm 0.5.5", + "sha2-asm", "slog", "stacks-common", "time 0.2.27", @@ -5288,7 +5288,6 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.10.5", - "sha2-asm 0.6.2", ] [[package]] @@ -5300,15 +5299,6 @@ dependencies = [ "cc", ] -[[package]] -name = "sha2-asm" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf27176fb5d15398e3a479c652c20459d9dac830dedd1fa55b42a77dbcdbfcea" -dependencies = [ - "cc", -] - [[package]] name = "sha3" version = "0.9.1" @@ -5535,7 +5525,7 @@ dependencies = [ [[package]] name = "stacks-common" version = "0.0.1" -source = "git+https://github.com/stacks-network/stacks-blockchain.git?branch=chore/update-rusqlite#edf24fe41b75803550d4bbd4c9f97d133d4e5109" +source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=f00a50167febe6ab603c1acfaa256632aa83339c#f00a50167febe6ab603c1acfaa256632aa83339c" dependencies = [ "chrono", "curve25519-dalek", diff --git a/components/clarity-repl/Cargo.toml b/components/clarity-repl/Cargo.toml index 1a9ee4eff..cb5bb13a9 100644 --- a/components/clarity-repl/Cargo.toml +++ b/components/clarity-repl/Cargo.toml @@ -38,7 +38,7 @@ getrandom = { version = "0.2.3", features = ["js"] } rand_pcg = "0.3.1" rand_seeder = "0.2.2" atty = "0.2.14" -clarity = { git = "https://github.com/stacks-network/stacks-blockchain.git", branch = "chore/update-rusqlite" } +clarity = { git = "https://github.com/stacks-network/stacks-blockchain.git", rev = "f00a50167febe6ab603c1acfaa256632aa83339c" } rusqlite = { version = "=0.27.0", features = [ "blob", "serde_json", From e1478008fed4aa0b148d76e2d38f2924f1d98754 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 26 Sep 2022 10:42:21 -0400 Subject: [PATCH 04/13] fix: unit tests --- components/clarity-repl/src/analysis/check_checker/mod.rs | 4 ++-- components/clarity-repl/src/repl/session.rs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/clarity-repl/src/analysis/check_checker/mod.rs b/components/clarity-repl/src/analysis/check_checker/mod.rs index 47d1e411b..e0bbb1c8e 100644 --- a/components/clarity-repl/src/analysis/check_checker/mod.rs +++ b/components/clarity-repl/src/analysis/check_checker/mod.rs @@ -3806,12 +3806,12 @@ mod tests { assert_eq!( output[3], format!( - "checker:12:29: {}: source of untrusted input here", + "checker:12:28: {}: source of untrusted input here", blue!("note") ) ); assert_eq!(output[4], "(define-public (handle-one (arg1 uint))"); - assert_eq!(output[5], " ^~~~"); + assert_eq!(output[5], " ^~~~"); } _ => panic!("Expected successful interpretation"), }; diff --git a/components/clarity-repl/src/repl/session.rs b/components/clarity-repl/src/repl/session.rs index 40502238f..c625b8867 100644 --- a/components/clarity-repl/src/repl/session.rs +++ b/components/clarity-repl/src/repl/session.rs @@ -1158,7 +1158,7 @@ impl Session { Ok(value) => value, Err(e) => return output.push(red!(format!("{}", e))), }; - output.push(green!(format!("{}", value))); + output.push(green!(format!("{}", crate::utils::value_to_string(&value)))); } pub fn get_costs(&mut self, output: &mut Vec, cmd: &str) { @@ -1453,14 +1453,14 @@ mod tests { assert_eq!( output[0], format!( - "encode:1:7: {}: expected ':' after key in tuple", + "{}: Tuple literal construction expects a colon at index 1", red!("error") ) ); session.encode(&mut output, "::encode (foo 1)"); assert_eq!( - output[4], + output[2], format!( "encode:1:1: {}: use of unresolved function 'foo'", red!("error") @@ -1497,7 +1497,7 @@ mod tests { assert_eq!(output.len(), 1); assert_eq!( output[0], - red!("Failed to decode clarity value: Deserialization error: Bad type prefix") + red!("Failed to decode clarity value: DeserializationError(\"Bad type prefix\")") ); session.decode(&mut output, "::decode 4g"); From a3e6a79ae4fdf7d7d0e28e41e1cfef1c04fb1f25 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 26 Sep 2022 12:31:51 -0400 Subject: [PATCH 05/13] fix: wasm deps --- .../clarinet-files/src/network_manifest.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/components/clarinet-files/src/network_manifest.rs b/components/clarinet-files/src/network_manifest.rs index c834ae338..bad78972c 100644 --- a/components/clarinet-files/src/network_manifest.rs +++ b/components/clarinet-files/src/network_manifest.rs @@ -1,11 +1,11 @@ use super::{FileAccessor, FileLocation}; use bip39::{Language, Mnemonic}; use clarinet_utils::get_bip39_seed_from_mnemonic; -use clarity_repl::clarity::address::AddressHashMode; -use clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; -use clarity_repl::clarity::util::hash::bytes_to_hex; -use clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; -use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use crate::clarity_repl::clarity::address::AddressHashMode; +use crate::clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; +use crate::clarity_repl::clarity::util::hash::bytes_to_hex; +use crate::clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; +use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use libsecp256k1::{PublicKey, SecretKey}; use orchestra_types::{BitcoinNetwork, StacksNetwork}; use std::collections::BTreeMap; @@ -349,7 +349,7 @@ impl NetworkManifest { _ => DevnetConfigFile::default(), }; - let now = clarity_repl::clarity::util::get_epoch_time_secs(); + let now = crate::clarity_repl::clarity::util::get_epoch_time_secs(); let mut dir = std::env::temp_dir(); dir.push(format!("stacks-devnet-{}/", now)); let default_working_dir = dir.display().to_string(); @@ -588,9 +588,9 @@ pub fn compute_addresses( let public_key = PublicKey::from_secret_key(&secret_key); let pub_key = Secp256k1PublicKey::from_slice(&public_key.serialize_compressed()).unwrap(); let version = if networks.1.is_mainnet() { - clarity_repl::clarity::address::C32_ADDRESS_VERSION_MAINNET_SINGLESIG + crate::clarity_repl::clarity::address::C32_ADDRESS_VERSION_MAINNET_SINGLESIG } else { - clarity_repl::clarity::address::C32_ADDRESS_VERSION_TESTNET_SINGLESIG + crate::clarity_repl::clarity::address::C32_ADDRESS_VERSION_TESTNET_SINGLESIG }; let stx_address = StacksAddress::from_public_keys( From 581c9ba56c6e6f6cfc361731c1534d1e61c1868a Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Thu, 29 Sep 2022 17:58:13 -0400 Subject: [PATCH 06/13] chore: cascade changes from new interface --- .../clarinet-cli/src/deployments/mod.rs | 4 +- components/clarinet-cli/src/frontend/cli.rs | 22 ++-- components/clarinet-cli/src/frontend/dap.rs | 9 +- .../clarinet-cli/src/generate/changes.rs | 5 +- .../clarinet-cli/src/generate/contract.rs | 21 +++- components/clarinet-cli/src/runner/api_v1.rs | 32 +++-- components/clarinet-deployments/Cargo.toml | 3 +- components/clarinet-deployments/src/lib.rs | 90 +++++++++----- .../clarinet-deployments/src/requirements.rs | 2 +- components/clarinet-deployments/src/types.rs | 50 +++++++- components/clarinet-files/src/lib.rs | 4 +- .../clarinet-files/src/network_manifest.rs | 4 +- .../clarinet-files/src/project_manifest.rs | 113 +++++++++++------- 13 files changed, 240 insertions(+), 119 deletions(-) diff --git a/components/clarinet-cli/src/deployments/mod.rs b/components/clarinet-cli/src/deployments/mod.rs index 9eedb179c..6a4223645 100644 --- a/components/clarinet-cli/src/deployments/mod.rs +++ b/components/clarinet-cli/src/deployments/mod.rs @@ -436,9 +436,7 @@ pub fn apply_on_chain_deployment( .parameters .iter() .map(|value| { - let execution = session - .interpret(value.to_string(), None, None, false, None, None) - .unwrap(); + let execution = session.eval(value.to_string(), None, false).unwrap(); match execution.result { EvaluationResult::Snippet(result) => result.result, _ => unreachable!("Contract result from snippet"), diff --git a/components/clarinet-cli/src/frontend/cli.rs b/components/clarinet-cli/src/frontend/cli.rs index b67954574..072b47131 100644 --- a/components/clarinet-cli/src/frontend/cli.rs +++ b/components/clarinet-cli/src/frontend/cli.rs @@ -21,7 +21,9 @@ use clarity_repl::clarity::vm::analysis::AnalysisDatabase; use clarity_repl::clarity::vm::costs::LimitedCostTracker; use clarity_repl::clarity::vm::diagnostic::{Diagnostic, Level}; use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use clarity_repl::clarity::ClarityVersion; use clarity_repl::repl::diagnostic::{output_code, output_diagnostic}; +use clarity_repl::repl::{ClarityCodeSource, ClarityContract, ContractDeployer, DEFAULT_EPOCH}; use clarity_repl::{analysis, repl, Terminal}; use orchestra_types::Chain; use orchestra_types::StacksNetwork; @@ -924,7 +926,7 @@ pub fn main() { settings.repl_settings.analysis.enable_all_passes(); let mut session = repl::Session::new(settings.clone()); - let code = match fs::read_to_string(&file) { + let code_source = match fs::read_to_string(&file) { Ok(code) => code, _ => { println!("{}: unable to read file: '{}'", red!("error"), file); @@ -932,18 +934,24 @@ pub fn main() { } }; let contract_id = QualifiedContractIdentifier::transient(); - let (ast, mut diagnostics, mut success) = session + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(code_source), + deployer: ContractDeployer::Transient, + name: "transient".to_string(), + clarity_version: ClarityVersion::Clarity1, + epoch: DEFAULT_EPOCH, + }; + let (ast, mut diagnostics, mut success) = session.interpreter.build_ast(&contract); + let (annotations, mut annotation_diagnostics) = session .interpreter - .build_ast(contract_id.clone(), code.clone()); - let (annotations, mut annotation_diagnostics) = - session.interpreter.collect_annotations(&ast, &code); + .collect_annotations(&ast, contract.expect_in_memory_code_source()); diagnostics.append(&mut annotation_diagnostics); let mut contract_analysis = ContractAnalysis::new( contract_id, ast.expressions, LimitedCostTracker::new_free(), - settings.repl_settings.clarity_version, + contract.clarity_version, ); let mut analysis_db = AnalysisDatabase::new(&mut session.interpreter.datastore); let mut analysis_diagnostics = match analysis::run_analysis( @@ -960,7 +968,7 @@ pub fn main() { }; diagnostics.append(&mut analysis_diagnostics); - let lines = code.lines(); + let lines = contract.expect_in_memory_code_source().lines(); let formatted_lines: Vec = lines.map(|l| l.to_string()).collect(); for d in diagnostics { for line in output_diagnostic(&d, &file, &formatted_lines) { diff --git a/components/clarinet-cli/src/frontend/dap.rs b/components/clarinet-cli/src/frontend/dap.rs index e35513b9e..b00b44d52 100644 --- a/components/clarinet-cli/src/frontend/dap.rs +++ b/components/clarinet-cli/src/frontend/dap.rs @@ -41,14 +41,7 @@ pub fn run_dap() -> Result<(), String> { } // Begin execution of the expression in debug mode - match session.interpret( - expression.clone(), - None, - Some(vec![&mut dap]), - false, - None, - None, - ) { + match session.eval(expression.clone(), Some(vec![&mut dap]), false) { Ok(_result) => Ok(()), Err(_diagnostics) => Err("unable to interpret expression".to_string()), } diff --git a/components/clarinet-cli/src/generate/changes.rs b/components/clarinet-cli/src/generate/changes.rs index 19e1a7218..1055b272a 100644 --- a/components/clarinet-cli/src/generate/changes.rs +++ b/components/clarinet-cli/src/generate/changes.rs @@ -1,4 +1,5 @@ -use clarinet_files::{ContractConfig, FileLocation, RequirementConfig}; +use clarinet_files::{FileLocation, RequirementConfig}; +use clarity_repl::repl::ClarityContract; use std::collections::HashMap; #[derive(Clone, Debug)] @@ -20,7 +21,7 @@ pub struct DirectoryCreation { pub struct TOMLEdition { pub comment: String, pub manifest_location: FileLocation, - pub contracts_to_add: HashMap, + pub contracts_to_add: HashMap, pub requirements_to_add: Vec, } diff --git a/components/clarinet-cli/src/generate/contract.rs b/components/clarinet-cli/src/generate/contract.rs index 87d66a568..63cf3db2d 100644 --- a/components/clarinet-cli/src/generate/contract.rs +++ b/components/clarinet-cli/src/generate/contract.rs @@ -1,6 +1,9 @@ use super::changes::{Changes, FileCreation, TOMLEdition}; -use clarinet_files::{ContractConfig, FileLocation}; -use std::collections::HashMap; +use clarinet_files::FileLocation; +use clarity_repl::repl::{ + ClarityCodeSource, ClarityContract, ContractDeployer, DEFAULT_CLARITY_VERSION, DEFAULT_EPOCH, +}; +use std::{collections::HashMap, path::PathBuf, str::FromStr}; pub struct GetChangesForNewContract { manifest_location: FileLocation, @@ -125,10 +128,16 @@ Clarinet.test({{ fn index_contract_in_clarinet_toml(&mut self) { let contract_file_name = format!("{}.clar", self.contract_name); let manifest_location = self.manifest_location.clone(); - - let contract_config = ContractConfig { - path: format!("contracts/{}", contract_file_name), - deployer: None, + let contract_path = { + let path = format!("contracts/{}", contract_file_name); + PathBuf::from_str(&path).unwrap() + }; + let contract_config = ClarityContract { + code_source: ClarityCodeSource::ContractOnDisk(contract_path), + deployer: ContractDeployer::DefaultDeployer, + name: self.contract_name.clone(), + clarity_version: DEFAULT_CLARITY_VERSION, + epoch: DEFAULT_EPOCH, }; let mut contracts_to_add = HashMap::new(); contracts_to_add.insert(self.contract_name.clone(), contract_config); diff --git a/components/clarinet-cli/src/runner/api_v1.rs b/components/clarinet-cli/src/runner/api_v1.rs index 04141276b..a733507af 100644 --- a/components/clarinet-cli/src/runner/api_v1.rs +++ b/components/clarinet-cli/src/runner/api_v1.rs @@ -11,7 +11,13 @@ use super::SessionArtifacts; use clarinet_deployments::update_session_with_contracts_executions; use clarity_repl::clarity::vm::analysis::contract_interface_builder::build_contract_interface; use clarity_repl::clarity::vm::EvaluationResult; +use clarity_repl::clarity::ClarityVersion; +use clarity_repl::repl::ClarityCodeSource; +use clarity_repl::repl::ClarityContract; +use clarity_repl::repl::ContractDeployer; use clarity_repl::repl::Session; +use clarity_repl::repl::DEFAULT_CLARITY_VERSION; +use clarity_repl::repl::DEFAULT_EPOCH; use clarity_repl::utils; use deno_core::error::AnyError; use deno_core::located_script_name; @@ -519,6 +525,7 @@ struct ContractCallArgs { struct DeployContractArgs { name: String, code: String, + clarity_version: Option, } #[derive(Deserialize)] @@ -566,15 +573,20 @@ fn mine_block(state: &mut OpState, args: MineBlockArgs) -> Result ClarityVersion::Clarity1, + Some(version) if version == 2 => ClarityVersion::Clarity2, + _ => DEFAULT_CLARITY_VERSION, + }, + epoch: DEFAULT_EPOCH, + }; + let execution = session - .interpret( - args.code.clone(), - Some(args.name.clone()), - None, - false, - Some(name.into()), - None, - ) + .deploy_contract(&contract, None, false, Some(name.into()), &mut None) .unwrap(); // TODO(lgalabru) let result = match execution.result { EvaluationResult::Snippet(result) => format!("{}", result.result), @@ -586,9 +598,7 @@ fn mine_block(state: &mut OpState, args: MineBlockArgs) -> Result format!("{}", result.result), _ => unreachable!("Contract result from snippet"), diff --git a/components/clarinet-deployments/Cargo.toml b/components/clarinet-deployments/Cargo.toml index 3ac0f5028..ec8336f04 100644 --- a/components/clarinet-deployments/Cargo.toml +++ b/components/clarinet-deployments/Cargo.toml @@ -8,7 +8,8 @@ serde = "1" serde_json = "1" serde_derive = "1" clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } +# clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } +clarity_repl_wasm = { package = "clarity-repl-wasm", path = "../clarity-repl-wasm", default-features = false, optional = true } clarinet_files = { package = "clarinet-files", path = "../clarinet-files", default-features = false } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } serde_yaml = "0.8.23" diff --git a/components/clarinet-deployments/src/lib.rs b/components/clarinet-deployments/src/lib.rs index 58853352c..81c6370e5 100644 --- a/components/clarinet-deployments/src/lib.rs +++ b/components/clarinet-deployments/src/lib.rs @@ -1,5 +1,11 @@ +use crate::clarity_repl::clarity::stacks_common::types::StacksEpochId; +use crate::clarity_repl::clarity::ClarityVersion; +use crate::clarity_repl::repl::{ClarityCodeSource, ClarityContract, ContractDeployer}; +#[cfg(not(feature = "wasm"))] +pub use clarity_repl; +use clarity_repl::repl::DEFAULT_EPOCH; #[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; +pub use clarity_repl_wasm as clarity_repl; extern crate serde; @@ -16,16 +22,18 @@ use self::types::{ use clarinet_files::FileAccessor; use clarinet_files::{NetworkManifest, ProjectManifest}; -use clarity_repl::analysis::ast_dependency_detector::{ASTDependencyDetector, DependencySet}; -use clarity_repl::clarity::vm::ast::ContractAST; -use clarity_repl::clarity::vm::diagnostic::Diagnostic; -use clarity_repl::clarity::vm::types::PrincipalData; -use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; -use clarity_repl::clarity::vm::ContractName; -use clarity_repl::clarity::vm::EvaluationResult; -use clarity_repl::clarity::vm::ExecutionResult; -use clarity_repl::repl::Session; -use clarity_repl::repl::SessionSettings; +use crate::clarity_repl::analysis::ast_dependency_detector::{ + ASTDependencyDetector, DependencySet, +}; +use crate::clarity_repl::clarity::vm::ast::ContractAST; +use crate::clarity_repl::clarity::vm::diagnostic::Diagnostic; +use crate::clarity_repl::clarity::vm::types::PrincipalData; +use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use crate::clarity_repl::clarity::vm::ContractName; +use crate::clarity_repl::clarity::vm::EvaluationResult; +use crate::clarity_repl::clarity::vm::ExecutionResult; +use crate::clarity_repl::repl::Session; +use crate::clarity_repl::repl::SessionSettings; use orchestra_types::StacksNetwork; use std::collections::{BTreeMap, HashMap, VecDeque}; use types::ContractPublishSpecification; @@ -131,17 +139,27 @@ pub fn update_session_with_contracts_executions( tx.emulated_sender.clone(), tx.contract_name.clone(), ); - let contract_ast = contracts_asts.as_ref().and_then(|m| m.get(&contract_id)); - let result = session.interpret( - tx.source.clone(), - Some(tx.contract_name.to_string()), + let mut contract_ast = contracts_asts + .as_ref() + .and_then(|m| m.get(&contract_id)) + .and_then(|c| Some(c.clone())); + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(tx.source.clone()), + deployer: ContractDeployer::Address(tx.emulated_sender.to_string()), + name: tx.contract_name.to_string(), + clarity_version: tx.clarity_version, + epoch: DEFAULT_EPOCH, + }; + + let result = session.deploy_contract( + &contract, None, false, match code_coverage_enabled { true => Some("__analysis__".to_string()), false => None, }, - contract_ast, + &mut contract_ast, ); results.insert(contract_id, result); session.set_tx_sender(default_tx_sender); @@ -332,6 +350,7 @@ pub async fn generate_default_deployment( emulated_sender: contract_id.issuer.clone(), source: source.clone(), location: contract_location, + clarity_version: ClarityVersion::Clarity1, }; emulated_contracts_publish.insert(contract_id.clone(), data); } else if network.either_devnet_or_testnet() { @@ -364,9 +383,14 @@ pub async fn generate_default_deployment( } // Compute the AST - let (ast, _, _) = session - .interpreter - .build_ast(contract_id.clone(), source.to_string()); + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(source), + name: contract_id.name.to_string(), + deployer: ContractDeployer::ContractIdentifier(contract_id.clone()), + clarity_version: ClarityVersion::Clarity1, + epoch: StacksEpochId::Epoch20, + }; + let (ast, _, _) = session.interpreter.build_ast(&contract); ast } }; @@ -449,8 +473,9 @@ pub async fn generate_default_deployment( Err(_) => return Err(format!("unable to use {} as a valid contract name", name)), }; - let deployer = match contract_config.deployer { - Some(ref deployer) => { + let deployer = match &contract_config.deployer { + ContractDeployer::DefaultDeployer => default_deployer, + ContractDeployer::LabeledDeployer(deployer) => { let deployer = match network_manifest.accounts.get(deployer) { Some(deployer) => deployer, None => { @@ -459,7 +484,7 @@ pub async fn generate_default_deployment( }; deployer } - None => default_deployer, + _ => unreachable!(), }; let sender = match PrincipalData::parse_standard_principal(&deployer.stx_address) { @@ -475,13 +500,13 @@ pub async fn generate_default_deployment( let (contract_location, source) = match file_accessor { None => { let mut contract_location = manifest.location.get_project_root_location()?; - contract_location.append_path(&contract_config.path)?; + contract_location.append_path(&contract_config.expect_contract_path_as_str())?; let source = contract_location.read_content_as_utf8()?; (contract_location, source) } Some(file_accessor) => { let mut contract_location = manifest.location.clone().get_parent_location()?; - contract_location.append_path(&contract_config.path.to_string())?; + contract_location.append_path(&contract_config.expect_contract_path_as_str())?; file_accessor .read_contract_content(contract_location.clone()) .await? @@ -490,7 +515,16 @@ pub async fn generate_default_deployment( let contract_id = QualifiedContractIdentifier::new(sender.clone(), contract_name.clone()); - contracts_sources.insert(contract_id.clone(), source.clone()); + contracts_sources.insert( + contract_id.clone(), + ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(source.clone()), + deployer: ContractDeployer::Address(sender.to_address()), + name: contract_name.to_string(), + clarity_version: contract_config.clarity_version, + epoch: DEFAULT_EPOCH, + }, + ); let contract_spec = if network.is_simnet() { TransactionSpecification::EmulatedContractPublish( @@ -499,6 +533,7 @@ pub async fn generate_default_deployment( emulated_sender: sender, source, location: contract_location, + clarity_version: contract_config.clarity_version, }, ) } else { @@ -510,6 +545,7 @@ pub async fn generate_default_deployment( .saturating_mul(source.as_bytes().len().try_into().unwrap()), source, anchor_block_only: true, + clarity_version: contract_config.clarity_version, }) }; @@ -523,8 +559,8 @@ pub async fn generate_default_deployment( let mut asts_success = true; - for (contract_id, source) in contracts_sources.into_iter() { - let (ast, diags, ast_success) = session.interpreter.build_ast(contract_id.clone(), source); + for (contract_id, contract) in contracts_sources.into_iter() { + let (ast, diags, ast_success) = session.interpreter.build_ast(&contract); contract_asts.insert(contract_id.clone(), ast); contract_diags.insert(contract_id, diags); asts_success = asts_success && ast_success; diff --git a/components/clarinet-deployments/src/requirements.rs b/components/clarinet-deployments/src/requirements.rs index 4efe192e2..45f9bea13 100644 --- a/components/clarinet-deployments/src/requirements.rs +++ b/components/clarinet-deployments/src/requirements.rs @@ -1,5 +1,5 @@ +use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use clarinet_files::{FileAccessor, FileLocation}; -use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use reqwest; pub async fn retrieve_contract( diff --git a/components/clarinet-deployments/src/types.rs b/components/clarinet-deployments/src/types.rs index d4a496010..47ff80b45 100644 --- a/components/clarinet-deployments/src/types.rs +++ b/components/clarinet-deployments/src/types.rs @@ -8,7 +8,7 @@ use clarity_repl::clarity::vm::types::{ #[cfg(feature = "wasm")] use clarity_repl_wasm as clarity_repl; -use clarity_repl::clarity::{ClarityName, ContractName}; +use clarity_repl::clarity::{ClarityName, ClarityVersion, ContractName}; use orchestra_types::StacksNetwork; use serde::{Deserialize, Serialize}; @@ -16,7 +16,7 @@ use serde_yaml; use std::collections::BTreeMap; use clarity_repl::analysis::ast_dependency_detector::DependencySet; -use clarity_repl::repl::Session; +use clarity_repl::repl::{Session, DEFAULT_CLARITY_VERSION}; use std::collections::HashMap; pub struct DeploymentGenerationArtifacts { @@ -107,6 +107,8 @@ pub struct ContractPublishSpecificationFile { pub url: Option, #[serde(skip_serializing_if = "Option::is_none")] pub anchor_block_only: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub clarity_version: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] @@ -129,6 +131,8 @@ pub struct EmulatedContractPublishSpecificationFile { pub path: Option, #[serde(skip_serializing_if = "Option::is_none")] pub url: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub clarity_version: Option, } #[derive(Debug, PartialEq, Clone)] @@ -231,6 +235,7 @@ pub struct ContractPublishSpecification { pub expected_sender: StandardPrincipalData, pub location: FileLocation, pub source: String, + pub clarity_version: ClarityVersion, pub cost: u64, pub anchor_block_only: bool, } @@ -273,6 +278,21 @@ impl ContractPublishSpecification { let source = location.read_content_as_utf8()?; + let clarity_version = match specs.clarity_version { + Some(clarity_version) => { + if clarity_version.eq(&1) { + Ok(ClarityVersion::Clarity1) + } else if clarity_version.eq(&2) { + Ok(ClarityVersion::Clarity2) + } else { + Err(format!( + "unable to parse clarity_version (can either be '1' or '2'", + )) + } + } + _ => Ok(DEFAULT_CLARITY_VERSION), + }?; + Ok(ContractPublishSpecification { contract_name, expected_sender, @@ -280,6 +300,7 @@ impl ContractPublishSpecification { location: location, cost: specs.cost, anchor_block_only: specs.anchor_block_only.unwrap_or(true), + clarity_version, }) } } @@ -424,6 +445,7 @@ pub struct EmulatedContractPublishSpecification { pub contract_name: ContractName, pub emulated_sender: StandardPrincipalData, pub source: String, + pub clarity_version: ClarityVersion, pub location: FileLocation, } @@ -463,6 +485,21 @@ impl EmulatedContractPublishSpecification { "unable to parse file location (can either be 'path' or 'url'", ))?; + let clarity_version = match specs.clarity_version { + Some(clarity_version) => { + if clarity_version.eq(&1) { + Ok(ClarityVersion::Clarity1) + } else if clarity_version.eq(&2) { + Ok(ClarityVersion::Clarity2) + } else { + Err(format!( + "unable to parse clarity_version (can either be '1' or '2'", + )) + } + } + _ => Ok(DEFAULT_CLARITY_VERSION), + }?; + let source = location.read_content_as_utf8()?; Ok(EmulatedContractPublishSpecification { @@ -470,6 +507,7 @@ impl EmulatedContractPublishSpecification { emulated_sender, source, location, + clarity_version, }) } } @@ -786,6 +824,10 @@ impl TransactionPlanSpecification { url: None, cost: tx.cost, anchor_block_only: Some(tx.anchor_block_only), + clarity_version: match tx.clarity_version { + ClarityVersion::Clarity1 => Some(1), + ClarityVersion::Clarity2 => Some(2), + }, }, ) } @@ -807,6 +849,10 @@ impl TransactionPlanSpecification { location: Some(tx.location.clone()), path: None, url: None, + clarity_version: match tx.clarity_version { + ClarityVersion::Clarity1 => Some(1), + ClarityVersion::Clarity2 => Some(2), + }, }, ) } diff --git a/components/clarinet-files/src/lib.rs b/components/clarinet-files/src/lib.rs index 2145a1e27..231c9f419 100644 --- a/components/clarinet-files/src/lib.rs +++ b/components/clarinet-files/src/lib.rs @@ -24,9 +24,7 @@ pub use network_manifest::{ NetworkManifestFile, PoxStackingOrder, DEFAULT_DERIVATION_PATH, }; use orchestra_types::StacksNetwork; -pub use project_manifest::{ - ContractConfig, ProjectManifest, ProjectManifestFile, RequirementConfig, -}; +pub use project_manifest::{ProjectManifest, ProjectManifestFile, RequirementConfig}; use serde::ser::{Serialize, SerializeMap, Serializer}; use std::future::Future; use std::pin::Pin; diff --git a/components/clarinet-files/src/network_manifest.rs b/components/clarinet-files/src/network_manifest.rs index bad78972c..b4e325207 100644 --- a/components/clarinet-files/src/network_manifest.rs +++ b/components/clarinet-files/src/network_manifest.rs @@ -1,11 +1,11 @@ use super::{FileAccessor, FileLocation}; -use bip39::{Language, Mnemonic}; -use clarinet_utils::get_bip39_seed_from_mnemonic; use crate::clarity_repl::clarity::address::AddressHashMode; use crate::clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; use crate::clarity_repl::clarity::util::hash::bytes_to_hex; use crate::clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use bip39::{Language, Mnemonic}; +use clarinet_utils::get_bip39_seed_from_mnemonic; use libsecp256k1::{PublicKey, SecretKey}; use orchestra_types::{BitcoinNetwork, StacksNetwork}; use std::collections::BTreeMap; diff --git a/components/clarinet-files/src/project_manifest.rs b/components/clarinet-files/src/project_manifest.rs index 8e60169f7..08f750d2b 100644 --- a/components/clarinet-files/src/project_manifest.rs +++ b/components/clarinet-files/src/project_manifest.rs @@ -1,11 +1,15 @@ use crate::FileAccessor; use super::FileLocation; -use clarity_repl::clarity::stacks_common::types::StacksEpochId; -use clarity_repl::repl; -#[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; +use crate::clarity_repl::clarity::stacks_common::types::StacksEpochId; +use crate::clarity_repl::repl; +use crate::clarity_repl::repl::{ + ClarityCodeSource, ClarityContract, ContractDeployer, DEFAULT_CLARITY_VERSION, DEFAULT_EPOCH, +}; +use clarity_repl::clarity::ClarityVersion; use std::collections::BTreeMap; +use std::path::PathBuf; +use std::str::FromStr; use toml::value::Value; #[derive(Serialize, Deserialize, Debug)] @@ -36,7 +40,7 @@ pub struct ProjectConfigFile { pub struct ProjectManifest { pub project: ProjectConfig, #[serde(serialize_with = "toml::ser::tables_last")] - pub contracts: BTreeMap, + pub contracts: BTreeMap, #[serde(rename = "repl")] pub repl_settings: repl::Settings, #[serde(skip_serializing)] @@ -59,12 +63,6 @@ pub struct RequirementConfig { pub contract_id: String, } -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ContractConfig { - pub path: String, - pub deployer: Option, -} - #[derive(Serialize, Deserialize, Debug)] pub struct NotebookConfig { pub name: String, @@ -141,31 +139,13 @@ impl ProjectManifest { authors: project_manifest_file.project.authors.unwrap_or(vec![]), telemetry: project_manifest_file.project.telemetry.unwrap_or(false), cache_location, - boot_contracts: project_manifest_file.project.boot_contracts.unwrap_or( - match repl_settings.epoch { - StacksEpochId::Epoch10 | StacksEpochId::Epoch20 => vec![ - "pox".to_string(), - "lockup".to_string(), - "costs".to_string(), - "cost-voting".to_string(), - "bns".to_string(), - ], - StacksEpochId::Epoch2_05 => vec![ - "pox".to_string(), - "lockup".to_string(), - "costs-2".to_string(), - "cost-voting".to_string(), - "bns".to_string(), - ], - StacksEpochId::Epoch21 => vec![ - "pox-2".to_string(), - "lockup".to_string(), - "costs-2".to_string(), - "cost-voting".to_string(), - "bns".to_string(), - ], - }, - ), + boot_contracts: project_manifest_file.project.boot_contracts.unwrap_or(vec![ + "pox-2".to_string(), + "lockup".to_string(), + "costs-2".to_string(), + "cost-voting".to_string(), + "bns".to_string(), + ]), }; let mut config = ProjectManifest { @@ -194,27 +174,68 @@ impl ProjectManifest { } _ => {} }; - match project_manifest_file.contracts { Some(Value::Table(contracts)) => { for (contract_name, contract_settings) in contracts.iter() { match contract_settings { Value::Table(contract_settings) => { - let path = match contract_settings.get("path") { - Some(Value::String(path)) => path.to_string(), + let code_source = match contract_settings.get("path") { + Some(Value::String(path)) => match PathBuf::from_str(path) { + Ok(path) => ClarityCodeSource::ContractOnDisk(path), + Err(e) => { + return Err(format!( + "unable to parse path {} ({})", + path, e + )) + } + }, _ => continue, }; - if contract_settings.get("depends_on").is_some() { - // We could print a deprecation notice here if that code path - // was not used by the LSP. - } let deployer = match contract_settings.get("deployer") { - Some(Value::String(path)) => Some(path.to_string()), - _ => None, + Some(Value::String(path)) => { + ContractDeployer::LabeledDeployer(path.clone()) + } + _ => ContractDeployer::DefaultDeployer, + }; + + let clarity_version = match contract_settings.get("clarity_version") { + Some(Value::Integer(version)) => { + if version.eq(&1) { + ClarityVersion::Clarity1 + } else if version.eq(&2) { + ClarityVersion::Clarity2 + } else { + return Err( + "clarity_version field invalid (value supported: 1, 2)" + .to_string(), + ); + } + } + _ => DEFAULT_CLARITY_VERSION, + }; + let epoch = match contract_settings.get("epoch") { + Some(Value::String(epoch)) => { + if epoch.eq("2.0") { + StacksEpochId::Epoch20 + } else if epoch.eq("2.05") { + StacksEpochId::Epoch2_05 + } else if epoch.eq("2.1") { + StacksEpochId::Epoch21 + } else { + return Err("epoch field invalid (value supported: '2.0', '2.05', '2.1')".to_string()); + } + } + _ => DEFAULT_EPOCH, }; config_contracts.insert( contract_name.to_string(), - ContractConfig { path, deployer }, + ClarityContract { + name: contract_name.clone(), + code_source, + deployer, + clarity_version, + epoch, + }, ); } _ => {} From 38219d028281a03f4b8214ddfc6cae3928183618 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Thu, 29 Sep 2022 17:58:42 -0400 Subject: [PATCH 07/13] chore: remove clarity_repl_wasm approach --- Cargo.lock | 50 +- components/clarinet-deployments/Cargo.toml | 4 +- components/clarinet-deployments/src/lib.rs | 32 +- .../clarinet-deployments/src/requirements.rs | 2 +- components/clarinet-deployments/src/types.rs | 2 - components/clarinet-files/Cargo.toml | 3 +- components/clarinet-files/src/lib.rs | 5 - .../clarinet-files/src/network_manifest.rs | 16 +- .../clarinet-files/src/project_manifest.rs | 8 +- components/clarity-lsp/Cargo.toml | 3 +- components/clarity-lsp/src/common/backend.rs | 2 - components/clarity-lsp/src/common/state.rs | 2 - components/clarity-lsp/src/utils/mod.rs | 2 - components/clarity-repl/Cargo.toml | 15 +- components/clarity-repl/src/codec/mod.rs | 14 +- components/clarity-repl/src/repl/datastore.rs | 24 +- .../clarity-repl/src/repl/interpreter.rs | 121 ++-- components/clarity-repl/src/repl/mod.rs | 76 +++ components/clarity-repl/src/repl/session.rs | 584 +++++------------- components/clarity-repl/src/repl/settings.rs | 6 - 20 files changed, 346 insertions(+), 625 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e16fbcef..1c6e5bfa0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -812,7 +812,7 @@ dependencies = [ "clarinet-files", "clarinet-utils", "clarity-lsp", - "clarity-repl 0.34.0", + "clarity-repl", "crossbeam-channel", "crossterm 0.22.1", "ctrlc", @@ -916,8 +916,7 @@ name = "clarinet-deployments" version = "0.1.0" dependencies = [ "clarinet-files", - "clarity-repl 0.33.1", - "clarity-repl 0.34.0", + "clarity-repl", "orchestra-types", "reqwest", "serde", @@ -933,8 +932,7 @@ dependencies = [ "bip39", "bitcoin 0.28.1", "clarinet-utils", - "clarity-repl 0.33.1", - "clarity-repl 0.34.0", + "clarity-repl", "js-sys", "libsecp256k1 0.7.1", "orchestra-types", @@ -962,7 +960,7 @@ dependencies = [ [[package]] name = "clarity" version = "0.0.1" -source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=f00a50167febe6ab603c1acfaa256632aa83339c#f00a50167febe6ab603c1acfaa256632aa83339c" +source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=5d0e4228270fef5cff74a85931d10ec95dcf2951#5d0e4228270fef5cff74a85931d10ec95dcf2951" dependencies = [ "integer-sqrt", "lazy_static", @@ -988,8 +986,7 @@ version = "0.1.0" dependencies = [ "clarinet-deployments", "clarinet-files", - "clarity-repl 0.33.1", - "clarity-repl 0.34.0", + "clarity-repl", "console_error_panic_hook", "js-sys", "lsp-types 0.93.1", @@ -1001,32 +998,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "clarity-repl" -version = "0.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245286ebe20cce1aa236f0a30fabbf262898b0546152220f4788fb61a3dab701" -dependencies = [ - "ansi_term", - "atty", - "getrandom 0.2.7", - "integer-sqrt", - "lazy_static", - "libsecp256k1 0.5.0", - "rand 0.7.3", - "rand_pcg", - "rand_seeder", - "regex", - "ripemd160", - "serde", - "serde_derive", - "serde_json", - "sha2 0.9.9", - "sha3 0.9.1", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "clarity-repl" version = "0.34.0" @@ -1051,12 +1022,10 @@ dependencies = [ "rand_seeder", "regex", "ripemd160", - "rusqlite", "rustyline", "serde", "serde_derive", "serde_json", - "serde_stacker", "sha2 0.10.5", "sha3 0.9.1", "tokio", @@ -3763,7 +3732,7 @@ dependencies = [ "clap", "clap_generate", "clarinet-utils", - "clarity-repl 0.34.0", + "clarity-repl", "ctrlc", "orchestra-types", "reqwest", @@ -5525,13 +5494,14 @@ dependencies = [ [[package]] name = "stacks-common" version = "0.0.1" -source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=f00a50167febe6ab603c1acfaa256632aa83339c#f00a50167febe6ab603c1acfaa256632aa83339c" +source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=5d0e4228270fef5cff74a85931d10ec95dcf2951#5d0e4228270fef5cff74a85931d10ec95dcf2951" dependencies = [ "chrono", "curve25519-dalek", "ed25519-dalek", "lazy_static", "libc", + "libsecp256k1 0.5.0", "percent-encoding", "rand 0.7.3", "ripemd", @@ -5540,10 +5510,10 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_stacker", "sha2 0.10.5", "sha3 0.10.5", "slog", + "slog-json", "slog-term", "time 0.2.27", ] @@ -5567,7 +5537,7 @@ name = "stacks-rpc-client" version = "0.1.0" dependencies = [ "clarinet-utils", - "clarity-repl 0.34.0", + "clarity-repl", "reqwest", "serde", "serde_derive", diff --git a/components/clarinet-deployments/Cargo.toml b/components/clarinet-deployments/Cargo.toml index ec8336f04..350e31f01 100644 --- a/components/clarinet-deployments/Cargo.toml +++ b/components/clarinet-deployments/Cargo.toml @@ -8,8 +8,6 @@ serde = "1" serde_json = "1" serde_derive = "1" clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -# clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl-wasm", path = "../clarity-repl-wasm", default-features = false, optional = true } clarinet_files = { package = "clarinet-files", path = "../clarinet-files", default-features = false } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } serde_yaml = "0.8.23" @@ -23,7 +21,7 @@ reqwest = { version = "0.11", default-features = false, features = [ [features] default = ["cli"] cli = ["clarity_repl/cli", "clarinet_files/cli"] -wasm = ["clarity_repl_wasm/wasm", "clarinet_files/wasm"] +wasm = ["clarity_repl/wasm", "clarinet_files/wasm"] [lib] name = "clarinet_deployments" diff --git a/components/clarinet-deployments/src/lib.rs b/components/clarinet-deployments/src/lib.rs index 81c6370e5..fa6616b23 100644 --- a/components/clarinet-deployments/src/lib.rs +++ b/components/clarinet-deployments/src/lib.rs @@ -1,11 +1,7 @@ -use crate::clarity_repl::clarity::stacks_common::types::StacksEpochId; -use crate::clarity_repl::clarity::ClarityVersion; -use crate::clarity_repl::repl::{ClarityCodeSource, ClarityContract, ContractDeployer}; -#[cfg(not(feature = "wasm"))] -pub use clarity_repl; +use clarity_repl::clarity::stacks_common::types::StacksEpochId; +use clarity_repl::clarity::ClarityVersion; use clarity_repl::repl::DEFAULT_EPOCH; -#[cfg(feature = "wasm")] -pub use clarity_repl_wasm as clarity_repl; +use clarity_repl::repl::{ClarityCodeSource, ClarityContract, ContractDeployer}; extern crate serde; @@ -22,18 +18,16 @@ use self::types::{ use clarinet_files::FileAccessor; use clarinet_files::{NetworkManifest, ProjectManifest}; -use crate::clarity_repl::analysis::ast_dependency_detector::{ - ASTDependencyDetector, DependencySet, -}; -use crate::clarity_repl::clarity::vm::ast::ContractAST; -use crate::clarity_repl::clarity::vm::diagnostic::Diagnostic; -use crate::clarity_repl::clarity::vm::types::PrincipalData; -use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; -use crate::clarity_repl::clarity::vm::ContractName; -use crate::clarity_repl::clarity::vm::EvaluationResult; -use crate::clarity_repl::clarity::vm::ExecutionResult; -use crate::clarity_repl::repl::Session; -use crate::clarity_repl::repl::SessionSettings; +use clarity_repl::analysis::ast_dependency_detector::{ASTDependencyDetector, DependencySet}; +use clarity_repl::clarity::vm::ast::ContractAST; +use clarity_repl::clarity::vm::diagnostic::Diagnostic; +use clarity_repl::clarity::vm::types::PrincipalData; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; +use clarity_repl::clarity::vm::ContractName; +use clarity_repl::clarity::vm::EvaluationResult; +use clarity_repl::clarity::vm::ExecutionResult; +use clarity_repl::repl::Session; +use clarity_repl::repl::SessionSettings; use orchestra_types::StacksNetwork; use std::collections::{BTreeMap, HashMap, VecDeque}; use types::ContractPublishSpecification; diff --git a/components/clarinet-deployments/src/requirements.rs b/components/clarinet-deployments/src/requirements.rs index 45f9bea13..4efe192e2 100644 --- a/components/clarinet-deployments/src/requirements.rs +++ b/components/clarinet-deployments/src/requirements.rs @@ -1,5 +1,5 @@ -use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use clarinet_files::{FileAccessor, FileLocation}; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use reqwest; pub async fn retrieve_contract( diff --git a/components/clarinet-deployments/src/types.rs b/components/clarinet-deployments/src/types.rs index 47ff80b45..3e29b32d1 100644 --- a/components/clarinet-deployments/src/types.rs +++ b/components/clarinet-deployments/src/types.rs @@ -5,8 +5,6 @@ use clarity_repl::clarity::vm::diagnostic::Diagnostic; use clarity_repl::clarity::vm::types::{ PrincipalData, QualifiedContractIdentifier, StandardPrincipalData, }; -#[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; use clarity_repl::clarity::{ClarityName, ClarityVersion, ContractName}; diff --git a/components/clarinet-files/Cargo.toml b/components/clarinet-files/Cargo.toml index 466b05186..ea6bbfb8e 100644 --- a/components/clarinet-files/Cargo.toml +++ b/components/clarinet-files/Cargo.toml @@ -10,7 +10,6 @@ clarinet_utils = { package = "clarinet-utils", path = "../clarinet-utils" } orchestra_types = { package = "orchestra-types", path = "../../vendor/orchestra-types-rs" } bip39 = { version = "1.0.1", default-features = false } clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } libsecp256k1 = "0.7.0" toml = { version = "0.5.6", features = ["preserve_order"] } url = { version = "2.2.2", features = ["serde"] } @@ -33,7 +32,7 @@ wasm = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "clarity_repl_wasm/wasm", + "clarity_repl/wasm", ] [lib] diff --git a/components/clarinet-files/src/lib.rs b/components/clarinet-files/src/lib.rs index 231c9f419..4f2076d34 100644 --- a/components/clarinet-files/src/lib.rs +++ b/components/clarinet-files/src/lib.rs @@ -1,8 +1,3 @@ -#[cfg(not(feature = "wasm"))] -pub use clarity_repl; -#[cfg(feature = "wasm")] -pub use clarity_repl_wasm as clarity_repl; - extern crate serde; #[macro_use] diff --git a/components/clarinet-files/src/network_manifest.rs b/components/clarinet-files/src/network_manifest.rs index b4e325207..c834ae338 100644 --- a/components/clarinet-files/src/network_manifest.rs +++ b/components/clarinet-files/src/network_manifest.rs @@ -1,11 +1,11 @@ use super::{FileAccessor, FileLocation}; -use crate::clarity_repl::clarity::address::AddressHashMode; -use crate::clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; -use crate::clarity_repl::clarity::util::hash::bytes_to_hex; -use crate::clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; -use crate::clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use bip39::{Language, Mnemonic}; use clarinet_utils::get_bip39_seed_from_mnemonic; +use clarity_repl::clarity::address::AddressHashMode; +use clarity_repl::clarity::stacks_common::types::chainstate::StacksAddress; +use clarity_repl::clarity::util::hash::bytes_to_hex; +use clarity_repl::clarity::util::secp256k1::Secp256k1PublicKey; +use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use libsecp256k1::{PublicKey, SecretKey}; use orchestra_types::{BitcoinNetwork, StacksNetwork}; use std::collections::BTreeMap; @@ -349,7 +349,7 @@ impl NetworkManifest { _ => DevnetConfigFile::default(), }; - let now = crate::clarity_repl::clarity::util::get_epoch_time_secs(); + let now = clarity_repl::clarity::util::get_epoch_time_secs(); let mut dir = std::env::temp_dir(); dir.push(format!("stacks-devnet-{}/", now)); let default_working_dir = dir.display().to_string(); @@ -588,9 +588,9 @@ pub fn compute_addresses( let public_key = PublicKey::from_secret_key(&secret_key); let pub_key = Secp256k1PublicKey::from_slice(&public_key.serialize_compressed()).unwrap(); let version = if networks.1.is_mainnet() { - crate::clarity_repl::clarity::address::C32_ADDRESS_VERSION_MAINNET_SINGLESIG + clarity_repl::clarity::address::C32_ADDRESS_VERSION_MAINNET_SINGLESIG } else { - crate::clarity_repl::clarity::address::C32_ADDRESS_VERSION_TESTNET_SINGLESIG + clarity_repl::clarity::address::C32_ADDRESS_VERSION_TESTNET_SINGLESIG }; let stx_address = StacksAddress::from_public_keys( diff --git a/components/clarinet-files/src/project_manifest.rs b/components/clarinet-files/src/project_manifest.rs index 08f750d2b..e88165a64 100644 --- a/components/clarinet-files/src/project_manifest.rs +++ b/components/clarinet-files/src/project_manifest.rs @@ -1,12 +1,12 @@ use crate::FileAccessor; use super::FileLocation; -use crate::clarity_repl::clarity::stacks_common::types::StacksEpochId; -use crate::clarity_repl::repl; -use crate::clarity_repl::repl::{ +use clarity_repl::clarity::stacks_common::types::StacksEpochId; +use clarity_repl::clarity::ClarityVersion; +use clarity_repl::repl; +use clarity_repl::repl::{ ClarityCodeSource, ClarityContract, ContractDeployer, DEFAULT_CLARITY_VERSION, DEFAULT_EPOCH, }; -use clarity_repl::clarity::ClarityVersion; use std::collections::BTreeMap; use std::path::PathBuf; use std::str::FromStr; diff --git a/components/clarity-lsp/Cargo.toml b/components/clarity-lsp/Cargo.toml index 85871ebca..eed9dc250 100644 --- a/components/clarity-lsp/Cargo.toml +++ b/components/clarity-lsp/Cargo.toml @@ -18,7 +18,6 @@ wasm-bindgen = { version = "0.2", optional = true } wasm-bindgen-futures = { version = "0.4", optional = true } web-sys = { version = "0.3", features = ["console"], optional = true } clarity_repl = { package = "clarity-repl", path = "../clarity-repl", default-features = false, optional = true } -clarity_repl_wasm = { package = "clarity-repl", version = "=0.33.1", default-features = false, optional = true } [features] default = ["cli"] @@ -36,7 +35,7 @@ wasm = [ "web-sys", "console_error_panic_hook", "clarinet_deployments/wasm", - "clarity_repl_wasm/wasm", + "clarity_repl/wasm", "clarinet_files/wasm", ] diff --git a/components/clarity-lsp/src/common/backend.rs b/components/clarity-lsp/src/common/backend.rs index ad14d6788..d55840d79 100644 --- a/components/clarity-lsp/src/common/backend.rs +++ b/components/clarity-lsp/src/common/backend.rs @@ -3,8 +3,6 @@ use crate::state::{build_state, EditorState, ProtocolState}; use crate::types::{CompletionItem, CompletionItemKind}; use clarinet_files::{FileAccessor, FileLocation}; use clarity_repl::clarity::diagnostic::Diagnostic; -#[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] diff --git a/components/clarity-lsp/src/common/state.rs b/components/clarity-lsp/src/common/state.rs index 85dc09209..0fb15ccb1 100644 --- a/components/clarity-lsp/src/common/state.rs +++ b/components/clarity-lsp/src/common/state.rs @@ -12,8 +12,6 @@ use clarity_repl::clarity::diagnostic::{Diagnostic as ClarityDiagnostic, Level a use clarity_repl::clarity::vm::ast::ContractAST; use clarity_repl::clarity::vm::types::QualifiedContractIdentifier; use clarity_repl::clarity::vm::EvaluationResult; -#[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; use lsp_types::MessageType; use orchestra_types::StacksNetwork; use std::borrow::BorrowMut; diff --git a/components/clarity-lsp/src/utils/mod.rs b/components/clarity-lsp/src/utils/mod.rs index 0b19f0ed1..e6affca59 100644 --- a/components/clarity-lsp/src/utils/mod.rs +++ b/components/clarity-lsp/src/utils/mod.rs @@ -11,8 +11,6 @@ use clarity_repl::clarity::vm::docs::{ make_api_reference, make_define_reference, make_keyword_reference, }; use clarity_repl::clarity::vm::types::{BlockInfoProperty, FunctionType}; -#[cfg(feature = "wasm")] -use clarity_repl_wasm as clarity_repl; use lsp_types::Diagnostic as LspDiagnostic; use lsp_types::Url; use lsp_types::{DiagnosticSeverity, Position, Range}; diff --git a/components/clarity-repl/Cargo.toml b/components/clarity-repl/Cargo.toml index cb5bb13a9..d27cfefd2 100644 --- a/components/clarity-repl/Cargo.toml +++ b/components/clarity-repl/Cargo.toml @@ -32,21 +32,12 @@ serde_derive = "1.0" ripemd160 = "0.9.1" integer-sqrt = "0.1.3" libsecp256k1 = "0.5.0" -serde_stacker = { version = "0.1", optional = true } rand = "=0.7.3" getrandom = { version = "0.2.3", features = ["js"] } rand_pcg = "0.3.1" rand_seeder = "0.2.2" atty = "0.2.14" -clarity = { git = "https://github.com/stacks-network/stacks-blockchain.git", rev = "f00a50167febe6ab603c1acfaa256632aa83339c" } -rusqlite = { version = "=0.27.0", features = [ - "blob", - "serde_json", - "i128_blob", - "bundled", - "trace", -] } - +clarity = { git = "https://github.com/stacks-network/stacks-blockchain.git", rev = "5d0e4228270fef5cff74a85931d10ec95dcf2951", default-features = false, optional = true } # DAP Debugger tokio = { version = "=1.17.0", features = ["full"], optional = true } @@ -81,7 +72,7 @@ path = "src/bin.rs" [features] default = ["cli", "dap"] -cli = ["pico-args", "rustyline", "prettytable-rs", "serde_stacker"] +cli = ["pico-args", "rustyline", "prettytable-rs", "clarity/default"] dap = [ "tokio", "tokio-util", @@ -92,7 +83,7 @@ dap = [ "memchr", "log", ] -wasm = ["wasm-bindgen", "wasm-bindgen-futures"] +wasm = ["wasm-bindgen", "wasm-bindgen-futures", "clarity/wasm"] [package.metadata.wasm-pack.profile.release.wasm-bindgen] debug-js-glue = false diff --git a/components/clarity-repl/src/codec/mod.rs b/components/clarity-repl/src/codec/mod.rs index ef95f884a..be116c92a 100644 --- a/components/clarity-repl/src/codec/mod.rs +++ b/components/clarity-repl/src/codec/mod.rs @@ -16,7 +16,7 @@ use clarity::util::retry::BoundReader; use clarity::util::secp256k1::{ MessageSignature, Secp256k1PrivateKey, Secp256k1PublicKey, MESSAGE_SIGNATURE_ENCODED_SIZE, }; -use clarity::util::vrf::VRFProof; +// use clarity::util::vrf::VRFProof; use clarity::vm::types::{ PrincipalData, QualifiedContractIdentifier, StandardPrincipalData, Value, }; @@ -2152,7 +2152,7 @@ pub struct StacksMicroblock { pub struct StacksBlockHeader { pub version: u8, pub total_work: StacksWorkScore, // NOTE: this is the work done on the chain tip this block builds on (i.e. take this from the parent) - pub proof: VRFProof, + pub proof: String, pub parent_block: BlockHeaderHash, // NOTE: even though this is also present in the burn chain, we need this here for super-light clients that don't even have burn chain headers pub parent_microblock: BlockHeaderHash, pub parent_microblock_sequence: u16, @@ -2184,11 +2184,11 @@ impl StacksMessageCodec for StacksMicroblockHeader { let signature: MessageSignature = read_next(fd)?; // signature must be well-formed - let _ = signature - .to_secp256k1_recoverable() - .ok_or(CodecError::DeserializeError( - "Failed to parse signature".to_string(), - ))?; + // let _ = signature + // .to_secp256k1_recoverable() + // .ok_or(CodecError::DeserializeError( + // "Failed to parse signature".to_string(), + // ))?; Ok(StacksMicroblockHeader { version, diff --git a/components/clarity-repl/src/repl/datastore.rs b/components/clarity-repl/src/repl/datastore.rs index 91c7f42aa..f6f32d1e7 100644 --- a/components/clarity-repl/src/repl/datastore.rs +++ b/components/clarity-repl/src/repl/datastore.rs @@ -1,4 +1,3 @@ -use rusqlite::Connection; use sha2::{Digest, Sha512_256}; use clarity::types::chainstate::BlockHeaderHash; @@ -261,11 +260,28 @@ impl ClarityBackingStore for Datastore { } fn get_with_proof(&mut self, key: &str) -> Option<(String, Vec)> { - panic!("DataStore cannot get with proof") + return None; } - fn get_side_store(&mut self) -> &Connection { - panic!("DataStore has no side store") + fn get_contract_hash( + &mut self, + _contract: &QualifiedContractIdentifier, + ) -> Result<(StacksBlockId, Sha512Trunc256Sum)> { + panic!("Datastore cannot get_contract_hash") + } + + fn get_metadata_manual( + &mut self, + _at_height: u32, + _contract: &QualifiedContractIdentifier, + _key: &str, + ) -> Result> { + panic!("Datastore cannot get_metadata_manual") + } + + #[cfg(not(feature = "wasm"))] + fn get_side_store(&mut self) -> &::clarity::rusqlite::Connection { + panic!("Datastore cannot get_side_store") } } diff --git a/components/clarity-repl/src/repl/interpreter.rs b/components/clarity-repl/src/repl/interpreter.rs index 4d95a56fe..9fffd9e47 100644 --- a/components/clarity-repl/src/repl/interpreter.rs +++ b/components/clarity-repl/src/repl/interpreter.rs @@ -38,6 +38,7 @@ use clarity::vm::{ContractEvaluationResult, EvalHook}; use clarity::vm::{CostSynthesis, ExecutionResult, ParsedContract}; use super::datastore::StacksConstants; +use super::{ClarityContract, DEFAULT_EPOCH}; pub const BLOCK_LIMIT_MAINNET: ExecutionCost = ExecutionCost { write_length: 15_000_000, @@ -130,18 +131,17 @@ impl ClarityInterpreter { pub fn run<'hooks>( &mut self, - snippet: String, - contract_identifier: QualifiedContractIdentifier, + contract: &ClarityContract, cost_track: bool, eval_hooks: Option>, ) -> Result> { - let (mut ast, mut diagnostics, success) = - self.build_ast(contract_identifier.clone(), snippet.clone()); - let (annotations, mut annotation_diagnostics) = self.collect_annotations(&ast, &snippet); + let (mut ast, mut diagnostics, success) = self.build_ast(contract); + let contract_id = contract.expect_resolved_contract_identifier(Some(&self.tx_sender)); + let (annotations, mut annotation_diagnostics) = + self.collect_annotations(&ast, contract.expect_in_memory_code_source()); diagnostics.append(&mut annotation_diagnostics); - let (analysis, mut analysis_diagnostics) = - match self.run_analysis(contract_identifier.clone(), &mut ast, &annotations) { + match self.run_analysis(&contract, &mut ast, &annotations) { Ok((analysis, diagnostics)) => (analysis, diagnostics), Err((_, Some(diagnostic), _)) => { diagnostics.push(diagnostic); @@ -156,14 +156,7 @@ impl ClarityInterpreter { return Err(diagnostics); } - let mut result = match self.execute( - contract_identifier, - &mut ast, - snippet, - analysis, - cost_track, - eval_hooks, - ) { + let mut result = match self.execute(&contract, &mut ast, analysis, cost_track, eval_hooks) { Ok(result) => result, Err((_, Some(diagnostic), _)) => { diagnostics.push(diagnostic); @@ -191,16 +184,16 @@ impl ClarityInterpreter { pub fn run_ast<'a, 'hooks>( &'a mut self, - mut ast: ContractAST, - snippet: String, - contract_identifier: QualifiedContractIdentifier, + contract: &ClarityContract, + ast: &mut ContractAST, cost_track: bool, eval_hooks: Option>, ) -> Result> { - let (annotations, mut diagnostics) = self.collect_annotations(&ast, &snippet); + let code_source = contract.expect_in_memory_code_source(); + let (annotations, mut diagnostics) = self.collect_annotations(&ast, &code_source); let (analysis, mut analysis_diagnostics) = - match self.run_analysis(contract_identifier.clone(), &mut ast, &annotations) { + match self.run_analysis(contract, ast, &annotations) { Ok((analysis, diagnostics)) => (analysis, diagnostics), Err((_, Some(diagnostic), _)) => { diagnostics.push(diagnostic); @@ -210,14 +203,7 @@ impl ClarityInterpreter { }; diagnostics.append(&mut analysis_diagnostics); - let mut result = match self.execute( - contract_identifier, - &mut ast, - snippet, - analysis, - cost_track, - eval_hooks, - ) { + let mut result = match self.execute(contract, ast, analysis, cost_track, eval_hooks) { Ok(result) => result, Err((_, Some(diagnostic), _)) => { diagnostics.push(diagnostic); @@ -245,11 +231,10 @@ impl ClarityInterpreter { pub fn detect_dependencies( &mut self, - contract_id: String, - snippet: String, + contract: &ClarityContract, ) -> Result, String> { - let contract_id = QualifiedContractIdentifier::parse(&contract_id).unwrap(); - let (ast, _, success) = self.build_ast(contract_id.clone(), snippet.clone()); + let contract_id = contract.expect_resolved_contract_identifier(Some(&self.tx_sender)); + let (ast, _, success) = self.build_ast(contract); if !success { return Err("error parsing source".to_string()); } @@ -277,28 +262,27 @@ impl ClarityInterpreter { Ok(dependencies) } - pub fn build_ast( - &self, - contract_identifier: QualifiedContractIdentifier, - snippet: String, - ) -> (ContractAST, Vec, bool) { + pub fn build_ast(&self, contract: &ClarityContract) -> (ContractAST, Vec, bool) { + let source_code = contract.expect_in_memory_code_source(); + let contract_identifier = + contract.expect_resolved_contract_identifier(Some(&self.tx_sender)); build_ast_with_diagnostics( &contract_identifier, - &snippet, + &source_code, &mut (), - self.repl_settings.clarity_version, - self.repl_settings.epoch, + contract.clarity_version.clone(), + contract.epoch.clone(), ) } pub fn collect_annotations( &self, ast: &ContractAST, - snippet: &String, + code_source: &str, ) -> (Vec, Vec) { let mut annotations = vec![]; let mut diagnostics = vec![]; - let lines = snippet.lines(); + let lines = code_source.lines(); for (n, line) in lines.enumerate() { if let Some(comment) = line.trim().strip_prefix(";;") { if let Some(annotation_string) = comment.trim().strip_prefix("#[") { @@ -338,7 +322,7 @@ impl ClarityInterpreter { pub fn run_analysis( &mut self, - contract_identifier: QualifiedContractIdentifier, + contract: &ClarityContract, contract_ast: &mut ContractAST, annotations: &Vec, ) -> Result<(ContractAnalysis, Vec), (String, Option, Option)> @@ -347,12 +331,12 @@ impl ClarityInterpreter { // Run standard clarity analyses let mut contract_analysis = match clarity::vm::analysis::run_analysis( - &contract_identifier, + &contract.expect_resolved_contract_identifier(Some(&self.tx_sender)), &mut contract_ast.expressions, &mut analysis_db, false, LimitedCostTracker::new_free(), - self.repl_settings.clarity_version, + contract.clarity_version.clone(), ) { Ok(res) => res, Err((error, cost_tracker)) => { @@ -379,16 +363,16 @@ impl ClarityInterpreter { #[allow(unused_assignments)] pub fn save_contract( &mut self, - contract_identifier: QualifiedContractIdentifier, + contract: &ClarityContract, contract_ast: &mut ContractAST, - snippet: String, contract_analysis: ContractAnalysis, mainnet: bool, ) { + let contract_id = contract.expect_resolved_contract_identifier(Some(&self.tx_sender)); { let mut contract_context = ContractContext::new( - contract_identifier.clone(), - self.repl_settings.clarity_version, + contract.expect_resolved_contract_identifier(Some(&self.tx_sender)), + contract.clarity_version, ); let conn = ClarityDatabase::new( @@ -403,7 +387,7 @@ impl ClarityInterpreter { clarity::consts::CHAIN_ID_TESTNET, conn, cost_tracker, - self.repl_settings.epoch, + contract.epoch, ); global_context.begin(); @@ -412,15 +396,15 @@ impl ClarityInterpreter { global_context .database - .insert_contract_hash(&contract_identifier, &snippet) + .insert_contract_hash(&contract_id, contract.expect_in_memory_code_source()) .unwrap(); let contract = Contract { contract_context }; global_context .database - .insert_contract(&contract_identifier, contract); + .insert_contract(&contract_id, contract); global_context .database - .set_contract_data_size(&contract_identifier, 0) + .set_contract_data_size(&contract_id, 0) .unwrap(); global_context.commit().unwrap(); }; @@ -428,7 +412,7 @@ impl ClarityInterpreter { let mut analysis_db = AnalysisDatabase::new(&mut self.datastore); analysis_db.begin(); analysis_db - .insert_contract(&contract_identifier, &contract_analysis) + .insert_contract(&contract_id, &contract_analysis) .unwrap(); analysis_db.commit(); } @@ -436,22 +420,22 @@ impl ClarityInterpreter { #[allow(unused_assignments)] pub fn execute<'a, 'hooks>( &'a mut self, - contract_identifier: QualifiedContractIdentifier, + contract: &ClarityContract, contract_ast: &mut ContractAST, - snippet: String, contract_analysis: ContractAnalysis, cost_track: bool, eval_hooks: Option>, ) -> Result, Option)> { let mut cost = None; + let contract_identifier = + contract.expect_resolved_contract_identifier(Some(&self.tx_sender)); + let snippet = contract.expect_in_memory_code_source(); let mut contract_saved = false; let mut serialized_events = vec![]; let mut accounts_to_debit = vec![]; let mut accounts_to_credit = vec![]; - let mut contract_context = ContractContext::new( - contract_identifier.clone(), - self.repl_settings.clarity_version, - ); + let mut contract_context = + ContractContext::new(contract_identifier.clone(), contract.clarity_version); let (eval_result, eval_hooks) = { let mut conn = ClarityDatabase::new( @@ -461,7 +445,7 @@ impl ClarityInterpreter { ); let tx_sender: PrincipalData = self.tx_sender.clone().into(); conn.begin(); - conn.set_clarity_epoch_version(self.repl_settings.epoch); + conn.set_clarity_epoch_version(contract.epoch); conn.commit(); let cost_tracker = if cost_track { LimitedCostTracker::new( @@ -469,19 +453,14 @@ impl ClarityInterpreter { CHAIN_ID_TESTNET, BLOCK_LIMIT_MAINNET.clone(), &mut conn, - self.repl_settings.epoch, + contract.epoch, ) .expect("failed to initialize cost tracker") } else { LimitedCostTracker::new_free() }; - let mut global_context = GlobalContext::new( - false, - CHAIN_ID_TESTNET, - conn, - cost_tracker, - self.repl_settings.epoch, - ); + let mut global_context = + GlobalContext::new(false, CHAIN_ID_TESTNET, conn, cost_tracker, contract.epoch); if let Some(mut in_hooks) = eval_hooks { let mut hooks: Vec<&mut dyn EvalHook> = Vec::new(); @@ -696,7 +675,7 @@ impl ClarityInterpreter { } let parsed_contract = ParsedContract { contract_identifier: contract_identifier.to_string(), - code: snippet.clone(), + code: snippet.to_string(), function_args: functions, ast: contract_ast.clone(), analysis: contract_analysis.clone(), @@ -779,7 +758,7 @@ impl ClarityInterpreter { CHAIN_ID_TESTNET, conn, LimitedCostTracker::new_free(), - self.repl_settings.epoch, + DEFAULT_EPOCH, ); global_context.begin(); let mut cur_balance = global_context.database.get_stx_balance_snapshot(&recipient); diff --git a/components/clarity-repl/src/repl/mod.rs b/components/clarity-repl/src/repl/mod.rs index 33f506da7..4dc4e67e2 100644 --- a/components/clarity-repl/src/repl/mod.rs +++ b/components/clarity-repl/src/repl/mod.rs @@ -7,7 +7,83 @@ pub mod session; pub mod settings; pub mod tracer; +use std::convert::TryInto; +use std::path::PathBuf; + +use ::clarity::vm::types::{PrincipalData, QualifiedContractIdentifier, StandardPrincipalData}; pub use interpreter::ClarityInterpreter; pub use session::Session; pub use settings::SessionSettings; pub use settings::{Settings, SettingsFile}; + +use clarity::types::StacksEpochId; +use clarity::vm::ClarityVersion; + +pub const DEFAULT_CLARITY_VERSION: ClarityVersion = ClarityVersion::Clarity1; +pub const DEFAULT_EPOCH: StacksEpochId = StacksEpochId::Epoch20; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ClarityContract { + pub code_source: ClarityCodeSource, + pub name: String, + pub deployer: ContractDeployer, + pub clarity_version: ClarityVersion, + pub epoch: StacksEpochId, +} + +impl ClarityContract { + pub fn expect_in_memory_code_source(&self) -> &str { + match self.code_source { + ClarityCodeSource::ContractInMemory(ref code_source) => code_source.as_str(), + _ => panic!("source code expected to be in memory"), + } + } + + pub fn expect_contract_path_as_str(&self) -> &str { + match self.code_source { + ClarityCodeSource::ContractOnDisk(ref path) => path.to_str().unwrap(), + _ => panic!("source code expected to be in memory"), + } + } + + pub fn expect_resolved_contract_identifier( + &self, + default_deployer: Option<&StandardPrincipalData>, + ) -> QualifiedContractIdentifier { + let deployer = match &self.deployer { + ContractDeployer::ContractIdentifier(contract_identifier) => { + return contract_identifier.clone() + } + ContractDeployer::Transient => StandardPrincipalData::transient(), + ContractDeployer::Address(address) => { + PrincipalData::parse_standard_principal(&address).expect("unable to parse address") + } + ContractDeployer::DefaultDeployer => default_deployer + .expect("default provider should have been provided") + .clone(), + _ => panic!("deployer expected to be resolved"), + }; + let contract_name = self + .name + .clone() + .try_into() + .expect("unable to parse contract name"); + QualifiedContractIdentifier::new(deployer, contract_name) + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ContractDeployer { + Transient, + DefaultDeployer, + LabeledDeployer(String), + Address(String), + ContractIdentifier(QualifiedContractIdentifier), +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ClarityCodeSource { + ContractInMemory(String), + ContractOnDisk(PathBuf), + Empty, +} diff --git a/components/clarity-repl/src/repl/session.rs b/components/clarity-repl/src/repl/session.rs index c625b8867..01b7c2bb4 100644 --- a/components/clarity-repl/src/repl/session.rs +++ b/components/clarity-repl/src/repl/session.rs @@ -1,6 +1,8 @@ use super::boot::{STACKS_BOOT_CODE_MAINNET, STACKS_BOOT_CODE_TESTNET}; use super::diagnostic::output_diagnostic; -use super::ClarityInterpreter; +use super::{ + ClarityCodeSource, ClarityContract, ClarityInterpreter, ContractDeployer, DEFAULT_EPOCH, +}; use crate::analysis::ast_dependency_detector::{ASTDependencyDetector, Dependency}; use crate::analysis::coverage::{self, TestCoverageReport}; use crate::repl::settings::InitialContract; @@ -19,7 +21,9 @@ use clarity::vm::types::{ PrincipalData, QualifiedContractIdentifier, StandardPrincipalData, Value, }; use clarity::vm::variables::NativeVariables; -use clarity::vm::{ContractName, CostSynthesis, EvalHook, EvaluationResult, ExecutionResult}; +use clarity::vm::{ + ClarityVersion, ContractName, CostSynthesis, EvalHook, EvaluationResult, ExecutionResult, +}; use std::collections::{BTreeMap, BTreeSet, HashMap, VecDeque}; use std::convert::TryFrom; use std::fmt; @@ -120,177 +124,6 @@ impl Session { self.interpreter.set_tx_sender(default_tx_sender); } - #[cfg(feature = "cli")] - pub fn start(&mut self) -> Result<(String, Vec<(ContractAnalysis, String, String)>), String> { - let mut output_err = Vec::::new(); - let mut output = Vec::::new(); - let mut contracts = vec![]; - - if !self.settings.include_boot_contracts.is_empty() { - self.load_boot_contracts(); - } - - if self.settings.initial_accounts.len() > 0 { - let mut initial_accounts = self.settings.initial_accounts.clone(); - for account in initial_accounts.drain(..) { - let recipient = match PrincipalData::parse(&account.address) { - Ok(recipient) => recipient, - _ => { - output_err.push(red!("Unable to parse address to credit")); - continue; - } - }; - - match self - .interpreter - .mint_stx_balance(recipient, account.balance) - { - Ok(_) => {} - Err(err) => output_err.push(red!(err)), - }; - } - } - - if !self.settings.lazy_initial_contracts_interpretation { - match self.interpret_initial_contracts() { - Ok((ref mut res, ref mut initial_contracts)) => { - if self.is_interactive { - // If the session is interactive (clarinet console, usr/bin/clarity-repl) - // we will display the contracts + genesis asset map. - if !self.settings.initial_contracts.is_empty() { - output.push(blue!("Contracts")); - self.get_contracts(&mut output); - } - - if self.settings.initial_accounts.len() > 0 { - output.push(blue!("Initialized balances")); - self.get_accounts(&mut output); - } - } - output.append(res); - contracts.append(initial_contracts); - } - Err(ref mut res) => { - output_err.append(res); - } - }; - } - - match output_err.len() { - 0 => Ok((output.join("\n"), contracts)), - _ => Err(output_err.join("\n")), - } - } - - #[cfg(feature = "cli")] - fn handle_initial_contracts( - &mut self, - ) -> Result<(Vec, Vec<(ContractAnalysis, String, String)>), Vec> { - let mut output_err = vec![]; - let mut output = vec![]; - - let mut contracts = vec![]; - if self.settings.initial_contracts.len() > 0 { - let initial_contracts = self.settings.initial_contracts.clone(); - let mut initial_contracts_map = HashMap::new(); - let mut contract_asts = HashMap::new(); - let default_tx_sender = self.interpreter.get_tx_sender(); - - // Parse all contracts and save the ASTs - for contract in &initial_contracts { - let deployer = { - let address = match contract.deployer { - Some(ref entry) => entry.clone(), - None => format!("{}", StacksAddress::burn_address(false)), - }; - PrincipalData::parse_standard_principal(&address) - .expect("Unable to parse deployer's address") - }; - - self.interpreter.set_tx_sender(deployer); - - match self.build_ast(&contract.code, contract.name.as_deref()) { - Ok((contract_identifier, ast, mut contract_output)) => { - contract_asts.insert(contract_identifier.clone(), ast); - initial_contracts_map.insert(contract_identifier, contract); - output.append(&mut contract_output) - } - Err(mut output) => output_err.append(&mut output), - } - } - - let dependencies = - match ASTDependencyDetector::detect_dependencies(&contract_asts, &self.asts) { - Ok(dependencies) => dependencies, - Err((dependencies, unresolved)) => { - for contract_id in unresolved { - output_err.push(format!( - "{}: unresolved dependency: {}", - red!("error"), - contract_id - )); - } - dependencies - } - }; - match ASTDependencyDetector::order_contracts(&dependencies) { - Ok(ordered_contracts) => { - // interpret the contract ASTs in order - for contract_identifier in ordered_contracts { - let contract = initial_contracts_map[contract_identifier]; - let ast = contract_asts.remove(contract_identifier).unwrap(); - match self.formatted_interpretation_ast( - contract.code.to_string(), - ast, - contract_identifier.clone(), - true, - None, - Some("Deployment".into()), - ) { - Ok((ref mut res_output, result)) => { - output.append(res_output); - let contract_result = match result.result { - EvaluationResult::Contract(result) => result, - _ => continue, - }; - contracts.push(( - contract_result.contract.analysis.clone(), - contract_result.contract.code.clone(), - contract.path.clone(), - )) - } - Err(ref mut result) => output_err.append(result), - }; - } - self.interpreter.set_tx_sender(default_tx_sender); - } - Err(e) => { - output_err.push(format!("{}: {}", red!("error"), e)); - } - } - } - if output_err.len() > 0 { - return Err(output_err); - } - Ok((output, contracts)) - } - - #[cfg(feature = "cli")] - pub fn interpret_initial_contracts( - &mut self, - ) -> Result<(Vec, Vec<(ContractAnalysis, String, String)>), Vec> { - if self.initial_contracts_analysis.is_empty() { - let (output, contracts) = self.handle_initial_contracts()?; - - self.initial_contracts_analysis - .append(&mut contracts.clone()); - - Ok((output, contracts)) - } else { - Err(vec!["Initial contracts already interpreted".into()]) - } - } - pub fn include_boot_contracts(&mut self, mainnet: bool) { let boot_code = if mainnet { *STACKS_BOOT_CODE_MAINNET @@ -314,8 +147,6 @@ impl Session { .expect(&format!("Unable to deploy {}", name)); } } - - if self.settings.repl_settings.epoch >= StacksEpochId::Epoch2_05 {} } pub fn get_boot_contracts_asts(&self) -> BTreeMap { @@ -334,15 +165,15 @@ impl Session { .include_boot_contracts .contains(&name.to_string()) { - let contract_identifier = QualifiedContractIdentifier::new( - deployer.clone(), - ContractName::try_from(*name) - .expect("unable to create `ContractName` from boot contract"), - ); - let (ast, _, _) = self - .interpreter - .build_ast(contract_identifier.clone(), code.to_string()); - asts.insert(contract_identifier, ast); + let boot_contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(code.to_string()), + deployer: ContractDeployer::Address(deployer.to_address()), + name: name.to_string(), + clarity_version: ClarityVersion::Clarity1, + epoch: StacksEpochId::Epoch20, + }; + let (ast, _, _) = self.interpreter.build_ast(&boot_contract); + asts.insert(boot_contract.expect_resolved_contract_identifier(None), ast); } } } @@ -409,8 +240,6 @@ impl Session { #[cfg(feature = "cli")] cmd if cmd.starts_with("::trace") => self.trace(&mut output, cmd), #[cfg(feature = "cli")] - cmd if cmd.starts_with("::reload") => self.reload(&mut output), - #[cfg(feature = "cli")] cmd if cmd.starts_with("::read") => self.read(&mut output, cmd), snippet => self.run_snippet(&mut output, self.show_costs, snippet), @@ -489,14 +318,7 @@ impl Session { ) -> Result<(Vec, ExecutionResult), Vec> { let light_red = Colour::Red.bold(); - let result = self.interpret( - snippet.to_string(), - name.clone(), - eval_hooks, - cost_track, - test_name, - None, - ); + let result = self.eval(snippet.to_string(), eval_hooks, cost_track); let mut output = Vec::::new(); let lines = snippet.lines(); let formatted_lines: Vec = lines.map(|l| l.to_string()).collect(); @@ -582,14 +404,7 @@ impl Session { let mut tracer = Tracer::new(snippet.to_string()); - match self.interpret( - snippet.to_string(), - None, - Some(vec![&mut tracer]), - false, - None, - None, - ) { + match self.eval(snippet.to_string(), Some(vec![&mut tracer]), false) { Ok(_) => (), Err(diagnostics) => { let lines = snippet.lines(); @@ -602,49 +417,40 @@ impl Session { } #[cfg(feature = "cli")] - fn reload(&mut self, output: &mut Vec) { - self.asts.clear(); - self.contracts.clear(); - self.costs_reports.clear(); - self.coverage_reports.clear(); - self.initial_contracts_analysis.clear(); - self.interpreter = ClarityInterpreter::new( - self.interpreter.get_tx_sender(), - self.settings.repl_settings.clone(), - ); - let contracts = std::mem::take(&mut self.settings.initial_contracts); - - for existing in contracts { - let reloaded = match fs::read_to_string(&existing.path) { - Ok(code) => code, - Err(err) => { - println!( - "{}: Unable to read {}: {}", - red!("error"), - existing.path, - err - ); - std::process::exit(1); - } - }; + pub fn start(&mut self) -> Result<(String, Vec<(ContractAnalysis, String, String)>), String> { + let mut output_err = Vec::::new(); + let output = Vec::::new(); + let contracts = vec![]; - self.settings.initial_contracts.push(InitialContract { - code: reloaded, - path: existing.path, - name: existing.name, - deployer: existing.deployer, - }); + if !self.settings.include_boot_contracts.is_empty() { + self.load_boot_contracts(); } - match self.start() { - Ok(_) => { - self.get_contracts(output); - output.push("Ok, contracts reloaded.".to_string()); - } - Err(e) => { - println!("{}", e); + if self.settings.initial_accounts.len() > 0 { + let mut initial_accounts = self.settings.initial_accounts.clone(); + for account in initial_accounts.drain(..) { + let recipient = match PrincipalData::parse(&account.address) { + Ok(recipient) => recipient, + _ => { + output_err.push(red!("Unable to parse address to credit")); + continue; + } + }; + + match self + .interpreter + .mint_stx_balance(recipient, account.balance) + { + Ok(_) => {} + Err(err) => output_err.push(red!(err)), + }; } } + + match output_err.len() { + 0 => Ok((output.join("\n"), contracts)), + _ => Err(output_err.join("\n")), + } } #[cfg(feature = "cli")] @@ -662,63 +468,59 @@ impl Session { self.run_snippet(output, self.show_costs, &snippet.to_string()); } - pub fn formatted_interpretation_ast<'hooks>( + pub fn deploy_contract( &mut self, - snippet: String, - ast: ContractAST, - contract_identifier: QualifiedContractIdentifier, - cost_track: bool, + contract: &ClarityContract, eval_hooks: Option>, + cost_track: bool, test_name: Option, - ) -> Result<(Vec, ExecutionResult), Vec> { - let light_red = Colour::Red.bold(); + ast: &mut Option, + ) -> Result> { + let mut hooks: Vec<&mut dyn EvalHook> = Vec::new(); + let mut coverage = if let Some(test_name) = test_name { + Some(TestCoverageReport::new(test_name.into())) + } else { + None + }; + if let Some(coverage) = &mut coverage { + hooks.push(coverage); + }; - let result = self.interpret_ast( - &contract_identifier, - ast, - snippet.to_string(), - eval_hooks, - cost_track, - test_name, - ); - let mut output = Vec::::new(); - let lines = snippet.lines(); - let formatted_lines: Vec = lines.map(|l| l.to_string()).collect(); - let contract_name = contract_identifier.name.to_string(); + if let Some(mut in_hooks) = eval_hooks { + for hook in in_hooks.drain(..) { + hooks.push(hook); + } + } + + let contract_id = + contract.expect_resolved_contract_identifier(Some(&self.interpreter.get_tx_sender())); + + let result = if let Some(mut ast) = ast.take() { + self.interpreter + .run_ast(contract, &mut ast, cost_track, Some(hooks)) + } else { + self.interpreter.run(contract, cost_track, Some(hooks)) + }; match result { Ok(result) => { - for diagnostic in &result.diagnostics { - output.append(&mut output_diagnostic( - &diagnostic, - &contract_name, - &formatted_lines, - )); - } - if result.events.len() > 0 { - output.push(black!("Events emitted")); - for event in result.events.iter() { - output.push(black!(format!("{}", event))); - } + if let Some(ref coverage) = coverage { + self.coverage_reports.push(coverage.clone()); } match &result.result { EvaluationResult::Contract(contract_result) => { - if let Some(value) = &contract_result.result { - output.push(green!(format!("{}", value))); - } - } - EvaluationResult::Snippet(snippet_result) => { - output.push(green!(format!("{}", snippet_result.result))) + self.asts + .insert(contract_id.clone(), contract_result.contract.ast.clone()); + self.contracts.insert( + contract_id.to_string(), + contract_result.contract.function_args.clone(), + ); } - } - Ok((output, result)) - } - Err(diagnostics) => { - for d in diagnostics { - output.append(&mut output_diagnostic(&d, &contract_name, &formatted_lines)); - } - Err(output) + _ => (), + }; + Ok(result) } + Err(res) => Err(res), } } @@ -739,23 +541,37 @@ impl Session { format!("{}.{}", initial_tx_sender, contract,) }; - let snippet = format!( + let mut hooks: Vec<&mut dyn EvalHook> = vec![]; + let mut coverage = TestCoverageReport::new(test_name.clone()); + hooks.push(&mut coverage); + + let contract_call = format!( "(contract-call? '{} {} {})", contract_id, method, args.join(" ") ); + let contract_call = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(contract_call), + name: "contract-call".to_string(), + deployer: ContractDeployer::Address(sender.to_string()), + epoch: StacksEpochId::Epoch20, + clarity_version: ClarityVersion::Clarity1, + }; self.set_tx_sender(sender.into()); - let result = match self.interpret(snippet, None, None, true, Some(test_name.clone()), None) - { + let execution = match self.interpreter.run(&contract_call, true, Some(hooks)) { Ok(result) => result, Err(e) => { self.set_tx_sender(initial_tx_sender); return Err(e); } }; - if let Some(ref cost) = result.cost { + self.set_tx_sender(initial_tx_sender); + // if let Some(coverage) = result.coverage.take() { + // self.coverage_reports.push(coverage); + // } + if let Some(ref cost) = execution.cost { self.costs_reports.push(CostsReport { test_name, contract_id, @@ -764,161 +580,63 @@ impl Session { cost_result: cost.clone(), }); } - self.set_tx_sender(initial_tx_sender); - Ok(result) - } - - pub fn build_ast( - &mut self, - snippet: &str, - name: Option<&str>, - ) -> Result<(QualifiedContractIdentifier, ContractAST, Vec), Vec> { - let (contract_name, is_tx) = match name { - Some(name) => (name.to_string(), false), - None => (format!("contract-{}", self.contracts.len()), true), - }; - let tx_sender = self.interpreter.get_tx_sender().to_address(); - let id = format!("{}.{}", tx_sender, contract_name); - let contract_identifier = QualifiedContractIdentifier::parse(&id).unwrap(); - - let (ast, diagnostics, success) = self - .interpreter - .build_ast(contract_identifier.clone(), snippet.to_string()); - - let mut output = Vec::::new(); - let lines = snippet.lines(); - let formatted_lines: Vec = lines.map(|l| l.to_string()).collect(); - for diagnostic in &diagnostics { - output.append(&mut output_diagnostic( - &diagnostic, - &contract_name, - &formatted_lines, - )); - } - if success { - Ok((contract_identifier, ast, output)) - } else { - Err(output) - } - } - - pub fn interpret_ast<'a, 'hooks>( - &'a mut self, - contract_identifier: &QualifiedContractIdentifier, - ast: ContractAST, - snippet: String, - eval_hooks: Option>, - cost_track: bool, - test_name: Option, - ) -> Result> { - let mut hooks: Vec<&mut dyn EvalHook> = Vec::new(); - let mut coverage = if let Some(test_name) = test_name { - Some(TestCoverageReport::new(test_name.into())) - } else { - None - }; - if let Some(coverage) = &mut coverage { - hooks.push(coverage); - }; - - if let Some(mut in_hooks) = eval_hooks { - for hook in in_hooks.drain(..) { - hooks.push(hook); - } - } - - match self.interpreter.run_ast( - ast, - snippet, - contract_identifier.clone(), - cost_track, - Some(hooks), - ) { - Ok(result) => { - if let Some(ref coverage) = coverage { - self.coverage_reports.push(coverage.clone()); - } - match &result.result { - EvaluationResult::Contract(contract_result) => { - self.asts.insert( - contract_identifier.clone(), - contract_result.contract.ast.clone(), - ); - self.contracts.insert( - contract_result.contract.contract_identifier.clone(), - contract_result.contract.function_args.clone(), - ); - } - _ => (), - }; - Ok(result) - } - Err(res) => Err(res), - } + Ok(execution) } - pub fn interpret<'a>( + // pub fn build_ast( + // &mut self, + // snippet: &str, + // name: Option<&str>, + // ) -> Result<(QualifiedContractIdentifier, ContractAST, Vec), Vec> { + // let (contract_name, is_tx) = match name { + // Some(name) => (name.to_string(), false), + // None => (format!("contract-{}", self.contracts.len()), true), + // }; + // let tx_sender = self.interpreter.get_tx_sender().to_address(); + // let id = format!("{}.{}", tx_sender, contract_name); + // let contract_identifier = QualifiedContractIdentifier::parse(&id).unwrap(); + + // let (ast, diagnostics, success) = self + // .interpreter + // .build_ast(contract_identifier.clone(), snippet.to_string()); + + // let mut output = Vec::::new(); + // let lines = snippet.lines(); + // let formatted_lines: Vec = lines.map(|l| l.to_string()).collect(); + // for diagnostic in &diagnostics { + // output.append(&mut output_diagnostic( + // &diagnostic, + // &contract_name, + // &formatted_lines, + // )); + // } + // if success { + // Ok((contract_identifier, ast, output)) + // } else { + // Err(output) + // } + // } + + pub fn eval<'a>( &'a mut self, snippet: String, - name: Option, eval_hooks: Option>, cost_track: bool, - test_name: Option, - ast: Option<&ContractAST>, ) -> Result> { - let mut hooks: Vec<&mut dyn EvalHook> = Vec::new(); - let mut coverage = if let Some(test_name) = test_name { - Some(TestCoverageReport::new(test_name.into())) - } else { - None - }; - if let Some(coverage) = &mut coverage { - hooks.push(coverage); + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(snippet), + name: format!("contract-{}", self.contracts.len()), + deployer: ContractDeployer::DefaultDeployer, + clarity_version: ClarityVersion::default_for_epoch(DEFAULT_EPOCH), + epoch: DEFAULT_EPOCH, }; + let contract_identifier = + contract.expect_resolved_contract_identifier(Some(&self.interpreter.get_tx_sender())); - if let Some(mut in_hooks) = eval_hooks { - for hook in in_hooks.drain(..) { - hooks.push(hook); - } - } - - let (contract_name, is_tx) = match name { - Some(name) => (name, false), - None => (format!("contract-{}", self.contracts.len()), true), - }; - let first_char = contract_name.chars().next().unwrap(); - - // Kludge for handling fully qualified contract_id vs sugared syntax - let contract_identifier = if first_char.to_string() == "S" { - QualifiedContractIdentifier::parse(&contract_name).unwrap() - } else { - let tx_sender = self.interpreter.get_tx_sender().to_address(); - let id = format!("{}.{}", tx_sender, contract_name); - QualifiedContractIdentifier::parse(&id).unwrap() - }; - - let result = if let Some(ast) = ast { - self.interpreter.run_ast( - ast.clone(), - snippet, - contract_identifier.clone(), - cost_track, - Some(hooks), - ) - } else { - self.interpreter.run( - snippet, - contract_identifier.clone(), - cost_track, - Some(hooks), - ) - }; + let result = self.interpreter.run(&contract, cost_track, Some(vec![])); match result { Ok(result) => { - if let Some(ref coverage) = coverage { - self.coverage_reports.push(coverage.clone()); - } match &result.result { EvaluationResult::Contract(contract_result) => { self.asts.insert( @@ -1109,7 +827,7 @@ impl Session { _ => return output.push(red!("Usage: ::encode ")), }; - let result = self.interpret(snippet.to_string(), None, None, false, None, None); + let result = self.eval(snippet.to_string(), None, false); let value = match result { Ok(result) => { let mut tx_bytes = vec![]; diff --git a/components/clarity-repl/src/repl/settings.rs b/components/clarity-repl/src/repl/settings.rs index 23b75d32d..abfea6aaa 100644 --- a/components/clarity-repl/src/repl/settings.rs +++ b/components/clarity-repl/src/repl/settings.rs @@ -64,8 +64,6 @@ pub struct SessionSettings { pub struct Settings { pub analysis: analysis::Settings, pub costs_version: u32, - pub clarity_version: ClarityVersion, - pub epoch: StacksEpochId, } impl Default for Settings { @@ -73,8 +71,6 @@ impl Default for Settings { Self { analysis: analysis::Settings::default(), costs_version: DEFAULT_COSTS_VERSION, - clarity_version: ClarityVersion::latest(), - epoch: StacksEpochId::Epoch2_05, // TODO(brice): Once 2.1 is live, use `::latest()` } } } @@ -97,8 +93,6 @@ impl From for Settings { Self { analysis, costs_version: file.costs_version.unwrap_or(DEFAULT_COSTS_VERSION), - clarity_version: file.clarity_version.unwrap_or(ClarityVersion::latest()), - epoch: file.epoch.unwrap_or(StacksEpochId::latest()), } } } From 9cc7f1c881202206ec0ed1e5d392b7eac18baa78 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 30 Sep 2022 10:26:59 -0400 Subject: [PATCH 08/13] fix: broken tests --- .../src/analysis/ast_dependency_detector.rs | 88 ++++++++++++------- 1 file changed, 56 insertions(+), 32 deletions(-) diff --git a/components/clarity-repl/src/analysis/ast_dependency_detector.rs b/components/clarity-repl/src/analysis/ast_dependency_detector.rs index 941de986c..a35fffc64 100644 --- a/components/clarity-repl/src/analysis/ast_dependency_detector.rs +++ b/components/clarity-repl/src/analysis/ast_dependency_detector.rs @@ -831,18 +831,42 @@ impl GraphWalker { mod tests { use super::*; use crate::repl::session::Session; - use crate::repl::SessionSettings; + use crate::repl::{ + ClarityCodeSource, ClarityContract, ContractDeployer, SessionSettings, + DEFAULT_CLARITY_VERSION, DEFAULT_EPOCH, + }; + use ::clarity::vm::diagnostic::Diagnostic; + + fn build_ast( + session: &Session, + snippet: &str, + name: Option<&str>, + ) -> Result<(QualifiedContractIdentifier, ContractAST, Vec), String> { + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(snippet.to_string()), + name: name.unwrap_or("contract").to_string(), + deployer: ContractDeployer::Transient, + clarity_version: DEFAULT_CLARITY_VERSION, + epoch: DEFAULT_EPOCH, + }; + let (ast, diags, _) = session.interpreter.build_ast(&contract); + Ok(( + contract.expect_resolved_contract_identifier(None), + ast, + diags, + )) + } #[test] fn no_deps() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let snippet = " (define-public (hello) (ok (print \"hello\")) ) " .to_string(); - match session.build_ast(&snippet, None) { + match build_ast(&session, &snippet, None) { Ok((contract_identifier, ast, _)) => { let mut contracts = HashMap::new(); contracts.insert(contract_identifier.clone(), ast); @@ -857,14 +881,14 @@ mod tests { #[test] fn contract_call() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-public (hello (a int)) (ok u0) )" .to_string(); - let foo = match session.build_ast(&snippet1, Some("foo")) { + let foo = match build_ast(&session, &snippet1, Some("foo")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -878,7 +902,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -897,14 +921,14 @@ mod tests { // whether this will be fixed or documented. // #[test] fn dynamic_contract_call_local_trait() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-public (hello (a int)) (ok u0) )" .to_string(); - let bar = match session.build_ast(&snippet1, Some("bar")) { + let bar = match build_ast(&session, &snippet1, Some("bar")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -924,7 +948,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -940,7 +964,7 @@ mod tests { #[test] fn dynamic_contract_call_remote_trait() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-trait my-trait @@ -950,7 +974,7 @@ mod tests { (ok u0) )" .to_string(); - let bar = match session.build_ast(&snippet1, Some("bar")) { + let bar = match build_ast(&session, &snippet1, Some("bar")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -968,7 +992,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -985,14 +1009,14 @@ mod tests { #[test] fn pass_contract_local() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-public (hello (a int)) (ok u0) )" .to_string(); - let bar = match session.build_ast(&snippet1, Some("bar")) { + let bar = match build_ast(&session, &snippet1, Some("bar")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1005,7 +1029,7 @@ mod tests { ((hello (int) (response uint uint))) )" .to_string(); - let my_trait = match session.build_ast(&snippet2, Some("my-trait")) { + let my_trait = match build_ast(&session, &snippet2, Some("my-trait")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1023,7 +1047,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1042,14 +1066,14 @@ mod tests { #[test] fn impl_trait() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-trait something ((hello (int) (response uint uint))) )" .to_string(); - let other = match session.build_ast(&snippet1, Some("other")) { + let other = match build_ast(&session, &snippet1, Some("other")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1064,7 +1088,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1082,14 +1106,14 @@ mod tests { #[test] fn use_trait() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-trait something ((hello (int) (response uint uint))) )" .to_string(); - let other = match session.build_ast(&snippet1, Some("other")) { + let other = match build_ast(&session, &snippet1, Some("other")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1104,7 +1128,7 @@ mod tests { (define-public (foo) (ok true)) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1122,7 +1146,7 @@ mod tests { #[test] fn unresolved_contract_call() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet = " (define-public (call-foo) @@ -1130,7 +1154,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1146,7 +1170,7 @@ mod tests { #[test] fn dynamic_contract_call_unresolved_trait() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet = " (use-trait my-trait .bar.my-trait) @@ -1156,7 +1180,7 @@ mod tests { ) " .to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1172,14 +1196,14 @@ mod tests { #[test] fn contract_call_top_level() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-public (hello (a int)) (ok u0) )" .to_string(); - let foo = match session.build_ast(&snippet1, Some("foo")) { + let foo = match build_ast(&session, &snippet1, Some("foo")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1188,7 +1212,7 @@ mod tests { }; let snippet = "(contract-call? .foo hello 4)".to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1204,14 +1228,14 @@ mod tests { #[test] fn avoid_bad_type() { - let mut session = Session::new(SessionSettings::default()); + let session = Session::new(SessionSettings::default()); let mut contracts = HashMap::new(); let snippet1 = " (define-public (hello (a (list principal))) (ok u0) )" .to_string(); - let foo = match session.build_ast(&snippet1, Some("foo")) { + let foo = match build_ast(&session, &snippet1, Some("foo")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier @@ -1220,7 +1244,7 @@ mod tests { }; let snippet = "(contract-call? .foo hello 4)".to_string(); - let test_identifier = match session.build_ast(&snippet, Some("test")) { + let test_identifier = match build_ast(&session, &snippet, Some("test")) { Ok((contract_identifier, ast, _)) => { contracts.insert(contract_identifier.clone(), ast); contract_identifier From 583aa8f6c5c8ea56ae9d0b8ca8d2a1f0f08dedd5 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 30 Sep 2022 11:41:49 -0400 Subject: [PATCH 09/13] fix: fix boot contracts handling --- README.md | 2 - .../clarinet-cli/examples/cbtc/Clarinet.toml | 1 - .../examples/counter/Clarinet.toml | 1 - .../clarinet-files/src/project_manifest.rs | 5 +- components/clarity-repl/src/bin.rs | 3 +- components/clarity-repl/src/lib.rs | 3 +- .../src/repl/database/key_value_wrapper.rs | 3 +- .../clarity-repl/src/repl/database/marf.rs | 50 ------------------- .../clarity-repl/src/repl/database/mod.rs | 1 - components/clarity-repl/src/repl/mod.rs | 13 +++++ components/clarity-repl/src/repl/session.rs | 28 +++++++---- components/clarity-repl/src/repl/settings.rs | 7 +-- 12 files changed, 38 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index d2648f1df..703a938f7 100644 --- a/README.md +++ b/README.md @@ -487,8 +487,6 @@ name = "my-project" [[project.requirements]] contract_id = "SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait" -boot_contracts = ["pox", "costs-v2", "bns"] - [project.cache_location] path = ".requirements" diff --git a/components/clarinet-cli/examples/cbtc/Clarinet.toml b/components/clarinet-cli/examples/cbtc/Clarinet.toml index 38c0b7f97..86df2865c 100644 --- a/components/clarinet-cli/examples/cbtc/Clarinet.toml +++ b/components/clarinet-cli/examples/cbtc/Clarinet.toml @@ -3,7 +3,6 @@ name = "cbtc" authors = [] description = "" telemetry = false -boot_contracts = ["pox", "costs-2", "cost-voting", "bns"] [[project.requirements]] contract_id = "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard" diff --git a/components/clarinet-cli/examples/counter/Clarinet.toml b/components/clarinet-cli/examples/counter/Clarinet.toml index 624a46aae..8d7d8ff89 100644 --- a/components/clarinet-cli/examples/counter/Clarinet.toml +++ b/components/clarinet-cli/examples/counter/Clarinet.toml @@ -4,7 +4,6 @@ authors = [] description = "" telemetry = false cache_dir = "./.requirements" -boot_contracts = ["pox", "costs-2", "cost-voting", "bns"] [contracts.counter] path = "contracts/counter.clar" diff --git a/components/clarinet-files/src/project_manifest.rs b/components/clarinet-files/src/project_manifest.rs index e88165a64..4c6218864 100644 --- a/components/clarinet-files/src/project_manifest.rs +++ b/components/clarinet-files/src/project_manifest.rs @@ -114,9 +114,6 @@ impl ProjectManifest { if let Some(passes) = project_manifest_file.project.analysis { repl_settings.analysis.set_passes(passes); } - if let Some(costs_version) = project_manifest_file.project.costs_version { - repl_settings.costs_version = costs_version; - } let project_name = project_manifest_file.project.name; let mut project_root_location = manifest_location.get_parent_location()?; @@ -140,6 +137,8 @@ impl ProjectManifest { telemetry: project_manifest_file.project.telemetry.unwrap_or(false), cache_location, boot_contracts: project_manifest_file.project.boot_contracts.unwrap_or(vec![ + "costs".to_string(), + "pox".to_string(), "pox-2".to_string(), "lockup".to_string(), "costs-2".to_string(), diff --git a/components/clarity-repl/src/bin.rs b/components/clarity-repl/src/bin.rs index ebb0bc9b6..1c6788750 100644 --- a/components/clarity-repl/src/bin.rs +++ b/components/clarity-repl/src/bin.rs @@ -34,8 +34,7 @@ fn main() { let code = args.subcommand().unwrap(); let mut settings = SessionSettings::default(); - settings.include_boot_contracts = - vec![format!("costs-v{}", settings.repl_settings.costs_version)]; + settings.include_boot_contracts = vec!["costs".into(), "costs-2".into()]; match code { Some(code_str) => { diff --git a/components/clarity-repl/src/lib.rs b/components/clarity-repl/src/lib.rs index 066516d48..b1960f7f6 100644 --- a/components/clarity-repl/src/lib.rs +++ b/components/clarity-repl/src/lib.rs @@ -58,8 +58,7 @@ pub async fn init_session() -> String { Some(session) => (session, "".to_string()), None => { let mut settings = SessionSettings::default(); - settings.include_boot_contracts = - vec![format!("costs-v{}", settings.repl_settings.costs_version)]; + settings.include_boot_contracts = vec!["costs".into(), "costs-2".into()]; let mut session = Session::new(settings); let output = session.start_wasm().await; (session, output) diff --git a/components/clarity-repl/src/repl/database/key_value_wrapper.rs b/components/clarity-repl/src/repl/database/key_value_wrapper.rs index dd34c11d5..8c0e94ff4 100644 --- a/components/clarity-repl/src/repl/database/key_value_wrapper.rs +++ b/components/clarity-repl/src/repl/database/key_value_wrapper.rs @@ -1,4 +1,5 @@ -use super::{ClarityBackingStore, ClarityDeserializable}; +use super::ClarityDeserializable; +use clarity::vm::database::ClarityBackingStore; use clarity::types::chainstate::StacksBlockId; use clarity_repl::clarity::util::hash::Sha512Trunc256Sum; use clarity::vm::errors::InterpreterResult as Result; diff --git a/components/clarity-repl/src/repl/database/marf.rs b/components/clarity-repl/src/repl/database/marf.rs index 60b78502e..6a13eb66d 100644 --- a/components/clarity-repl/src/repl/database/marf.rs +++ b/components/clarity-repl/src/repl/database/marf.rs @@ -12,56 +12,6 @@ use clarity::vm::errors::{ }; use clarity::vm::types::QualifiedContractIdentifier; -// These functions generally _do not_ return errors, rather, any errors in the underlying storage -// will _panic_. The rationale for this is that under no condition should the interpreter -// attempt to continue processing in the event of an unexpected storage error. -pub trait ClarityBackingStore { - /// put K-V data into the committed datastore - fn put_all(&mut self, items: Vec<(String, String)>); - /// fetch K-V out of the committed datastore - fn get(&mut self, key: &str) -> Option; - fn has_entry(&mut self, key: &str) -> bool { - self.get(key).is_some() - } - - /// change the current MARF context to service reads from a different chain_tip - /// used to implement time-shifted evaluation. - /// returns the previous block header hash on success - fn set_block_hash(&mut self, bhh: StacksBlockId) -> Result; - - fn get_block_at_height(&mut self, height: u32) -> Option; - - /// this function returns the current block height, as viewed by this marfed-kv structure, - /// i.e., it changes on time-shifted evaluation. the open_chain_tip functions always - /// return data about the chain tip that is currently open for writing. - fn get_current_block_height(&mut self) -> u32; - - fn get_open_chain_tip_height(&mut self) -> u32; - fn get_open_chain_tip(&mut self) -> StacksBlockId; - - /// The contract commitment is the hash of the contract, plus the block height in - /// which the contract was initialized. - fn make_contract_commitment(&mut self, contract_hash: Sha512Trunc256Sum) -> String { - let block_height = self.get_open_chain_tip_height(); - let cc = ContractCommitment { - hash: contract_hash, - block_height, - }; - cc.serialize() - } - - /// This function is used to obtain a committed contract hash, and the block header hash of the block - /// in which the contract was initialized. This data is used to store contract metadata in the side - /// store. - fn insert_metadata(&mut self, contract: &QualifiedContractIdentifier, key: &str, value: &str); - - fn get_metadata( - &mut self, - contract: &QualifiedContractIdentifier, - key: &str, - ) -> Result>; -} - pub struct ContractCommitment { pub hash: Sha512Trunc256Sum, pub block_height: u32, diff --git a/components/clarity-repl/src/repl/database/mod.rs b/components/clarity-repl/src/repl/database/mod.rs index 5d7b72891..0faa92150 100644 --- a/components/clarity-repl/src/repl/database/mod.rs +++ b/components/clarity-repl/src/repl/database/mod.rs @@ -10,5 +10,4 @@ pub use self::clarity_db::{ }; pub use self::datastore::Datastore; pub use self::key_value_wrapper::{RollbackWrapper, RollbackWrapperPersistedLog}; -pub use self::marf::ClarityBackingStore; pub use self::structures::{ClarityDeserializable, ClaritySerializable}; diff --git a/components/clarity-repl/src/repl/mod.rs b/components/clarity-repl/src/repl/mod.rs index 4dc4e67e2..10d0b02a9 100644 --- a/components/clarity-repl/src/repl/mod.rs +++ b/components/clarity-repl/src/repl/mod.rs @@ -8,6 +8,7 @@ pub mod settings; pub mod tracer; use std::convert::TryInto; +use std::fmt::Display; use std::path::PathBuf; use ::clarity::vm::types::{PrincipalData, QualifiedContractIdentifier, StandardPrincipalData}; @@ -31,6 +32,18 @@ pub struct ClarityContract { pub epoch: StacksEpochId, } +impl Display for ClarityContract { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "", + self.expect_resolved_contract_identifier(None), + self.clarity_version, + self.epoch + ) + } +} + impl ClarityContract { pub fn expect_in_memory_code_source(&self) -> &str { match self.code_source { diff --git a/components/clarity-repl/src/repl/session.rs b/components/clarity-repl/src/repl/session.rs index 01b7c2bb4..3516d756e 100644 --- a/components/clarity-repl/src/repl/session.rs +++ b/components/clarity-repl/src/repl/session.rs @@ -137,14 +137,23 @@ impl Session { .include_boot_contracts .contains(&name.to_string()) { - self.formatted_interpretation( - code.to_string(), - Some(name.to_string()), - false, - None, - None, - ) - .expect(&format!("Unable to deploy {}", name)); + let (epoch, clarity_version) = if (*name).eq("pox-2") || (*name).eq("cost-3") { + (StacksEpochId::Epoch21, ClarityVersion::Clarity2) + } else if (*name).eq("cost-2") { + (StacksEpochId::Epoch2_05, ClarityVersion::Clarity1) + } else { + (StacksEpochId::Epoch20, ClarityVersion::Clarity1) + }; + + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(code.to_string()), + name: name.to_string(), + deployer: ContractDeployer::DefaultDeployer, + clarity_version, + epoch, + }; + let _ = self.deploy_contract(&contract, None, false, None, &mut None); + // Result ignored, boot contracts are trusted to be valid } } } @@ -1229,8 +1238,7 @@ mod tests { #[test] fn evaluate_at_block() { let mut settings = SessionSettings::default(); - settings.include_boot_contracts = vec!["costs-2".into()]; - settings.repl_settings.costs_version = 2; + settings.include_boot_contracts = vec!["costs".into(), "costs-2".into()]; let mut session = Session::new(settings); session.start().expect("session could not start"); diff --git a/components/clarity-repl/src/repl/settings.rs b/components/clarity-repl/src/repl/settings.rs index abfea6aaa..181c88ee3 100644 --- a/components/clarity-repl/src/repl/settings.rs +++ b/components/clarity-repl/src/repl/settings.rs @@ -63,14 +63,12 @@ pub struct SessionSettings { #[derive(Debug, Clone, Deserialize, Serialize)] pub struct Settings { pub analysis: analysis::Settings, - pub costs_version: u32, } impl Default for Settings { fn default() -> Self { Self { analysis: analysis::Settings::default(), - costs_version: DEFAULT_COSTS_VERSION, } } } @@ -90,9 +88,6 @@ impl From for Settings { } else { analysis::Settings::default() }; - Self { - analysis, - costs_version: file.costs_version.unwrap_or(DEFAULT_COSTS_VERSION), - } + Self { analysis } } } From 3d950c502716d41c78efbee2afbd2639828aea3b Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 30 Sep 2022 12:15:43 -0400 Subject: [PATCH 10/13] fix: logs coming from canonical vm --- Cargo.lock | 34 +++--------------------------- components/clarity-repl/Cargo.toml | 5 +++-- 2 files changed, 6 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c6e5bfa0..ee2bbc386 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -960,7 +960,7 @@ dependencies = [ [[package]] name = "clarity" version = "0.0.1" -source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=5d0e4228270fef5cff74a85931d10ec95dcf2951#5d0e4228270fef5cff74a85931d10ec95dcf2951" +source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=4ddffa6da4289d14f528a7af8e5369d25290e9e7#4ddffa6da4289d14f528a7af8e5369d25290e9e7" dependencies = [ "integer-sqrt", "lazy_static", @@ -975,7 +975,6 @@ dependencies = [ "serde_json", "serde_stacker", "sha2-asm", - "slog", "stacks-common", "time 0.2.27", ] @@ -4094,7 +4093,7 @@ dependencies = [ "csv", "encode_unicode", "lazy_static", - "term 0.5.2", + "term", "unicode-width", ] @@ -5402,19 +5401,6 @@ dependencies = [ "slog", ] -[[package]] -name = "slog-term" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d29185c55b7b258b4f120eab00f48557d4d9bc814f41713f449d35b0f8977c" -dependencies = [ - "atty", - "slog", - "term 0.7.0", - "thread_local", - "time 0.3.14", -] - [[package]] name = "smallvec" version = "1.9.0" @@ -5494,7 +5480,7 @@ dependencies = [ [[package]] name = "stacks-common" version = "0.0.1" -source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=5d0e4228270fef5cff74a85931d10ec95dcf2951#5d0e4228270fef5cff74a85931d10ec95dcf2951" +source = "git+https://github.com/stacks-network/stacks-blockchain.git?rev=4ddffa6da4289d14f528a7af8e5369d25290e9e7#4ddffa6da4289d14f528a7af8e5369d25290e9e7" dependencies = [ "chrono", "curve25519-dalek", @@ -5512,9 +5498,6 @@ dependencies = [ "serde_json", "sha2 0.10.5", "sha3 0.10.5", - "slog", - "slog-json", - "slog-term", "time 0.2.27", ] @@ -6194,17 +6177,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - [[package]] name = "termcolor" version = "1.1.3" diff --git a/components/clarity-repl/Cargo.toml b/components/clarity-repl/Cargo.toml index d27cfefd2..b46a0b534 100644 --- a/components/clarity-repl/Cargo.toml +++ b/components/clarity-repl/Cargo.toml @@ -37,7 +37,8 @@ getrandom = { version = "0.2.3", features = ["js"] } rand_pcg = "0.3.1" rand_seeder = "0.2.2" atty = "0.2.14" -clarity = { git = "https://github.com/stacks-network/stacks-blockchain.git", rev = "5d0e4228270fef5cff74a85931d10ec95dcf2951", default-features = false, optional = true } +clarity = { git = "https://github.com/stacks-network/stacks-blockchain.git", rev = "4ddffa6da4289d14f528a7af8e5369d25290e9e7", default-features = false, optional = true } +# clarity = { package = "clarity", path = "../../../stacks-blockchain/clarity", default-features = false, optional = true } # DAP Debugger tokio = { version = "=1.17.0", features = ["full"], optional = true } @@ -72,7 +73,7 @@ path = "src/bin.rs" [features] default = ["cli", "dap"] -cli = ["pico-args", "rustyline", "prettytable-rs", "clarity/default"] +cli = ["pico-args", "rustyline", "prettytable-rs", "clarity/canonical", "clarity/developer-mode"] dap = [ "tokio", "tokio-util", From 85dc79ef423b0fbac611ea262ade0615b074a048 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 30 Sep 2022 12:19:31 -0400 Subject: [PATCH 11/13] chore: ignore js (linguist) --- .gitattributes | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index ad33adb2d..d0f9485f4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,7 @@ # Have linguist ignore typescript compiler sources -tsc/* linguist-vendored +components/clarinet-cli/js/* linguist-vendored +components/clarinet-cli/dts/* linguist-vendored +components/clarinet-cli/tsc/* linguist-vendored # Declare Clarity files that will always have LF line endings on checkout. *.clar text eol=lf From 0ea8f36229320a7c447a5fd9546c0bd9cd87a14b Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 30 Sep 2022 12:24:09 -0400 Subject: [PATCH 12/13] chore: fix test --- components/clarity-repl/src/repl/session.rs | 36 +++++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/components/clarity-repl/src/repl/session.rs b/components/clarity-repl/src/repl/session.rs index 3516d756e..0a8c00c98 100644 --- a/components/clarity-repl/src/repl/session.rs +++ b/components/clarity-repl/src/repl/session.rs @@ -1244,8 +1244,7 @@ mod tests { session.start().expect("session could not start"); // setup contract state - session.handle_command( - " + let snippet = " (define-data-var x uint u0) (define-read-only (get-x) @@ -1254,28 +1253,37 @@ mod tests { (define-public (incr) (begin (var-set x (+ (var-get x) u1)) - (ok (var-get x))))", - ); + (ok (var-get x))))"; + + let contract = ClarityContract { + code_source: ClarityCodeSource::ContractInMemory(snippet.to_string()), + name: "contract".to_string(), + deployer: ContractDeployer::Address("ST000000000000000000002AMW42H".into()), + clarity_version: ClarityVersion::Clarity1, + epoch: DEFAULT_EPOCH, + }; + + let _ = session.deploy_contract(&contract, None, false, None, &mut None); // assert data-var is set to 0 assert_eq!( - session.handle_command("(contract-call? .contract-2 get-x)")[0], + session.handle_command("(contract-call? .contract get-x)")[0], green!("u0") ); // advance chain tip and test at-block session.advance_chain_tip(10000); assert_eq!( - session.handle_command("(contract-call? .contract-2 get-x)")[0], + session.handle_command("(contract-call? .contract get-x)")[0], green!("u0") ); - session.handle_command("(contract-call? .contract-2 incr)"); + session.handle_command("(contract-call? .contract incr)"); assert_eq!( - session.handle_command("(contract-call? .contract-2 get-x)")[0], + session.handle_command("(contract-call? .contract get-x)")[0], green!("u1") ); - assert_eq!(session.handle_command("(at-block (unwrap-panic (get-block-info? id-header-hash u0)) (contract-call? .contract-2 get-x))")[0], green!("u0")); - assert_eq!(session.handle_command("(at-block (unwrap-panic (get-block-info? id-header-hash u5000)) (contract-call? .contract-2 get-x))")[0], green!("u0")); + assert_eq!(session.handle_command("(at-block (unwrap-panic (get-block-info? id-header-hash u0)) (contract-call? .contract get-x))")[0], green!("u0")); + assert_eq!(session.handle_command("(at-block (unwrap-panic (get-block-info? id-header-hash u5000)) (contract-call? .contract get-x))")[0], green!("u0")); // advance chain tip again and test at-block // do this twice to make sure that the lookup table is being updated properly @@ -1283,14 +1291,14 @@ mod tests { session.advance_chain_tip(10); assert_eq!( - session.handle_command("(contract-call? .contract-2 get-x)")[0], + session.handle_command("(contract-call? .contract get-x)")[0], green!("u1") ); - session.handle_command("(contract-call? .contract-2 incr)"); + session.handle_command("(contract-call? .contract incr)"); assert_eq!( - session.handle_command("(contract-call? .contract-2 get-x)")[0], + session.handle_command("(contract-call? .contract get-x)")[0], green!("u2") ); - assert_eq!(session.handle_command("(at-block (unwrap-panic (get-block-info? id-header-hash u10000)) (contract-call? .contract-2 get-x))")[0], green!("u1")); + assert_eq!(session.handle_command("(at-block (unwrap-panic (get-block-info? id-header-hash u10000)) (contract-call? .contract get-x))")[0], green!("u1")); } } From dd6cecb47d10824b2b5faf49327bd6d55bc6c189 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 30 Sep 2022 12:52:55 -0400 Subject: [PATCH 13/13] fix: remove submodule --- .gitmodules | 4 ---- README.md | 9 +-------- vendor/deno | 1 - 3 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 .gitmodules delete mode 160000 vendor/deno diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 7ba12bb28..000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "vendor/deno"] - path = vendor/deno - url = https://github.com/hirosystems/deno.git - branch = clarinet/patch-v1 diff --git a/README.md b/README.md index 703a938f7..ae617b241 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ sudo apt install build-essential pkg-config libssl-dev You can build Clarinet from source using Cargo with the following commands: ```bash -git clone https://github.com/hirosystems/clarinet.git --recursive +git clone https://github.com/hirosystems/clarinet.git cd clarinet cargo clarinet-install ``` @@ -83,13 +83,6 @@ By default, you will be in our development branch, `develop`, with code that has git checkout main ``` -If you have previously checked out the source, ensure you have the latest code (including submodules) before building using: - -``` -git pull -git submodule update --recursive -``` - ## Getting started with Clarinet The following sections describe how to create a new project in Clarinet and populate it with smart contracts. Clarinet diff --git a/vendor/deno b/vendor/deno deleted file mode 160000 index 34b91f2d8..000000000 --- a/vendor/deno +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 34b91f2d8a14acb3fc92c18548d7ba07f0c3ef97