radix_engine/blueprints/resource/
bucket_common.rs1use crate::blueprints::resource::*;
2use crate::errors::{ApplicationError, RuntimeError};
3use crate::internal_prelude::*;
4use radix_engine_interface::api::SystemApi;
5use radix_engine_interface::blueprints::resource::*;
6
7#[derive(Debug)]
8pub struct DroppedFungibleBucket {
9 pub liquid: LiquidFungibleResource,
10 pub locked: LockedFungibleResource,
11}
12
13#[derive(Debug)]
14pub struct DroppedNonFungibleBucket {
15 pub liquid: LiquidNonFungibleResource,
16 pub locked: LockedNonFungibleResource,
17}
18
19impl Into<DroppedFungibleBucket> for Vec<Vec<u8>> {
20 fn into(self) -> DroppedFungibleBucket {
21 let liquid: LiquidFungibleResource =
22 scrypto_decode(&self[FungibleBucketField::Liquid as usize]).unwrap();
23 let locked: LockedFungibleResource =
24 scrypto_decode(&self[FungibleBucketField::Locked as usize]).unwrap();
25
26 DroppedFungibleBucket { liquid, locked }
27 }
28}
29
30impl Into<DroppedNonFungibleBucket> for Vec<Vec<u8>> {
31 fn into(self) -> DroppedNonFungibleBucket {
32 let liquid: LiquidNonFungibleResource =
33 scrypto_decode(&self[NonFungibleBucketField::Liquid as usize]).unwrap();
34 let locked: LockedNonFungibleResource =
35 scrypto_decode(&self[NonFungibleBucketField::Locked as usize]).unwrap();
36
37 DroppedNonFungibleBucket { liquid, locked }
38 }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, ScryptoSbor)]
42pub enum BucketError {
43 ResourceError(ResourceError),
44 ProofError(ProofError),
45 Locked(error_models::OwnedNodeId),
46 InvalidAmount(Decimal),
47 DecimalOverflow,
48}
49
50impl From<BucketError> for RuntimeError {
51 fn from(bucket_error: BucketError) -> Self {
52 RuntimeError::ApplicationError(ApplicationError::BucketError(bucket_error))
53 }
54}
55
56pub fn drop_fungible_bucket<Y: SystemApi<RuntimeError>>(
57 bucket_node_id: &NodeId,
58 api: &mut Y,
59) -> Result<DroppedFungibleBucket, RuntimeError> {
60 let fields = api.drop_object(bucket_node_id)?;
61 let bucket: DroppedFungibleBucket = fields.into();
62 if bucket.locked.is_locked() {
63 return Err(RuntimeError::ApplicationError(
64 ApplicationError::BucketError(BucketError::Locked(bucket_node_id.clone().into())),
65 ));
66 }
67
68 Ok(bucket)
69}
70
71pub fn drop_non_fungible_bucket<Y: SystemApi<RuntimeError>>(
72 bucket_node_id: &NodeId,
73 api: &mut Y,
74) -> Result<DroppedNonFungibleBucket, RuntimeError> {
75 let fields = api.drop_object(bucket_node_id)?;
76 let bucket: DroppedNonFungibleBucket = fields.into();
77 if bucket.locked.is_locked() {
78 return Err(RuntimeError::ApplicationError(
79 ApplicationError::BucketError(BucketError::Locked(bucket_node_id.clone().into())),
80 ));
81 }
82
83 Ok(bucket)
84}