Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Apply Shield Wallet Interaction Part 2 #355

Open
wants to merge 19 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@
Into::<AddressOfAccountOrPersona>::into(self.entity.address())
}

pub fn current_authentication_signing_factor_instance(

Check warning on line 65 in crates/profile/models/supporting-types/src/abstract_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/profile/models/supporting-types/src/abstract_securified_entity.rs#L65

Added line #L65 was not covered by tests
&self,
) -> HierarchicalDeterministicFactorInstance {
self.securified_entity_control()

Check warning on line 68 in crates/profile/models/supporting-types/src/abstract_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/profile/models/supporting-types/src/abstract_securified_entity.rs#L68

Added line #L68 was not covered by tests
.authentication_signing_factor_instance()
}

pub fn veci(&self) -> Option<VirtualEntityCreatingInstance> {
self.securified_entity_control()
.veci()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
use crate::prelude::*;
use radix_engine_interface::blueprints::access_controller::{
AccessControllerInitiateRecoveryAsPrimaryInput as ScryptoAccessControllerInitiateRecoveryAsPrimaryInput,
AccessControllerInitiateRecoveryAsRecoveryInput as ScryptoAccessControllerInitiateRecoveryAsRecoveryInput,
AccessControllerQuickConfirmPrimaryRoleRecoveryProposalInput as ScryptoAccessControllerQuickConfirmPrimaryRoleRecoveryProposalInput,
AccessControllerQuickConfirmRecoveryRoleRecoveryProposalInput as ScryptoAccessControllerQuickConfirmRecoveryRoleRecoveryProposalInput,
AccessControllerTimedConfirmRecoveryInput as ScryptoAccessControllerTimedConfirmRecoveryInput,
};

#[derive(Debug, Clone)]
pub struct AccessControllerFactorsAndTimeInput {
Copy link
Contributor

@Sajjon Sajjon Jan 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shared type to create:

  • AccessControllerInitiateRecoveryAsPrimaryInput
  • AccessControllerInitiateRecoveryAsRecoveryInput
  • AccessControllerQuickConfirmPrimaryRoleRecoveryProposalInput
  • AccessControllerQuickConfirmRecoveryRoleRecoveryProposalInput
  • AccessControllerTimedConfirmRecoveryInput

Input to call_method instruction, using SecurityStructureOfFactorInstances - which is Into<RuleSet> (and time u32).

rule_set: ScryptoRuleSet,
timed_recovery_delay_in_minutes: u32,
}

impl AccessControllerFactorsAndTimeInput {
pub fn new(

Check warning on line 17 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L17

Added line #L17 was not covered by tests
security_structure_of_factor_instances: &SecurityStructureOfFactorInstances,
) -> Self {
let rule_set = ScryptoRuleSet::from(
security_structure_of_factor_instances
.matrix_of_factors
.clone(),

Check warning on line 23 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L21-L23

Added lines #L21 - L23 were not covered by tests
);

let timed_recovery_delay_in_minutes =
security_structure_of_factor_instances

Check warning on line 27 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L26-L27

Added lines #L26 - L27 were not covered by tests
.timed_recovery_delay_in_minutes();

Self {
rule_set,
timed_recovery_delay_in_minutes,
}
}
}

impl From<&AccessControllerFactorsAndTimeInput>
for ScryptoAccessControllerInitiateRecoveryAsRecoveryInput
{
fn from(value: &AccessControllerFactorsAndTimeInput) -> Self {

Check warning on line 40 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L40

Added line #L40 was not covered by tests
Self {
rule_set: value.rule_set.clone(),
timed_recovery_delay_in_minutes: Some(

Check warning on line 43 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L42-L43

Added lines #L42 - L43 were not covered by tests
value.timed_recovery_delay_in_minutes,
),
}
}
}

impl From<&AccessControllerFactorsAndTimeInput>
for ScryptoAccessControllerInitiateRecoveryAsPrimaryInput
{
fn from(value: &AccessControllerFactorsAndTimeInput) -> Self {

Check warning on line 53 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L53

Added line #L53 was not covered by tests
Self {
rule_set: value.rule_set.clone(),
timed_recovery_delay_in_minutes: Some(

Check warning on line 56 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L55-L56

Added lines #L55 - L56 were not covered by tests
value.timed_recovery_delay_in_minutes,
),
}
}
}

impl From<&AccessControllerFactorsAndTimeInput>
for ScryptoAccessControllerQuickConfirmRecoveryRoleRecoveryProposalInput
{
fn from(value: &AccessControllerFactorsAndTimeInput) -> Self {

Check warning on line 66 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L66

Added line #L66 was not covered by tests
Self {
rule_set: value.rule_set.clone(),
timed_recovery_delay_in_minutes: Some(

Check warning on line 69 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L68-L69

Added lines #L68 - L69 were not covered by tests
value.timed_recovery_delay_in_minutes,
),
}
}
}

impl From<&AccessControllerFactorsAndTimeInput>
for ScryptoAccessControllerQuickConfirmPrimaryRoleRecoveryProposalInput
{
fn from(value: &AccessControllerFactorsAndTimeInput) -> Self {

Check warning on line 79 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L79

Added line #L79 was not covered by tests
Self {
rule_set: value.rule_set.clone(),
timed_recovery_delay_in_minutes: Some(

Check warning on line 82 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L81-L82

Added lines #L81 - L82 were not covered by tests
value.timed_recovery_delay_in_minutes,
),
}
}
}

impl From<&AccessControllerFactorsAndTimeInput>
for ScryptoAccessControllerTimedConfirmRecoveryInput
{
fn from(value: &AccessControllerFactorsAndTimeInput) -> Self {

Check warning on line 92 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L92

Added line #L92 was not covered by tests
Self {
rule_set: value.rule_set.clone(),
timed_recovery_delay_in_minutes: Some(

Check warning on line 95 in crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L94-L95

Added lines #L94 - L95 were not covered by tests
value.timed_recovery_delay_in_minutes,
),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#![allow(dead_code)]
use crate::prelude::*;
use std::ops::Deref;

use profile_supporting_types::AnySecurifiedEntity;

pub trait TransactionManifestSecurifySecurifiedEntity:
TransactionManifestSetRolaKey
{
fn apply_security_shield_for_securified_entity(
securified_entity: AnySecurifiedEntity,
input: TransactionManifestApplySecurityShieldSecurifiedInput,
) -> Result<TransactionManifest>;
}

impl TransactionManifestSecurifySecurifiedEntity for TransactionManifest {
fn apply_security_shield_for_securified_entity(

Check warning on line 17 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L17

Added line #L17 was not covered by tests
securified_entity: AnySecurifiedEntity,
input: TransactionManifestApplySecurityShieldSecurifiedInput,
) -> Result<Self> {
let TransactionManifestApplySecurityShieldSecurifiedInput {
security_structure_of_factor_instances,
apply_shield_manifest_kind: kind,
} = input.clone();

Check warning on line 24 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L21-L24

Added lines #L21 - L24 were not covered by tests

let entity_address = securified_entity.entity.address();

Check warning on line 26 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L26

Added line #L26 was not covered by tests

// ACCESS_CONTROLLER_CREATE_PROOF_IDENT
let mut builder = TransactionManifest::produce_owner_badge(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does:

builder.call_method(
    access_controller_address.scrypto(),
    ACCESS_CONTROLLER_CREATE_PROOF_IDENT,
    (),
);

ScryptoTransactionManifestBuilder::new(),
&securified_entity.entity,

Check warning on line 31 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L30-L31

Added lines #L30 - L31 were not covered by tests
);

let access_controller_address = securified_entity
.securified_entity_control
.access_controller_address;

Check warning on line 36 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L34-L36

Added lines #L34 - L36 were not covered by tests

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have forgotten to add the withdrawal of XRD from AccessControllera XRD vault.

I’m adding it now

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right we need to add the locking of fee against XRD vault of AccessController later (like the top up) - since we dont know how big a fee to lock. Ive added modify_manifest_add_lock_fee_against_xrd_vault_of_access_controller. Take a look at it 4d8fc6d

let factors_and_time_input = &AccessControllerFactorsAndTimeInput::new(
&security_structure_of_factor_instances,

Check warning on line 39 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L38-L39

Added lines #L38 - L39 were not covered by tests
);

// INITIATE RECOVERY
let (init_method, init_input) =
kind.input_for_initialization(factors_and_time_input);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depending on selector of which of the six TransactionManifest flavours as selected by kind: TransactionManifestApplySecurityShieldKind we use different roles for initialization of recovery (and the correct concrete scrypto "Input"-type (Box dyn-ed))

For details see transaction_manifest_apply_security_shield_kind.rs which was added by this PR

builder = builder.call_method(
access_controller_address.scrypto(),
init_method,
(init_input.deref(),),

Check warning on line 48 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L43-L48

Added lines #L43 - L48 were not covered by tests
);

// CONFIRM RECOVERY
// TODO: for timed, should we really call it here, now? Should
// we not call it AFTER the time has elapsed???
let (confirm_method, confirm_input) =
kind.input_for_confirm(factors_and_time_input);
builder = builder.call_method(
access_controller_address.scrypto(),
confirm_method,
CyonAlexRDX marked this conversation as resolved.
Show resolved Hide resolved
(confirm_input.deref(),),

Check warning on line 59 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L54-L59

Added lines #L54 - L59 were not covered by tests
);

// Set Rola Key
let should_set_rola_key = security_structure_of_factor_instances
.authentication_signing_factor_instance
!= securified_entity
Copy link
Contributor

@Sajjon Sajjon Jan 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dont set ROLA key if it is unchanged

.current_authentication_signing_factor_instance();

Check warning on line 66 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L63-L66

Added lines #L63 - L66 were not covered by tests

if should_set_rola_key {
if kind.can_set_rola_key() {
builder = TransactionManifest::set_rola_key(
builder,
&security_structure_of_factor_instances
.authentication_signing_factor_instance,
&entity_address,

Check warning on line 74 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L68-L74

Added lines #L68 - L74 were not covered by tests
);
} else {
return Err(CommonError::Unknown); // TODO: new error variant

Check warning on line 77 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L77

Added line #L77 was not covered by tests
}
}

let manifest = TransactionManifest::sargon_built(
builder,
securified_entity.network_id(),

Check warning on line 83 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L82-L83

Added lines #L82 - L83 were not covered by tests
);

// N.B.
// We do NOT top of XRD vault of AccessController - yet!
// Host will need to call the function:
// `modify_manifest_add_withdraw_of_xrd_for_access_controller_xrd_vault_top_up_paid_by_account`
// after user has selected account to pay in wallet GUI.
// (and as usual also call `modify_manifest_lock_fee`)

Ok(manifest)

Check warning on line 93 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs

View check run for this annotation

Codecov / codecov/patch

crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L93

Added line #L93 was not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
use profile_supporting_types::AnyUnsecurifiedEntity;
use radix_common::prelude::ACCESS_CONTROLLER_PACKAGE as SCRYPTO_ACCESS_CONTROLLER_PACKAGE;
use radix_engine_interface::blueprints::{
access_controller::{
AccessControllerCreateManifestInput as ScryptoAccessControllerCreateManifestInput,
ACCESS_CONTROLLER_BLUEPRINT as SCRYPTO_ACCESS_CONTROLLER_BLUEPRINT,
ACCESS_CONTROLLER_CREATE_IDENT as SCRYPTO_ACCESS_CONTROLLER_CREATE_IDENT,
},
account::AccountSecurifyManifestInput as ScryptoAccountSecurifyManifestInput,
use radix_engine_interface::blueprints::access_controller::{
AccessControllerCreateManifestInput as ScryptoAccessControllerCreateManifestInput,
ACCESS_CONTROLLER_BLUEPRINT as SCRYPTO_ACCESS_CONTROLLER_BLUEPRINT,
ACCESS_CONTROLLER_CREATE_IDENT as SCRYPTO_ACCESS_CONTROLLER_CREATE_IDENT,
};
use radix_transactions::prelude::ManifestBuilder;

use crate::prelude::*;

Expand All @@ -29,37 +25,16 @@ impl TransactionManifestApplySecurityShieldUnsecurifiedInput {
}
}

pub trait TransactionManifestSecurifyEntity: Sized {
pub trait TransactionManifestSecurifyUnsecurifiedEntity:
Sized + TransactionManifestSetRolaKey
{
fn apply_security_shield_for_unsecurified_entity(
unsecurified_entity: AnyUnsecurifiedEntity,
input: TransactionManifestApplySecurityShieldUnsecurifiedInput,
) -> Result<Self>;

fn set_rola_key(
builder: ManifestBuilder,
authentication_signing_factor_instance: &HierarchicalDeterministicFactorInstance,
entity_address: &AddressOfAccountOrPersona,
) -> ManifestBuilder;
}

impl TransactionManifestSecurifyEntity for TransactionManifest {
fn set_rola_key(
builder: ManifestBuilder,
authentication_signing_factor_instance:
&HierarchicalDeterministicFactorInstance,
entity_address: &AddressOfAccountOrPersona,
) -> ManifestBuilder {
let rola_key_hash = PublicKeyHash::hash(
authentication_signing_factor_instance.public_key(),
);
let owner_key_hashes = vec![rola_key_hash];
Self::set_owner_keys_hashes_on_builder(
entity_address,
owner_key_hashes,
builder,
)
}

impl TransactionManifestSecurifyUnsecurifiedEntity for TransactionManifest {
/// We do NOT top of XRD vault of AccessController - yet!
/// Host will need to call the function:
/// `modify_manifest_add_withdraw_of_xrd_for_access_controller_xrd_vault_top_up_paid_by_account`
Expand All @@ -77,34 +52,11 @@ impl TransactionManifestSecurifyEntity for TransactionManifest {
security_structure_of_factor_instances
.assert_has_entity_kind(entity_address.get_entity_kind())?;

let (security_entity_identifier, owner_badge) =
if entity_address.is_identity() {
(
SCRYPTO_IDENTITY_SECURIFY_IDENT,
SCRYPTO_IDENTITY_OWNER_BADGE,
)
} else {
(SCRYPTO_ACCOUNT_SECURIFY_IDENT, SCRYPTO_ACCOUNT_OWNER_BADGE)
};

let mut builder = ScryptoTransactionManifestBuilder::new();

// Securify the entity which will return an entity owner badge onto the worktop.
let owner_badge_bucket_name = "owner_badge_bucket";
{
builder = builder.call_method(
&entity_address,
security_entity_identifier,
ScryptoAccountSecurifyManifestInput {},
);

// Create a bucket out of the entity owner badge.
builder = builder.take_from_worktop(
owner_badge,
1,
owner_badge_bucket_name,
);
};
let (mut builder, owner_badge_bucket) = Self::put_owner_badge_in_bucket(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

still calls "securify" - just refactored a bit.

ScryptoTransactionManifestBuilder::new(),
&unsecurified_entity.entity,
);

// Create an access controller for the entity.
builder = {
Expand All @@ -131,8 +83,6 @@ impl TransactionManifestSecurifyEntity for TransactionManifest {
.clone(),
);

let owner_badge_bucket = builder.bucket(owner_badge_bucket_name);

builder.call_function(
SCRYPTO_ACCESS_CONTROLLER_PACKAGE,
SCRYPTO_ACCESS_CONTROLLER_BLUEPRINT,
Expand Down
19 changes: 16 additions & 3 deletions crates/transaction/manifests/src/manifests_security_shield/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
#[allow(clippy::module_inception)]
mod manifests_security_shield;
mod access_controller_factors_and_time_input;
mod manifests_securify_shield_securified_entity;
mod manifests_securify_shield_unsecurified_entity;
mod set_rola_key;
mod top_up_access_controller_xrd_vault;
mod transaction_manifest_apply_security_shield_any_input;
mod transaction_manifest_apply_security_shield_kind;
mod transaction_manifest_apply_security_shield_securified_input;
mod transaction_manifest_owner_badge_producing;

pub use manifests_security_shield::*;
pub use access_controller_factors_and_time_input::*;
pub use manifests_securify_shield_securified_entity::*;
pub use manifests_securify_shield_unsecurified_entity::*;
pub use set_rola_key::*;
pub use top_up_access_controller_xrd_vault::*;
pub use transaction_manifest_apply_security_shield_any_input::*;
pub use transaction_manifest_apply_security_shield_kind::*;
pub use transaction_manifest_apply_security_shield_securified_input::*;
pub use transaction_manifest_owner_badge_producing::*;
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
use radix_transactions::prelude::ManifestBuilder;

use crate::prelude::*;

pub trait TransactionManifestSetRolaKey: Sized {
fn set_rola_key(
builder: ManifestBuilder,
authentication_signing_factor_instance: &HierarchicalDeterministicFactorInstance,
entity_address: &AddressOfAccountOrPersona,
) -> ManifestBuilder;
}

impl TransactionManifestSetRolaKey for TransactionManifest {
fn set_rola_key(
builder: ManifestBuilder,
authentication_signing_factor_instance:
&HierarchicalDeterministicFactorInstance,
entity_address: &AddressOfAccountOrPersona,
) -> ManifestBuilder {
let rola_key_hash = PublicKeyHash::hash(
authentication_signing_factor_instance.public_key(),
);
let owner_key_hashes = vec![rola_key_hash];
Self::set_owner_keys_hashes_on_builder(
entity_address,
owner_key_hashes,
builder,
)
}
}
Loading
Loading