Skip to content

Commit 1f905be

Browse files
authored
Merge pull request #95 from coblox/fix/handle-block-expiries
Treat expiry/exit-delay values as blocks if below 512
2 parents 4414161 + 9077c6a commit 1f905be

File tree

1 file changed

+24
-10
lines changed

1 file changed

+24
-10
lines changed

ark-grpc/src/types.rs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,9 @@ impl TryFrom<generated::ark::v1::GetInfoResponse> for server::Info {
5454
fn try_from(value: generated::ark::v1::GetInfoResponse) -> Result<Self, Self::Error> {
5555
let pk = value.signer_pubkey.parse().map_err(Error::conversion)?;
5656

57-
let vtxo_tree_expiry = bitcoin::Sequence::from_seconds_ceil(value.vtxo_tree_expiry as u32)
58-
.map_err(Error::conversion)?;
59-
60-
let unilateral_exit_delay =
61-
bitcoin::Sequence::from_seconds_ceil(value.unilateral_exit_delay as u32)
62-
.map_err(Error::conversion)?;
63-
64-
let boarding_exit_delay =
65-
bitcoin::Sequence::from_seconds_ceil(value.boarding_exit_delay as u32)
66-
.map_err(Error::conversion)?;
57+
let vtxo_tree_expiry = parse_sequence_number(value.vtxo_tree_expiry)?;
58+
let unilateral_exit_delay = parse_sequence_number(value.unilateral_exit_delay)?;
59+
let boarding_exit_delay = parse_sequence_number(value.boarding_exit_delay)?;
6760

6861
let network = Network::from_str(value.network.as_str()).map_err(Error::conversion)?;
6962
let network = bitcoin::Network::from(network);
@@ -112,6 +105,27 @@ impl TryFrom<generated::ark::v1::GetInfoResponse> for server::Info {
112105
}
113106
}
114107

108+
fn parse_sequence_number(value: i64) -> Result<bitcoin::Sequence, Error> {
109+
/// The threshold that determines whether an expiry or exit delay should be parsed as a
110+
/// number of blocks or a number of seconds.
111+
///
112+
/// - A value below 512 is considered a number of blocks.
113+
/// - A value over 512 is considered a number of seconds.
114+
const ARBITRARY_SEQUENCE_THRESHOLD: i64 = 512;
115+
116+
let sequence = if value.is_negative() {
117+
return Err(Error::conversion(format!(
118+
"invalid sequence number: {value}"
119+
)));
120+
} else if value < ARBITRARY_SEQUENCE_THRESHOLD {
121+
bitcoin::Sequence::from_height(value as u16)
122+
} else {
123+
bitcoin::Sequence::from_seconds_ceil(value as u32).map_err(Error::conversion)?
124+
};
125+
126+
Ok(sequence)
127+
}
128+
115129
impl TryFrom<&generated::ark::v1::IndexerVtxo> for server::VirtualTxOutPoint {
116130
type Error = Error;
117131

0 commit comments

Comments
 (0)