From: Valentine Wallace Date: Fri, 31 Dec 2021 22:14:48 +0000 (-0500) Subject: scid_utils: add utils for retrieving txindex and vout X-Git-Tag: v0.0.105~13^2~4 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=e1c33d49f03b08e979e873b3842c5413fd9cb0e0;p=rust-lightning scid_utils: add utils for retrieving txindex and vout --- diff --git a/lightning/src/util/scid_utils.rs b/lightning/src/util/scid_utils.rs index 7902a5271..f85e843d8 100644 --- a/lightning/src/util/scid_utils.rs +++ b/lightning/src/util/scid_utils.rs @@ -32,6 +32,16 @@ pub fn block_from_scid(short_channel_id: &u64) -> u32 { return (short_channel_id >> 40) as u32; } +/// Extracts the tx index (bytes [2..4]) from the `short_channel_id` +pub fn tx_index_from_scid(short_channel_id: &u64) -> u32 { + return ((short_channel_id >> 16) & MAX_SCID_TX_INDEX) as u32; +} + +/// Extracts the vout (bytes [0..2]) from the `short_channel_id` +pub fn vout_from_scid(short_channel_id: &u64) -> u16 { + return ((short_channel_id) & MAX_SCID_VOUT_INDEX) as u16; +} + /// Constructs a `short_channel_id` using the components pieces. Results in an error /// if the block height, tx index, or vout index overflow the maximum sizes. pub fn scid_from_parts(block: u64, tx_index: u64, vout_index: u64) -> Result { @@ -63,6 +73,24 @@ mod tests { assert_eq!(block_from_scid(&0xffffff_ffffff_ffff), 0xffffff); } + #[test] + fn test_tx_index_from_scid() { + assert_eq!(tx_index_from_scid(&0x000000_000000_0000), 0); + assert_eq!(tx_index_from_scid(&0x000000_000001_0000), 1); + assert_eq!(tx_index_from_scid(&0xffffff_000001_ffff), 1); + assert_eq!(tx_index_from_scid(&0xffffff_800000_ffff), 0x800000); + assert_eq!(tx_index_from_scid(&0xffffff_ffffff_ffff), 0xffffff); + } + + #[test] + fn test_vout_from_scid() { + assert_eq!(vout_from_scid(&0x000000_000000_0000), 0); + assert_eq!(vout_from_scid(&0x000000_000000_0001), 1); + assert_eq!(vout_from_scid(&0xffffff_ffffff_0001), 1); + assert_eq!(vout_from_scid(&0xffffff_ffffff_8000), 0x8000); + assert_eq!(vout_from_scid(&0xffffff_ffffff_ffff), 0xffff); + } + #[test] fn test_scid_from_parts() { assert_eq!(scid_from_parts(0x00000000, 0x00000000, 0x0000).unwrap(), 0x000000_000000_0000);