From 09f449dac2211d8cba02660d4dde1f4dce166376 Mon Sep 17 00:00:00 2001 From: Omar Date: Fri, 11 Oct 2024 16:56:11 +0300 Subject: [PATCH] Add derivations for the package of direct caller --- .../src/common/non_fungible.rs | 28 +++++++++++-- .../src/derive/functions.rs | 42 +++++++++++++++++-- .../src/internal_prelude.rs | 2 + .../src/functions/derive.rs | 36 +++++++++------- 4 files changed, 87 insertions(+), 21 deletions(-) diff --git a/crates/radix-engine-toolkit-uniffi/src/common/non_fungible.rs b/crates/radix-engine-toolkit-uniffi/src/common/non_fungible.rs index c3a0a5ef..a33c41cc 100644 --- a/crates/radix-engine-toolkit-uniffi/src/common/non_fungible.rs +++ b/crates/radix-engine-toolkit-uniffi/src/common/non_fungible.rs @@ -92,6 +92,26 @@ impl NonFungibleGlobalId { ) } + #[uniffi::constructor] + pub fn global_caller_badge( + component_address: Arc
, + network_id: u8, + ) -> Result> { + derive_virtual_global_caller_non_fungible_global_id_from_component_address( + component_address, network_id, + ) + } + + #[uniffi::constructor] + pub fn package_of_direct_caller_badge( + package_address: Arc
, + network_id: u8, + ) -> Result> { + derive_virtual_package_of_direct_caller_non_fungible_global_id_from_component_address( + package_address, network_id, + ) + } + pub fn resource_address(&self) -> Arc
{ let address = self.0.resource_address(); Arc::new(Address::from_typed_node_id(address, self.1)) @@ -179,10 +199,10 @@ pub fn non_fungible_local_id_sbor_decode( bytes: Vec, ) -> Result { let native = match bytes.first().copied() { - Some(NATIVE_SCRYPTO_SBOR_V1_PAYLOAD_PREFIX) => native_scrypto_decode::< - NativeNonFungibleLocalId, - >(&bytes) - .map_err(Into::into), + Some(NATIVE_SCRYPTO_SBOR_V1_PAYLOAD_PREFIX) => { + native_scrypto_decode::(&bytes) + .map_err(Into::into) + } Some(NATIVE_MANIFEST_SBOR_V1_PAYLOAD_PREFIX) => { native_manifest_decode::(&bytes) .map_err(Into::into) diff --git a/crates/radix-engine-toolkit-uniffi/src/derive/functions.rs b/crates/radix-engine-toolkit-uniffi/src/derive/functions.rs index 26f9d9a3..1154cd33 100644 --- a/crates/radix-engine-toolkit-uniffi/src/derive/functions.rs +++ b/crates/radix-engine-toolkit-uniffi/src/derive/functions.rs @@ -49,7 +49,37 @@ pub fn derive_virtual_signature_non_fungible_global_id_from_public_key( core_virtual_signature_non_fungible_global_id_from_public_key( &public_key, ); - Ok(Arc::new(NonFungibleGlobalId(non_fungible_global_id, network_id))) + Ok(Arc::new(NonFungibleGlobalId( + non_fungible_global_id, + network_id, + ))) +} + +#[uniffi::export] +pub fn derive_virtual_global_caller_non_fungible_global_id_from_component_address( + component_address: Arc
, + network_id: u8, +) -> Result> { + let component_address = + NativeComponentAddress::try_from(*component_address)?; + let non_fungible_global_id = core_virtual_global_caller_non_fungible_global_id_from_component_address(component_address); + Ok(Arc::new(NonFungibleGlobalId( + non_fungible_global_id, + network_id, + ))) +} + +#[uniffi::export] +pub fn derive_virtual_package_of_direct_caller_non_fungible_global_id_from_component_address( + package_address: Arc
, + network_id: u8, +) -> Result> { + let package_address = NativePackageAddress::try_from(*package_address)?; + let non_fungible_global_id = core_virtual_package_of_direct_caller_non_fungible_global_id_from_component_address(package_address); + Ok(Arc::new(NonFungibleGlobalId( + non_fungible_global_id, + network_id, + ))) } #[uniffi::export] @@ -61,7 +91,10 @@ pub fn derive_virtual_account_address_from_olympia_account_address( core_virtual_account_address_from_olympia_account_address( &olympia_account_address.0, )?; - Ok(Arc::new(Address::from_typed_node_id(component_address, network_id))) + Ok(Arc::new(Address::from_typed_node_id( + component_address, + network_id, + ))) } #[uniffi::export] @@ -72,7 +105,10 @@ pub fn derive_resource_address_from_olympia_resource_address( let resource_address = core_resource_address_from_olympia_resource_address( &olympia_resource_address.0, )?; - Ok(Arc::new(Address::from_typed_node_id(resource_address, network_id))) + Ok(Arc::new(Address::from_typed_node_id( + resource_address, + network_id, + ))) } #[uniffi::export] diff --git a/crates/radix-engine-toolkit-uniffi/src/internal_prelude.rs b/crates/radix-engine-toolkit-uniffi/src/internal_prelude.rs index 4e810ea1..e107f0b8 100644 --- a/crates/radix-engine-toolkit-uniffi/src/internal_prelude.rs +++ b/crates/radix-engine-toolkit-uniffi/src/internal_prelude.rs @@ -40,6 +40,8 @@ mod core { virtual_account_address_from_public_key as core_virtual_account_address_from_public_key, virtual_identity_address_from_public_key as core_virtual_identity_address_from_public_key, virtual_signature_non_fungible_global_id_from_public_key as core_virtual_signature_non_fungible_global_id_from_public_key, + virtual_global_caller_non_fungible_global_id_from_component_address as core_virtual_global_caller_non_fungible_global_id_from_component_address, + virtual_package_of_direct_caller_non_fungible_global_id_from_component_address as core_virtual_package_of_direct_caller_non_fungible_global_id_from_component_address, virtual_account_address_from_olympia_account_address as core_virtual_account_address_from_olympia_account_address, resource_address_from_olympia_resource_address as core_resource_address_from_olympia_resource_address, public_key_from_olympia_account_address as core_public_key_from_olympia_account_address, diff --git a/crates/radix-engine-toolkit/src/functions/derive.rs b/crates/radix-engine-toolkit/src/functions/derive.rs index d8391f9d..d8000ca0 100644 --- a/crates/radix-engine-toolkit/src/functions/derive.rs +++ b/crates/radix-engine-toolkit/src/functions/derive.rs @@ -47,6 +47,18 @@ where NonFungibleGlobalId::from_public_key(public_key) } +pub fn virtual_global_caller_non_fungible_global_id_from_component_address( + component_address: ComponentAddress, +) -> NonFungibleGlobalId { + NonFungibleGlobalId::global_caller_badge(component_address) +} + +pub fn virtual_package_of_direct_caller_non_fungible_global_id_from_component_address( + package_address: PackageAddress, +) -> NonFungibleGlobalId { + NonFungibleGlobalId::package_of_direct_caller_badge(package_address) +} + pub fn virtual_account_address_from_olympia_account_address( olympia_account_address: S, ) -> Result @@ -117,14 +129,12 @@ where olympia_account_address.chars().nth(2), ) { (Some('d'), Some('x')) => Ok(()), - (Some(char1), Some(char2)) => { - Err( - DerivationError::InvalidCharsInOlympiaAddressEntitySpecifier { - expected: ('d', 'x'), - actual: (char1, char2), - }, - ) - } + (Some(char1), Some(char2)) => Err( + DerivationError::InvalidCharsInOlympiaAddressEntitySpecifier { + expected: ('d', 'x'), + actual: (char1, char2), + }, + ), _ => Err(DerivationError::InvalidOlympiaAddressLength { expected: 65, actual: olympia_account_address.len(), @@ -159,12 +169,10 @@ where } }) } - Some(prefix) => { - Err(DerivationError::InvalidOlympiaAddressPrefix { - expected: 0x04, - actual: *prefix, - }) - } + Some(prefix) => Err(DerivationError::InvalidOlympiaAddressPrefix { + expected: 0x04, + actual: *prefix, + }), None => Err(DerivationError::InvalidOlympiaAddressLength { expected: EXPECTED_LENGTH, actual: data.len(),