Skip to content

Commit ab97ed1

Browse files
committed
fix: get addresses
Signed-off-by: bkioshn <[email protected]>
1 parent 160edcd commit ab97ed1

File tree

4 files changed

+48
-24
lines changed

4 files changed

+48
-24
lines changed

rust/rbac-registration/src/cardano/cip509/cip509.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,15 +275,15 @@ impl Cip509 {
275275
self.catalyst_id.as_ref()
276276
}
277277

278-
/// Returns a list of addresses extract from certificate URIs.
278+
/// Returns a list of addresses extracted from certificate URIs of a specific role.
279279
#[must_use]
280280
pub fn certificate_addresses(
281281
&self,
282-
index: usize,
282+
role: usize,
283283
) -> HashSet<Address> {
284284
self.metadata
285285
.as_ref()
286-
.map(|m| m.certificate_uris.addresses(index))
286+
.map(|m| m.certificate_uris.role_addresses(role))
287287
.unwrap_or_default()
288288
}
289289

rust/rbac-registration/src/cardano/cip509/utils/cip134_uri_set.rs

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use c509_certificate::{
1010
general_names::general_name::{GeneralNameTypeRegistry, GeneralNameValue},
1111
C509ExtensionType,
1212
};
13-
use cardano_blockchain_types::{pallas_addresses::Address, Cip0134Uri};
13+
use cardano_blockchain_types::{pallas_addresses::Address, Cip0134Uri, StakeAddress};
1414
use catalyst_types::problem_report::ProblemReport;
1515
use der_parser::der::parse_der_sequence;
1616
use tracing::debug;
@@ -72,33 +72,55 @@ impl Cip0134UriSet {
7272
self.x_uris().is_empty() && self.c_uris().is_empty()
7373
}
7474

75-
/// Returns a list of addresses by the given index.
75+
/// Returns a list of addresses by the given role.
7676
#[must_use]
77-
pub fn addresses(
77+
pub fn role_addresses(
7878
&self,
79-
index: usize,
79+
role: usize,
8080
) -> HashSet<Address> {
8181
let mut result = HashSet::new();
8282

83-
if let Some(uris) = self.x_uris().get(&index) {
83+
if let Some(uris) = self.x_uris().get(&role) {
8484
result.extend(uris.iter().map(|uri| uri.address().clone()));
8585
}
86-
if let Some(uris) = self.c_uris().get(&index) {
86+
if let Some(uris) = self.c_uris().get(&role) {
8787
result.extend(uris.iter().map(|uri| uri.address().clone()));
8888
}
8989

9090
result
9191
}
9292

93-
/// Return true if the given index contains at least one stake address.
93+
/// Returns a list of stake addresses by the given role.
9494
#[must_use]
95-
pub fn contain_stake_address(
95+
pub fn role_stake_addresses(
9696
&self,
97-
index: usize,
98-
) -> bool {
99-
self.addresses(index)
97+
role: usize,
98+
) -> HashSet<StakeAddress> {
99+
self.role_addresses(role)
100100
.iter()
101-
.any(|address| matches!(address, Address::Stake(_)))
101+
.filter_map(|address| {
102+
match address {
103+
Address::Stake(a) => Some(a.clone().into()),
104+
_ => None,
105+
}
106+
})
107+
.collect()
108+
}
109+
110+
/// Returns a list of all stake addresses.
111+
#[must_use]
112+
pub fn stake_addresses(&self) -> HashSet<StakeAddress> {
113+
self.x_uris()
114+
.values()
115+
.chain(self.c_uris().values())
116+
.flat_map(|uris| uris.iter())
117+
.filter_map(|uri| {
118+
match uri.address() {
119+
Address::Stake(a) => Some(a.clone().into()),
120+
_ => None,
121+
}
122+
})
123+
.collect()
102124
}
103125

104126
/// Return the updated URIs set.

rust/rbac-registration/src/cardano/cip509/validation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ pub fn validate_role_data(
389389

390390
// Can contain different kind of address URIs, but for role 0
391391
// there should be at least 1 stake address
392-
if !metadata.certificate_uris.contain_stake_address(0) {
392+
if metadata.certificate_uris.role_stake_addresses(0).is_empty() {
393393
report.missing_field(
394394
"The role 0 certificate must have at least one stake address",
395395
context,

rust/rbac-registration/src/registration/cardano/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
33
mod update_rbac;
44

5-
use std::{collections::HashMap, sync::Arc};
5+
use std::{
6+
collections::{HashMap, HashSet},
7+
sync::Arc,
8+
};
69

710
use anyhow::Context;
811
use c509_certificate::c509::C509;
9-
use cardano_blockchain_types::{hashes::TransactionId, Point, TxnIndex};
12+
use cardano_blockchain_types::{hashes::TransactionId, Point, StakeAddress, TxnIndex};
1013
use catalyst_types::{
1114
catalyst_id::{key_rotation::KeyRotation, role_index::RoleId, CatalystId},
1215
conversion::zero_out_last_n_bytes,
@@ -246,12 +249,11 @@ impl RegistrationChain {
246249
.and_then(|rdr| rdr.encryption_key_from_rotation(rotation))
247250
}
248251

249-
// FIXME
250-
// /// Returns a set of role 0 stake addresses.
251-
// #[must_use]
252-
// pub fn role_0_stake_addresses(&self) -> HashSet<StakeAddress> {
253-
// self.inner.certificate_uris.stake_addresses(0)
254-
// }
252+
/// Returns all stake addresses associated to this registration.
253+
#[must_use]
254+
pub fn stake_addresses(&self) -> HashSet<StakeAddress> {
255+
self.inner.certificate_uris.stake_addresses()
256+
}
255257
}
256258

257259
/// Inner structure of registration chain.

0 commit comments

Comments
 (0)