permissioned_delegation - [testnet]
Esta página aún no está disponible en tu idioma.
use 0x1::auth_data;use 0x1::bcs_stream;use 0x1::big_ordered_map;use 0x1::ed25519;use 0x1::error;use 0x1::option;use 0x1::permissioned_signer;use 0x1::rate_limiter;use 0x1::signer;Enum AccountDelegation
enum AccountDelegation has storeVariants
Enum DelegationKey
enum DelegationKey has copy, drop, storeVariants
Ed25519PublicKey
Fields
Constants
const ENOT_MASTER_SIGNER: u64 = 1;const EINVALID_PUBLIC_KEY: u64 = 2;const EINVALID_SIGNATURE: u64 = 4;const EDELEGATION_EXISTENCE: u64 = 5;const EPUBLIC_KEY_NOT_FOUND: u64 = 3;const ERATE_LIMITED: u64 = 6;Resources
RegisteredDelegations
struct RegisteredDelegations has keyFields
Functions
gen_ed25519_key
public fun gen_ed25519_key(key: ed25519::UnvalidatedPublicKey): permissioned_delegation::DelegationKeyImplementation
public fun gen_ed25519_key(key: UnvalidatedPublicKey): DelegationKey { DelegationKey::Ed25519PublicKey(key)}check_txn_rate
fun check_txn_rate(bundle: &mut permissioned_delegation::AccountDelegation, check_rate_limit: bool)Implementation
inline fun check_txn_rate(bundle: &mut AccountDelegation, check_rate_limit: bool) { let token_bucket = &mut bundle.rate_limiter; if (check_rate_limit && token_bucket.is_some()) { assert!(rate_limiter::request(token_bucket.borrow_mut(), 1), std::error::permission_denied(ERATE_LIMITED)); };}add_permissioned_handle
public fun add_permissioned_handle(master: &signer, key: permissioned_delegation::DelegationKey, rate_limiter: option::Option<rate_limiter::RateLimiter>, expiration_time: u64): signerImplementation
public fun add_permissioned_handle( master: &signer, key: DelegationKey, rate_limiter: Option<RateLimiter>, expiration_time: u64,): signer acquires RegisteredDelegations { assert!(!is_permissioned_signer(master), error::permission_denied(ENOT_MASTER_SIGNER)); let addr = signer::address_of(master); if (!exists<RegisteredDelegations>(addr)) { move_to(master, RegisteredDelegations { delegations: big_ordered_map::new_with_config(50, 20, false) }); }; let handles = &mut RegisteredDelegations[addr].delegations; assert!(!handles.contains(&key), error::already_exists(EDELEGATION_EXISTENCE)); let handle = permissioned_signer::create_storable_permissioned_handle(master, expiration_time); let permissioned_signer = permissioned_signer::signer_from_storable_permissioned_handle(&handle); handles.add(key, AccountDelegation::V1 { handle, rate_limiter }); permissioned_signer}remove_permissioned_handle
public fun remove_permissioned_handle(master: &signer, key: permissioned_delegation::DelegationKey)Implementation
public fun remove_permissioned_handle( master: &signer, key: DelegationKey,) acquires RegisteredDelegations { assert!(!is_permissioned_signer(master), error::permission_denied(ENOT_MASTER_SIGNER)); let addr = signer::address_of(master); let delegations = &mut RegisteredDelegations[addr].delegations; assert!(delegations.contains(&key), error::not_found(EDELEGATION_EXISTENCE)); let delegation = delegations.remove(&key); match (delegation) { AccountDelegation::V1 { handle, rate_limiter: _ } => { permissioned_signer::destroy_storable_permissioned_handle(handle); } };}permissioned_signer_by_key
public fun permissioned_signer_by_key(master: &signer, key: permissioned_delegation::DelegationKey): signerImplementation
public fun permissioned_signer_by_key( master: &signer, key: DelegationKey,): signer acquires RegisteredDelegations { assert!(!is_permissioned_signer(master), error::permission_denied(ENOT_MASTER_SIGNER)); let addr = signer::address_of(master); let handle = get_storable_permissioned_handle(addr, key, false); permissioned_signer::signer_from_storable_permissioned_handle(handle)}handle_address_by_key
public fun handle_address_by_key(master: address, key: permissioned_delegation::DelegationKey): addressImplementation
public fun handle_address_by_key(master: address, key: DelegationKey): address acquires RegisteredDelegations { let handle = get_storable_permissioned_handle(master, key, false); permissioned_signer::permissions_storage_address(handle)}authenticate
Authorization function for account abstraction.
public fun authenticate(account: signer, abstraction_auth_data: auth_data::AbstractionAuthData): signerImplementation
public fun authenticate( account: signer, abstraction_auth_data: AbstractionAuthData): signer acquires RegisteredDelegations { let addr = signer::address_of(&account); let stream = bcs_stream::new(*auth_data::authenticator(&abstraction_auth_data)); let public_key = new_unvalidated_public_key_from_bytes( bcs_stream::deserialize_vector<u8>(&mut stream, |x| deserialize_u8(x)) ); let signature = new_signature_from_bytes( bcs_stream::deserialize_vector<u8>(&mut stream, |x| deserialize_u8(x)) ); assert!( ed25519::signature_verify_strict( &signature, &public_key, *auth_data::digest(&abstraction_auth_data), ), error::permission_denied(EINVALID_SIGNATURE) ); let handle = get_storable_permissioned_handle(addr, DelegationKey::Ed25519PublicKey(public_key), true); permissioned_signer::signer_from_storable_permissioned_handle(handle)}get_storable_permissioned_handle
fun get_storable_permissioned_handle(master: address, key: permissioned_delegation::DelegationKey, count_rate: bool): &permissioned_signer::StorablePermissionedHandleImplementation
inline fun get_storable_permissioned_handle( master: address, key: DelegationKey, count_rate: bool): &StorablePermissionedHandle { if (exists<RegisteredDelegations>(master)) { let delegations = &mut RegisteredDelegations[master].delegations; if (delegations.contains(&key)) { let delegation = delegations.remove(&key); check_txn_rate(&mut delegation, count_rate); delegations.add(key, delegation); &delegations.borrow(&key).handle } else { abort error::permission_denied(EINVALID_SIGNATURE) } } else { abort error::permission_denied(EINVALID_SIGNATURE) }}Specification
pragma verify = false;