From 954eb92fda970a328c15376a473cafc8f5d2d0c9 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 13 May 2026 15:35:19 +0200 Subject: [PATCH] feat(key-wallet,key-wallet-manager): add serde derives for AssetLockFundingType and DerivedAddress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expose optional serde Serialize/Deserialize on two types so downstream consumers can drop hand-rolled adapters: * `key_wallet::wallet::managed_wallet_info::asset_lock_builder::AssetLockFundingType` (enum) — derives are gated on the existing `serde` feature. * `key_wallet_manager::DerivedAddress` (struct) — `key-wallet-manager` previously had no `serde` feature, so this adds one wired to `key-wallet/serde` and `dashcore/serde`. The struct's `public_key` field is `dashcore::PublicKey`, which already implements serde under the `dashcore/serde` feature, so no custom adapter is needed. Motivation: dashpay/platform PR #3637 (rs-platform-wallet serde support) currently works around the missing derives with a custom `serde_adapters::asset_lock_funding_type` module and a `#[serde(skip)]` on a `PlatformAddressChangeSet::addresses_derived` field. Once this lands, both workarounds become deletable. Round-trip test (`derived_address_serde_json_roundtrip`) locks down the JSON wire shape for `DerivedAddress` so future regressions are caught. Co-Authored-By: Claude Opus 4.7 (1M context) --- key-wallet-manager/Cargo.toml | 2 ++ key-wallet-manager/src/events.rs | 1 + key-wallet/src/wallet/managed_wallet_info/asset_lock_builder.rs | 1 + 3 files changed, 4 insertions(+) diff --git a/key-wallet-manager/Cargo.toml b/key-wallet-manager/Cargo.toml index dd0b68849..4eb5f181b 100644 --- a/key-wallet-manager/Cargo.toml +++ b/key-wallet-manager/Cargo.toml @@ -10,6 +10,7 @@ license = "CC0-1.0" [features] default = [] parallel-filters = ["dep:rayon"] +serde = ["dep:serde", "key-wallet/serde", "dashcore/serde"] bincode = ["key-wallet/bincode", "dep:bincode"] test-utils = ["key-wallet/test-utils"] bls = ["key-wallet/bls"] @@ -31,6 +32,7 @@ tracing = "0.1" zeroize = { version = "1.8", features = ["derive"] } rayon = { version = "1.11", optional = true } bincode = { version = "2.0.1", optional = true } +serde = { version = "1.0", default-features = false, features = ["derive"], optional = true } [dev-dependencies] key-wallet = { path = "../key-wallet", features = ["test-utils", "bincode"] } diff --git a/key-wallet-manager/src/events.rs b/key-wallet-manager/src/events.rs index 0080b3979..998cf991a 100644 --- a/key-wallet-manager/src/events.rs +++ b/key-wallet-manager/src/events.rs @@ -29,6 +29,7 @@ use crate::WalletId; /// stand-alone event) is what lets consumers store /// `Wallet → Account → CoreAddress → Txo` without breaking the /// `CoreAddress` link for UTXOs landing on freshly derived addresses. +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct DerivedAddress { /// The account that derived this address. diff --git a/key-wallet/src/wallet/managed_wallet_info/asset_lock_builder.rs b/key-wallet/src/wallet/managed_wallet_info/asset_lock_builder.rs index 27e1ecd31..8f8fa9bb5 100644 --- a/key-wallet/src/wallet/managed_wallet_info/asset_lock_builder.rs +++ b/key-wallet/src/wallet/managed_wallet_info/asset_lock_builder.rs @@ -20,6 +20,7 @@ use crate::wallet::Wallet; use crate::DerivationPath; /// Which funding account to derive the one-time key from. +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum AssetLockFundingType { /// Identity registration: m/9'/coinType'/5'/0'/index'