[package]
name = "darkfi"
version = "0.4.1"
homepage = "https://dark.fi"
description = "Anonymous. Uncensored. Sovereign."
authors = ["Dyne.org foundation <foundation@dyne.org>"]
repository = "https://github.com/darkrenaissance/darkfi"
license = "AGPL-3.0-only"
edition = "2021"

[lib]
name = "darkfi"
doctest = false

#[profile.release]
#debug = true
#lto = "fat"
#codegen-units = 1

[workspace]
members = [
    "bin/zkas",
    "bin/darkfid",
    "bin/darkfid2",
    "bin/drk",
    "bin/faucetd",
    "bin/fud/fu",
    "bin/fud/fud",
    "bin/genev/genevd",
    "bin/genev/genev-cli",
    "bin/darkirc",
    #"bin/dnetview",
    "bin/tau/taud",
    "bin/tau/tau-cli",
    #"bin/darkwiki/darkwikid",
    #"bin/darkwiki/darkwiki-cli",
    "bin/dhtd/dhtd",
    "bin/vanityaddr",
    "bin/lilith",
    "bin/zktool",

    "src/sdk",
    "src/sdk/python",

    "src/serial",
    "src/serial/derive",
    "src/serial/derive-internal",

    "src/contract/test-harness",
    "src/contract/money",
    "src/contract/dao",
    "src/contract/consensus",
    "src/contract/deployooor",

    "example/dchat",
]

[dependencies]
# Hard dependencies
libc = "0.2.147"
log = "0.4.19"
thiserror = "1.0.43"

# async-runtime
async-std = {version = "1.12.0", features = ["attributes"], optional = true}
async-trait = {version = "0.1.71", optional = true}
futures = {version = "0.3.28", optional = true}
smol = {version = "1.3.0", optional = true}

# Networking
async-rustls = {version = "0.4.0", features = ["dangerous_configuration"], optional = true}
socket2 = {version = "0.5.3", optional = true, features = ["all"]}

# Pluggable Transports
arti-client = {version = "0.9.2", default-features = false, features = ["async-std", "rustls", "onion-service-client"], optional = true}
tor-hscrypto = {version = "0.3.0", optional = true}

# TLS cert utilities
ed25519-compact = {version = "2.0.4", optional = true}
rcgen = {version = "0.11.1", optional = true}
rustls-pemfile = {version = "1.0.3", optional = true}
x509-parser = {version = "0.15.0", features = ["validate", "verify"], optional = true}

# Encoding
bs58 = {version = "0.5.0", optional = true}
serde_json = {version = "1.0.100", optional = true}
serde = {version = "1.0.171", features = ["derive"], optional = true}
semver = {version = "1.0.17", optional = true}
structopt = {version= "0.3.26", optional = true}
structopt-toml = {version= "0.5.1", optional = true}
toml = {version = "0.7.6", optional = true}
# Big float high precision arithmetics
dashu = {version = "0.3.1", optional = true}

# Utilities
# TODO: check chrono usage and impl our own
chrono = {version = "0.4.26", optional = true}
darkfi-serial = {path = "src/serial", optional = true}
darkfi-derive = {path = "src/serial/derive", optional = true}
darkfi-derive-internal = {path = "src/serial/derive-internal", optional = true}
itertools = {version = "0.11.0", optional = true}
lazy_static = {version = "1.4.0", optional = true}
# TODO: Test without serde
url = {version = "2.4.0", features = ["serde"], optional = true}

# Misc
# TODO: Implement something simple and kill these deps
simplelog = {version = "0.12.1", optional = true}

# Crypto
rand = {version = "0.8.5", optional = true}
blake3 = {version = "1.4.1", features = ["rayon"], optional = true}
crypto_api_chachapoly = {version = "0.5.0", optional = true}
halo2_proofs = {version = "0.3.0", optional = true}
halo2_gadgets = {version = "0.3.0", optional = true}

# Smart contract runtime
darkfi-sdk = {path = "src/sdk", optional = true}
wasmer = {version = "4.0.0", optional = true}
wasmer-compiler-singlepass = {version = "4.0.0", optional = true}
wasmer-middlewares = {version = "4.0.0", optional = true}

# Wallet management
rusqlite = {version = "0.29.0", features = ["bundled-sqlcipher-vendored-openssl"], optional = true}
libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher-vendored-openssl"], optional = true}

# Blockchain store
sled = {version = "0.34.7", optional = true}
sled-overlay = {version = "0.0.7", optional = true}

# Temporary version lock
#curve25519-dalek = {version = "=4.0.0-rc.3", default-features = false, optional = true}

[dev-dependencies]
clap = {version = "4.3.11", features = ["derive"]}
halo2_proofs = {version = "0.3.0", features = ["dev-graph", "gadget-traces", "sanity-checks"]}
halo2_gadgets = {version = "0.3.0", features = ["test-dev-graph", "test-dependencies"]}
plotters = "0.3.5"
easy-parallel = "3.3.0"
prettytable-rs = "0.10.0"

# -----BEGIN LIBRARY FEATURES-----
[features]
p2p-transport-tcp = []
p2p-transport-tor = ["arti-client", "tor-hscrypto"]
p2p-transport-nym = []

async-runtime = [
    "async-std",
    "async-trait",
    "futures",
    "smol",
]

blockchain = [
    "blake3",
    "bs58", # <-- TODO: remove after we get rid of json for notifications
    "crypto_api_chachapoly",
    "dashu",
    "halo2_proofs",
    "lazy_static",
    "rand",
    "sled",
    "sled-overlay",
    "url",

    "async-runtime",
    "darkfi-sdk",
    "darkfi-serial/crypto",
    "net",
    "rpc",
    "tx",
    "util",
    "wallet",
    "wasm-runtime",
]

dht = [
    "blake3",
    "chrono",
    "rand",

    "async-runtime",
    "darkfi-serial",
    "darkfi-serial/collections",
    "darkfi-serial/hash",
    "net",
]

event-graph = [
    "blake3",
    "rand",

    "async-runtime",
    "darkfi-serial/hash",
    "net",
]

net = [
    "ed25519-compact",
    "async-rustls",
    "structopt",
    "structopt-toml",
    "rand",
    "rcgen",
    "rustls-pemfile",
    "x509-parser",
    "semver",
    "serde",
    "serde_json",
    "socket2",
    "url",

    "async-runtime",
    "darkfi-serial",
    "darkfi-serial/async",
    "darkfi-serial/url",
    "system",
    "util",

    "p2p-transport-tcp",
    "p2p-transport-tor",
    "p2p-transport-nym",
]

rpc = [
    "rand",
    "serde",
    "serde_json",
    "url",

    "async-runtime",
    "darkfi-serial",
    "net",
]

system = [
    "rand",

    "async-runtime",
]

tx = [
    "blake3",
    
    "async-runtime",
    "darkfi-sdk",
    "darkfi-serial",
    "zk",
]

util = [
    "simplelog",
    "serde",
    "serde_json",
    "toml",

    "darkfi-serial",
]

wallet = [
    "async-std",
    "rusqlite",

    "darkfi-serial",
    "util",
]

wasm-runtime = [
    "wasmer",
    "wasmer-compiler-singlepass",
    "wasmer-middlewares",

    "blockchain",
    "darkfi-sdk",
]

zk = [
    "halo2_proofs",
    "halo2_gadgets",
    "rand",

    "darkfi-sdk",
    "zkas",
]

zkas = [
    "itertools",

    "darkfi-serial",
]
# -----END LIBRARY FEATURES-----

[[example]]
name = "net"
path = "example/net.rs"
required-features = ["async-runtime", "net"]

[[example]]
name = "zk"
path = "example/zk.rs"
required-features = ["zk"]

[[example]]
name = "zk-inclusion-proof"
path = "example/zk-inclusion-proof.rs"
required-features = ["zk"]

[patch.crates-io]
halo2_proofs = {git="https://github.com/parazyd/halo2", branch="v3"}
halo2_gadgets = {git="https://github.com/parazyd/halo2", branch="v3"}
arti-client = {git="https://gitlab.torproject.org/tpo/core/arti", rev="77b0dc2edc93c9ad09b833b176e0f7066f017dd1"}
tor-hscrypto = {git="https://gitlab.torproject.org/tpo/core/arti", rev="77b0dc2edc93c9ad09b833b176e0f7066f017dd1"}
