diff --git a/README.md b/README.md index e3c386b..095435f 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,10 @@ fn get_latest_release_hash(&self) -> String; fn get_latest_release_blob(&self) -> Vec; /// Returns a list of existing contract deployments. -fn get_deployments(&self) -> Vec; +fn get_deployments(&self) -> BTreeMap; + +/// Returns a contract deployment info for corresponding account id. +fn get_deployment(&self, account_id: AccountId) -> Option; ``` #### Callback diff --git a/contract/src/lib.rs b/contract/src/lib.rs index 83f9454..b2c6391 100644 --- a/contract/src/lib.rs +++ b/contract/src/lib.rs @@ -10,6 +10,7 @@ use near_sdk::{ assert_one_yocto, env, ext_contract, near, require, AccountId, Gas, NearToken, PanicOnDefault, Promise, PromiseResult, PublicKey, }; +use std::collections::BTreeMap; use crate::event::Event; use crate::types::{DeploymentInfo, FunctionCallArgs, ReleaseInfo, UpgradeArgs, Version}; @@ -396,10 +397,19 @@ impl AuroraControllerFactory { } } - /// Returns a list of existing contract deployments. + /// Returns a list of existing contract deployment infos. #[must_use] - pub fn get_deployments(&self) -> Vec { - self.deployments.values().cloned().collect() + pub fn get_deployments(&self) -> BTreeMap { + self.deployments + .iter() + .map(|(acc, info)| (acc.clone(), info.clone())) + .collect() + } + + /// Returns a contract deployment info for corresponding account id. + #[must_use] + pub fn get_deployment(&self, account_id: &AccountId) -> Option { + self.deployments.get(account_id).cloned() } /// Upgrades a contract with account id and provided or the latest hash. diff --git a/contract/src/tests/workspace/deploy.rs b/contract/src/tests/workspace/deploy.rs index f5b6167..e5c99b2 100644 --- a/contract/src/tests/workspace/deploy.rs +++ b/contract/src/tests/workspace/deploy.rs @@ -63,7 +63,7 @@ async fn test_deploy_contract() { .unwrap(); assert!(result.is_success(), "{result:#?}"); - let deployments: Vec = factory_owner + let deployments: BTreeMap = factory_owner .view(factory.id(), "get_deployments") .await .unwrap() @@ -194,7 +194,7 @@ async fn test_deploy_more_than_one_contract() { .unwrap() .timestamp(); - let deployments: Vec = factory_owner + let deployments: BTreeMap = factory_owner .view(factory.id(), "get_deployments") .await .unwrap() @@ -203,22 +203,28 @@ async fn test_deploy_more_than_one_contract() { assert_eq!(deployments.len(), 2); assert_eq!( deployments, - vec![ - DeploymentInfo { - hash: HASH_3_6_4.to_string(), - version: "3.6.4".parse().unwrap(), - deployment_time: deploy_time_1, - upgrade_times: [(deploy_time_1, "3.6.4".parse().unwrap())].into(), - init_args: near_sdk::serde_json::to_string(&init_args_1).unwrap(), - }, - DeploymentInfo { - hash: HASH_3_7_0.to_string(), - version: "3.7.0".parse().unwrap(), - deployment_time: deploy_time_2, - upgrade_times: [(deploy_time_2, "3.7.0".parse().unwrap())].into(), - init_args: near_sdk::serde_json::to_string(&init_args_2).unwrap(), - } - ] + BTreeMap::from_iter([ + ( + "aurora-1.factory-owner.test.near".parse().unwrap(), + DeploymentInfo { + hash: HASH_3_6_4.to_string(), + version: "3.6.4".parse().unwrap(), + deployment_time: deploy_time_1, + upgrade_times: [(deploy_time_1, "3.6.4".parse().unwrap())].into(), + init_args: near_sdk::serde_json::to_string(&init_args_1).unwrap(), + } + ), + ( + "aurora-2.factory-owner.test.near".parse().unwrap(), + DeploymentInfo { + hash: HASH_3_7_0.to_string(), + version: "3.7.0".parse().unwrap(), + deployment_time: deploy_time_2, + upgrade_times: [(deploy_time_2, "3.7.0".parse().unwrap())].into(), + init_args: near_sdk::serde_json::to_string(&init_args_2).unwrap(), + } + ) + ]) ); } diff --git a/contract/src/tests/workspace/downgrade.rs b/contract/src/tests/workspace/downgrade.rs index 0404883..612494d 100644 --- a/contract/src/tests/workspace/downgrade.rs +++ b/contract/src/tests/workspace/downgrade.rs @@ -1,6 +1,7 @@ use near_sdk::serde_json::json; use near_workspaces::types::NearToken; use near_workspaces::AccountId; +use std::collections::BTreeMap; use super::utils; use crate::tests::{BLOB_3_6_4, BLOB_3_7_0, HASH_3_6_4, HASH_3_7_0}; @@ -80,14 +81,17 @@ async fn test_downgrade_contract() { .unwrap(); assert!(result.is_success()); - let deployments: Vec = factory_owner + let deployments: BTreeMap = factory_owner .view(factory.id(), "get_deployments") .await .unwrap() .json() .unwrap(); - assert_eq!(deployments[0].version, "3.7.0".parse().unwrap()); + assert_eq!( + deployments[&new_contract_id].version, + "3.7.0".parse().unwrap() + ); let result = factory_owner .call(factory.id(), "downgrade") @@ -104,12 +108,13 @@ async fn test_downgrade_contract() { let version = String::from_utf8(result.unwrap().result).unwrap(); assert_eq!(version.trim_end(), "3.6.4"); - let deployments: Vec = factory_owner - .view(factory.id(), "get_deployments") + let deployments: DeploymentInfo = factory_owner + .view(factory.id(), "get_deployment") + .args_json(json!({ "account_id": new_contract_id })) .await .unwrap() .json() .unwrap(); - assert_eq!(deployments[0].version, "3.6.4".parse().unwrap()); + assert_eq!(deployments.version, "3.6.4".parse().unwrap()); } diff --git a/contract/src/tests/workspace/upgrade.rs b/contract/src/tests/workspace/upgrade.rs index bccb45e..b44a648 100644 --- a/contract/src/tests/workspace/upgrade.rs +++ b/contract/src/tests/workspace/upgrade.rs @@ -1,6 +1,7 @@ use near_sdk::serde_json::json; use near_workspaces::types::NearToken; use near_workspaces::AccountId; +use std::collections::BTreeMap; use super::utils; use crate::tests::{BLOB_3_6_4, BLOB_3_7_0, HASH_3_6_4, HASH_3_7_0, MIGRATION_GAS}; @@ -316,7 +317,7 @@ async fn test_upgrade_contract_with_small_gas_for_migration() { .unwrap(); assert!(result.is_success(), "{result:#?}"); - let deployments_info: Vec = factory_owner + let deployments_info: BTreeMap = factory_owner .view(factory.id(), "get_deployments") .await .unwrap() @@ -363,7 +364,7 @@ async fn test_upgrade_contract_with_small_gas_for_migration() { // So, the upgrade won't be successful. // Check that the deployment into hasn't been changed. - let result: Vec = factory_owner + let result: BTreeMap = factory_owner .view(factory.id(), "get_deployments") .await .unwrap()