diff --git a/rpc/types/src/bin.rs b/rpc/types/src/bin.rs index 295bee70..2934ca0a 100644 --- a/rpc/types/src/bin.rs +++ b/rpc/types/src/bin.rs @@ -24,7 +24,7 @@ use crate::{ }; #[cfg(any(feature = "epee", feature = "serde"))] -use crate::defaults::{default_false, default_zero}; +use crate::defaults::default; //---------------------------------------------------------------------------------------------------- Definitions define_request_and_response! { @@ -36,7 +36,7 @@ define_request_and_response! { heights: Vec, }, AccessResponseBase { - blocks: Vec, + blocks: Vec = default::>(), "default", } } @@ -46,11 +46,11 @@ define_request_and_response! { core_rpc_server_commands_defs.h => 309..=338, GetHashes, Request { - block_ids: ByteArrayVec<32>, + block_ids: ByteArrayVec<32> = default::>(), "default", start_height: u64, }, AccessResponseBase { - m_blocks_ids: ByteArrayVec<32>, + m_blocks_ids: ByteArrayVec<32> = default::>(), "default", start_height: u64, current_height: u64, } @@ -67,7 +67,7 @@ define_request_and_response! { txid: [u8; 32], }, AccessResponseBase { - o_indexes: Vec, + o_indexes: Vec = default::>(), "default", } } @@ -92,11 +92,11 @@ define_request_and_response! { core_rpc_server_commands_defs.h => 512..=565, GetOuts, Request { - outputs: Vec, - get_txid: bool = default_false(), "default_false", + outputs: Vec = default::>(), "default", + get_txid: bool, }, AccessResponseBase { - outs: Vec, + outs: Vec = default::>(), "default", } } @@ -107,7 +107,7 @@ define_request_and_response! { GetTransactionPoolHashes, Request {}, AccessResponseBase { - tx_hashes: ByteArrayVec<32>, + tx_hashes: ByteArrayVec<32> = default::>(), "default", } } @@ -119,22 +119,22 @@ define_request_and_response! { GetBlocks, Request { - requested_info: u8 = default_zero::(), "default_zero", + requested_info: u8 = default::(), "default", // FIXME: This is a `std::list` in `monerod` because...? - block_ids: ByteArrayVec<32>, + block_ids: ByteArrayVec<32> = default::>(), "default", start_height: u64, prune: bool, - no_miner_tx: bool = default_false(), "default_false", - pool_info_since: u64 = default_zero::(), "default_zero", + no_miner_tx: bool, + pool_info_since: u64 = default::(), "default", }, // TODO: add `top_block_hash` field // AccessResponseBase { - blocks: Vec, + blocks: Vec = default::>(), "default", start_height: u64, current_height: u64, - output_indices: Vec, + output_indices: Vec = default::>(), "default", daemon_time: u64, pool_info: PoolInfo, } diff --git a/rpc/types/src/defaults.rs b/rpc/types/src/defaults.rs index def5df44..6bf1aa43 100644 --- a/rpc/types/src/defaults.rs +++ b/rpc/types/src/defaults.rs @@ -10,36 +10,12 @@ //---------------------------------------------------------------------------------------------------- Import //---------------------------------------------------------------------------------------------------- TODO -/// Default [`bool`] type used in request/response types, `false`. -#[inline] -pub(crate) const fn default_false() -> bool { - false -} - /// Default [`bool`] type used in _some_ request/response types, `true`. #[inline] pub(crate) const fn default_true() -> bool { true } -/// Default [`String`] type used in request/response types. -#[inline] -pub(crate) const fn default_string() -> String { - String::new() -} - -/// Default block height used in request/response types. -#[inline] -pub(crate) const fn default_height() -> u64 { - 0 -} - -/// Default [`Vec`] used in request/response types. -#[inline] -pub(crate) const fn default_vec() -> Vec { - Vec::new() -} - /// Default `0` value used in request/response types. #[inline] pub(crate) fn default_zero>() -> T { @@ -52,6 +28,12 @@ pub(crate) fn default_one>() -> T { T::from(1) } +/// Generate a default `T` to be used in request/response types. +#[inline] +pub(crate) fn default() -> T { + T::default() +} + //---------------------------------------------------------------------------------------------------- Tests #[cfg(test)] mod test { diff --git a/rpc/types/src/json.rs b/rpc/types/src/json.rs index d6376db7..39165b14 100644 --- a/rpc/types/src/json.rs +++ b/rpc/types/src/json.rs @@ -20,10 +20,7 @@ use crate::{ }; #[cfg(any(feature = "epee", feature = "serde"))] -use crate::defaults::{ - default_false, default_height, default_one, default_string, default_true, default_vec, - default_zero, -}; +use crate::defaults::{default, default_one, default_true}; //---------------------------------------------------------------------------------------------------- Definitions // This generates 2 structs: @@ -81,15 +78,15 @@ define_request_and_response! { // // This is a HACK since `serde`'s default attribute only takes in // string literals and macros (stringify) within attributes do not work. - extra_nonce: String = default_string(), "default_string", - prev_block: String = default_string(), "default_string", + extra_nonce: String, + prev_block: String, // Another optional expression: // This indicates to the macro to (de)serialize // this field as another type in epee. // // See `cuprate_epee_encoding::epee_object` for info. - reserve_size: u64 = default_zero::(), "default_zero" /* as Type */, + reserve_size: u64, wallet_address: String, }, @@ -125,7 +122,7 @@ define_request_and_response! { difficulty: u64, expected_reward: u64, height: u64, - next_seed_hash: String = default_string(), "default_string", + next_seed_hash: String, prev_hash: Hex<32>, reserved_offset: u64, seed_hash: Hex<32>, @@ -200,7 +197,7 @@ define_request_and_response! { Request { amount_of_blocks: u64, - prev_block: String = default_string(), "default_string", + prev_block: String, starting_nonce: u32, wallet_address: String, }, @@ -220,7 +217,7 @@ define_request_and_response! { #[derive(Copy)] Request { - fill_pow_hash: bool = default_false(), "default_false", + fill_pow_hash: bool, }, AccessResponseBase { @@ -236,13 +233,13 @@ define_request_and_response! { Request { hash: Hex<32>, - hashes: Vec> = default_vec::>(), "default_vec", - fill_pow_hash: bool = default_false(), "default_false", + hashes: Vec>, + fill_pow_hash: bool, }, AccessResponseBase { block_header: BlockHeader, - block_headers: Vec = default_vec::(), "default_vec", + block_headers: Vec, } } @@ -256,7 +253,7 @@ define_request_and_response! { #[derive(Copy)] Request { height: u64, - fill_pow_hash: bool = default_false(), "default_false", + fill_pow_hash: bool, }, AccessResponseBase { @@ -275,7 +272,7 @@ define_request_and_response! { Request { start_height: u64, end_height: u64, - fill_pow_hash: bool = default_false(), "default_false", + fill_pow_hash: bool, }, AccessResponseBase { @@ -293,9 +290,9 @@ define_request_and_response! { // `monerod` has both `hash` and `height` fields. // In the RPC handler, if `hash.is_empty()`, it will use it, else, it uses `height`. // - hash: String = default_string(), "default_string", - height: u64 = default_height(), "default_height", - fill_pow_hash: bool = default_false(), "default_false", + hash: String, + height: u64, + fill_pow_hash: bool, }, AccessResponseBase { @@ -305,7 +302,7 @@ define_request_and_response! { /// to create this JSON string in a type-safe manner. json: String, miner_tx_hash: Hex<32>, - tx_hashes: Vec> = default_vec::>(), "default_vec", + tx_hashes: Vec>, } } @@ -319,7 +316,6 @@ define_request_and_response! { Request {}, ResponseBase { - // FIXME: This is a `std::list` in `monerod` because...? connections: Vec, } } @@ -449,7 +445,7 @@ define_request_and_response! { FlushTransactionPool (restricted), Request { - txids: Vec> = default_vec::>(), "default_vec", + txids: Vec>, }, #[repr(transparent)] @@ -466,10 +462,10 @@ define_request_and_response! { Request { amounts: Vec, - min_count: u64 = default_zero::(), "default_zero", - max_count: u64 = default_zero::(), "default_zero", - unlocked: bool = default_false(), "default_false", - recent_cutoff: u64 = default_zero::(), "default_zero", + min_count: u64, + max_count: u64, + unlocked: bool, + recent_cutoff: u64, }, AccessResponseBase { @@ -510,9 +506,9 @@ define_request_and_response! { ResponseBase { version: u32, release: bool, - current_height: u64 = default_zero::(), "default_zero", - target_height: u64 = default_zero::(), "default_zero", - hard_forks: Vec = default_vec(), "default_vec", + current_height: u64, + target_height: u64, + hard_forks: Vec, } } @@ -524,7 +520,7 @@ define_request_and_response! { GetFeeEstimate, Request { - grace_blocks: u64 = default_zero::(), "default_zero", + grace_blocks: u64, }, AccessResponseBase { @@ -576,10 +572,8 @@ define_request_and_response! { height: u64, next_needed_pruning_seed: u32, overview: String, - // FIXME: This is a `std::list` in `monerod` because...? - peers: Vec = default_vec::(), "default_vec", - // FIXME: This is a `std::list` in `monerod` because...? - spans: Vec = default_vec::(), "default_vec", + peers: Vec, + spans: Vec, target_height: u64, } } @@ -610,10 +604,10 @@ define_request_and_response! { Request { amounts: Vec, binary: bool = default_true(), "default_true", - compress: bool = default_false(), "default_false", - cumulative: bool = default_false(), "default_false", - from_height: u64 = default_zero::(), "default_zero", - to_height: u64 = default_zero::(), "default_zero", + compress: bool, + cumulative: bool, + from_height: u64, + to_height: u64, }, AccessResponseBase { @@ -649,7 +643,7 @@ define_request_and_response! { #[derive(Copy)] Request { - check: bool = default_false(), "default_false", + check: bool, }, ResponseBase { @@ -688,8 +682,8 @@ define_request_and_response! { #[derive(Copy)] Request { - bad_txs: bool = default_false(), "default_false", - bad_blocks: bool = default_false(), "default_false", + bad_txs: bool, + bad_blocks: bool, }, ResponseBase {} diff --git a/rpc/types/src/macros.rs b/rpc/types/src/macros.rs index aad4197e..77ffe872 100644 --- a/rpc/types/src/macros.rs +++ b/rpc/types/src/macros.rs @@ -238,6 +238,7 @@ macro_rules! define_request { ) => { #[allow(dead_code, missing_docs, reason = "inside a macro")] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[cfg_attr(feature = "serde", serde(default))] // TODO: link epee field not serializing oddity #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] $( #[$attr] )* pub struct $t { diff --git a/rpc/types/src/misc/key_image_spent_status.rs b/rpc/types/src/misc/key_image_spent_status.rs index 44717de5..97c257a0 100644 --- a/rpc/types/src/misc/key_image_spent_status.rs +++ b/rpc/types/src/misc/key_image_spent_status.rs @@ -20,6 +20,7 @@ use cuprate_epee_encoding::{ /// Used in [`crate::other::IsKeyImageSpentResponse`]. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] #[repr(u8)] pub enum KeyImageSpentStatus { Unspent = 0, @@ -68,6 +69,19 @@ impl KeyImageSpentStatus { } } +impl From for u8 { + fn from(value: KeyImageSpentStatus) -> Self { + value.to_u8() + } +} + +impl TryFrom for KeyImageSpentStatus { + type Error = u8; + fn try_from(value: u8) -> Result { + Self::from_u8(value).ok_or(value) + } +} + #[cfg(feature = "epee")] impl EpeeValue for KeyImageSpentStatus { const MARKER: Marker = u8::MARKER; diff --git a/rpc/types/src/misc/requested_info.rs b/rpc/types/src/misc/requested_info.rs index faf8fb94..ca0cf3ab 100644 --- a/rpc/types/src/misc/requested_info.rs +++ b/rpc/types/src/misc/requested_info.rs @@ -20,6 +20,7 @@ use cuprate_epee_encoding::{ /// Used in [`crate::bin::GetBlocksRequest`]. #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] #[repr(u8)] pub enum RequestedInfo { #[default] @@ -69,6 +70,19 @@ impl RequestedInfo { } } +impl From for u8 { + fn from(value: RequestedInfo) -> Self { + value.to_u8() + } +} + +impl TryFrom for RequestedInfo { + type Error = u8; + fn try_from(value: u8) -> Result { + Self::from_u8(value).ok_or(value) + } +} + #[cfg(feature = "epee")] impl EpeeValue for RequestedInfo { const MARKER: Marker = u8::MARKER; diff --git a/rpc/types/src/misc/types.rs b/rpc/types/src/misc/types.rs index 29a367f9..cc0c30b5 100644 --- a/rpc/types/src/misc/types.rs +++ b/rpc/types/src/misc/types.rs @@ -9,7 +9,7 @@ use cuprate_hex::Hex; use cuprate_types::HardFork; #[cfg(any(feature = "epee", feature = "serde"))] -use crate::defaults::default_zero; +use crate::defaults::default; use crate::macros::monero_definition_link; @@ -41,6 +41,7 @@ macro_rules! define_struct_and_impl_epee { $( #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[cfg_attr(feature = "serde", serde(default))] $( #[$struct_attr] )* pub struct $struct_name { $( @@ -148,9 +149,7 @@ define_struct_and_impl_epee! { )] /// Used in [`crate::json::SetBansRequest`]. SetBan { - #[cfg_attr(feature = "serde", serde(default = "crate::defaults::default_string"))] host: String, - #[cfg_attr(feature = "serde", serde(default = "default_zero"))] ip: u32, ban: bool, seconds: u32, @@ -293,8 +292,7 @@ define_struct_and_impl_epee! { relayed: bool, tx_blob: String, tx_json: cuprate_types::json::tx::Transaction, - #[cfg_attr(feature = "serde", serde(default = "default_zero"))] - weight: u64 = default_zero::(), + weight: u64 = default::(), } } diff --git a/rpc/types/src/other.rs b/rpc/types/src/other.rs index ddc7b1c8..17e88c00 100644 --- a/rpc/types/src/other.rs +++ b/rpc/types/src/other.rs @@ -6,17 +6,18 @@ #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +use cuprate_hex::Hex; use cuprate_types::rpc::{OutKey, Peer, PublicNode, TxpoolStats}; use crate::{ base::{AccessResponseBase, ResponseBase}, macros::define_request_and_response, - misc::{GetOutputsOut, SpentKeyImageInfo, Status, TxEntry, TxInfo}, + misc::{GetOutputsOut, KeyImageSpentStatus, SpentKeyImageInfo, Status, TxEntry, TxInfo}, RpcCallValue, }; #[cfg(any(feature = "serde", feature = "epee"))] -use crate::defaults::{default_false, default_string, default_true, default_vec, default_zero}; +use crate::defaults::default_true; //---------------------------------------------------------------------------------------------------- Definitions define_request_and_response! { @@ -27,7 +28,7 @@ define_request_and_response! { Request {}, ResponseBase { - hash: String, + hash: Hex<32>, height: u64, } } @@ -39,22 +40,22 @@ define_request_and_response! { GetTransactions, Request { - txs_hashes: Vec = default_vec::(), "default_vec", + txs_hashes: Vec>, // FIXME: this is documented as optional but it isn't serialized as an optional // but it is set _somewhere_ to false in `monerod` // - decode_as_json: bool = default_false(), "default_false", - prune: bool = default_false(), "default_false", - split: bool = default_false(), "default_false", + decode_as_json: bool, + prune: bool, + split: bool, }, AccessResponseBase { - txs_as_hex: Vec = default_vec::(), "default_vec", + txs_as_hex: Vec, /// `cuprate_rpc_types::json::tx::Transaction` should be used /// to create this JSON string in a type-safe manner. - txs_as_json: Vec = default_vec::(), "default_vec", - missed_tx: Vec = default_vec::(), "default_vec", - txs: Vec = default_vec::(), "default_vec", + txs_as_json: Vec, + missed_tx: Vec>, + txs: Vec, } } @@ -66,7 +67,7 @@ define_request_and_response! { Request {}, AccessResponseBase { - blks_hashes: Vec, + blks_hashes: Vec>, } } @@ -78,12 +79,11 @@ define_request_and_response! { IsKeyImageSpent, Request { - key_images: Vec, + key_images: Vec>, }, AccessResponseBase { - /// FIXME: These are [`KeyImageSpentStatus`](crate::misc::KeyImageSpentStatus) in [`u8`] form. - spent_status: Vec, + spent_status: Vec, } } @@ -96,7 +96,7 @@ define_request_and_response! { Request { tx_as_hex: String, - do_not_relay: bool = default_false(), "default_false", + do_not_relay: bool, do_sanity_checks: bool = default_true(), "default_true", }, @@ -106,7 +106,7 @@ define_request_and_response! { invalid_input: bool, invalid_output: bool, low_mixin: bool, - nonzero_unlock_time: bool = default_false(), "default_false", + nonzero_unlock_time: bool, not_relayed: bool, overspend: bool, reason: String, @@ -189,7 +189,7 @@ define_request_and_response! { Request { public_only: bool = default_true(), "default_true", - include_blocked: bool = default_false(), "default_false", + include_blocked: bool, }, ResponseBase { @@ -207,7 +207,7 @@ define_request_and_response! { #[derive(Copy)] Request { - visible: bool = default_false(), "default_false", + visible: bool, }, ResponseBase {} @@ -236,7 +236,7 @@ define_request_and_response! { SetLogCategories (restricted), Request { - categories: String = default_string(), "default_string", + categories: String, }, ResponseBase { @@ -253,9 +253,9 @@ define_request_and_response! { Request { address: String, - username: String = default_string(), "default_string", - password: String = default_string(), "default_string", - proxy: String = default_string(), "default_string", + username: String, + password: String, + proxy: String, }, Response { @@ -325,9 +325,8 @@ define_request_and_response! { SetLimit (restricted), Request { - // FIXME: These may need to be `Option`. - limit_down: i64 = default_zero::(), "default_zero", - limit_up: i64 = default_zero::(), "default_zero", + limit_down: i64, + limit_up: i64, }, ResponseBase { @@ -409,7 +408,7 @@ define_request_and_response! { Request { command: String, - path: String = default_string(), "default_string", + path: String, }, ResponseBase { auto_uri: String, @@ -447,7 +446,7 @@ define_request_and_response! { Request {}, ResponseBase { - tx_hashes: Vec, + tx_hashes: Vec>, } } @@ -459,14 +458,14 @@ define_request_and_response! { GetPublicNodes (restricted), Request { - gray: bool = default_false(), "default_false", + gray: bool, white: bool = default_true(), "default_true", - include_blocked: bool = default_false(), "default_false", + include_blocked: bool, }, ResponseBase { - gray: Vec = default_vec::(), "default_vec", - white: Vec = default_vec::(), "default_vec", + gray: Vec, + white: Vec, } } @@ -674,7 +673,9 @@ mod test { other::GET_HEIGHT_RESPONSE, Some(GetHeightResponse { base: ResponseBase::OK, - hash: "68bb1a1cff8e2a44c3221e8e1aff80bc6ca45d06fa8eff4d2a3a7ac31d4efe3f".into(), + hash: Hex(hex!( + "68bb1a1cff8e2a44c3221e8e1aff80bc6ca45d06fa8eff4d2a3a7ac31d4efe3f" + )), height: 3195160, }), ); @@ -685,9 +686,9 @@ mod test { test_json( other::GET_TRANSACTIONS_REQUEST, Some(GetTransactionsRequest { - txs_hashes: vec![ - "d6e48158472848e6687173a91ae6eebfa3e1d778e65252ee99d7515d63090408".into(), - ], + txs_hashes: vec![Hex(hex!( + "d6e48158472848e6687173a91ae6eebfa3e1d778e65252ee99d7515d63090408" + ))], decode_as_json: false, prune: false, split: false, @@ -706,9 +707,9 @@ mod test { other::GET_ALT_BLOCKS_HASHES_RESPONSE, Some(GetAltBlocksHashesResponse { base: AccessResponseBase::OK, - blks_hashes: vec![ - "8ee10db35b1baf943f201b303890a29e7d45437bd76c2bd4df0d2f2ee34be109".into(), - ], + blks_hashes: vec![Hex(hex!( + "8ee10db35b1baf943f201b303890a29e7d45437bd76c2bd4df0d2f2ee34be109" + ))], }), ); } @@ -719,8 +720,12 @@ mod test { other::IS_KEY_IMAGE_SPENT_REQUEST, Some(IsKeyImageSpentRequest { key_images: vec![ - "8d1bd8181bf7d857bdb281e0153d84cd55a3fcaa57c3e570f4a49f935850b5e3".into(), - "7319134bfc50668251f5b899c66b005805ee255c136f0e1cecbb0f3a912e09d4".into(), + Hex(hex!( + "8d1bd8181bf7d857bdb281e0153d84cd55a3fcaa57c3e570f4a49f935850b5e3" + )), + Hex(hex!( + "7319134bfc50668251f5b899c66b005805ee255c136f0e1cecbb0f3a912e09d4" + )), ], }), ); @@ -732,7 +737,7 @@ mod test { other::IS_KEY_IMAGE_SPENT_RESPONSE, Some(IsKeyImageSpentResponse { base: AccessResponseBase::OK, - spent_status: vec![1, 1], + spent_status: vec![KeyImageSpentStatus::SpentInBlockchain; 2], }), ); } @@ -1255,24 +1260,60 @@ mod test { Some(GetTransactionPoolHashesResponse { base: ResponseBase::OK, tx_hashes: vec![ - "aa928aed888acd6152c60194d50a4df29b0b851be6169acf11b6a8e304dd6c03".into(), - "794345f321a98f3135151f3056c0fdf8188646a8dab27de971428acf3551dd11".into(), - "1e9d2ae11f2168a228942077483e70940d34e8658c972bbc3e7f7693b90edf17".into(), - "7375c928f261d00f07197775eb0bfa756e5f23319819152faa0b3c670fe54c1b".into(), - "2e4d5f8c5a45498f37fb8b6ca4ebc1efa0c371c38c901c77e66b08c072287329".into(), - "eee6d596cf855adfb10e1597d2018e3a61897ac467ef1d4a5406b8d20bfbd52f".into(), - "59c574d7ba9bb4558470f74503c7518946a85ea22c60fccfbdec108ce7d8f236".into(), - "0d57bec1e1075a9e1ac45cf3b3ced1ad95ccdf2a50ce360190111282a0178655".into(), - "60d627b2369714a40009c07d6185ebe7fa4af324fdfa8d95a37a936eb878d062".into(), - "661d7e728a901a8cb4cf851447d9cd5752462687ed0b776b605ba706f06bdc7d".into(), - "b80e1f09442b00b3fffe6db5d263be6267c7586620afff8112d5a8775a6fc58e".into(), - "974063906d1ddfa914baf85176b0f689d616d23f3d71ed4798458c8b4f9b9d8f".into(), - "d2575ae152a180be4981a9d2fc009afcd073adaa5c6d8b022c540a62d6c905bb".into(), - "3d78aa80ee50f506683bab9f02855eb10257a08adceda7cbfbdfc26b10f6b1bb".into(), - "8b5bc125bdb73b708500f734501d55088c5ac381a0879e1141634eaa72b6a4da".into(), - "11c06f4d2f00c912ca07313ed2ea5366f3cae914a762bed258731d3d9e3706df".into(), - "b3644dc7c9a3a53465fe80ad3769e516edaaeb7835e16fdd493aac110d472ae1".into(), - "ed2478ad793b923dbf652c8612c40799d764e5468897021234a14a37346bc6ee".into(), + Hex(hex!( + "aa928aed888acd6152c60194d50a4df29b0b851be6169acf11b6a8e304dd6c03" + )), + Hex(hex!( + "794345f321a98f3135151f3056c0fdf8188646a8dab27de971428acf3551dd11" + )), + Hex(hex!( + "1e9d2ae11f2168a228942077483e70940d34e8658c972bbc3e7f7693b90edf17" + )), + Hex(hex!( + "7375c928f261d00f07197775eb0bfa756e5f23319819152faa0b3c670fe54c1b" + )), + Hex(hex!( + "2e4d5f8c5a45498f37fb8b6ca4ebc1efa0c371c38c901c77e66b08c072287329" + )), + Hex(hex!( + "eee6d596cf855adfb10e1597d2018e3a61897ac467ef1d4a5406b8d20bfbd52f" + )), + Hex(hex!( + "59c574d7ba9bb4558470f74503c7518946a85ea22c60fccfbdec108ce7d8f236" + )), + Hex(hex!( + "0d57bec1e1075a9e1ac45cf3b3ced1ad95ccdf2a50ce360190111282a0178655" + )), + Hex(hex!( + "60d627b2369714a40009c07d6185ebe7fa4af324fdfa8d95a37a936eb878d062" + )), + Hex(hex!( + "661d7e728a901a8cb4cf851447d9cd5752462687ed0b776b605ba706f06bdc7d" + )), + Hex(hex!( + "b80e1f09442b00b3fffe6db5d263be6267c7586620afff8112d5a8775a6fc58e" + )), + Hex(hex!( + "974063906d1ddfa914baf85176b0f689d616d23f3d71ed4798458c8b4f9b9d8f" + )), + Hex(hex!( + "d2575ae152a180be4981a9d2fc009afcd073adaa5c6d8b022c540a62d6c905bb" + )), + Hex(hex!( + "3d78aa80ee50f506683bab9f02855eb10257a08adceda7cbfbdfc26b10f6b1bb" + )), + Hex(hex!( + "8b5bc125bdb73b708500f734501d55088c5ac381a0879e1141634eaa72b6a4da" + )), + Hex(hex!( + "11c06f4d2f00c912ca07313ed2ea5366f3cae914a762bed258731d3d9e3706df" + )), + Hex(hex!( + "b3644dc7c9a3a53465fe80ad3769e516edaaeb7835e16fdd493aac110d472ae1" + )), + Hex(hex!( + "ed2478ad793b923dbf652c8612c40799d764e5468897021234a14a37346bc6ee" + )), ], }), );