-
Notifications
You must be signed in to change notification settings - Fork 1
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
base: main
Are you sure you want to change the base?
Changes from 4 commits
1a52f44
fdea748
9015925
e7fd884
54e9967
20cbf2a
25188e9
4d8fc6d
f2babd1
12704e2
58fc8cb
4007bae
0ce2b35
5529715
15e0558
252f2bd
3489880
3ac37f3
ebde221
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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 { | ||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L17
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L21-L23
|
||
); | ||
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L26-L27
|
||
.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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L40
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L42-L43
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L53
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L55-L56
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L66
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L68-L69
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L79
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L81-L82
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L92
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/access_controller_factors_and_time_input.rs#L94-L95
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L17
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L21-L24
|
||
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L26
|
||
|
||
// ACCESS_CONTROLLER_CREATE_PROOF_IDENT | ||
let mut builder = TransactionManifest::produce_owner_badge( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This does:
|
||
ScryptoTransactionManifestBuilder::new(), | ||
&securified_entity.entity, | ||
Check warning on line 31 in crates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L30-L31
|
||
); | ||
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L34-L36
|
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 |
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L38-L39
|
||
); | ||
|
||
// INITIATE RECOVERY | ||
let (init_method, init_input) = | ||
kind.input_for_initialization(factors_and_time_input); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Depending on selector of which of the six For details see |
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L43-L48
|
||
); | ||
|
||
// 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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L54-L59
|
||
); | ||
|
||
// Set Rola Key | ||
let should_set_rola_key = security_structure_of_factor_instances | ||
.authentication_signing_factor_instance | ||
!= securified_entity | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L63-L66
|
||
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L68-L74
|
||
); | ||
} 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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L77
|
||
} | ||
} | ||
|
||
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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L82-L83
|
||
); | ||
|
||
// 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 Codecov / codecov/patchcrates/transaction/manifests/src/manifests_security_shield/manifests_securify_shield_securified_entity.rs#L93
|
||
} | ||
} |
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::*; | ||
|
||
|
@@ -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` | ||
|
@@ -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( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 = { | ||
|
@@ -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, | ||
|
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, | ||
) | ||
} | ||
} |
There was a problem hiding this comment.
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, usingSecurityStructureOfFactorInstances
- which isInto<RuleSet>
(and time u32).