//! Plain `DataUpdate` payload struct.
//!
//! Field order and types match the on-chain `SubmitDataUpdateArgs` instruction argument so a
//! mechanical field copy converts between the two. With the `borsh` feature enabled the byte
//! layout also matches the 129-byte anchor borsh layout, but the crate does not rely on that.
//!
//! The signed message commits to the feed value as `keccak256(raw_value)` plus its byte length
//! rather than carrying those fields in the wire payload. The raw bytes travel alongside and are
//! hashed into the message during verification ([`crate::message::compute_message_hash`]).
/// A signed Molpha data update.
///
/// Borsh layout (129 bytes): `feed_id` (32) + `registry_version` (4) + `canonical_timestamp` (8) +
/// `signatures_required` (1) + `agg_sig_s` (32) + `commitment_addr` (20) + `signers_bitmap` (32).