myc

Self-custodial remote signer for Radroots apps
git clone https://radroots.dev/git/myc.git
Log | Files | Refs | README | LICENSE

commit 514d65efbc7f26bd80e723de617db558b8cb972d
parent da9af49ed74d64ca3f419493976cda1eb15c9773
Author: triesap <tyson@radroots.org>
Date:   Sat, 18 Jul 2026 11:27:26 +0000

build: bind Myc to alpha event contract

- exact-pin every direct Radroots dependency to the 1.0.0-alpha.1 public contract
- refresh the lockfile for the shared Blossom, event, identity, signer, and runtime graph
- replace implicit SDK dereferencing with explicit notification and relay-probe interoperability
- preserve NIP-46 custody behavior through strict checks, Clippy, and the deterministic full suite

Diffstat:
MCargo.lock | 54+++++++++++++++++++++++++++++++++++++++---------------
MCargo.toml | 18+++++++++---------
Msrc/discovery.rs | 2++
Msrc/operability/mod.rs | 2++
Msrc/transport/nip46.rs | 3++-
5 files changed, 54 insertions(+), 25 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1282,6 +1282,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] name = "js-sys" version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1419,6 +1425,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] +name = "mediatype" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120fa187be19d9962f0926633453784691731018a2bf936ddb4e29101b79c4a7" + +[[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1866,8 +1878,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] +name = "radroots_blossom" +version = "1.0.0-alpha.1" +dependencies = [ + "mediatype", + "serde", + "sha2", + "url", +] + +[[package]] name = "radroots_core" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "rust_decimal", "rust_decimal_macros", @@ -1876,18 +1898,21 @@ dependencies = [ [[package]] name = "radroots_event" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "hex", + "jiff-tzdb", + "radroots_blossom", "radroots_core", "serde", "serde_json", "sha2", + "url", ] [[package]] name = "radroots_event_codec" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "radroots_core", "radroots_event", @@ -1895,10 +1920,9 @@ dependencies = [ [[package]] name = "radroots_identity" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "nostr", - "radroots_event", "radroots_protected_store", "radroots_runtime", "radroots_runtime_paths", @@ -1911,7 +1935,7 @@ dependencies = [ [[package]] name = "radroots_log" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "chrono", "serde_json", @@ -1923,7 +1947,7 @@ dependencies = [ [[package]] name = "radroots_nostr" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "nostr", "nostr-sdk", @@ -1937,7 +1961,7 @@ dependencies = [ [[package]] name = "radroots_nostr_accounts" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "radroots_identity", "radroots_nostr_signer", @@ -1952,7 +1976,7 @@ dependencies = [ [[package]] name = "radroots_nostr_connect" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "nostr", "serde", @@ -1963,7 +1987,7 @@ dependencies = [ [[package]] name = "radroots_nostr_signer" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "hex", "nostr", @@ -1982,7 +2006,7 @@ dependencies = [ [[package]] name = "radroots_protected_store" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "chacha20poly1305", "getrandom 0.2.17", @@ -1994,7 +2018,7 @@ dependencies = [ [[package]] name = "radroots_runtime" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "anyhow", "chacha20poly1305", @@ -2016,7 +2040,7 @@ dependencies = [ [[package]] name = "radroots_runtime_paths" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "serde", "thiserror 1.0.69", @@ -2024,14 +2048,14 @@ dependencies = [ [[package]] name = "radroots_secret_vault" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "keyring", ] [[package]] name = "radroots_sql_core" -version = "0.1.0-alpha.2" +version = "1.0.0-alpha.1" dependencies = [ "chrono", "futures-executor", diff --git a/Cargo.toml b/Cargo.toml @@ -19,15 +19,15 @@ chacha20poly1305 = "0.10" clap = { version = "4.5", features = ["derive"] } getrandom = "0.2" nostr = { version = "0.44.2", features = ["nip04", "nip44", "nip46"] } -radroots_identity = { path = "../lib/crates/identity" } -radroots_log = { path = "../lib/crates/log" } -radroots_nostr_accounts = { path = "../lib/crates/nostr_accounts", default-features = false, features = ["std", "memory-vault", "os-keyring"] } -radroots_nostr = { path = "../lib/crates/nostr", features = ["client", "events"] } -radroots_nostr_connect = { path = "../lib/crates/nostr_connect" } -radroots_nostr_signer = { path = "../lib/crates/nostr_signer", features = ["native"] } -radroots_runtime_paths = { path = "../lib/crates/runtime_paths" } -radroots_secret_vault = { path = "../lib/crates/secret_vault", features = ["std", "os-keyring"] } -radroots_sql_core = { path = "../lib/crates/sql_core", features = ["native"] } +radroots_identity = { version = "=1.0.0-alpha.1", path = "../lib/crates/identity" } +radroots_log = { version = "=1.0.0-alpha.1", path = "../lib/crates/log" } +radroots_nostr_accounts = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr_accounts", default-features = false, features = ["std", "memory-vault", "os-keyring"] } +radroots_nostr = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr", features = ["client", "events"] } +radroots_nostr_connect = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr_connect" } +radroots_nostr_signer = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr_signer", features = ["native"] } +radroots_runtime_paths = { version = "=1.0.0-alpha.1", path = "../lib/crates/runtime_paths" } +radroots_secret_vault = { version = "=1.0.0-alpha.1", path = "../lib/crates/secret_vault", features = ["std", "os-keyring"] } +radroots_sql_core = { version = "=1.0.0-alpha.1", path = "../lib/crates/sql_core", features = ["native"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" thiserror = "2.0" diff --git a/src/discovery.rs b/src/discovery.rs @@ -1436,6 +1436,8 @@ async fn fetch_live_nip89_events_for_relay( let client = context.app_identity().nostr_client(); let _ = client.add_relay(relay.as_str()).await?; client + .clone() + .into_inner() .try_connect_relay( relay.as_str(), Duration::from_secs(context.connect_timeout_secs()), diff --git a/src/operability/mod.rs b/src/operability/mod.rs @@ -1382,6 +1382,8 @@ async fn probe_relay( .map_err(MycError::from)?; match client + .clone() + .into_inner() .try_connect_relay(relay.as_str(), Duration::from_secs(connect_timeout_secs)) .await { diff --git a/src/transport/nip46.rs b/src/transport/nip46.rs @@ -374,7 +374,8 @@ impl MycNip46Service { self.transport.connect().await?; let filter = self.handler.filter()?; - let mut notifications = self.transport.client().notifications(); + let sdk_client = self.transport.client().clone().into_inner(); + let mut notifications = sdk_client.notifications(); let subscription = self.transport.client().subscribe(filter, None).await?; let mut replay_guard = MycNip46ReplayGuard::new(NIP46_REPLAY_CACHE_CAPACITY); tracing::info!(