use super::*;
use radix_common::prelude::*;
use radix_engine_interface::blueprints::access_controller::*;
use radix_engine_interface::blueprints::account::*;
use radix_engine_interface::blueprints::consensus_manager::*;
use radix_engine_interface::blueprints::identity::*;
use radix_engine_interface::blueprints::locker::*;
use radix_engine_interface::blueprints::package::*;
use radix_engine_interface::blueprints::pool::*;
use radix_engine_interface::blueprints::resource::*;
use radix_engine_interface::blueprints::transaction_tracker::*;
use radix_engine_interface::object_modules::metadata::*;
use radix_engine_interface::object_modules::role_assignment::*;
use radix_engine_interface::object_modules::royalty::*;
pub trait StaticInvocationResourcesOutput
where
Self: ManifestEncode + ManifestDecode,
{
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError>;
}
pub struct InvocationDetails<'a> {
pub receiver: InvocationReceiver,
pub sent_resources: &'a TrackedResources,
pub source: ChangeSource,
}
#[derive(Debug)]
pub enum InvocationReceiver {
GlobalMethod(ResolvedDynamicAddress<GlobalAddress>),
DirectAccess(InternalAddress),
BlueprintFunction(BlueprintId),
}
macro_rules! no_output_static_invocation_resources_output_impl {
(
$(
$output_ident: ident
),* $(,)?
) => {
$(
impl StaticInvocationResourcesOutput for $output_ident {
fn output(
&self,
_details: InvocationDetails
) -> Result<TrackedResources, StaticResourceMovementsError> {
Ok(TrackedResources::new_empty())
}
}
)*
};
}
macro_rules! handle_single_unknown_output_static_invocation_resources_output_impl {
($input_ty: ty) => {
impl StaticInvocationResourcesOutput for $input_ty {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
)
}
}
};
(no_resource_inputs_returned: $input_ty: ty) => {
impl StaticInvocationResourcesOutput for $input_ty {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let mut tracked_resources =
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]);
for resource_address in details.sent_resources.specified_resources().keys() {
tracked_resources.handle_resource_assertion(
*resource_address,
ResourceBounds::zero(),
details.source,
)?;
}
Ok(tracked_resources)
}
}
};
}
macro_rules! unknown_output_static_invocation_resources_output_impl {
(
$(
$([$modifier: ident]:)? $input_ty: ident
),* $(,)?
) => {
$(
handle_single_unknown_output_static_invocation_resources_output_impl!(
$($modifier:)? $input_ty
);
)*
};
}
no_output_static_invocation_resources_output_impl![
AccessControllerCreateManifestInput,
AccessControllerCreateProofManifestInput,
AccessControllerInitiateRecoveryAsPrimaryManifestInput,
AccessControllerInitiateRecoveryAsRecoveryManifestInput,
AccessControllerQuickConfirmPrimaryRoleRecoveryProposalManifestInput,
AccessControllerQuickConfirmRecoveryRoleRecoveryProposalManifestInput,
AccessControllerTimedConfirmRecoveryManifestInput,
AccessControllerCancelPrimaryRoleRecoveryProposalManifestInput,
AccessControllerCancelRecoveryRoleRecoveryProposalManifestInput,
AccessControllerLockPrimaryRoleManifestInput,
AccessControllerUnlockPrimaryRoleManifestInput,
AccessControllerStopTimedRecoveryManifestInput,
AccessControllerInitiateBadgeWithdrawAttemptAsPrimaryManifestInput,
AccessControllerInitiateBadgeWithdrawAttemptAsRecoveryManifestInput,
AccessControllerCancelPrimaryRoleBadgeWithdrawAttemptManifestInput,
AccessControllerCancelRecoveryRoleBadgeWithdrawAttemptManifestInput,
AccessControllerLockRecoveryFeeManifestInput,
AccessControllerContributeRecoveryFeeManifestInput,
AccountCreateAdvancedManifestInput,
AccountLockFeeManifestInput,
AccountLockContingentFeeManifestInput,
AccountDepositManifestInput,
AccountDepositBatchManifestInput,
AccountBurnManifestInput,
AccountBurnNonFungiblesManifestInput,
AccountCreateProofOfAmountManifestInput,
AccountCreateProofOfNonFungiblesManifestInput,
AccountSetDefaultDepositRuleManifestInput,
AccountSetResourcePreferenceManifestInput,
AccountRemoveResourcePreferenceManifestInput,
AccountTryDepositOrAbortManifestInput,
AccountTryDepositBatchOrAbortManifestInput,
AccountAddAuthorizedDepositorManifestInput,
AccountRemoveAuthorizedDepositorManifestInput,
AccountBalanceManifestInput,
AccountNonFungibleLocalIdsManifestInput,
AccountHasNonFungibleManifestInput,
ConsensusManagerCreateManifestInput,
ConsensusManagerGetCurrentEpochManifestInput,
ConsensusManagerStartManifestInput,
ConsensusManagerGetCurrentTimeManifestInputV1,
ConsensusManagerGetCurrentTimeManifestInputV2,
ConsensusManagerCompareCurrentTimeManifestInputV1,
ConsensusManagerCompareCurrentTimeManifestInputV2,
ConsensusManagerNextRoundManifestInput,
ValidatorRegisterManifestInput,
ValidatorUnregisterManifestInput,
ValidatorUpdateKeyManifestInput,
ValidatorUpdateFeeManifestInput,
ValidatorUpdateAcceptDelegatedStakeManifestInput,
ValidatorAcceptsDelegatedStakeManifestInput,
ValidatorTotalStakeXrdAmountManifestInput,
ValidatorTotalStakeUnitSupplyManifestInput,
ValidatorGetRedemptionValueManifestInput,
ValidatorSignalProtocolUpdateReadinessManifestInput,
ValidatorGetProtocolUpdateReadinessManifestInput,
ValidatorLockOwnerStakeUnitsManifestInput,
ValidatorStartUnlockOwnerStakeUnitsManifestInput,
ValidatorApplyEmissionManifestInput,
ValidatorApplyRewardManifestInput,
IdentityCreateAdvancedManifestInput,
AccountLockerInstantiateManifestInput,
AccountLockerStoreManifestInput,
AccountLockerGetAmountManifestInput,
AccountLockerGetNonFungibleLocalIdsManifestInput,
PackagePublishWasmAdvancedManifestInput,
PackagePublishNativeManifestInput,
OneResourcePoolInstantiateManifestInput,
OneResourcePoolProtectedDepositManifestInput,
OneResourcePoolGetRedemptionValueManifestInput,
OneResourcePoolGetVaultAmountManifestInput,
TwoResourcePoolInstantiateManifestInput,
TwoResourcePoolProtectedDepositManifestInput,
TwoResourcePoolGetRedemptionValueManifestInput,
TwoResourcePoolGetVaultAmountsManifestInput,
MultiResourcePoolInstantiateManifestInput,
MultiResourcePoolProtectedDepositManifestInput,
MultiResourcePoolGetRedemptionValueManifestInput,
MultiResourcePoolGetVaultAmountsManifestInput,
ResourceManagerBurnManifestInput,
ResourceManagerPackageBurnManifestInput,
ResourceManagerGetTotalSupplyManifestInput,
ResourceManagerGetResourceTypeManifestInput,
ResourceManagerCreateEmptyVaultManifestInput,
ResourceManagerGetAmountForWithdrawalManifestInput,
ResourceManagerDropEmptyBucketManifestInput,
FungibleResourceManagerCreateManifestInput,
NonFungibleResourceManagerCreateManifestInput,
NonFungibleResourceManagerGetNonFungibleManifestInput,
NonFungibleResourceManagerUpdateDataManifestInput,
NonFungibleResourceManagerExistsManifestInput,
VaultGetAmountManifestInput,
VaultFreezeManifestInput,
VaultUnfreezeManifestInput,
VaultBurnManifestInput,
VaultPutManifestInput,
FungibleVaultLockFeeManifestInput,
FungibleVaultCreateProofOfAmountManifestInput,
FungibleVaultLockFungibleAmountManifestInput,
FungibleVaultUnlockFungibleAmountManifestInput,
NonFungibleVaultGetNonFungibleLocalIdsManifestInput,
NonFungibleVaultContainsNonFungibleManifestInput,
NonFungibleVaultCreateProofOfNonFungiblesManifestInput,
NonFungibleVaultLockNonFungiblesManifestInput,
NonFungibleVaultUnlockNonFungiblesManifestInput,
NonFungibleVaultBurnNonFungiblesManifestInput,
TransactionTrackerCreateManifestInput,
MetadataCreateManifestInput,
MetadataCreateWithDataManifestInput,
MetadataSetManifestInput,
MetadataLockManifestInput,
MetadataGetManifestInput,
MetadataRemoveManifestInput,
RoleAssignmentCreateManifestInput,
RoleAssignmentSetOwnerManifestInput,
RoleAssignmentLockOwnerManifestInput,
RoleAssignmentSetManifestInput,
RoleAssignmentGetManifestInput,
RoleAssignmentGetOwnerRoleManifestInput,
ComponentRoyaltyCreateManifestInput,
ComponentRoyaltySetManifestInput,
ComponentRoyaltyLockManifestInput,
];
unknown_output_static_invocation_resources_output_impl![
AccessControllerQuickConfirmPrimaryRoleBadgeWithdrawAttemptManifestInput,
AccessControllerQuickConfirmRecoveryRoleBadgeWithdrawAttemptManifestInput,
AccessControllerMintRecoveryBadgesManifestInput,
[no_resource_inputs_returned]: ValidatorStakeAsOwnerManifestInput,
[no_resource_inputs_returned]: ValidatorStakeManifestInput,
[no_resource_inputs_returned]: ValidatorUnstakeManifestInput,
[no_resource_inputs_returned]: ValidatorFinishUnlockOwnerStakeUnitsManifestInput,
AccountLockerInstantiateSimpleManifestInput,
[no_resource_inputs_returned]: OneResourcePoolContributeManifestInput,
[no_resource_inputs_returned]: OneResourcePoolRedeemManifestInput,
OneResourcePoolProtectedWithdrawManifestInput,
TwoResourcePoolContributeManifestInput,
[no_resource_inputs_returned]: TwoResourcePoolRedeemManifestInput,
MultiResourcePoolContributeManifestInput,
[no_resource_inputs_returned]: MultiResourcePoolRedeemManifestInput,
FungibleResourceManagerCreateWithInitialSupplyManifestInput,
NonFungibleResourceManagerCreateWithInitialSupplyManifestInput,
NonFungibleResourceManagerCreateRuidWithInitialSupplyManifestInput,
VaultTakeManifestInput,
VaultTakeAdvancedManifestInput,
VaultRecallManifestInput,
NonFungibleVaultTakeNonFungiblesManifestInput,
NonFungibleVaultRecallNonFungiblesManifestInput,
];
impl StaticInvocationResourcesOutput for TypedManifestNativeInvocation {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
uniform_match_on_manifest_typed_invocation!(self => (input) => input.output(details))
}
}
impl StaticInvocationResourcesOutput for AccessControllerWithdrawRecoveryFeeManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty().add_resource(
XRD,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for AccountCreateManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty().add_resource(
ACCOUNT_OWNER_BADGE,
TrackedResource::exact_amount(1, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for AccountSecurifyManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
match details.receiver {
InvocationReceiver::GlobalMethod(ResolvedDynamicAddress::StaticAddress(
global_address,
)) => {
let local_id = NonFungibleLocalId::bytes(global_address.as_bytes()).unwrap();
TrackedResources::new_empty().add_resource(
ACCOUNT_OWNER_BADGE,
TrackedResource::exact_non_fungibles([local_id], [details.source]),
)
}
InvocationReceiver::GlobalMethod(
ResolvedDynamicAddress::BlueprintResolvedFromNamedAddress(_),
) => TrackedResources::new_empty().add_resource(
ACCOUNT_OWNER_BADGE,
TrackedResource::exact_amount(1, [details.source])?,
),
InvocationReceiver::DirectAccess(_) | InvocationReceiver::BlueprintFunction(_) => {
unreachable!()
}
}
}
}
impl StaticInvocationResourcesOutput for AccountWithdrawManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for AccountWithdrawNonFungiblesManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_non_fungibles(self.ids.clone(), [details.source]),
)
}
}
impl StaticInvocationResourcesOutput for AccountLockFeeAndWithdrawManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for AccountLockFeeAndWithdrawNonFungiblesManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_non_fungibles(self.ids.clone(), [details.source]),
)
}
}
impl StaticInvocationResourcesOutput for AccountTryDepositOrRefundManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
handle_possible_refund(details)
}
}
impl StaticInvocationResourcesOutput for AccountTryDepositBatchOrRefundManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
handle_possible_refund(details)
}
}
fn handle_possible_refund(
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let mut sent_resources = details.sent_resources.clone();
let mut refunded_resources = TrackedResources::new_empty();
let known_resources = sent_resources
.specified_resources()
.keys()
.cloned()
.collect::<Vec<_>>();
for known_resource in known_resources {
let attempted_deposit = sent_resources.mut_take_resource(
known_resource,
ResourceTakeAmount::All,
details.source,
)?;
let (bounds, _history) = attempted_deposit.deconstruct();
let refunded_amount = bounds.replace_lower_bounds_with_zero();
refunded_resources.mut_add_resource(
known_resource,
TrackedResource::general(refunded_amount, [details.source]),
)?;
}
if sent_resources.unspecified_resources().may_be_present() {
refunded_resources.mut_add_unspecified_resources([details.source]);
}
Ok(refunded_resources)
}
impl StaticInvocationResourcesOutput for ConsensusManagerCreateValidatorManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty().add_resource(
VALIDATOR_OWNER_BADGE,
TrackedResource::exact_amount(1, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for ValidatorClaimXrdManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty()
.add_resource(XRD, TrackedResource::zero_or_more([details.source]))
}
}
impl StaticInvocationResourcesOutput for IdentityCreateManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty().add_resource(
IDENTITY_OWNER_BADGE,
TrackedResource::exact_amount(1, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for IdentitySecurifyToSingleBadgeManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
Ok(match details.receiver {
InvocationReceiver::GlobalMethod(ResolvedDynamicAddress::StaticAddress(
global_address,
)) => {
let local_id = NonFungibleLocalId::bytes(global_address.as_bytes()).unwrap();
TrackedResources::new_empty().add_resource(
IDENTITY_OWNER_BADGE,
TrackedResource::exact_non_fungibles([local_id], [details.source]),
)?
}
InvocationReceiver::GlobalMethod(
ResolvedDynamicAddress::BlueprintResolvedFromNamedAddress(_),
) => TrackedResources::new_empty().add_resource(
IDENTITY_OWNER_BADGE,
TrackedResource::exact_amount(1, [details.source])?,
)?,
InvocationReceiver::DirectAccess(_) | InvocationReceiver::BlueprintFunction(_) => {
unreachable!()
}
})
}
}
impl StaticInvocationResourcesOutput for AccountLockerAirdropManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
handle_possible_refund(details)
}
}
impl StaticInvocationResourcesOutput for AccountLockerRecoverManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for AccountLockerRecoverNonFungiblesManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_non_fungibles(self.ids.clone(), [details.source]),
)
}
}
impl StaticInvocationResourcesOutput for AccountLockerClaimManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for AccountLockerClaimNonFungiblesManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_non_fungibles(self.ids.clone(), [details.source]),
)
}
}
impl StaticInvocationResourcesOutput for PackagePublishWasmManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty().add_resource(
PACKAGE_OWNER_BADGE,
TrackedResource::exact_amount(1, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for PackageClaimRoyaltiesManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty()
.add_resource(XRD, TrackedResource::zero_or_more([details.source]))
}
}
impl StaticInvocationResourcesOutput for TwoResourcePoolProtectedWithdrawManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for MultiResourcePoolProtectedWithdrawManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
let ManifestResourceAddress::Static(resource_address) = self.resource_address else {
return Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
);
};
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
}
}
impl StaticInvocationResourcesOutput for FungibleResourceManagerMintManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
match details.receiver {
InvocationReceiver::GlobalMethod(ResolvedDynamicAddress::StaticAddress(
global_address,
)) => {
if let Ok(resource_address) = ResourceAddress::try_from(global_address) {
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.amount, [details.source])?,
)
} else {
Err(StaticResourceMovementsError::NotAResourceAddress(
global_address,
))
}
}
InvocationReceiver::GlobalMethod(
ResolvedDynamicAddress::BlueprintResolvedFromNamedAddress(_),
)
| InvocationReceiver::DirectAccess(_)
| InvocationReceiver::BlueprintFunction(_) => Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
),
}
}
}
impl StaticInvocationResourcesOutput for ResourceManagerCreateEmptyBucketInput {
fn output(
&self,
_: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
Ok(TrackedResources::new_empty())
}
}
impl StaticInvocationResourcesOutput for NonFungibleResourceManagerMintManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
match details.receiver {
InvocationReceiver::GlobalMethod(ResolvedDynamicAddress::StaticAddress(
global_address,
)) => {
if let Ok(resource_address) = ResourceAddress::try_from(global_address) {
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_non_fungibles(
self.entries.keys().cloned(),
[details.source],
),
)
} else {
Err(StaticResourceMovementsError::NotAResourceAddress(
global_address,
))
}
}
InvocationReceiver::GlobalMethod(
ResolvedDynamicAddress::BlueprintResolvedFromNamedAddress(_),
)
| InvocationReceiver::DirectAccess(_)
| InvocationReceiver::BlueprintFunction(_) => Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
),
}
}
}
impl StaticInvocationResourcesOutput for NonFungibleResourceManagerMintRuidManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
match details.receiver {
InvocationReceiver::GlobalMethod(ResolvedDynamicAddress::StaticAddress(
global_address,
)) => {
if let Ok(resource_address) = ResourceAddress::try_from(global_address) {
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(self.entries.len(), [details.source])?,
)
} else {
Err(StaticResourceMovementsError::NotAResourceAddress(
global_address,
))
}
}
InvocationReceiver::GlobalMethod(
ResolvedDynamicAddress::BlueprintResolvedFromNamedAddress(_),
)
| InvocationReceiver::DirectAccess(_)
| InvocationReceiver::BlueprintFunction(_) => Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
),
}
}
}
impl StaticInvocationResourcesOutput for NonFungibleResourceManagerMintSingleRuidManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
match details.receiver {
InvocationReceiver::GlobalMethod(ResolvedDynamicAddress::StaticAddress(
global_address,
)) => {
if let Ok(resource_address) = ResourceAddress::try_from(global_address) {
TrackedResources::new_empty().add_resource(
resource_address,
TrackedResource::exact_amount(Decimal::ONE, [details.source])?,
)
} else {
Err(StaticResourceMovementsError::NotAResourceAddress(
global_address,
))
}
}
InvocationReceiver::GlobalMethod(
ResolvedDynamicAddress::BlueprintResolvedFromNamedAddress(_),
)
| InvocationReceiver::DirectAccess(_)
| InvocationReceiver::BlueprintFunction(_) => Ok(
TrackedResources::new_with_possible_balance_of_unspecified_resources([
details.source
]),
),
}
}
}
impl StaticInvocationResourcesOutput for ComponentClaimRoyaltiesManifestInput {
fn output(
&self,
details: InvocationDetails,
) -> Result<TrackedResources, StaticResourceMovementsError> {
TrackedResources::new_empty()
.add_resource(XRD, TrackedResource::zero_or_more([details.source]))
}
}