radix_engine/blueprints/resource/
bucket_common.rs

1use 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}