Skip to content
This repository was archived by the owner on Sep 1, 2023. It is now read-only.

Commit 96f9562

Browse files
authored
Merge pull request #87 from AshAvalanche/70-vm-versions-hashmap
VM versions as HashMap
2 parents 762c1c7 + f0409a6 commit 96f9562

File tree

2 files changed

+142
-67
lines changed

2 files changed

+142
-67
lines changed

src/jsonrpc/info.rs

+26-54
Original file line numberDiff line numberDiff line change
@@ -348,93 +348,65 @@ pub struct GetNodeVersionResponse {
348348
}
349349

350350
/// ref. <https://docs.avax.network/build/avalanchego-apis/info/#infogetnodeversion>
351-
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
351+
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
352352
#[serde(rename_all = "camelCase")]
353353
pub struct GetNodeVersionResult {
354354
pub version: String,
355355
pub database_version: String,
356356
pub git_commit: String,
357357
pub vm_versions: VmVersions,
358-
}
359-
360-
impl Default for GetNodeVersionResult {
361-
fn default() -> Self {
362-
Self::default()
363-
}
364-
}
365-
366-
impl GetNodeVersionResult {
367-
pub fn default() -> Self {
368-
Self {
369-
version: String::new(),
370-
database_version: String::new(),
371-
git_commit: String::new(),
372-
vm_versions: VmVersions::default(),
373-
}
374-
}
358+
pub rpc_protocol_version: String,
375359
}
376360

377361
/// ref. <https://docs.avax.network/build/avalanchego-apis/info/#infogetnodeversion>
378-
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
362+
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
379363
#[serde(rename_all = "camelCase")]
380364
pub struct VmVersions {
381365
pub avm: String,
382366
pub evm: String,
383367
pub platform: String,
384-
}
385-
386-
impl Default for VmVersions {
387-
fn default() -> Self {
388-
Self::default()
389-
}
390-
}
391-
392-
impl VmVersions {
393-
pub fn default() -> Self {
394-
Self {
395-
avm: String::new(),
396-
evm: String::new(),
397-
platform: String::new(),
398-
}
399-
}
368+
#[serde(flatten)]
369+
pub subnets: HashMap<String, String>,
400370
}
401371

402372
/// RUST_LOG=debug cargo test --package avalanche-types --lib -- jsonrpc::info::test_get_node_version --exact --show-output
403373
#[test]
404374
fn test_get_node_version() {
405375
let resp: GetNodeVersionResponse = serde_json::from_str(
406-
"
407-
376+
r#"
408377
{
409-
\"jsonrpc\": \"2.0\",
410-
\"result\": {
411-
\"version\": \"avalanche/1.4.10\",
412-
\"databaseVersion\": \"v1.4.5\",
413-
\"gitCommit\": \"a3930fe3fa115c018e71eb1e97ca8cec34db67f1\",
414-
\"vmVersions\": {
415-
\"avm\": \"v1.4.10\",
416-
\"evm\": \"v0.5.5-rc.1\",
417-
\"platform\": \"v1.4.10\"
378+
"jsonrpc": "2.0",
379+
"result": {
380+
"version": "avalanche/1.10.1",
381+
"databaseVersion": "v1.4.5",
382+
"rpcProtocolVersion": "26",
383+
"gitCommit": "ef6a2a2f7facd8fbefd5fb2ac9c4908c2bcae3e2",
384+
"vmVersions": {
385+
"avm": "v1.10.1",
386+
"evm": "v0.12.1",
387+
"platform": "v1.10.1",
388+
"subnet-evm": "v0.5.1"
418389
}
419390
},
420-
\"id\": 1
391+
"id": 1
421392
}
422-
423-
",
393+
"#,
424394
)
425395
.unwrap();
426396
let expected = GetNodeVersionResponse {
427397
jsonrpc: "2.0".to_string(),
428398
id: 1,
429399
result: Some(GetNodeVersionResult {
430-
version: String::from("avalanche/1.4.10"),
400+
version: String::from("avalanche/1.10.1"),
431401
database_version: String::from("v1.4.5"),
432-
git_commit: String::from("a3930fe3fa115c018e71eb1e97ca8cec34db67f1"),
402+
git_commit: String::from("ef6a2a2f7facd8fbefd5fb2ac9c4908c2bcae3e2"),
433403
vm_versions: VmVersions {
434-
avm: String::from("v1.4.10"),
435-
evm: String::from("v0.5.5-rc.1"),
436-
platform: String::from("v1.4.10"),
404+
avm: String::from("v1.10.1"),
405+
evm: String::from("v0.12.1"),
406+
platform: String::from("v1.10.1"),
407+
subnets: HashMap::from([(String::from("subnet-evm"), String::from("v0.5.1"))]),
437408
},
409+
rpc_protocol_version: String::from("26"),
438410
}),
439411
error: None,
440412
};

src/jsonrpc/platformvm.rs

+116-13
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,39 @@ impl GetCurrentValidatorsResult {
768768
}
769769
}
770770

771+
/// ref. <https://docs.avax.network/apis/avalanchego/apis/p-chain#platformgetpendingvalidators>
772+
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
773+
pub struct GetPendingValidatorsResponse {
774+
pub jsonrpc: String,
775+
pub id: u32,
776+
777+
#[serde(skip_serializing_if = "Option::is_none")]
778+
pub result: Option<GetPendingValidatorsResult>,
779+
780+
#[serde(skip_serializing_if = "Option::is_none")]
781+
pub error: Option<jsonrpc::ResponseError>,
782+
}
783+
784+
impl Default for GetPendingValidatorsResponse {
785+
fn default() -> Self {
786+
Self {
787+
jsonrpc: "2.0".to_string(),
788+
id: 1,
789+
result: Some(GetPendingValidatorsResult::default()),
790+
error: None,
791+
}
792+
}
793+
}
794+
795+
/// ref. <https://docs.avax.network/apis/avalanchego/apis/p-chain#platformgetpendingvalidators>
796+
/// ref. <https://pkg.go.dev/github.com/ava-labs/avalanchego/vms/platformvm#ClientPermissionlessValidator>
797+
/// ref. <https://pkg.go.dev/github.com/ava-labs/avalanchego/vms/platformvm#ClientStaker>
798+
#[derive(Default, Debug, Serialize, Deserialize, PartialEq, Clone)]
799+
pub struct GetPendingValidatorsResult {
800+
pub validators: Vec<ApiPrimaryValidator>,
801+
pub delegators: Vec<ApiPrimaryDelegator>,
802+
}
803+
771804
/// ref. <https://docs.avax.network/apis/avalanchego/apis/p-chain#platformgetcurrentvalidators>
772805
/// ref. <https://pkg.go.dev/github.com/ava-labs/avalanchego/vms/platformvm#ClientPermissionlessValidator>
773806
/// ref. <https://pkg.go.dev/github.com/ava-labs/avalanchego/vms/platformvm#ClientStaker>
@@ -783,52 +816,54 @@ pub struct ApiPrimaryValidator {
783816
#[serde_as(as = "DisplayFromStr")]
784817
pub end_time: u64,
785818

786-
/// None for subnet validator.
819+
/// None for elastic Subnet validator
787820
#[serde_as(as = "Option<DisplayFromStr>")]
788821
#[serde(skip_serializing_if = "Option::is_none")]
789822
pub weight: Option<u64>,
790823

791-
/// None for subnet validator.
824+
/// None for permissioned Subnet validator
792825
#[serde_as(as = "Option<DisplayFromStr>")]
826+
#[serde(skip_serializing_if = "Option::is_none")]
793827
pub stake_amount: Option<u64>,
794828

795829
#[serde(rename = "nodeID")]
796830
pub node_id: node::Id,
797831

798-
/// None for subnet validator.
832+
/// None for permissioned Subnet validator
799833
#[serde(skip_serializing_if = "Option::is_none")]
800834
pub validation_reward_owner: Option<ApiOwner>,
801-
/// None for subnet validator.
835+
/// None for permissioned Subnet validator
802836
#[serde(skip_serializing_if = "Option::is_none")]
803837
pub delegation_reward_owner: Option<ApiOwner>,
804838

805-
/// None for subnet validator.
839+
/// None for permissioned Subnet validator
806840
#[serde_as(as = "Option<DisplayFromStr>")]
807841
pub potential_reward: Option<u64>,
808-
/// None for subnet validator.
842+
/// None for permissioned Subnet validator
809843
#[serde_as(as = "Option<DisplayFromStr>")]
810844
#[serde(skip_serializing_if = "Option::is_none")]
811845
pub delegation_fee: Option<f32>,
812846

847+
/// None for permissioned Subnet validator
813848
#[serde_as(as = "Option<DisplayFromStr>")]
814849
#[serde(skip_serializing_if = "Option::is_none")]
815850
pub uptime: Option<f32>,
816851
pub connected: bool,
817852

818-
/// None if the validator doesn't have a BLS public key.
853+
/// None for permissioned Subnet validator
819854
#[serde(skip_serializing_if = "Option::is_none")]
820855
pub signer: Option<bls::ProofOfPossession>,
821856

822-
/// None for subnet validator.
857+
/// None for permissioned Subnet validator
823858
#[serde_as(as = "Option<DisplayFromStr>")]
824859
#[serde(skip_serializing_if = "Option::is_none")]
825860
pub delegator_count: Option<u64>,
826-
/// None for subnet validator.
861+
/// None for permissioned Subnet validator
827862
#[serde_as(as = "Option<DisplayFromStr>")]
828863
#[serde(skip_serializing_if = "Option::is_none")]
829864
pub delegator_weight: Option<u64>,
830865

831-
/// None for subnet validator.
866+
/// None for permissioned Subnet validator
832867
#[serde(skip_serializing_if = "Option::is_none")]
833868
pub delegators: Option<Vec<ApiPrimaryDelegator>>,
834869
}
@@ -852,7 +887,7 @@ impl ApiPrimaryValidator {
852887
delegation_reward_owner: None,
853888
potential_reward: None,
854889
delegation_fee: None,
855-
uptime: Some(0_f32),
890+
uptime: None,
856891
connected: false,
857892
signer: None,
858893
delegator_count: None,
@@ -910,12 +945,11 @@ pub struct ApiPrimaryDelegator {
910945
#[serde(rename = "nodeID")]
911946
pub node_id: node::Id,
912947

913-
/// None for subnet validator.
914948
#[serde(skip_serializing_if = "Option::is_none")]
915949
pub reward_owner: Option<ApiOwner>,
916950

917951
#[serde_as(as = "Option<DisplayFromStr>")]
918-
#[serde(rename = "potentialReward")]
952+
#[serde(rename = "potentialReward", skip_serializing_if = "Option::is_none")]
919953
pub potential_reward: Option<u64>,
920954
}
921955

@@ -1089,6 +1123,75 @@ fn test_get_current_validators() {
10891123
assert_eq!(resp, expected);
10901124
}
10911125

1126+
/// RUST_LOG=debug cargo test --package avalanche-types --lib -- jsonrpc::platformvm::test_get_pending_validators --exact --show-output
1127+
#[test]
1128+
1129+
fn test_get_pending_validators() {
1130+
use std::str::FromStr;
1131+
1132+
// ref. <https://docs.avax.network/apis/avalanchego/apis/p-chain#platformgetcurrentvalidators>
1133+
let resp: GetPendingValidatorsResponse = serde_json::from_str(
1134+
r#"
1135+
{
1136+
"jsonrpc": "2.0",
1137+
"result": {
1138+
"validators": [
1139+
{
1140+
"txID": "2NNkpYTGfTFLSGXJcHtVv6drwVU2cczhmjK2uhvwDyxwsjzZMm",
1141+
"startTime": "1600368632",
1142+
"endTime": "1602960455",
1143+
"stakeAmount": "200000000000",
1144+
"nodeID": "NodeID-5mb46qkSBj81k9g9e4VFjGGSbaaSLFRzD",
1145+
"delegationFee": "10.0000",
1146+
"connected": false
1147+
}
1148+
],
1149+
"delegators": [
1150+
{
1151+
"txID": "Bbai8nzGVcyn2VmeYcbS74zfjJLjDacGNVuzuvAQkHn1uWfoV",
1152+
"startTime": "1600368523",
1153+
"endTime": "1602960342",
1154+
"stakeAmount": "20000000000",
1155+
"nodeID": "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg"
1156+
}
1157+
]
1158+
},
1159+
"id": 1
1160+
}
1161+
"#,
1162+
)
1163+
.unwrap();
1164+
1165+
let expected = GetPendingValidatorsResponse {
1166+
jsonrpc: "2.0".to_string(),
1167+
id: 1,
1168+
result: Some(GetPendingValidatorsResult {
1169+
validators: <Vec<ApiPrimaryValidator>>::from([ApiPrimaryValidator {
1170+
tx_id: ids::Id::from_str("2NNkpYTGfTFLSGXJcHtVv6drwVU2cczhmjK2uhvwDyxwsjzZMm")
1171+
.unwrap(),
1172+
start_time: 1600368632,
1173+
end_time: 1602960455,
1174+
stake_amount: Some(200000000000),
1175+
node_id: node::Id::from_str("NodeID-5mb46qkSBj81k9g9e4VFjGGSbaaSLFRzD").unwrap(),
1176+
delegation_fee: Some(10.0),
1177+
connected: false,
1178+
..ApiPrimaryValidator::default()
1179+
}]),
1180+
delegators: <Vec<ApiPrimaryDelegator>>::from([ApiPrimaryDelegator {
1181+
tx_id: ids::Id::from_str("Bbai8nzGVcyn2VmeYcbS74zfjJLjDacGNVuzuvAQkHn1uWfoV")
1182+
.unwrap(),
1183+
start_time: 1600368523,
1184+
end_time: 1602960342,
1185+
stake_amount: 20000000000,
1186+
node_id: node::Id::from_str("NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg").unwrap(),
1187+
..ApiPrimaryDelegator::default()
1188+
}]),
1189+
}),
1190+
error: None,
1191+
};
1192+
assert_eq!(resp, expected);
1193+
}
1194+
10921195
/// ref. <https://pkg.go.dev/github.com/ava-labs/avalanchego/vms/platformvm#APIUTXO>
10931196
#[serde_as]
10941197
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]

0 commit comments

Comments
 (0)