use std::collections::BTreeMap;
use crate::{bytes::Bytes, hash::Address, uint::Uint};
use serde::Deserialize;
use super::{StepDuration, ValidatorSet};
#[derive(Debug, PartialEq, Deserialize)]
#[serde(deny_unknown_fields)]
#[serde(rename_all = "camelCase")]
pub struct AuthorityRoundParams {
pub step_duration: StepDuration,
pub validators: ValidatorSet,
pub start_step: Option<Uint>,
pub validate_score_transition: Option<Uint>,
pub validate_step_transition: Option<Uint>,
pub immediate_transitions: Option<bool>,
pub block_reward: Option<Uint>,
pub block_reward_contract_transition: Option<Uint>,
pub block_reward_contract_address: Option<Address>,
pub block_reward_contract_transitions: Option<BTreeMap<Uint, Address>>,
pub block_reward_contract_code: Option<Bytes>,
pub maximum_uncle_count_transition: Option<Uint>,
pub maximum_uncle_count: Option<Uint>,
pub empty_steps_transition: Option<Uint>,
pub maximum_empty_steps: Option<Uint>,
pub strict_empty_steps_transition: Option<Uint>,
pub two_thirds_majority_transition: Option<Uint>,
pub randomness_contract_address: Option<BTreeMap<Uint, Address>>,
pub block_gas_limit_contract_transitions: Option<BTreeMap<Uint, Address>>,
}
#[derive(Debug, PartialEq, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AuthorityRound {
pub params: AuthorityRoundParams,
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use ethereum_types::{U256, H160};
use serde_json;
use super::{Address, Uint, StepDuration};
use crate::{spec::{validator_set::ValidatorSet, authority_round::AuthorityRound}};
#[test]
fn authority_round_deserialization() {
let s = r#"{
"params": {
"stepDuration": "0x02",
"validators": {
"list" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
},
"startStep" : 24,
"validateStepTransition": 150,
"blockReward": 5000000,
"maximumUncleCountTransition": 10000000,
"maximumUncleCount": 5,
"randomnessContractAddress": {
"10": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"20": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
},
"blockGasLimitContractTransitions": {
"10": "0x1000000000000000000000000000000000000001",
"20": "0x2000000000000000000000000000000000000002"
}
}
}"#;
let deserialized: AuthorityRound = serde_json::from_str(s).unwrap();
assert_eq!(deserialized.params.step_duration, StepDuration::Single(Uint(U256::from(2))));
assert_eq!(
deserialized.params.validators,
ValidatorSet::List(vec![Address(H160::from_str("c6d9d2cd449a754c494264e1809c50e34d64562b").unwrap())]),
);
assert_eq!(deserialized.params.start_step, Some(Uint(U256::from(24))));
assert_eq!(deserialized.params.immediate_transitions, None);
assert_eq!(deserialized.params.maximum_uncle_count_transition, Some(Uint(10_000_000.into())));
assert_eq!(deserialized.params.maximum_uncle_count, Some(Uint(5.into())));
assert_eq!(deserialized.params.randomness_contract_address.unwrap(),
vec![
(Uint(10.into()), Address(H160::from_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap())),
(Uint(20.into()), Address(H160::from_str("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb").unwrap())),
].into_iter().collect());
let expected_bglc =
[(Uint(10.into()), Address(H160::from_str("1000000000000000000000000000000000000001").unwrap())),
(Uint(20.into()), Address(H160::from_str("2000000000000000000000000000000000000002").unwrap()))];
assert_eq!(deserialized.params.block_gas_limit_contract_transitions,
Some(expected_bglc.to_vec().into_iter().collect()));
}
}