From a080c968c400d4963c405f6e9044af3ee50663b6 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 11:37:27 -0500 Subject: [PATCH 01/14] misc fixes --- main/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/main/src/main.rs b/main/src/main.rs index 5240e1b..bd01fc8 100644 --- a/main/src/main.rs +++ b/main/src/main.rs @@ -69,6 +69,7 @@ const COMMANDS: &[Binary] = &[ name: "cargo-stylus-check", apis: &[ "new", + "activate", "export-abi", "cache", "check", From b6387265ffb72f03b5bb8f4e1ce8d564ab36c031 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 11:40:39 -0500 Subject: [PATCH 02/14] check cache on unactivated --- check/src/cache.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/check/src/cache.rs b/check/src/cache.rs index 7d907e1..f850e50 100644 --- a/check/src/cache.rs +++ b/check/src/cache.rs @@ -30,6 +30,7 @@ sol! { error AlreadyCached(bytes32 codehash); error BidTooSmall(uint192 bid, uint192 min); error BidsArePaused(); + error ProgramNotActivated(); } } @@ -88,6 +89,9 @@ pub async fn cache_contract(cfg: &CacheConfig) -> Result<()> { C::BidTooSmall(_) => { bail!("Bid amount {} (wei) too small", cfg.bid.unwrap_or_default()) } + C::ProgramNotActivated(_) => { + bail!("Your Stylus contract {} is not yet activated. To activate it, use the `cargo stylus activate` subcommand", hex::encode(contract)) + } } } let verbose = cfg.common_cfg.verbose; From 2959effcb3112961d6366d2ac0f38478cf17c214 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 11:43:03 -0500 Subject: [PATCH 03/14] commentary --- check/src/deploy.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check/src/deploy.rs b/check/src/deploy.rs index f146e0b..9c5d79e 100644 --- a/check/src/deploy.rs +++ b/check/src/deploy.rs @@ -146,7 +146,7 @@ impl DeployConfig { let tx_hash = receipt.transaction_hash.debug_lavender(); greyln!("deployment tx hash: {tx_hash}"); println!( - r#"we recommend running cargo stylus cache --address={} to cache your activated contract in ArbOS. + r#"INFO: Your program is not yet part of the Stylus contract cache. We recommend running `cargo stylus cache --address={}` to cache your activated contract in ArbOS. Cached contracts benefit from cheaper calls. To read more about the Stylus contract cache, see https://docs.arbitrum.io/stylus/concepts/stylus-cache-manager"#, hex::encode(contract) From 570e7afc83c2cdbca724d8fa4bc978de7851197e Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 12:36:16 -0500 Subject: [PATCH 04/14] edits --- README.md | 19 +------------------ check/src/docker.rs | 23 +++++++---------------- 2 files changed, 8 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index bdd0228..fcca0c6 100644 --- a/README.md +++ b/README.md @@ -156,24 +156,7 @@ See `--help` for all available flags and default values. ## Verifying Stylus Contracts -**cargo stylus verify** - -Verifies that a deployed smart contract is identical to that produced by the -current project. Since Stylus smart contracts include a hash of all project -files, this additionally verifies that code comments and other files are -identical. To ensure build reproducibility, if a contract is to be verified, -it should be both deployed and verified using `cargo stylus reproducible`. - -See `--help` for all available flags and default values. - -## Reproducibly Deploying and Verifying - -**cargo stylus reproducible** - -Runs a `cargo stylus` command in a Docker container to ensure build -reproducibility. - -See `--help` for all available flags and default values. +See [here](https://hackmd.io/bpeMnrzbSvO4mohhvkrKqw) ## Deploying Non-Rust WASM Projects diff --git a/check/src/docker.rs b/check/src/docker.rs index 89a433d..a5ce9f2 100644 --- a/check/src/docker.rs +++ b/check/src/docker.rs @@ -45,15 +45,7 @@ fn create_image(version: &str) -> Result<()> { if image_exists(&name)? { return Ok(()); } - let cargo_stylus_version = env!("CARGO_PKG_VERSION"); - let cargo_stylus_version: String = cargo_stylus_version - .chars() - .filter(|c| c.is_alphanumeric() || *c == '-' || *c == '.') - .collect(); - println!( - "Building Docker image for cargo-stylus version {} and Rust toolchain {}", - cargo_stylus_version, version, - ); + println!("Building Docker image for Rust toolchain {}", version,); let mut child = Command::new("docker") .arg("build") .arg("-t") @@ -62,24 +54,23 @@ fn create_image(version: &str) -> Result<()> { .arg("-f-") .stdin(Stdio::piped()) .spawn() - .map_err(|e| eyre!("failed to execure Docker command: {e}"))?; + .map_err(|e| eyre!("failed to execute Docker command: {e}"))?; write!( child.stdin.as_mut().unwrap(), "\ FROM --platform=linux/amd64 rust:{} as builder\n\ - RUN rustup toolchain install {}-x86_64-unknown-linux-gnu - RUN rustup default {}-x86_64-unknown-linux-gnu RUN rustup target add wasm32-unknown-unknown RUN rustup target add wasm32-wasi RUN rustup target add x86_64-unknown-linux-gnu - RUN cargo install cargo-stylus-check --version {} --force - RUN cargo install cargo-stylus --version {} --force + RUN cargo install cargo-stylus-check --force + RUN cargo install cargo-stylus --force + + RUN rustup toolchain install {}-x86_64-unknown-linux-gnu + RUN rustup default {}-x86_64-unknown-linux-gnu ", RUST_BASE_IMAGE_VERSION, version, version, - cargo_stylus_version, - cargo_stylus_version, )?; child.wait().map_err(|e| eyre!("wait failed: {e}"))?; Ok(()) From ac00d0c0e92450aad66a995acd5059a410430625 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 12:53:11 -0500 Subject: [PATCH 05/14] add init command --- check/src/main.rs | 11 ++++++++++- check/src/new.rs | 39 +++++++++++++++++++++++++++++++++++++++ main/src/main.rs | 7 ++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/check/src/main.rs b/check/src/main.rs index 9f8912b..f3c3c75 100644 --- a/check/src/main.rs +++ b/check/src/main.rs @@ -34,7 +34,7 @@ struct Opts { #[derive(Parser, Debug, Clone)] enum Apis { - /// Create a new Rust project. + /// Create a new Stylus project. New { /// Project name. name: PathBuf, @@ -42,6 +42,12 @@ enum Apis { #[arg(long)] minimal: bool, }, + /// Initializes a Stylus project in the current directory. + Init { + /// Create a minimal contract. + #[arg(long)] + minimal: bool, + }, /// Export a Solidity ABI. ExportAbi { /// The output file (defaults to stdout). @@ -296,6 +302,9 @@ async fn main_impl(args: Opts) -> Result<()> { Apis::New { name, minimal } => { run!(new::new(&name, minimal), "failed to open new project"); } + Apis::Init { minimal } => { + run!(new::init(minimal), "failed to initialize project"); + } Apis::ExportAbi { json, output } => { run!(export_abi::export_abi(output, json), "failed to export abi"); } diff --git a/check/src/new.rs b/check/src/new.rs index 668df01..213dffa 100644 --- a/check/src/new.rs +++ b/check/src/new.rs @@ -29,3 +29,42 @@ pub fn new(name: &Path, minimal: bool) -> Result<()> { println!("{GREY}new project at: {}", path.to_string_lossy().mint()); Ok(()) } + +pub fn init(minimal: bool) -> Result<()> { + let current_dir = current_dir().wrap_err("no current dir")?; + let repo = if minimal { + GITHUB_TEMPLATE_REPO_MINIMAL + } else { + GITHUB_TEMPLATE_REPO + }; + + let output = sys::new_command("git") + .arg("clone") + .arg("--depth") + .arg("1") + .arg("--no-checkout") + .arg(repo) + .arg(".") + .output() + .wrap_err("git clone failed")?; + + if !output.status.success() { + bail!("git clone command failed"); + } + + let output = sys::new_command("git") + .arg("checkout") + .arg(".") + .output() + .wrap_err("git checkout failed")?; + + if !output.status.success() { + bail!("git checkout command failed"); + } + + println!( + "{GREY}initialized project in: {}", + current_dir.to_string_lossy().mint() + ); + Ok(()) +} diff --git a/main/src/main.rs b/main/src/main.rs index bd01fc8..ab9a655 100644 --- a/main/src/main.rs +++ b/main/src/main.rs @@ -28,8 +28,11 @@ struct Opts { #[derive(Parser, Debug, Clone)] enum Subcommands { #[command(alias = "n")] - /// Create a new Rust project. + /// Create a new Stylus project. New, + #[command(alias = "i")] + /// Initializes a Stylus project in the current directory. + Init, #[command(alias = "x")] /// Export a Solidity ABI. ExportAbi, @@ -69,6 +72,7 @@ const COMMANDS: &[Binary] = &[ name: "cargo-stylus-check", apis: &[ "new", + "init", "activate", "export-abi", "cache", @@ -76,6 +80,7 @@ const COMMANDS: &[Binary] = &[ "deploy", "verify", "a", + "i", "n", "x", "c", From 49456b4b9483f1a3184cb2a28dbff30414449399 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 13:59:36 -0500 Subject: [PATCH 06/14] use cargo stylus base --- check/src/docker.rs | 10 ++-------- check/src/new.rs | 11 ----------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/check/src/docker.rs b/check/src/docker.rs index a5ce9f2..fa45af9 100644 --- a/check/src/docker.rs +++ b/check/src/docker.rs @@ -58,17 +58,11 @@ fn create_image(version: &str) -> Result<()> { write!( child.stdin.as_mut().unwrap(), "\ - FROM --platform=linux/amd64 rust:{} as builder\n\ - RUN rustup target add wasm32-unknown-unknown - RUN rustup target add wasm32-wasi - RUN rustup target add x86_64-unknown-linux-gnu - RUN cargo install cargo-stylus-check --force - RUN cargo install cargo-stylus --force - + FROM --platform=linux/amd64 rauljordan2020/cargo-stylus-base as base RUN rustup toolchain install {}-x86_64-unknown-linux-gnu RUN rustup default {}-x86_64-unknown-linux-gnu + RUN rustup target add wasm32-unknown-unknown ", - RUST_BASE_IMAGE_VERSION, version, version, )?; diff --git a/check/src/new.rs b/check/src/new.rs index 213dffa..7fe0e1c 100644 --- a/check/src/new.rs +++ b/check/src/new.rs @@ -42,7 +42,6 @@ pub fn init(minimal: bool) -> Result<()> { .arg("clone") .arg("--depth") .arg("1") - .arg("--no-checkout") .arg(repo) .arg(".") .output() @@ -52,16 +51,6 @@ pub fn init(minimal: bool) -> Result<()> { bail!("git clone command failed"); } - let output = sys::new_command("git") - .arg("checkout") - .arg(".") - .output() - .wrap_err("git checkout failed")?; - - if !output.status.success() { - bail!("git checkout command failed"); - } - println!( "{GREY}initialized project in: {}", current_dir.to_string_lossy().mint() From be23da64574fb1beb48ae79855df658da42559ec Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 14:02:22 -0500 Subject: [PATCH 07/14] base rust --- check/src/constants.rs | 5 ----- check/src/docker.rs | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/check/src/constants.rs b/check/src/constants.rs index b923821..935d9b9 100644 --- a/check/src/constants.rs +++ b/check/src/constants.rs @@ -43,8 +43,3 @@ pub const PROJECT_HASH_SECTION_NAME: &str = "project_hash"; /// Name of the toolchain file used to specify the Rust toolchain version for a project. pub const TOOLCHAIN_FILE_NAME: &str = "rust-toolchain.toml"; - -/// Base Rust image version to be used for reproducible builds. This simply installs cargo and the Rust -/// compiler, but the user will specify the exact version of the Rust toolchain to use for building within -/// the docker container. -pub const RUST_BASE_IMAGE_VERSION: &str = "1.79.0"; diff --git a/check/src/docker.rs b/check/src/docker.rs index fa45af9..5538e05 100644 --- a/check/src/docker.rs +++ b/check/src/docker.rs @@ -8,7 +8,7 @@ use std::process::{Command, Stdio}; use cargo_stylus_util::color::Color; use eyre::{bail, eyre, Result}; -use crate::constants::{RUST_BASE_IMAGE_VERSION, TOOLCHAIN_FILE_NAME}; +use crate::constants::TOOLCHAIN_FILE_NAME; use crate::macros::greyln; use crate::project::extract_toolchain_channel; From 0b9ef0cce73be33e2c6e92a8fcabe1420ec684ef Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 17:11:15 -0500 Subject: [PATCH 08/14] misc fixes --- check/src/project.rs | 12 ++++++------ replay/src/main.rs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/check/src/project.rs b/check/src/project.rs index ee327ec..160bedd 100644 --- a/check/src/project.rs +++ b/check/src/project.rs @@ -57,9 +57,9 @@ pub fn build_dylib(cfg: BuildConfig) -> Result { let mut cmd = sys::new_command("cargo"); - if !cfg.stable { - cmd.arg("+nightly"); - } + // if !cfg.stable { + // cmd.arg("+nightly"); + // } cmd.arg("build"); cmd.arg("--lib"); @@ -208,9 +208,9 @@ pub fn extract_toolchain_channel(toolchain_file_path: &PathBuf) -> Result, cfg: BuildConfig) -> Result<[u8; 32]> { let mut keccak = Keccak::v256(); let mut cmd = Command::new("cargo"); - if !cfg.stable { - cmd.arg("+nightly"); - } + // if !cfg.stable { + // cmd.arg("+nightly"); + // } cmd.arg("--version"); let output = cmd .output() diff --git a/replay/src/main.rs b/replay/src/main.rs index e74b465..1efcea5 100644 --- a/replay/src/main.rs +++ b/replay/src/main.rs @@ -173,7 +173,7 @@ pub fn build_so(path: &Path, stable: bool) -> Result<()> { let mut cargo = sys::new_command("cargo"); if !stable { - cargo.arg("+nightly"); + // cargo.arg("+nightly"); } cargo .current_dir(path) From 985bc7d34dca9bfded4d6176be5133945e88b747 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Mon, 12 Aug 2024 17:27:03 -0500 Subject: [PATCH 09/14] fix up docker --- check/src/docker.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/check/src/docker.rs b/check/src/docker.rs index 5538e05..9367f48 100644 --- a/check/src/docker.rs +++ b/check/src/docker.rs @@ -62,9 +62,11 @@ fn create_image(version: &str) -> Result<()> { RUN rustup toolchain install {}-x86_64-unknown-linux-gnu RUN rustup default {}-x86_64-unknown-linux-gnu RUN rustup target add wasm32-unknown-unknown + RUN rustup component add rust-src --toolchain {}-x86_64-unknown-linux-gnu ", version, version, + version, )?; child.wait().map_err(|e| eyre!("wait failed: {e}"))?; Ok(()) From acc87399dc56bbce3f60afdcd623eac1490765cf Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Tue, 13 Aug 2024 09:59:49 -0500 Subject: [PATCH 10/14] better error --- check/src/check.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/check/src/check.rs b/check/src/check.rs index 0716e62..e315d03 100644 --- a/check/src/check.rs +++ b/check/src/check.rs @@ -210,6 +210,12 @@ async fn contract_exists(codehash: B256, provider: &Provider) -> Result { + if outs.is_empty() { + bail!( + r#"No data returned from the ArbWasm precompile when checking if your Stylus contract exists. +Perhaps the Arbitrum node for the endpoint you are connecting to has not yet upgraded to Stylus"# + ); + } let ArbWasm::codehashVersionReturn { version } = ArbWasm::codehashVersionCall::abi_decode_returns(&outs, true)?; version From f3526b9b3da41ed9a7d697b4afb899916533c007 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Tue, 13 Aug 2024 10:02:39 -0500 Subject: [PATCH 11/14] cargo stylus check no docker --- check/Dockerfile | 7 ------- check/src/main.rs | 40 ++++++++++++---------------------------- 2 files changed, 12 insertions(+), 35 deletions(-) delete mode 100644 check/Dockerfile diff --git a/check/Dockerfile b/check/Dockerfile deleted file mode 100644 index cea0606..0000000 --- a/check/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM rust:1.71 as builder -COPY . . -RUN cargo build --release - -FROM debian:buster-slim -COPY --from=builder ./target/release/cargo-stylus ./target/release/cargo-stylus -CMD ["/target/release/cargo-stylus"] \ No newline at end of file diff --git a/check/src/main.rs b/check/src/main.rs index f3c3c75..fc08372 100644 --- a/check/src/main.rs +++ b/check/src/main.rs @@ -133,10 +133,6 @@ pub struct CheckConfig { /// Where to deploy and activate the contract (defaults to a random address). #[arg(long)] contract_address: Option, - /// If specified, will not run the command in a reproducible docker container. Useful for local - /// builds, but at the risk of not having a reproducible contract for verification purposes. - #[arg(long)] - no_verify: bool, } #[derive(Args, Clone, Debug)] @@ -149,6 +145,10 @@ struct DeployConfig { /// Only perform gas estimation. #[arg(long)] estimate_gas: bool, + /// If specified, will not run the command in a reproducible docker container. Useful for local + /// builds, but at the risk of not having a reproducible contract for verification purposes. + #[arg(long)] + no_verify: bool, } #[derive(Args, Clone, Debug)] @@ -212,7 +212,7 @@ impl fmt::Display for CheckConfig { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "{} {} {} {}", + "{} {} {}", self.common_cfg, match &self.wasm_file { Some(path) => format!("--wasm-file={}", path.display()), @@ -222,10 +222,6 @@ impl fmt::Display for CheckConfig { Some(addr) => format!("--contract-address={:?}", addr), None => "".to_string(), }, - match self.no_verify { - true => "--no-verify".to_string(), - false => "".to_string(), - }, ) } } @@ -234,13 +230,17 @@ impl fmt::Display for DeployConfig { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "{} {} {}", + "{} {} {} {}", self.check_config, self.auth, match self.estimate_gas { true => "--estimate-gas".to_string(), false => "".to_string(), }, + match self.no_verify { + true => "--no-verify".to_string(), + false => "".to_string(), + }, ) } } @@ -318,26 +318,10 @@ async fn main_impl(args: Opts) -> Result<()> { run!(cache::cache_contract(&config).await, "stylus cache failed"); } Apis::Check(config) => { - if config.no_verify { - run!(check::check(&config).await, "stylus checks failed"); - } else { - let mut commands: Vec = - vec![String::from("check"), String::from("--no-verify")]; - let config_args = config - .to_string() - .split(' ') - .map(|s| s.to_string()) - .filter(|s| !s.is_empty()) - .collect::>(); - commands.extend(config_args); - run!( - docker::run_reproducible(&commands), - "failed reproducible run" - ); - } + run!(check::check(&config).await, "stylus checks failed"); } Apis::Deploy(config) => { - if config.check_config.no_verify { + if config.no_verify { run!(deploy::deploy(config).await, "stylus deploy failed"); } else { let mut commands: Vec = From cb7e29b2bf0b5e89485cb9158b3706b759d50b6d Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Tue, 13 Aug 2024 10:03:51 -0500 Subject: [PATCH 12/14] edit --- check/src/project.rs | 7 ------- check/src/verify.rs | 1 - replay/src/main.rs | 7 ++----- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/check/src/project.rs b/check/src/project.rs index 160bedd..8ea07ab 100644 --- a/check/src/project.rs +++ b/check/src/project.rs @@ -57,10 +57,6 @@ pub fn build_dylib(cfg: BuildConfig) -> Result { let mut cmd = sys::new_command("cargo"); - // if !cfg.stable { - // cmd.arg("+nightly"); - // } - cmd.arg("build"); cmd.arg("--lib"); @@ -208,9 +204,6 @@ pub fn extract_toolchain_channel(toolchain_file_path: &PathBuf) -> Result, cfg: BuildConfig) -> Result<[u8; 32]> { let mut keccak = Keccak::v256(); let mut cmd = Command::new("cargo"); - // if !cfg.stable { - // cmd.arg("+nightly"); - // } cmd.arg("--version"); let output = cmd .output() diff --git a/check/src/verify.rs b/check/src/verify.rs index 9c55f8b..2cc0084 100644 --- a/check/src/verify.rs +++ b/check/src/verify.rs @@ -54,7 +54,6 @@ pub async fn verify(cfg: VerifyConfig) -> eyre::Result<()> { common_cfg: cfg.common_cfg.clone(), wasm_file: None, contract_address: None, - no_verify: cfg.no_verify, }; let _ = check::check(&check_cfg) .await diff --git a/replay/src/main.rs b/replay/src/main.rs index 1efcea5..79fd1da 100644 --- a/replay/src/main.rs +++ b/replay/src/main.rs @@ -147,7 +147,7 @@ async fn replay(args: ReplayArgs) -> Result<()> { let provider = sys::new_provider(&args.endpoint)?; let trace = Trace::new(provider, args.tx).await?; - build_so(&args.project, args.stable_rust)?; + build_so(&args.project)?; let so = find_so(&args.project)?; // TODO: don't assume the contract is top-level @@ -169,12 +169,9 @@ async fn replay(args: ReplayArgs) -> Result<()> { Ok(()) } -pub fn build_so(path: &Path, stable: bool) -> Result<()> { +pub fn build_so(path: &Path) -> Result<()> { let mut cargo = sys::new_command("cargo"); - if !stable { - // cargo.arg("+nightly"); - } cargo .current_dir(path) .arg("build") From 6629e44fc90854a8321ef738a2f9130f8b21ac78 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Thu, 15 Aug 2024 17:32:49 -0500 Subject: [PATCH 13/14] use proper image --- check/src/docker.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check/src/docker.rs b/check/src/docker.rs index 9367f48..fa96700 100644 --- a/check/src/docker.rs +++ b/check/src/docker.rs @@ -58,7 +58,7 @@ fn create_image(version: &str) -> Result<()> { write!( child.stdin.as_mut().unwrap(), "\ - FROM --platform=linux/amd64 rauljordan2020/cargo-stylus-base as base + FROM --platform=linux/amd64 offchainlabs/cargo-stylus-base as base RUN rustup toolchain install {}-x86_64-unknown-linux-gnu RUN rustup default {}-x86_64-unknown-linux-gnu RUN rustup target add wasm32-unknown-unknown From 10d27fa8bd4ba7a602269b30a5d1fe3dbc5d14c0 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Thu, 15 Aug 2024 17:53:06 -0500 Subject: [PATCH 14/14] comment --- check/src/main.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/check/src/main.rs b/check/src/main.rs index fc08372..848bf93 100644 --- a/check/src/main.rs +++ b/check/src/main.rs @@ -324,6 +324,10 @@ async fn main_impl(args: Opts) -> Result<()> { if config.no_verify { run!(deploy::deploy(config).await, "stylus deploy failed"); } else { + println!( + "Running in a Docker container for reproducibility, this may take a while", + ); + println!("NOTE: You can opt out by doing --no-verify"); let mut commands: Vec = vec![String::from("deploy"), String::from("--no-verify")]; let config_args = config @@ -343,6 +347,9 @@ async fn main_impl(args: Opts) -> Result<()> { if config.no_verify { run!(verify::verify(config).await, "failed to verify"); } else { + println!( + "Running in a Docker container for reproducibility, this may take a while", + ); let mut commands: Vec = vec![String::from("verify"), String::from("--no-verify")]; let config_args = config