use crate::blueprints::account::AccountBlueprint;
use crate::errors::ApplicationError;
use crate::errors::RuntimeError;
use crate::internal_prelude::*;
use radix_engine_interface::api::SystemApi;
use radix_engine_interface::blueprints::account::*;
use radix_engine_interface::blueprints::hooks::OnVirtualizeInput;
use radix_engine_interface::blueprints::package::PackageDefinition;
pub const ACCOUNT_ON_VIRTUALIZE_EXPORT_NAME: &str = "on_virtualize";
pub struct AccountNativePackage;
impl AccountNativePackage {
pub fn definition() -> PackageDefinition {
let blueprints = indexmap!(
ACCOUNT_BLUEPRINT.to_string() => AccountBlueprint::get_definition()
);
PackageDefinition { blueprints }
}
pub fn invoke_export<Y: SystemApi<RuntimeError>>(
export_name: &str,
input: &IndexedScryptoValue,
api: &mut Y,
) -> Result<IndexedScryptoValue, RuntimeError> {
match export_name {
ACCOUNT_ON_VIRTUALIZE_EXPORT_NAME => {
let input: OnVirtualizeInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::on_virtualize(input, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_CREATE_ADVANCED_IDENT => {
let input: AccountCreateAdvancedInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::create_advanced(
input.owner_role,
input.address_reservation,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_CREATE_IDENT => {
let _input: AccountCreateInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::create(api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_SECURIFY_IDENT => {
let _input: AccountSecurifyInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::securify(api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_LOCK_FEE_IDENT => {
let input: AccountLockFeeInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::lock_fee(input.amount, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_LOCK_CONTINGENT_FEE_IDENT => {
let input: AccountLockContingentFeeInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::lock_contingent_fee(input.amount, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_DEPOSIT_IDENT => {
let input: AccountDepositInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::deposit(input.bucket, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_DEPOSIT_BATCH_IDENT => {
let input: AccountDepositBatchInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::deposit_batch(input.buckets, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_TRY_DEPOSIT_OR_REFUND_IDENT => {
let AccountTryDepositOrRefundInput {
bucket,
authorized_depositor_badge,
} = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::try_deposit_or_refund(
bucket,
authorized_depositor_badge,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_TRY_DEPOSIT_BATCH_OR_REFUND_IDENT => {
let AccountTryDepositBatchOrRefundInput {
buckets,
authorized_depositor_badge,
} = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::try_deposit_batch_or_refund(
buckets,
authorized_depositor_badge,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_TRY_DEPOSIT_OR_ABORT_IDENT => {
let AccountTryDepositOrAbortInput {
bucket,
authorized_depositor_badge,
} = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::try_deposit_or_abort(
bucket,
authorized_depositor_badge,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_TRY_DEPOSIT_BATCH_OR_ABORT_IDENT => {
let AccountTryDepositBatchOrAbortInput {
buckets,
authorized_depositor_badge,
} = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::try_deposit_batch_or_abort(
buckets,
authorized_depositor_badge,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_WITHDRAW_IDENT => {
let input: AccountWithdrawInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::withdraw(input.resource_address, input.amount, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_WITHDRAW_NON_FUNGIBLES_IDENT => {
let input: AccountWithdrawNonFungiblesInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::withdraw_non_fungibles(
input.resource_address,
input.ids,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_BURN_IDENT => {
let input: AccountBurnInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::burn(input.resource_address, input.amount, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_BURN_NON_FUNGIBLES_IDENT => {
let input: AccountBurnNonFungiblesInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn =
AccountBlueprint::burn_non_fungibles(input.resource_address, input.ids, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_LOCK_FEE_AND_WITHDRAW_IDENT => {
let input: AccountLockFeeAndWithdrawInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::lock_fee_and_withdraw(
input.amount_to_lock,
input.resource_address,
input.amount,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_LOCK_FEE_AND_WITHDRAW_NON_FUNGIBLES_IDENT => {
let input: AccountLockFeeAndWithdrawNonFungiblesInput =
input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::lock_fee_and_withdraw_non_fungibles(
input.amount_to_lock,
input.resource_address,
input.ids,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_CREATE_PROOF_OF_AMOUNT_IDENT => {
let input: AccountCreateProofOfAmountInput = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::create_proof_of_amount(
input.resource_address,
input.amount,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_CREATE_PROOF_OF_NON_FUNGIBLES_IDENT => {
let input: AccountCreateProofOfNonFungiblesInput =
input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::create_proof_of_non_fungibles(
input.resource_address,
input.ids,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_SET_DEFAULT_DEPOSIT_RULE_IDENT => {
let AccountSetDefaultDepositRuleInput { default } =
input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::set_default_deposit_rule(default, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_SET_RESOURCE_PREFERENCE_IDENT => {
let AccountSetResourcePreferenceInput {
resource_address,
resource_preference,
} = input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::set_resource_preference(
resource_address,
resource_preference,
api,
)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_REMOVE_RESOURCE_PREFERENCE_IDENT => {
let AccountRemoveResourcePreferenceInput { resource_address } =
input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::remove_resource_preference(resource_address, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_ADD_AUTHORIZED_DEPOSITOR_IDENT => {
let AccountAddAuthorizedDepositorInput { badge } =
input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::add_authorized_depositor(badge, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
ACCOUNT_REMOVE_AUTHORIZED_DEPOSITOR_IDENT => {
let AccountRemoveAuthorizedDepositorInput { badge } =
input.as_typed().map_err(|e| {
RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
})?;
let rtn = AccountBlueprint::remove_authorized_depositor(badge, api)?;
Ok(IndexedScryptoValue::from_typed(&rtn))
}
_ => Err(RuntimeError::ApplicationError(
ApplicationError::ExportDoesNotExist(export_name.to_string()),
)),
}
}
}