From 1775139e6dcaabb8fe1e68b79b9716592c0416fb Mon Sep 17 00:00:00 2001 From: Houmaan Chamani Date: Fri, 27 Sep 2024 16:55:10 -0400 Subject: [PATCH] feat(minor-coordinator)!: verifier information query (#637) --- Cargo.lock | 3 + contracts/coordinator/Cargo.toml | 1 + contracts/coordinator/src/client.rs | 19 +++ contracts/coordinator/src/contract.rs | 32 ++++- .../src/contract/migrations/mod.rs | 2 +- .../src/contract/migrations/v1_0_0.rs | 115 ++++++++++++++++++ contracts/coordinator/src/contract/query.rs | 52 +++++++- contracts/coordinator/src/error.rs | 9 ++ contracts/coordinator/src/msg.rs | 23 ++++ contracts/coordinator/src/state.rs | 14 ++- .../multisig-prover/src/contract/execute.rs | 2 +- contracts/service-registry/src/lib.rs | 2 - .../query_verifier_returns_verifier.golden | 10 -- contracts/voting-verifier/Cargo.toml | 1 + .../voting-verifier/src/contract/execute.rs | 2 +- integration-tests/src/coordinator_contract.rs | 3 +- integration-tests/tests/test_utils/mod.rs | 50 +++++++- integration-tests/tests/verifier_details.rs | 35 ++++++ packages/service-registry-api/Cargo.toml | 1 + .../service-registry-api}/src/client.rs | 26 ++-- packages/service-registry-api/src/lib.rs | 3 + ..._verifiers_returns_active_verifiers.golden | 0 ...iers_returns_error_when_query_fails.golden | 0 ...vice_returns_error_when_query_fails.golden | 0 .../query_service_returns_service.golden | 0 ...fier_returns_error_when_query_fails.golden | 0 ...y_verifier_returns_verifier_details.golden | 14 +++ 27 files changed, 378 insertions(+), 41 deletions(-) create mode 100644 contracts/coordinator/src/contract/migrations/v1_0_0.rs delete mode 100644 contracts/service-registry/src/testdata/query_verifier_returns_verifier.golden create mode 100644 integration-tests/tests/verifier_details.rs rename {contracts/service-registry => packages/service-registry-api}/src/client.rs (91%) rename {contracts/service-registry => packages/service-registry-api}/src/testdata/query_active_verifiers_returns_active_verifiers.golden (100%) rename {contracts/service-registry => packages/service-registry-api}/src/testdata/query_active_verifiers_returns_error_when_query_fails.golden (100%) rename {contracts/service-registry => packages/service-registry-api}/src/testdata/query_service_returns_error_when_query_fails.golden (100%) rename {contracts/service-registry => packages/service-registry-api}/src/testdata/query_service_returns_service.golden (100%) rename {contracts/service-registry => packages/service-registry-api}/src/testdata/query_verifier_returns_error_when_query_fails.golden (100%) create mode 100644 packages/service-registry-api/src/testdata/query_verifier_returns_verifier_details.golden diff --git a/Cargo.lock b/Cargo.lock index 22623503a..694a9d401 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1702,6 +1702,7 @@ dependencies = [ "multisig", "report", "router-api", + "service-registry-api", "thiserror", "tofn", ] @@ -7562,6 +7563,7 @@ name = "service-registry-api" version = "1.0.0" dependencies = [ "axelar-wasm-std", + "client", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", @@ -9409,6 +9411,7 @@ dependencies = [ "router-api", "serde_json", "service-registry", + "service-registry-api", "sha3", "thiserror", ] diff --git a/contracts/coordinator/Cargo.toml b/contracts/coordinator/Cargo.toml index f4a79d2bd..3882a16b4 100644 --- a/contracts/coordinator/Cargo.toml +++ b/contracts/coordinator/Cargo.toml @@ -44,6 +44,7 @@ msgs-derive = { workspace = true } multisig = { workspace = true, features = ["library"] } report = { workspace = true } router-api = { workspace = true } +service-registry-api = { workspace = true } thiserror = { workspace = true } [dev-dependencies] diff --git a/contracts/coordinator/src/client.rs b/contracts/coordinator/src/client.rs index a26be69b8..fbe3461d2 100644 --- a/contracts/coordinator/src/client.rs +++ b/contracts/coordinator/src/client.rs @@ -12,12 +12,27 @@ pub enum Error { "failed to execute ReadyToUnbond query at coordinator contract. verifier_address: {0}" )] ReadyToUnbond(String), + + #[error( + "failed to execute VerifierDetailsWithProvers query at coordinator contract. service_name: {service_name}, verifier_address: {verifier_address}" + )] + VerifierDetailsWithProvers { + service_name: String, + verifier_address: String, + }, } impl From for Error { fn from(value: QueryMsg) -> Self { match value { QueryMsg::ReadyToUnbond { verifier_address } => Error::ReadyToUnbond(verifier_address), + QueryMsg::VerifierInfo { + service_name, + verifier, + } => Error::VerifierDetailsWithProvers { + service_name, + verifier_address: verifier, + }, } } } @@ -114,6 +129,10 @@ mod test { QueryMsg::ReadyToUnbond { verifier_address: _, } => Ok(to_json_binary(&true).into()).into(), + QueryMsg::VerifierInfo { + service_name: _, + verifier: _, + } => Ok(to_json_binary(&true).into()).into(), } } _ => panic!("unexpected query: {:?}", msg), diff --git a/contracts/coordinator/src/contract.rs b/contracts/coordinator/src/contract.rs index a2e5bce57..71f3573cf 100644 --- a/contracts/coordinator/src/contract.rs +++ b/contracts/coordinator/src/contract.rs @@ -7,14 +7,14 @@ use axelar_wasm_std::{address, permission_control, FnExt}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, Storage, + to_json_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Response, Storage, }; -use error_stack::report; +use error_stack::{report, ResultExt}; use itertools::Itertools; use crate::error::ContractError; -use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; -use crate::state::is_prover_registered; +use crate::msg::{ExecuteMsg, InstantiateMsg, MigrationMsg, QueryMsg}; +use crate::state::{is_prover_registered, Config, CONFIG}; pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -23,8 +23,13 @@ pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); pub fn migrate( deps: DepsMut, _env: Env, - _msg: Empty, + msg: MigrationMsg, ) -> Result { + let service_registry = validate_cosmwasm_address(deps.api, &msg.service_registry)?; + + migrations::v1_0_0::migrate(deps.storage, service_registry) + .change_context(ContractError::Migration)?; + // this needs to be the last thing to do during migration, // because previous migration steps should check the old version cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; @@ -41,6 +46,11 @@ pub fn instantiate( ) -> Result { cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + let config = Config { + service_registry: address::validate_cosmwasm_address(deps.api, &msg.service_registry)?, + }; + CONFIG.save(deps.storage, &config)?; + let governance = address::validate_cosmwasm_address(deps.api, &msg.governance_address)?; permission_control::set_governance(deps.storage, &governance)?; @@ -105,6 +115,17 @@ pub fn query( worker_address, )?)? } + QueryMsg::VerifierInfo { + service_name, + verifier, + } => { + let verifier_address = validate_cosmwasm_address(deps.api, &verifier)?; + to_json_binary(&query::verifier_details_with_provers( + deps, + service_name, + verifier_address, + )?)? + } } .then(Ok) } @@ -138,6 +159,7 @@ mod tests { let instantiate_msg = InstantiateMsg { governance_address: governance.to_string(), + service_registry: Addr::unchecked("random_service").to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), instantiate_msg); diff --git a/contracts/coordinator/src/contract/migrations/mod.rs b/contracts/coordinator/src/contract/migrations/mod.rs index 8b1378917..1d185e9d7 100644 --- a/contracts/coordinator/src/contract/migrations/mod.rs +++ b/contracts/coordinator/src/contract/migrations/mod.rs @@ -1 +1 @@ - +pub mod v1_0_0; diff --git a/contracts/coordinator/src/contract/migrations/v1_0_0.rs b/contracts/coordinator/src/contract/migrations/v1_0_0.rs new file mode 100644 index 000000000..c89703ee8 --- /dev/null +++ b/contracts/coordinator/src/contract/migrations/v1_0_0.rs @@ -0,0 +1,115 @@ +#![allow(deprecated)] + +use axelar_wasm_std::nonempty; +use cosmwasm_std::{Addr, StdError, Storage}; +use cw2::VersionError; + +use crate::contract::CONTRACT_NAME; + +const BASE_VERSION: &str = "1.0.0"; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error(transparent)] + Std(#[from] StdError), + #[error(transparent)] + Version(#[from] VersionError), + #[error(transparent)] + NonEmpty(#[from] nonempty::Error), +} + +pub fn migrate(storage: &mut dyn Storage, service_registry: Addr) -> Result<(), Error> { + cw2::assert_contract_version(storage, CONTRACT_NAME, BASE_VERSION)?; + + migrate_config(storage, service_registry)?; + Ok(()) +} + +fn migrate_config(storage: &mut dyn Storage, service_registry: Addr) -> Result<(), Error> { + let new_config = crate::state::Config { service_registry }; + crate::state::CONFIG.save(storage, &new_config)?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use axelar_wasm_std::{address, permission_control}; + use cosmwasm_schema::cw_serde; + use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; + use cosmwasm_std::{Addr, DepsMut, Env, MessageInfo, Response}; + + use crate::contract::migrations::v1_0_0::{self, BASE_VERSION}; + use crate::contract::CONTRACT_NAME; + + const GOVERNANCE: &str = "governance"; + + #[test] + fn migrate_checks_contract_version() { + let mut deps = mock_dependencies(); + instantiate_contract(deps.as_mut()); + + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "something wrong").unwrap(); + + assert!(v1_0_0::migrate(deps.as_mut().storage, Addr::unchecked("random_service")).is_err()); + + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, BASE_VERSION).unwrap(); + + assert!(v1_0_0::migrate(deps.as_mut().storage, Addr::unchecked("random_service")).is_ok()); + } + + #[test] + fn migrate_config() { + let mut deps = mock_dependencies(); + instantiate( + deps.as_mut(), + mock_env(), + mock_info("admin", &[]), + InstantiateMsg { + governance_address: "governance".to_string(), + }, + ) + .unwrap(); + + let service_registry_address = Addr::unchecked("random_service"); + assert!(v1_0_0::migrate(deps.as_mut().storage, service_registry_address.clone()).is_ok()); + + let config_result = crate::state::CONFIG.load(deps.as_mut().storage); + assert!(config_result.is_ok()); + + let config = config_result.unwrap(); + assert_eq!(config.service_registry, service_registry_address) + } + + fn instantiate_contract(deps: DepsMut) { + instantiate( + deps, + mock_env(), + mock_info("admin", &[]), + InstantiateMsg { + governance_address: GOVERNANCE.to_string(), + }, + ) + .unwrap(); + } + + #[deprecated(since = "1.0.0", note = "only used to test the migration")] + fn instantiate( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: InstantiateMsg, + ) -> Result { + cw2::set_contract_version(deps.storage, CONTRACT_NAME, BASE_VERSION)?; + + let governance = address::validate_cosmwasm_address(deps.api, &msg.governance_address)?; + permission_control::set_governance(deps.storage, &governance)?; + + Ok(Response::default()) + } + + #[cw_serde] + #[deprecated(since = "1.0.0", note = "only used to test the migration")] + struct InstantiateMsg { + pub governance_address: String, + } +} diff --git a/contracts/coordinator/src/contract/query.rs b/contracts/coordinator/src/contract/query.rs index 275e5488e..b54384610 100644 --- a/contracts/coordinator/src/contract/query.rs +++ b/contracts/coordinator/src/contract/query.rs @@ -1,6 +1,41 @@ +use std::collections::HashSet; + use cosmwasm_std::{Addr, Deps, Order, StdResult}; +use error_stack::{Result, ResultExt}; +use itertools::Itertools; +use service_registry_api::msg::VerifierDetails; + +use crate::error::ContractError; +use crate::msg::VerifierInfo; +use crate::state::{load_config, VERIFIER_PROVER_INDEXED_MAP}; + +pub fn check_verifier_ready_to_unbond(deps: Deps, verifier_address: Addr) -> StdResult { + Ok(!is_verifier_in_any_verifier_set(deps, &verifier_address)) +} + +pub fn verifier_details_with_provers( + deps: Deps, + service_name: String, + verifier_address: Addr, +) -> Result { + let config = load_config(deps.storage); + + let service_registry: service_registry_api::Client = + client::ContractClient::new(deps.querier, &config.service_registry).into(); + + let verifier_details: VerifierDetails = service_registry + .verifier(service_name, verifier_address.to_string()) + .change_context(ContractError::FailedToGetVerifierDetails)?; -use crate::state::VERIFIER_PROVER_INDEXED_MAP; + let active_prover_set = get_provers_for_verifier(deps, verifier_address)?; + + Ok(VerifierInfo { + verifier: verifier_details.verifier, + weight: verifier_details.weight, + supported_chains: verifier_details.supported_chains, + actively_signing_for: active_prover_set, + }) +} fn is_verifier_in_any_verifier_set(deps: Deps, verifier_address: &Addr) -> bool { VERIFIER_PROVER_INDEXED_MAP @@ -11,6 +46,17 @@ fn is_verifier_in_any_verifier_set(deps: Deps, verifier_address: &Addr) -> bool .any(|_| true) } -pub fn check_verifier_ready_to_unbond(deps: Deps, verifier_address: Addr) -> StdResult { - Ok(!is_verifier_in_any_verifier_set(deps, &verifier_address)) +fn get_provers_for_verifier( + deps: Deps, + verifier_address: Addr, +) -> Result, ContractError> { + let provers = VERIFIER_PROVER_INDEXED_MAP + .idx + .by_verifier + .prefix(verifier_address) + .range(deps.storage, None, None, Order::Ascending) + .map(|result| result.map(|(_, record)| record.prover)) + .try_collect(); + + provers.change_context(ContractError::FailedToGetProversForVerifier) } diff --git a/contracts/coordinator/src/error.rs b/contracts/coordinator/src/error.rs index a60817fc5..05c2d0195 100644 --- a/contracts/coordinator/src/error.rs +++ b/contracts/coordinator/src/error.rs @@ -16,4 +16,13 @@ pub enum ContractError { #[error("prover is not registered")] ProverNotRegistered, + + #[error("failed to obtain verifier details")] + FailedToGetVerifierDetails, + + #[error("failed to get provers of verifier")] + FailedToGetProversForVerifier, + + #[error("failed to migrate contract state")] + Migration, } diff --git a/contracts/coordinator/src/msg.rs b/contracts/coordinator/src/msg.rs index 546835c24..e93bc6ad5 100644 --- a/contracts/coordinator/src/msg.rs +++ b/contracts/coordinator/src/msg.rs @@ -1,12 +1,21 @@ use std::collections::HashSet; +use axelar_wasm_std::nonempty; use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::Addr; use msgs_derive::EnsurePermissions; use router_api::ChainName; +use service_registry_api::Verifier; + +#[cw_serde] +pub struct MigrationMsg { + pub service_registry: String, +} #[cw_serde] pub struct InstantiateMsg { pub governance_address: String, + pub service_registry: String, } #[cw_serde] @@ -26,4 +35,18 @@ pub enum ExecuteMsg { pub enum QueryMsg { #[returns(bool)] ReadyToUnbond { verifier_address: String }, + + #[returns(VerifierInfo)] + VerifierInfo { + service_name: String, + verifier: String, + }, +} + +#[cw_serde] +pub struct VerifierInfo { + pub verifier: Verifier, + pub weight: nonempty::Uint128, + pub supported_chains: Vec, + pub actively_signing_for: HashSet, } diff --git a/contracts/coordinator/src/state.rs b/contracts/coordinator/src/state.rs index 8b953900b..f8b657f5e 100644 --- a/contracts/coordinator/src/state.rs +++ b/contracts/coordinator/src/state.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use cosmwasm_schema::cw_serde; use cosmwasm_std::{Addr, Order, Storage}; -use cw_storage_plus::{index_list, IndexedMap, MultiIndex, UniqueIndex}; +use cw_storage_plus::{index_list, IndexedMap, Item, MultiIndex, UniqueIndex}; use router_api::ChainName; use crate::error::ContractError; @@ -10,6 +10,18 @@ use crate::error::ContractError; type ProverAddress = Addr; type VerifierAddress = Addr; +#[cw_serde] +pub struct Config { + pub service_registry: Addr, +} +pub const CONFIG: Item = Item::new("config"); + +pub fn load_config(storage: &dyn Storage) -> Config { + CONFIG + .load(storage) + .expect("coordinator config must be set during instantiation") +} + #[index_list(ProverAddress)] struct ChainProverIndexes<'a> { pub by_prover: UniqueIndex<'a, ProverAddress, ProverAddress, ChainName>, diff --git a/contracts/multisig-prover/src/contract/execute.rs b/contracts/multisig-prover/src/contract/execute.rs index 1dbe49943..bc01ff2ff 100644 --- a/contracts/multisig-prover/src/contract/execute.rs +++ b/contracts/multisig-prover/src/contract/execute.rs @@ -119,7 +119,7 @@ fn make_verifier_set( env: &Env, config: &Config, ) -> Result { - let service_registry: service_registry::Client = + let service_registry: service_registry_api::Client = client::ContractClient::new(deps.querier, &config.service_registry).into(); let verifiers: Vec = service_registry diff --git a/contracts/service-registry/src/lib.rs b/contracts/service-registry/src/lib.rs index 03cdfe39e..8e7ff511c 100644 --- a/contracts/service-registry/src/lib.rs +++ b/contracts/service-registry/src/lib.rs @@ -1,5 +1,3 @@ -mod client; -pub use client::Client; pub mod contract; pub mod helpers; pub mod msg; diff --git a/contracts/service-registry/src/testdata/query_verifier_returns_verifier.golden b/contracts/service-registry/src/testdata/query_verifier_returns_verifier.golden deleted file mode 100644 index 1a51940c2..000000000 --- a/contracts/service-registry/src/testdata/query_verifier_returns_verifier.golden +++ /dev/null @@ -1,10 +0,0 @@ -{ - "address": "verifier", - "bonding_state": { - "Bonded": { - "amount": "1" - } - }, - "authorization_state": "Authorized", - "service_name": "verifiers" -} \ No newline at end of file diff --git a/contracts/voting-verifier/Cargo.toml b/contracts/voting-verifier/Cargo.toml index 7271a9946..e63487488 100644 --- a/contracts/voting-verifier/Cargo.toml +++ b/contracts/voting-verifier/Cargo.toml @@ -47,6 +47,7 @@ rewards = { workspace = true, features = ["library"] } router-api = { workspace = true } serde_json = { workspace = true } service-registry = { workspace = true, features = ["library"] } +service-registry-api = { workspace = true } thiserror = { workspace = true } [dev-dependencies] diff --git a/contracts/voting-verifier/src/contract/execute.rs b/contracts/voting-verifier/src/contract/execute.rs index e4efd3570..79766491d 100644 --- a/contracts/voting-verifier/src/contract/execute.rs +++ b/contracts/voting-verifier/src/contract/execute.rs @@ -327,7 +327,7 @@ pub fn end_poll(deps: DepsMut, env: Env, poll_id: PollId) -> Result Result { let config = CONFIG.load(deps.storage).expect("failed to load config"); - let service_registry: service_registry::Client = + let service_registry: service_registry_api::Client = client::ContractClient::new(deps.querier, &config.service_registry_contract).into(); let verifiers: Vec = service_registry diff --git a/integration-tests/src/coordinator_contract.rs b/integration-tests/src/coordinator_contract.rs index c742492c1..94570a17b 100644 --- a/integration-tests/src/coordinator_contract.rs +++ b/integration-tests/src/coordinator_contract.rs @@ -10,7 +10,7 @@ pub struct CoordinatorContract { } impl CoordinatorContract { - pub fn instantiate_contract(app: &mut App, governance: Addr) -> Self { + pub fn instantiate_contract(app: &mut App, governance: Addr, service_registry: Addr) -> Self { let code = ContractWrapper::new(execute, instantiate, query); let code_id = app.store_code(Box::new(code)); @@ -20,6 +20,7 @@ impl CoordinatorContract { Addr::unchecked("anyone"), &coordinator::msg::InstantiateMsg { governance_address: governance.to_string(), + service_registry: service_registry.to_string(), }, &[], "coordinator", diff --git a/integration-tests/tests/test_utils/mod.rs b/integration-tests/tests/test_utils/mod.rs index 1cc7fe777..37f458265 100644 --- a/integration-tests/tests/test_utils/mod.rs +++ b/integration-tests/tests/test_utils/mod.rs @@ -1,9 +1,9 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use axelar_wasm_std::msg_id::HexTxHashAndEventIndex; use axelar_wasm_std::voting::{PollId, Vote}; use axelar_wasm_std::{nonempty, Participant, Threshold}; -use coordinator::msg::ExecuteMsg as CoordinatorExecuteMsg; +use coordinator::msg::{ExecuteMsg as CoordinatorExecuteMsg, VerifierInfo}; use cosmwasm_std::{ coins, Addr, Attribute, BlockInfo, Event, HexBinary, StdError, Uint128, Uint64, }; @@ -313,6 +313,43 @@ pub fn verifier_set_from_prover( query_response.unwrap().unwrap().verifier_set } +pub fn verifier_info_from_coordinator( + protocol: &mut Protocol, + verifier_address: Addr, +) -> VerifierInfo { + let query_response: Result = protocol.coordinator.query( + &protocol.app, + &coordinator::msg::QueryMsg::VerifierInfo { + service_name: protocol.service_name.to_string(), + verifier: verifier_address.to_string(), + }, + ); + assert!(query_response.is_ok()); + + query_response.unwrap() +} + +pub fn assert_verifier_details_are_equal( + verifier_info: VerifierInfo, + verifier: &Verifier, + chains: &[Chain], +) { + assert_eq!(verifier_info.verifier.address, verifier.addr); + + let verifier_info_chains: HashSet = + verifier_info.supported_chains.into_iter().collect(); + let verifier_chains: HashSet = + verifier.supported_chains.clone().into_iter().collect(); + assert_eq!(verifier_info_chains, verifier_chains); + + let available_provers: HashSet = chains + .iter() + .map(|chain| chain.multisig_prover.contract_addr.clone()) + .collect(); + + assert_eq!(verifier_info.actively_signing_for, available_provers); +} + #[allow(clippy::arithmetic_side_effects)] pub fn advance_height(app: &mut App, increment: u64) { let cur_block = app.block_info(); @@ -385,12 +422,15 @@ pub fn setup_protocol(service_name: nonempty::String) -> Protocol { SIGNATURE_BLOCK_EXPIRY.try_into().unwrap(), ); - let coordinator = - CoordinatorContract::instantiate_contract(&mut app, governance_address.clone()); - let service_registry = ServiceRegistryContract::instantiate_contract(&mut app, governance_address.clone()); + let coordinator = CoordinatorContract::instantiate_contract( + &mut app, + governance_address.clone(), + service_registry.contract_addr.clone(), + ); + Protocol { genesis_address: genesis, governance_address, diff --git a/integration-tests/tests/verifier_details.rs b/integration-tests/tests/verifier_details.rs new file mode 100644 index 000000000..d79e1468c --- /dev/null +++ b/integration-tests/tests/verifier_details.rs @@ -0,0 +1,35 @@ +pub mod test_utils; + +#[test] +fn verifier_information_should_be_consistent_in_coordinator() { + let test_utils::TestCase { + mut protocol, + chain1: ethereum, + chain2: polygon, + verifiers, + .. + } = test_utils::setup_test_case(); + + let chains = vec![ethereum, polygon]; + let first_verifier_info = test_utils::verifier_info_from_coordinator( + &mut protocol, + verifiers.first().unwrap().addr.clone(), + ); + + test_utils::assert_verifier_details_are_equal( + first_verifier_info, + verifiers.first().unwrap(), + &chains, + ); + + let second_verifier_info = test_utils::verifier_info_from_coordinator( + &mut protocol, + verifiers.get(1).unwrap().addr.clone(), + ); + + test_utils::assert_verifier_details_are_equal( + second_verifier_info, + verifiers.get(1).unwrap(), + &chains, + ); +} diff --git a/packages/service-registry-api/Cargo.toml b/packages/service-registry-api/Cargo.toml index 50fe50a2a..345acc2d6 100644 --- a/packages/service-registry-api/Cargo.toml +++ b/packages/service-registry-api/Cargo.toml @@ -7,6 +7,7 @@ edition = { workspace = true } [dependencies] axelar-wasm-std = { workspace = true, features = ["derive"] } +client = { workspace = true } cosmwasm-schema = { workspace = true } cosmwasm-std = { workspace = true } cw-storage-plus = { workspace = true } diff --git a/contracts/service-registry/src/client.rs b/packages/service-registry-api/src/client.rs similarity index 91% rename from contracts/service-registry/src/client.rs rename to packages/service-registry-api/src/client.rs index 1fd604ad3..8d1383b04 100644 --- a/contracts/service-registry/src/client.rs +++ b/packages/service-registry-api/src/client.rs @@ -1,8 +1,8 @@ use error_stack::ResultExt; use router_api::ChainName; -use service_registry_api::msg::{ExecuteMsg, QueryMsg}; -use crate::{Service, Verifier, WeightedVerifier}; +use crate::msg::{ExecuteMsg, QueryMsg, VerifierDetails}; +use crate::{Service, WeightedVerifier}; type Result = error_stack::Result; @@ -76,7 +76,7 @@ impl<'a> Client<'a> { self.client.query(&msg).change_context_lazy(|| msg.into()) } - pub fn verifier(&self, service_name: String, verifier: String) -> Result { + pub fn verifier(&self, service_name: String, verifier: String) -> Result { let msg = QueryMsg::Verifier { service_name, verifier, @@ -92,9 +92,9 @@ mod test { use cosmwasm_std::testing::MockQuerier; use cosmwasm_std::{from_json, to_json_binary, Addr, QuerierWrapper, SystemError, WasmQuery}; use router_api::ChainName; - use service_registry_api::msg::QueryMsg; use crate::client::Client; + use crate::msg::{QueryMsg, VerifierDetails}; use crate::{Service, Verifier, WeightedVerifier}; #[test] @@ -137,7 +137,7 @@ mod test { } #[test] - fn query_verifier_returns_verifier() { + fn query_verifier_returns_verifier_details() { let (querier, addr) = setup_queries_to_succeed(); let client: Client = client::ContractClient::new(QuerierWrapper::new(&querier), &addr).into(); @@ -229,13 +229,17 @@ mod test { QueryMsg::Verifier { service_name, verifier, - } => Ok(to_json_binary(&Verifier { - address: Addr::unchecked(verifier), - bonding_state: crate::BondingState::Bonded { - amount: Uint128::one(), + } => Ok(to_json_binary(&VerifierDetails { + verifier: Verifier { + address: Addr::unchecked(verifier), + bonding_state: crate::BondingState::Bonded { + amount: Uint128::one(), + }, + authorization_state: crate::AuthorizationState::Authorized, + service_name, }, - authorization_state: crate::AuthorizationState::Authorized, - service_name, + weight: Uint128::one(), + supported_chains: vec![], }) .into()) .into(), diff --git a/packages/service-registry-api/src/lib.rs b/packages/service-registry-api/src/lib.rs index 8308809a2..67f30af29 100644 --- a/packages/service-registry-api/src/lib.rs +++ b/packages/service-registry-api/src/lib.rs @@ -1,3 +1,6 @@ +mod client; +pub use client::Client; + pub mod error; mod primitives; diff --git a/contracts/service-registry/src/testdata/query_active_verifiers_returns_active_verifiers.golden b/packages/service-registry-api/src/testdata/query_active_verifiers_returns_active_verifiers.golden similarity index 100% rename from contracts/service-registry/src/testdata/query_active_verifiers_returns_active_verifiers.golden rename to packages/service-registry-api/src/testdata/query_active_verifiers_returns_active_verifiers.golden diff --git a/contracts/service-registry/src/testdata/query_active_verifiers_returns_error_when_query_fails.golden b/packages/service-registry-api/src/testdata/query_active_verifiers_returns_error_when_query_fails.golden similarity index 100% rename from contracts/service-registry/src/testdata/query_active_verifiers_returns_error_when_query_fails.golden rename to packages/service-registry-api/src/testdata/query_active_verifiers_returns_error_when_query_fails.golden diff --git a/contracts/service-registry/src/testdata/query_service_returns_error_when_query_fails.golden b/packages/service-registry-api/src/testdata/query_service_returns_error_when_query_fails.golden similarity index 100% rename from contracts/service-registry/src/testdata/query_service_returns_error_when_query_fails.golden rename to packages/service-registry-api/src/testdata/query_service_returns_error_when_query_fails.golden diff --git a/contracts/service-registry/src/testdata/query_service_returns_service.golden b/packages/service-registry-api/src/testdata/query_service_returns_service.golden similarity index 100% rename from contracts/service-registry/src/testdata/query_service_returns_service.golden rename to packages/service-registry-api/src/testdata/query_service_returns_service.golden diff --git a/contracts/service-registry/src/testdata/query_verifier_returns_error_when_query_fails.golden b/packages/service-registry-api/src/testdata/query_verifier_returns_error_when_query_fails.golden similarity index 100% rename from contracts/service-registry/src/testdata/query_verifier_returns_error_when_query_fails.golden rename to packages/service-registry-api/src/testdata/query_verifier_returns_error_when_query_fails.golden diff --git a/packages/service-registry-api/src/testdata/query_verifier_returns_verifier_details.golden b/packages/service-registry-api/src/testdata/query_verifier_returns_verifier_details.golden new file mode 100644 index 000000000..6dc59ffaa --- /dev/null +++ b/packages/service-registry-api/src/testdata/query_verifier_returns_verifier_details.golden @@ -0,0 +1,14 @@ +{ + "verifier": { + "address": "verifier", + "bonding_state": { + "Bonded": { + "amount": "1" + } + }, + "authorization_state": "Authorized", + "service_name": "verifiers" + }, + "weight": "1", + "supported_chains": [] +} \ No newline at end of file