diff --git a/substrate/core/rpc/src/chain/mod.rs b/substrate/core/rpc/src/chain/mod.rs index de7ad3faad..ab930d0076 100644 --- a/substrate/core/rpc/src/chain/mod.rs +++ b/substrate/core/rpc/src/chain/mod.rs @@ -187,7 +187,6 @@ impl ChainApi, Block::Hash, Block::Header, Sig } fn block_hash(&self, number: Option>>) -> Result> { - let number: Option>> = number.into(); Ok(match number { None => Some(self.client.info()?.chain.best_hash), Some(num_or_hex) => self.client.header(&BlockId::number(num_or_hex.to_number()?))?.map(|h| h.hash()), diff --git a/substrate/core/rpc/src/chain/number.rs b/substrate/core/rpc/src/chain/number.rs index bdf4b4df03..35daf26a76 100644 --- a/substrate/core/rpc/src/chain/number.rs +++ b/substrate/core/rpc/src/chain/number.rs @@ -39,18 +39,24 @@ impl> NumberOrHex { /// /// Fails in case hex number is too big. pub fn to_number(self) -> Result { - match self { - NumberOrHex::Number(n) => Ok(n), + let num: u64 = match self { + NumberOrHex::Number(n) => n.as_(), NumberOrHex::Hex(h) => { // FIXME #1377 this only supports `u64` since `BlockNumber` // is `As` we could possibly go with `u128`. let l = h.low_u64(); if U256::from(l) != h { - Err(format!("`{}` does not fit into the block number type.", h)) + return Err(format!("`{}` does not fit into the block number type.", h)); } else { - Ok(traits::As::sa(l)) + l } }, + }; + // FIXME <2329>: Database seems to limit the block number to u32 for no reason + if num > u32::max_value() as u64 { + Err(format!("`{}` > u32::max_value(), the max block number is u32.", num)) + } else { + Ok(traits::As::sa(num)) } } }