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 PROFILE_ROOT_ANNOUNCE: u8 = 223;
pub const PROFILE_BODY_REQUEST: u8 = 224;
pub const PROFILE_BODY: u8 = 225;
pub const ALL_DIG_OPCODES: [u8; 26] = [
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,
PROFILE_ROOT_ANNOUNCE,
PROFILE_BODY_REQUEST,
PROFILE_BODY,
];
#[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, PROFILE_BODY, PROFILE_BODY_REQUEST, PROFILE_ROOT_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..=PROFILE_BODY).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);
assert_eq!(PROFILE_ROOT_ANNOUNCE, 223);
assert_eq!(PROFILE_BODY_REQUEST, 224);
assert_eq!(PROFILE_BODY, 225);
}
#[test]
fn the_profile_sync_triple_is_assigned_together() {
let tail = &ALL_DIG_OPCODES[ALL_DIG_OPCODES.len() - 3..];
assert_eq!(
tail,
[PROFILE_ROOT_ANNOUNCE, PROFILE_BODY_REQUEST, PROFILE_BODY]
);
}
#[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));
}
}