[package] name = "grim" version = "0.3.6" authors = ["Ardocrat "] description = "Goblin: a peer-to-peer wallet for Grin. Send and receive instantly with a handle - slatepacks and the Nym mixnet handled for you." license = "Apache-2.0" repository = "https://code.gri.mw/GUI/grim" keywords = [ "crypto", "grin", "mimblewimble", "nostr" ] edition = "2024" build = "build.rs" [[bin]] name = "goblin" path = "src/main.rs" [lib] name="grim" crate-type = ["rlib"] # Desktop/CI release binaries ship stripped of debug symbols — the nym + nostr + # grin tree leaves a large symbol table that's dead weight for users (~16 MB on # Linux). opt-level stays at the default 3 for wallet/runtime speed. [profile.release] strip = true [profile.release-apk] inherits = "release" strip = true opt-level = "z" lto = true codegen-units = 1 panic = "abort" [features] ## Default build uses the Tor transport only. The `nym` feature gates the dormant ## mixnet path (src/nym/). Cargo resolves OPTIONAL deps into the graph too, so ## nym-sdk cannot merely be `optional` — it links a different libsqlite3-sys than ## arti (a native-lib `links` conflict Cargo rejects at resolution). The nym ## path-deps are therefore commented out below; the module code is retained on ## disk but building `--features nym` requires restoring them (and drops arti — ## the two transports cannot coexist in one binary, which is why Tor replaced Nym). default = [] nym = [] [dependencies] log = "0.4.27" # node grin_api = { path = "node/api" } grin_chain = { path = "node/chain" } grin_config = { path = "node/config" } grin_core = { path = "node/core" } grin_p2p = { path = "node/p2p" } grin_servers = { path = "node/servers" } grin_keychain = { path = "node/keychain" } grin_util = { path = "node/util" } # wallet grin_wallet_impls = { path = "wallet/impls" } grin_wallet_api = { path = "wallet/api"} grin_wallet_libwallet = { path = "wallet/libwallet" } grin_wallet_util = { path = "wallet/util" } grin_wallet_controller = { path = "wallet/controller" } ## ui egui = { version = "0.33.3", default-features = false } egui_extras = { version = "0.33.3", features = ["image", "svg"] } egui-async = "0.3.4" rust-i18n = "3.1.5" ## other log4rs = "1.4.0" anyhow = "1.0.97" pin-project = "1.1.10" backtrace = "0.3.76" thiserror = "2.0.18" futures = "0.3.31" dirs = "6.0.0" sys-locale = "0.3.2" chrono = "0.4.43" parking_lot = "0.12.3" lazy_static = "1.5.0" toml = "0.9.11+spec-1.1.0" serde = "1.0.228" local-ip-address = "0.6.9" url = "2.5.8" rand = "0.9.2" serde_derive = "1.0.228" serde_json = "1.0.149" tokio = { version = "1.49.0", features = ["full"] } image = "0.25.9" rqrr = "0.10.1" qrcodegen = "1.8.0" qrcode = "0.14.1" ur = "0.4.1" gif = "0.14.1" rkv = "0.20.0" usvg = "0.45.1" ring = "0.16.20" hyper = { version = "1.6.0", features = ["full"], package = "hyper" } hyper-util = { version = "0.1.19", features = ["http1", "client", "client-legacy", "tokio"] } http-body-util = "0.1.3" bytes = "1.11.0" hyper-socks2 = "0.9.1" hyper-proxy2 = "0.1.0" hyper-tls = "0.6.0" async-std = "1.13.2" uuid = { version = "0.8.2", features = ["v4"] } num-bigint = "0.4.6" ## nostr nostr-sdk = { version = "0.44", features = ["nip06", "nip44", "nip49", "nip59", "nip98"] } nostr-relay-pool = "0.44" ## NIP-44 v3 (+ v2) encryption for the NIP-17 backward-compat extension (G4). ## Now published to crates.io as v0.3.0 (the M0 deliverable, all upstream test ## vectors green) — no local sibling checkout required. secp256k1 0.31, bridged ## to nostr-sdk's 0.29 in wrapv3.rs (see the secp256k1 note below). nip44 = "0.3.0" ## Only to construct the key types the `nip44` crate takes: nostr-sdk pins ## secp256k1 0.29, the nip44 crate 0.31 — bridged via byte arrays in wrapv3.rs. secp256k1 = "0.31" async-wsocket = "0.13" tokio-tungstenite = { version = "0.26", features = ["rustls-tls-webpki-roots"] } regex = "1" base64 = "0.22" hex = "0.4" ## rustls is pulled by both our TLS (tungstenite, ring) and nym-sdk ## (aws-lc-rs); with two providers present rustls 0.23 can't auto-pick a default, ## so we install ring explicitly at startup (see lib.rs). Direct dep just to make ## `rustls::crypto::ring::default_provider()` reachable. NOTHING here may pull ## rustls-platform-verifier — it panics on Android outside a full app context. rustls = { version = "0.23", features = ["ring"] } ## TLS-over-tunnel for the mixnet HTTP client (webpki roots, never the platform ## verifier — see the rustls note above). tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] } webpki-roots = "1" ## Tor — embedded arti (the DIALING half only: connect OUT to the relay's .onion, ## and to clearnet HTTP hosts through a Tor exit). Copied from our sister wallet ## GRIM's proven, shipping engine. Two choices inherited VERBATIM from GRIM: arti ## 0.43 across the family, and the native-tls Tor runtime (TokioNativeTlsRuntime), ## NOT rustls — this deliberately sidesteps the rustls/ring crypto-provider ## conflict fought during the Nym era (our relay/HTTP rustls still uses ring, see ## lib.rs; arti's own TLS is native-tls and never touches the rustls provider). ## `static` vendors openssl (self-contained Android/cross builds, as GRIM ships); ## `onion-service-client` enables dialing .onion. We drop GRIM's `pt-client` ## (bridges) and `onion-service-service` (hosting) — Goblin only dials. arti-client = { version = "0.43.0", features = ["static", "onion-service-client"] } tor-rtcompat = { version = "0.43.0", features = ["static"] } ## Nym mixnet — DORMANT since the Tor transport swap. The mixnet path (src/nym/) ## is retained on disk but its deps are COMMENTED OUT, because arti's `tor-dirmgr` ## needs libsqlite3-sys 0.34 (rusqlite 0.36) while nym-sdk's credential-storage ## needs libsqlite3-sys 0.30 (sqlx) and BOTH link the native `sqlite3` library — ## Cargo forbids two packages linking the same native lib, and it rejects this at ## RESOLUTION even for optional/unused deps. The two transports therefore cannot ## coexist in one binary (exactly why Tor replaced Nym). To build the old path, ## restore these three deps and build `--features nym` (which then drops arti). ## Full deletion is a later phase; for now the code stays on disk for reference. ## Path deps into the local nym checkout, PINNED at rev ## f6ed17d949cc19fee0fb51db3cb65771fd510d5b ("http-api-client: preconfigured ## webpki roots on Android"). # nym-sdk = { path = "../nym/sdk/rust/nym-sdk" } # smolmix = { path = "../nym/smolmix/core" } # hickory-proto = { version = "0.26", default-features = false, features = ["std"] } ## NIP-98 payload hashing sha2 = "0.10.8" ## stratum server tokio-old = { version = "0.2", features = ["full"], package = "tokio" } tokio-util-old = { version = "0.2", features = ["codec"], package = "tokio-util" } [target.'cfg(target_os = "linux")'.dependencies] nokhwa = { version = "0.10.10", default-features = false, features = ["input-v4l"] } [target.'cfg(target_os = "windows")'.dependencies] nokhwa = { version = "0.10.10", default-features = false, features = ["input-msmf"] } [target.'cfg(target_os = "macos")'.dependencies] nokhwa = { version = "0.10.10", default-features = false, features = ["input-avfoundation", "output-threaded"] } [target.'cfg(not(target_os = "android"))'.dependencies] env_logger = "0.11.3" winit = { version = "0.30.12" } wgpu = { version = "27.0.1" } eframe = { version = "0.33.2", features = ["wgpu"] } arboard = "3.2.0" rfd = "0.17.2" interprocess = { version = "2.2.1", features = ["tokio"] } ## native-tls (via hyper-tls) uses OpenSSL only on Linux/Android. Upstream Grim ## got a vendored, statically-linked OpenSSL for free through arti's `static` ## feature; dropping arti for Nym took that with it, breaking Android/cross ## builds (no system OpenSSL for the target) and leaving desktop dynamically ## linked to libssl. Restore the vendored build for exactly those two targets so ## each is self-contained. Windows (SChannel) and macOS (Security.framework) ## don't use OpenSSL at all, so they must NOT pull it — building openssl-src ## there is both pointless and fragile (the Windows MSVC runner's bash perl is ## missing modules its Configure needs). [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] openssl = { version = "0.10", features = ["vendored"] } [target.'cfg(target_os = "android")'.dependencies] android_logger = "0.15.0" jni = "0.21.1" android-activity = { version = "0.6.0", features = ["game-activity"] } winit = { version = "0.30.12", features = ["android-game-activity"] } eframe = { version = "0.33.2", default-features = false, features = ["glow", "android-game-activity"] } [build-dependencies] built = "0.8.0" # Windows hosts only: embed the Goblin icon (wix/Product.ico) into goblin.exe via # build.rs. Not compiled on Linux/macOS/Android hosts, so other builds are # unaffected. [target.'cfg(windows)'.build-dependencies] winresource = "0.1" [dev-dependencies] nostr-sdk = { version = "0.44", features = ["nip06", "nip44", "nip49", "nip59", "nip98"] } tokio = { version = "1.49.0", features = ["full"] } base64 = "0.22" sha2 = "0.10" hex = "0.4" serde_yaml = "0.9" ## G14 transport-validation harness (tests/xrelay_smoke.rs): re-expose deps that ## already live in the main graph so the smolmix transport can be exercised and ## its tunnel/mix-dns logs captured. No new compiles — same versions unify. log = "0.4.27" env_logger = "0.11.3" rustls = { version = "0.23", features = ["ring"] }