use crate::DigMessageType;
pub const DIG_BAND_START: u8 = 200;
pub const FREE_BAND_START: u8 = 220;
pub const DIG_MESSAGE: u8 = 220;
pub const STORE_MELTED: u8 = 221;
pub const HOLDINGS_ANNOUNCE: u8 = 222;
pub const ALL_DIG_OPCODES: [u8; 23] = [
DigMessageType::NewAttestation as u8,
DigMessageType::NewCheckpointProposal as u8,
DigMessageType::NewCheckpointSignature as u8,
DigMessageType::RequestCheckpointSignatures as u8,
DigMessageType::RespondCheckpointSignatures as u8,
DigMessageType::RequestStatus as u8,
DigMessageType::RespondStatus as u8,
DigMessageType::NewCheckpointSubmission as u8,
DigMessageType::ValidatorAnnounce as u8,
DigMessageType::RequestBlockTransactions as u8,
DigMessageType::RespondBlockTransactions as u8,
DigMessageType::ReconciliationSketch as u8,
DigMessageType::ReconciliationResponse as u8,
DigMessageType::StemTransaction as u8,
DigMessageType::PlumtreeLazyAnnounce as u8,
DigMessageType::PlumtreePrune as u8,
DigMessageType::PlumtreeGraft as u8,
DigMessageType::PlumtreeRequestByHash as u8,
DigMessageType::RegisterPeer as u8,
DigMessageType::RegisterAck as u8,
DIG_MESSAGE,
STORE_MELTED,
HOLDINGS_ANNOUNCE,
];
#[must_use]
pub const fn is_dig_opcode(opcode: u8) -> bool {
opcode >= DIG_BAND_START
}
#[cfg(test)]
mod tests {
use super::{
is_dig_opcode, ALL_DIG_OPCODES, DIG_BAND_START, DIG_MESSAGE, FREE_BAND_START,
HOLDINGS_ANNOUNCE, STORE_MELTED,
};
use chia_protocol::ProtocolMessageTypes;
use chia_traits::Streamable;
#[test]
fn dig_opcodes_are_disjoint_from_the_chia_namespace() {
for opcode in ALL_DIG_OPCODES {
assert!(
ProtocolMessageTypes::from_bytes(&[opcode]).is_err(),
"opcode {opcode} is claimed by both DIG and Chia"
);
}
}
#[test]
fn the_assigned_band_is_contiguous_from_200() {
let expected: Vec<u8> = (DIG_BAND_START..=HOLDINGS_ANNOUNCE).collect();
assert_eq!(ALL_DIG_OPCODES.to_vec(), expected);
}
#[test]
fn free_band_constants_are_pinned() {
assert_eq!(FREE_BAND_START, 220);
assert_eq!(DIG_MESSAGE, 220);
assert_eq!(STORE_MELTED, 221);
assert_eq!(HOLDINGS_ANNOUNCE, 222);
}
#[test]
fn band_predicate_is_pinned_from_both_sides() {
assert!(!is_dig_opcode(DIG_BAND_START - 1));
assert!(is_dig_opcode(DIG_BAND_START));
assert!(is_dig_opcode(u8::MAX));
}
}