[package]
# Crate metadata
name = "zebrad"
version = "1.6.1"
authors = ["Zcash Foundation <zebra@zfnd.org>"]
description = "The Zcash Foundation's independent, consensus-compatible implementation of a Zcash node"
license = "MIT OR Apache-2.0"
repository = "https://github.com/ZcashFoundation/zebra"

readme = "../README.md"
homepage = "https://zfnd.org/zebra/"
# crates.io is limited to 5 keywords and categories
keywords = ["zebra", "zcash"]
# Must be one of <https://crates.io/category_slugs>
categories = ["command-line-utilities", "cryptography::cryptocurrencies"]

# Settings that impact compilation
edition = "2021"

# Zebra is only supported on the latest stable Rust version. See the README for details.
# Any Zebra release can break compatibility with older Rust versions.
rust-version = "1.73"

# Settings that impact runtime behaviour

# make `cargo run` use `zebrad` by default
# when run in the workspace directory
default-run = "zebrad"

# `cargo release` settings
[package.metadata.release]
pre-release-replacements = [
  {file="../book/src/user/install.md", search="git checkout [a-z0-9\\.-]+", replace="git checkout v{{version}}"},
  {file="../book/src/user/install.md", search="--tag [a-z0-9\\.-]+", replace="--tag v{{version}}"},
  {file="../book/src/user/docker.md", search="--branch [a-z0-9\\.-]+", replace="--branch v{{version}}"},
]

[package.metadata.docs.rs]

# Publish Zebra's supported production and developer features on docs.rs.
# (Except for the log level features, because there are a lot of them.)
#
# <https://docs.rs/about/metadata>
features = [
    "default-release-binaries",
    "filter-reload",
    "flamegraph",
    "journald",
    "prometheus",
    "sentry",
]

[features]
# In release builds, don't compile debug logging code, to improve performance.
default = ["release_max_level_info", "progress-bar", "getblocktemplate-rpcs"]

# Default features for official ZF binary release builds
default-release-binaries = ["default", "sentry"]

# Production features that activate extra dependencies, or extra features in dependencies

# Mining RPC support
getblocktemplate-rpcs = [
    "zebra-rpc/getblocktemplate-rpcs",
    "zebra-consensus/getblocktemplate-rpcs",
    "zebra-state/getblocktemplate-rpcs",
    "zebra-node-services/getblocktemplate-rpcs",
    "zebra-chain/getblocktemplate-rpcs",
]

# Experimental internal miner support
internal-miner = [
    "thread-priority",
    "zebra-chain/internal-miner",
    # TODO: move common code into zebra-chain or zebra-node-services and remove the RPC dependency
    "zebra-rpc/internal-miner",
    "zebra-rpc/getblocktemplate-rpcs",
]

# Experimental shielded blockchain scanning
shielded-scan = ["zebra-scan"]

# Experimental elasticsearch indexing
elasticsearch = [
    "zebra-state/elasticsearch",
]

# Tracing and monitoring
sentry = ["dep:sentry"]
journald = ["tracing-journald"]
filter-reload = ["hyper"]

progress-bar = [
    "howudoin",
    "indicatif",
    "zebra-consensus/progress-bar",
    "zebra-state/progress-bar",
    "zebra-network/progress-bar",
]

prometheus = ["metrics-exporter-prometheus"]

# Production features that modify dependency behaviour

# Enable additional error debugging in release builds
error-debug = ["color-eyre/track-caller", "color-eyre/capture-spantrace"]

# Remove verbose logging at compile-time in release or all builds.
#
# Release builds are defined as "cfg(not(debug_assertions))".
# https://docs.rs/tracing/latest/tracing/level_filters/index.html#compile-time-filters
release_max_level_warn = ["tracing/release_max_level_warn", "log/release_max_level_warn"]
release_max_level_info = ["tracing/release_max_level_info", "log/release_max_level_info"]
release_max_level_debug = ["tracing/release_max_level_debug", "log/release_max_level_debug"]

max_level_warn = ["tracing/max_level_warn", "log/max_level_warn"]
max_level_info = ["tracing/max_level_info", "log/max_level_info"]
max_level_debug = ["tracing/max_level_debug", "log/max_level_debug"]

# Testing features that activate extra dependencies
flamegraph = ["tracing-flame", "inferno"]

proptest-impl = [
    "proptest",
    "proptest-derive",
    "zebra-consensus/proptest-impl",
    "zebra-state/proptest-impl",
    "zebra-network/proptest-impl",
    "zebra-chain/proptest-impl",
    "zebra-scan?/proptest-impl",
]

# Build the zebra-checkpoints utility for checkpoint generation tests
zebra-checkpoints = [
    "zebra-utils/zebra-checkpoints",
]

# The gRPC tests also need an installed lightwalletd binary
lightwalletd-grpc-tests = ["tonic-build"]

# tokio-console support
#
# To activate this feature, run:
# ```sh
# RUSTFLAGS="--cfg tokio_unstable" cargo build --no-default-features --features="tokio-console" --bin zebrad
# ```
#
# The console-subscriber is incompatible with the tracing/max_level_* features.
#
# For more details, see:
# https://github.com/tokio-rs/console/blob/main/console-subscriber/README.md#enabling-tokio-instrumentation
tokio-console = ["console-subscriber"]

# TODO: replace with environmental variables that skip the tests when not set (part of #2995)
test_sync_to_mandatory_checkpoint_mainnet = []
test_sync_to_mandatory_checkpoint_testnet = []
test_sync_past_mandatory_checkpoint_mainnet = []
test_sync_past_mandatory_checkpoint_testnet = []

[dependencies]
zebra-chain = { path = "../zebra-chain", version = "1.0.0-beta.36" }
zebra-consensus = { path = "../zebra-consensus", version = "1.0.0-beta.36" }
zebra-network = { path = "../zebra-network", version = "1.0.0-beta.36" }
zebra-node-services = { path = "../zebra-node-services", version = "1.0.0-beta.36" }
zebra-rpc = { path = "../zebra-rpc", version = "1.0.0-beta.36" }
zebra-state = { path = "../zebra-state", version = "1.0.0-beta.36" }

# Experimental shielded-scan feature
zebra-scan = { path = "../zebra-scan", version = "0.1.0-alpha.4", optional = true }

# Required for crates.io publishing, but it's only used in tests
zebra-utils = { path = "../zebra-utils", version = "1.0.0-beta.36", optional = true }

abscissa_core = "0.7.0"
clap = { version = "4.5.4", features = ["cargo"] }
chrono = { version = "0.4.38", default-features = false, features = ["clock", "std"] }
humantime-serde = "1.1.1"
indexmap = "2.2.6"
lazy_static = "1.4.0"
semver = "1.0.22"
serde = { version = "1.0.198", features = ["serde_derive"] }
toml = "0.8.11"

futures = "0.3.30"
rayon = "1.10.0"
tokio = { version = "1.37.0", features = ["time", "rt-multi-thread", "macros", "tracing", "signal"] }
tokio-stream = { version = "0.1.15", features = ["time"] }
tower = { version = "0.4.13", features = ["hedge", "limit"] }
pin-project = "1.1.5"

color-eyre = { version = "0.6.3", default-features = false, features = ["issue-url"] }
# This is a transitive dependency via color-eyre.
# Enable a feature that makes tinyvec compile much faster.
tinyvec = { version = "1.6.0", features = ["rustc_1_55"] }

thiserror = "1.0.59"

tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
tracing-appender = "0.2.3"
tracing-error = "0.2.0"
tracing-futures = "0.2.5"
tracing = "0.1.39"

metrics = "0.22.3"

dirs = "5.0.1"
atty = "0.2.14"

num-integer = "0.1.46"
rand = "0.8.5"

# prod feature internal-miner
thread-priority = { version = "1.0.0", optional = true }

# prod feature sentry
sentry = { version = "0.32.2", default-features = false, features = ["backtrace", "contexts", "reqwest", "rustls", "tracing"], optional = true }

# prod feature flamegraph
tracing-flame = { version = "0.2.0", optional = true }
inferno = { version = "0.11.19", default-features = false, optional = true }

# prod feature journald
tracing-journald = { version = "0.3.0", optional = true }

# prod feature filter-reload
hyper = { version = "0.14.28", features = ["http1", "http2", "server"], optional = true }

# prod feature prometheus
metrics-exporter-prometheus = { version = "0.14.0", default-features = false, features = ["http-listener"], optional = true }

# prod feature release_max_level_info
#
# zebrad uses tracing for logging,
# we only use `log` to set and print the static log levels in transitive dependencies
log = "0.4.21"

# prod feature progress-bar
howudoin = { version = "0.1.2", features = ["term-line"], optional = true }
indicatif = { version = "0.17.8", optional = true }

# test feature proptest-impl
proptest = { version = "1.4.0", optional = true }
proptest-derive = { version = "0.4.0", optional = true }

# test feature tokio-console
console-subscriber = { version = "0.2.0", optional = true }

[build-dependencies]
vergen = { version = "8.3.1", default-features = false, features = ["cargo", "git", "git2", "rustc"] }

# test feature lightwalletd-grpc-tests
tonic-build = { version = "0.11.0", optional = true }

[dev-dependencies]
abscissa_core = { version = "0.7.0", features = ["testing"] }
hex = "0.4.3"
hex-literal = "0.4.1"
jsonrpc-core = "18.0.0"
once_cell = "1.18.0"
regex = "1.10.4"
insta = { version = "1.38.0", features = ["json"] }

# zebra-rpc needs the preserve_order feature, it also makes test results more stable
serde_json = { version = "1.0.116", features = ["preserve_order"] }
tempfile = "3.10.1"

hyper = { version = "0.14.28", features = ["http1", "http2", "server"]}
tracing-test = { version = "0.2.4", features = ["no-env-filter"] }

tokio = { version = "1.37.0", features = ["full", "tracing", "test-util"] }
tokio-stream = "0.1.15"

# test feature lightwalletd-grpc-tests
prost = "0.12.4"
tonic = "0.11.0"

proptest = "1.4.0"
proptest-derive = "0.4.0"

# enable span traces and track caller in tests
color-eyre = { version = "0.6.3" }

zebra-chain = { path = "../zebra-chain", version = "1.0.0-beta.36", features = ["proptest-impl"] }
zebra-consensus = { path = "../zebra-consensus", version = "1.0.0-beta.36", features = ["proptest-impl"] }
zebra-network = { path = "../zebra-network", version = "1.0.0-beta.36", features = ["proptest-impl"] }
zebra-scan = { path = "../zebra-scan", version = "0.1.0-alpha.5", features = ["proptest-impl"] }
zebra-state = { path = "../zebra-state", version = "1.0.0-beta.36", features = ["proptest-impl"] }

zebra-node-services = { path = "../zebra-node-services", version = "1.0.0-beta.36", features = ["rpc-client"] }

zebra-test = { path = "../zebra-test", version = "1.0.0-beta.36" }
zebra-grpc = { path = "../zebra-grpc", version = "0.1.0-alpha.3" }

# Used by the checkpoint generation tests via the zebra-checkpoints feature
# (the binaries in this crate won't be built unless their features are enabled).
#
# Currently, we use zebra-utils/tests/build_utils_for_zebrad_tests.rs as a workaround
# to build the zebra-checkpoints utility for the zebrad acceptance tests.
#
# When `-Z bindeps` is stabilised, enable this binary dependency instead:
# https://github.com/rust-lang/cargo/issues/9096
# zebra-utils { path = "../zebra-utils", artifact = "bin:zebra-checkpoints" }
zebra-utils = { path = "../zebra-utils", version = "1.0.0-beta.36" }
