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 7 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
Expand Up @@ -30,10 +30,9 @@
.map(|e| {
let provisional = e.entity.get_provisional().expect("Entity should have a provisional config set since we applied shield above");
let derived = provisional.as_factor_instances_derived().expect("Should have derived factors");
let input = TransactionManifestApplySecurityShieldUnsecurifiedInput::new(derived.clone());
TransactionManifest::apply_security_shield_for_unsecurified_entity(
e,
input,
derived.clone()

Check warning on line 35 in crates/system/os/factors/src/apply_security_shield/sargon_os_apply_security_shield_interaction.rs

View check run for this annotation

Codecov / codecov/patch

crates/system/os/factors/src/apply_security_shield/sargon_os_apply_security_shield_interaction.rs#L35

Added line #L35 was not covered by tests
)
}).collect::<Result<Vec<TransactionManifest>>>()?;

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,
security_structure_of_factor_instances:
SecurityStructureOfFactorInstances,
apply_shield_manifest_kind: TransactionManifestApplySecurityShieldKind,
) -> Result<TransactionManifest>;
}

impl TransactionManifestSecurifySecurifiedEntity for TransactionManifest {
fn apply_security_shield_for_securified_entity(

Check warning on line 19 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#L19

Added line #L19 was not covered by tests
securified_entity: AnySecurifiedEntity,
security_structure_of_factor_instances:
SecurityStructureOfFactorInstances,
apply_shield_manifest_kind: TransactionManifestApplySecurityShieldKind,
) -> Result<Self> {
let kind = apply_shield_manifest_kind;
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#L25-L26

Added lines #L25 - L26 were 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
}
}
Loading
Loading