Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions dash-spv-ffi/FFI_API.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Functions: 3

| Function | Description | Module |
|----------|-------------|--------|
| `dash_spv_ffi_client_broadcast_transaction` | No description | broadcast |
| `dash_spv_ffi_client_broadcast_transaction` | Broadcasts a transaction to the Dash network via connected peers | broadcast |
| `dash_spv_ffi_unconfirmed_transaction_destroy` | Destroys an FFIUnconfirmedTransaction and all its associated resources #... | types |
| `dash_spv_ffi_unconfirmed_transaction_destroy_raw_tx` | Destroys the raw transaction bytes allocated for an FFIUnconfirmedTransaction... | types |

Expand Down Expand Up @@ -254,7 +254,7 @@ dash_spv_ffi_config_add_peer(config: *mut FFIClientConfig, addr: *const c_char,)
```

**Description:**
Adds a peer address to the configuration Accepts either a full socket address (e.g., "192.168.1.1:9999" or "[::1]:19999") or an IP-only string (e.g., "127.0.0.1" or "2001:db8::1"). When an IP-only string is given, the default P2P port for the configured network is used. # Safety - `config` must be a valid pointer to an FFIClientConfig created by dash_spv_ffi_config_new/mainnet/testnet - `addr` must be a valid null-terminated C string containing a socket address or IP-only string - The caller must ensure both pointers remain valid for the duration of this call
Adds a peer address to the configuration Accepts either a full socket address (e.g., `192.168.1.1:9999` or `[::1]:19999`) or an IP-only string (e.g., "127.0.0.1" or "2001:db8::1"). When an IP-only string is given, the default P2P port for the configured network is used. # Safety - `config` must be a valid pointer to an FFIClientConfig created by dash_spv_ffi_config_new/mainnet/testnet - `addr` must be a valid null-terminated C string containing a socket address or IP-only string - The caller must ensure both pointers remain valid for the duration of this call

**Safety:**
- `config` must be a valid pointer to an FFIClientConfig created by dash_spv_ffi_config_new/mainnet/testnet - `addr` must be a valid null-terminated C string containing a socket address or IP-only string - The caller must ensure both pointers remain valid for the duration of this call
Expand Down Expand Up @@ -785,6 +785,12 @@ Destroys the addresses array allocated for an FFIUnconfirmedTransaction # Safet
dash_spv_ffi_client_broadcast_transaction(client: *mut FFIDashSpvClient, tx_hex: *const c_char,) -> i32
```

**Description:**
Broadcasts a transaction to the Dash network via connected peers. # Safety - `client` must be a valid, non-null pointer to an initialized FFIDashSpvClient - `tx_hex` must be a valid, non-null pointer to a NUL-terminated C string containing a hex-encoded serialized transaction

**Safety:**
- `client` must be a valid, non-null pointer to an initialized FFIDashSpvClient - `tx_hex` must be a valid, non-null pointer to a NUL-terminated C string containing a hex-encoded serialized transaction

**Module:** `broadcast`

---
Expand Down
11 changes: 10 additions & 1 deletion dash-spv-ffi/include/dash_spv_ffi.h
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ int32_t dash_spv_ffi_config_set_max_peers(struct FFIClientConfig *config,
/**
* Adds a peer address to the configuration
*
* Accepts either a full socket address (e.g., "192.168.1.1:9999" or "[::1]:19999")
* Accepts either a full socket address (e.g., `192.168.1.1:9999` or `[::1]:19999`)
* or an IP-only string (e.g., "127.0.0.1" or "2001:db8::1"). When an IP-only
* string is given, the default P2P port for the configured network is used.
*
Expand Down Expand Up @@ -992,6 +992,15 @@ int32_t dash_spv_ffi_init_logging(const char *level,

void dash_spv_ffi_enable_test_mode(void) ;

/**
* Broadcasts a transaction to the Dash network via connected peers.
*
* # Safety
*
* - `client` must be a valid, non-null pointer to an initialized FFIDashSpvClient
* - `tx_hex` must be a valid, non-null pointer to a NUL-terminated C string
* containing a hex-encoded serialized transaction
*/

int32_t dash_spv_ffi_client_broadcast_transaction(struct FFIDashSpvClient *client,
const char *tx_hex)
Expand Down
7 changes: 7 additions & 0 deletions dash-spv-ffi/src/broadcast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ use crate::{null_check, set_last_error, FFIDashSpvClient, FFIErrorCode};
use std::ffi::CStr;
use std::os::raw::c_char;

/// Broadcasts a transaction to the Dash network via connected peers.
///
/// # Safety
///
/// - `client` must be a valid, non-null pointer to an initialized FFIDashSpvClient
/// - `tx_hex` must be a valid, non-null pointer to a NUL-terminated C string
/// containing a hex-encoded serialized transaction
#[no_mangle]
pub unsafe extern "C" fn dash_spv_ffi_client_broadcast_transaction(
client: *mut FFIDashSpvClient,
Expand Down
2 changes: 1 addition & 1 deletion dash-spv-ffi/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ pub unsafe extern "C" fn dash_spv_ffi_config_set_max_peers(

/// Adds a peer address to the configuration
///
/// Accepts either a full socket address (e.g., "192.168.1.1:9999" or "[::1]:19999")
/// Accepts either a full socket address (e.g., `192.168.1.1:9999` or `[::1]:19999`)
/// or an IP-only string (e.g., "127.0.0.1" or "2001:db8::1"). When an IP-only
/// string is given, the default P2P port for the configured network is used.
///
Expand Down
4 changes: 2 additions & 2 deletions dash-spv/src/client/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ pub struct DashSpvClient<W: WalletInterface, N: NetworkManager, S: StorageManage
///
/// # Architectural Design
///
/// The sync manager is stored as a non-shared field (not wrapped in Arc<Mutex<T>>)
/// The sync manager is stored as a non-shared field (not wrapped in `Arc<Mutex<T>>`)
/// for the following reasons:
///
/// 1. **Single Owner Pattern**: The sync manager is exclusively owned by the client,
Expand All @@ -126,7 +126,7 @@ pub struct DashSpvClient<W: WalletInterface, N: NetworkManager, S: StorageManage
///
/// If concurrent access becomes necessary (e.g., for monitoring sync progress from
/// multiple threads), consider:
/// - Using interior mutability patterns (Arc<Mutex<SyncManager>>)
/// - Using interior mutability patterns (`Arc<Mutex<SyncManager>>`)
/// - Extracting read-only state into a separate shared structure
/// - Implementing a message-passing architecture for sync commands
///
Expand Down
10 changes: 5 additions & 5 deletions dash-spv/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@
//! ## Lock Ordering (CRITICAL - Prevents Deadlocks)
//!
//! When acquiring multiple locks, ALWAYS use this order:
//! 1. running (Arc<RwLock<bool>>)
//! 2. state (Arc<RwLock<ChainState>>)
//! 3. stats (Arc<RwLock<SpvStats>>)
//! 4. mempool_state (Arc<RwLock<MempoolState>>)
//! 5. storage (Arc<Mutex<S>>)
//! 1. running (`Arc<RwLock<bool>>`)
//! 2. state (`Arc<RwLock<ChainState>>`)
//! 3. stats (`Arc<RwLock<SpvStats>>`)
//! 4. mempool_state (`Arc<RwLock<MempoolState>>`)
//! 5. storage (`Arc<Mutex<S>>`)
//!
//! Never acquire locks in reverse order or deadlock will occur!

Expand Down
2 changes: 1 addition & 1 deletion dash-spv/src/logging.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ pub fn init_console_logging(level: LevelFilter) -> LoggingResult<LoggingGuard> {
/// Note: If neither console nor file output is enabled, logging is disabled
/// (tracing macros become no-ops) and Ok is returned.
///
/// # Example
/// # Examples
///
/// ```no_run
/// use dash_spv::logging::{init_logging, LoggingConfig, LogFileConfig};
Expand Down
2 changes: 1 addition & 1 deletion dash-spv/src/sync/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ impl<
/// - `filters_downloaded`: Should be calculated from storage
/// - `last_synced_filter_height`: Should be queried from storage
///
/// # Example
/// # Examples
/// ```ignore
/// let mut progress = sync_manager.get_progress();
/// progress.header_height = storage.get_tip_height().await?.unwrap_or(0);
Expand Down
8 changes: 4 additions & 4 deletions dash-spv/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
//! - types/balances.rs - AddressBalance, UnconfirmedTransaction
//!
//! # Thread Safety
//! Many types here are wrapped in Arc<RwLock> or Arc<Mutex> when used.
//! Many types here are wrapped in `Arc<RwLock>` or `Arc<Mutex>` when used.
//! Always acquire locks in consistent order to prevent deadlocks:
//! 1. state (ChainState)
//! 2. stats (SpvStats)
Expand All @@ -27,13 +27,13 @@ use std::sync::Arc;

/// Shared, mutex-protected set of filter heights used across components.
///
/// # Why Arc<Mutex<HashSet>>?
/// # Why `Arc<Mutex<HashSet>>`?
/// - Arc: Shared ownership between FilterSyncManager and SpvStats
/// - Mutex: Interior mutability for concurrent updates from filter download tasks
/// - HashSet: Fast O(1) membership testing for gap detection
///
/// # Performance Note
/// Consider Arc<RwLock> if read contention becomes an issue (most operations are reads).
/// Consider `Arc<RwLock>` if read contention becomes an issue (most operations are reads).
pub type SharedFilterHeights = std::sync::Arc<tokio::sync::Mutex<std::collections::HashSet<u32>>>;

/// A block header with its cached hash to avoid expensive X11 recomputation.
Expand Down Expand Up @@ -240,7 +240,7 @@ impl DetailedSyncProgress {
/// # CRITICAL: This is the heart of the SPV client's state
///
/// ## Thread Safety
/// Almost always wrapped in Arc<RwLock<ChainState>> for shared access.
/// Almost always wrapped in `Arc<RwLock<ChainState>>` for shared access.
/// Multiple readers can access simultaneously, but writes are exclusive.
///
/// ## Checkpoint Sync
Expand Down
12 changes: 6 additions & 6 deletions dash/src/blockdata/transaction/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ use crate::prelude::*;
pub use crate::transaction::outpoint::*;
use crate::{ScriptBuf, Weight, io};

/// Result of [`SighashCache::legacy_encode_signing_data_to`].
/// Result of `SighashCache::legacy_encode_signing_data_to`.
///
/// This type forces the caller to handle SIGHASH_SINGLE bug case.
///
Expand Down Expand Up @@ -232,10 +232,10 @@ impl Transaction {
/// sighash flag can be computed.
///
/// To actually produce a scriptSig, this hash needs to be run through an ECDSA signer, the
/// [`EcdsaSighashType`] appended to the resulting sig, and a script written around this, but
/// `EcdsaSighashType` appended to the resulting sig, and a script written around this, but
/// this is the general (and hard) part.
///
/// The `sighash_type` supports an arbitrary `u32` value, instead of just [`EcdsaSighashType`],
/// The `sighash_type` supports an arbitrary `u32` value, instead of just `EcdsaSighashType`,
/// because internally 4 bytes are being hashed, even though only the lowest byte is appended to
/// signature in a transaction.
///
Expand All @@ -245,7 +245,7 @@ impl Transaction {
/// `script_pubkey` to determine which separators get evaluated and which don't, which we don't
/// have the information to determine.
/// - Does NOT handle the sighash single bug, you should either handle that manually or use
/// [`Self::signature_hash()`] instead.
/// `Self::signature_hash()` instead.
///
/// # Panics
///
Expand All @@ -254,10 +254,10 @@ impl Transaction {
/// sighash flag can be computed.
///
/// To actually produce a scriptSig, this hash needs to be run through an ECDSA signer, the
/// [`EcdsaSighashType`] appended to the resulting sig, and a script written around this, but
/// `EcdsaSighashType` appended to the resulting sig, and a script written around this, but
/// this is the general (and hard) part.
///
/// The `sighash_type` supports an arbitrary `u32` value, instead of just [`EcdsaSighashType`],
/// The `sighash_type` supports an arbitrary `u32` value, instead of just `EcdsaSighashType`,
/// because internally 4 bytes are being hashed, even though only the lowest byte is appended to
/// signature in a transaction.
///
Expand Down
6 changes: 3 additions & 3 deletions dash/src/crypto/key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -645,7 +645,7 @@ pub trait TapTweak {
type TweakedKey;

/// Tweaks an untweaked key with corresponding public key value and optional script tree merkle
/// root. For the [`KeyPair`] type this also tweaks the private key in the pair.
/// root. For the `KeyPair` type this also tweaks the private key in the pair.
///
/// This is done by using the equation Q = P + H(P|c)G, where
/// * Q is the tweaked public key
Expand Down Expand Up @@ -706,7 +706,7 @@ impl TapTweak for UntweakedKeyPair {
type TweakedAux = TweakedKeyPair;
type TweakedKey = TweakedKeyPair;

/// Tweaks private and public keys within an untweaked [`KeyPair`] with corresponding public key
/// Tweaks private and public keys within an untweaked `KeyPair` with corresponding public key
/// value and optional script tree merkle root.
///
/// This is done by tweaking private key within the pair using the equation q = p + H(P|c), where
Expand Down Expand Up @@ -767,7 +767,7 @@ impl TweakedPublicKey {
}

impl TweakedKeyPair {
/// Creates a new [`TweakedKeyPair`] from a [`KeyPair`]. No tweak is applied, consider
/// Creates a new [`TweakedKeyPair`] from a `KeyPair`. No tweak is applied, consider
/// calling `tap_tweak` on an [`UntweakedKeyPair`] instead of using this constructor.
///
/// This method is dangerous and can lead to loss of funds if used incorrectly.
Expand Down
2 changes: 1 addition & 1 deletion dash/src/network/message_qrinfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ impl Decodable for QRInfo {
/// Fields:
/// - `mn_skip_list_mode`: A 4-byte signed integer representing the mode of the skip list.
/// - `active_quorum_members_count`: A compact-size unsigned integer representing the number of active quorum members.
/// - `active_quorum_members`: A bitset of active_quorum_members_count bits (Vec<bool>),
/// - `active_quorum_members`: A bitset of active_quorum_members_count bits (`Vec<bool>`),
/// serialized via write_fixed_bitset/read_fixed_bitset.
/// - `mn_skip_list_size`: A compact-size unsigned integer representing the number of skip list entries.
/// - `mn_skip_list`: An array of 4-byte signed integers, one per skip list entry.
Expand Down
4 changes: 2 additions & 2 deletions dash/src/network/message_sml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::{BlockHash, ProTxHash, QuorumHash, Transaction};
/// - A full masternode list (if `base_block_hash` is all-zero)
/// - An update to a previously requested masternode list
///
/// https://docs.dash.org/en/stable/docs/core/reference/p2p-network-data-messages.html#getmnlistd
/// <https://docs.dash.org/en/stable/docs/core/reference/p2p-network-data-messages.html#getmnlistd>
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub struct GetMnListDiff {
/// Hash of a block the requester already has a valid masternode list of.
Expand All @@ -28,7 +28,7 @@ impl_consensus_encoding!(GetMnListDiff, base_block_hash, block_hash);
/// The `mnlistdiff` message is a reply to a `getmnlistd` message which requested
/// either a full masternode list or a diff for a range of blocks.
///
/// https://docs.dash.org/en/stable/docs/core/reference/p2p-network-data-messages.html#mnlistdiff
/// <https://docs.dash.org/en/stable/docs/core/reference/p2p-network-data-messages.html#mnlistdiff>
#[derive(Clone, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "bincode", derive(Encode, Decode))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
Expand Down
2 changes: 1 addition & 1 deletion dash/src/taproot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -721,7 +721,7 @@ impl TapTree {
self.0
}

/// Returns [`TapTreeIter<'_>`] iterator for a taproot script tree, operating in DFS order over
/// Returns a [`ScriptLeaves<'_>`] iterator for a taproot script tree, operating in DFS order over
/// tree [`ScriptLeaf`]s.
pub fn script_leaves(&self) -> ScriptLeaves<'_> {
ScriptLeaves {
Expand Down
2 changes: 0 additions & 2 deletions hashes/src/bincode_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
/// - [`bincode::Encode`]: Encodes the value by serializing its internal byte array.
/// - [`bincode::Decode`]: Decodes a `[u8; N]` array and reconstructs the type using `from_byte_array`.
/// - [`bincode::BorrowDecode`]: Borrow-decodes a byte slice, checks its length, and uses `from_byte_array`.
///
/// ```
#[macro_export]
#[cfg(feature = "bincode")]
macro_rules! bincode_impl {
Expand Down
2 changes: 1 addition & 1 deletion hashes/src/hash_x11.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ impl Midstate {
self.0
}

/// Unwraps the [Midstate] and returns the underlying byte array.
/// Unwraps the [`Midstate`] and returns the underlying byte array.
pub fn into_inner(self) -> [u8; 32] {
self.0
}
Expand Down
8 changes: 4 additions & 4 deletions key-wallet-ffi/include/key_wallet_ffi.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,19 +65,19 @@ typedef enum {
*/
IDENTITY_INVITATION = 6,
/*
Provider voting keys (DIP-3) - Path: m/9'/5'/3'/1'/[key_index]
Provider voting keys (DIP-3) - Path: m/9'/5'/3'/1'/\[key_index\]
*/
PROVIDER_VOTING_KEYS = 7,
/*
Provider owner keys (DIP-3) - Path: m/9'/5'/3'/2'/[key_index]
Provider owner keys (DIP-3) - Path: m/9'/5'/3'/2'/\[key_index\]
*/
PROVIDER_OWNER_KEYS = 8,
/*
Provider operator keys (DIP-3) - Path: m/9'/5'/3'/3'/[key_index]
Provider operator keys (DIP-3) - Path: m/9'/5'/3'/3'/\[key_index\]
*/
PROVIDER_OPERATOR_KEYS = 9,
/*
Provider platform P2P keys (DIP-3, ED25519) - Path: m/9'/5'/3'/4'/[key_index]
Provider platform P2P keys (DIP-3, ED25519) - Path: m/9'/5'/3'/4'/\[key_index\]
*/
PROVIDER_PLATFORM_KEYS = 10,
DASHPAY_RECEIVING_FUNDS = 11,
Expand Down
2 changes: 1 addition & 1 deletion key-wallet-ffi/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ pub unsafe extern "C" fn error_message_free(message: *mut c_char) {
}
}

/// Helper macro to convert any error that implements Into<FFIError> and set it on the error pointer
/// Helper macro to convert any error that implements `Into<FFIError>` and set it on the error pointer
#[macro_export]
macro_rules! ffi_error_set {
($error_ptr:expr, $err:expr) => {{
Expand Down
2 changes: 1 addition & 1 deletion key-wallet-ffi/src/managed_account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//!
//! This module provides FFI-compatible managed account functionality that wraps
//! ManagedAccount instances from the key-wallet crate. FFIManagedAccount is a
//! simple wrapper around Arc<ManagedAccount> without additional fields.
//! simple wrapper around `Arc<ManagedAccount>` without additional fields.

use std::os::raw::c_uint;
use std::sync::Arc;
Expand Down
8 changes: 4 additions & 4 deletions key-wallet-ffi/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,13 @@ pub enum FFIAccountType {
IdentityTopUpNotBoundToIdentity = 5,
/// Identity invitation funding
IdentityInvitation = 6,
/// Provider voting keys (DIP-3) - Path: m/9'/5'/3'/1'/[key_index]
/// Provider voting keys (DIP-3) - Path: m/9'/5'/3'/1'/\[key_index\]
ProviderVotingKeys = 7,
/// Provider owner keys (DIP-3) - Path: m/9'/5'/3'/2'/[key_index]
/// Provider owner keys (DIP-3) - Path: m/9'/5'/3'/2'/\[key_index\]
ProviderOwnerKeys = 8,
/// Provider operator keys (DIP-3) - Path: m/9'/5'/3'/3'/[key_index]
/// Provider operator keys (DIP-3) - Path: m/9'/5'/3'/3'/\[key_index\]
ProviderOperatorKeys = 9,
/// Provider platform P2P keys (DIP-3, ED25519) - Path: m/9'/5'/3'/4'/[key_index]
/// Provider platform P2P keys (DIP-3, ED25519) - Path: m/9'/5'/3'/4'/\[key_index\]
ProviderPlatformKeys = 10,
DashpayReceivingFunds = 11,
DashpayExternalAccount = 12,
Expand Down
2 changes: 1 addition & 1 deletion key-wallet-ffi/src/wallet_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub struct FFIWalletManager {
}

impl FFIWalletManager {
/// Create a new FFIWalletManager from an Arc<RwLock<WalletManager>>
/// Create a new FFIWalletManager from an `Arc<RwLock<WalletManager>>`
pub fn from_arc(
manager: Arc<RwLock<WalletManager<ManagedWalletInfo>>>,
runtime: Arc<tokio::runtime::Runtime>,
Expand Down
8 changes: 4 additions & 4 deletions key-wallet/src/account/account_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,16 @@ pub enum AccountType {
/// Identity invitation funding
IdentityInvitation,
/// Provider voting keys (DIP-3)
/// Path: m/9'/5'/3'/1'/[key_index]
/// Path: `m/9'/5'/3'/1'/[key_index]`
ProviderVotingKeys,
/// Provider owner keys (DIP-3)
/// Path: m/9'/5'/3'/2'/[key_index]
/// Path: `m/9'/5'/3'/2'/[key_index]`
ProviderOwnerKeys,
/// Provider operator keys (DIP-3)
/// Path: m/9'/5'/3'/3'/[key_index]
/// Path: `m/9'/5'/3'/3'/[key_index]`
ProviderOperatorKeys,
/// Provider platform P2P keys (DIP-3, ED25519)
/// Path: m/9'/5'/3'/4'/[key_index]
/// Path: `m/9'/5'/3'/4'/[key_index]`
ProviderPlatformKeys,
/// Incoming DashPay funds account using 256-bit derivation
/// The derivation path used is user_identity_id/friend_identity_id
Expand Down
2 changes: 1 addition & 1 deletion key-wallet/src/managed_account/address_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use dashcore::{Address, AddressType, ScriptBuf};
#[cfg_attr(feature = "bincode", derive(Encode, Decode))]
#[allow(clippy::upper_case_acronyms)]
pub enum PublicKeyType {
/// ECDSA public key (standard Bitcoin/Dash addresses) - stored as Vec<u8> for serialization
/// ECDSA public key (standard Bitcoin/Dash addresses) - stored as `Vec<u8>` for serialization
ECDSA(Vec<u8>),
/// EdDSA public key (Ed25519, used in some Platform operations)
EdDSA(Vec<u8>),
Expand Down
Loading