radix_engine_interface/blueprints/resource/
bucket.rs

1use super::Proof;
2use super::WithdrawStrategy;
3use crate::internal_prelude::*;
4use radix_common::data::scrypto::model::Own;
5use radix_common::data::scrypto::ScryptoCustomTypeKind;
6use radix_common::data::scrypto::ScryptoCustomValueKind;
7use radix_common::data::scrypto::*;
8use radix_common::math::*;
9use radix_common::types::*;
10use sbor::rust::prelude::*;
11use sbor::*;
12
13pub const BUCKET_TAKE_IDENT: &str = "take";
14
15#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor, ManifestSbor)]
16pub struct BucketTakeInput {
17    pub amount: Decimal,
18}
19
20pub type BucketTakeManifestInput = BucketTakeInput;
21
22pub type BucketTakeOutput = Bucket;
23
24pub const BUCKET_TAKE_ADVANCED_IDENT: &str = "take_advanced";
25
26#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor, ManifestSbor)]
27pub struct BucketTakeAdvancedInput {
28    pub amount: Decimal,
29    pub withdraw_strategy: WithdrawStrategy,
30}
31
32pub type BucketTakeAdvancedManifestInput = BucketTakeAdvancedInput;
33
34pub type BucketTakeAdvancedOutput = Bucket;
35
36pub const BUCKET_PUT_IDENT: &str = "put";
37
38#[derive(Debug, Eq, PartialEq, ScryptoSbor)]
39pub struct BucketPutInput {
40    pub bucket: Bucket,
41}
42
43#[derive(Debug, Eq, PartialEq, ManifestSbor)]
44pub struct BucketPutManifestInput {
45    pub bucket: ManifestBucket,
46}
47
48pub type BucketPutOutput = ();
49
50pub const BUCKET_GET_AMOUNT_IDENT: &str = "get_amount";
51
52#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor, ManifestSbor)]
53pub struct BucketGetAmountInput {}
54
55pub type BucketGetAmountManifestInput = BucketGetAmountInput;
56
57pub type BucketGetAmountOutput = Decimal;
58
59pub const BUCKET_GET_RESOURCE_ADDRESS_IDENT: &str = "get_resource_address";
60
61#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor, ManifestSbor)]
62pub struct BucketGetResourceAddressInput {}
63
64pub type BucketGetResourceAddressManifestInput = BucketGetResourceAddressInput;
65
66pub type BucketGetResourceAddressOutput = ResourceAddress;
67
68pub const BUCKET_CREATE_PROOF_OF_ALL_IDENT: &str = "create_proof_of_all";
69
70#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor, ManifestSbor)]
71pub struct BucketCreateProofOfAllInput {}
72
73pub type BucketCreateProofOfAllManifestInput = BucketCreateProofOfAllInput;
74
75pub type BucketCreateProofOfAllOutput = Proof;
76
77//========
78// Stub
79//========
80
81#[derive(Debug, PartialEq, Eq, Hash)]
82#[must_use]
83pub struct Bucket(pub Own);
84
85#[derive(Debug, PartialEq, Eq, Hash, ScryptoEncode, ScryptoDecode, ScryptoCategorize)]
86#[sbor(transparent)]
87#[must_use]
88pub struct FungibleBucket(pub Bucket);
89
90#[derive(Debug, PartialEq, Eq, Hash, ScryptoEncode, ScryptoDecode, ScryptoCategorize)]
91#[sbor(transparent)]
92#[must_use]
93pub struct NonFungibleBucket(pub Bucket);
94
95impl AsRef<Bucket> for FungibleBucket {
96    fn as_ref(&self) -> &Bucket {
97        &self.0
98    }
99}
100
101impl From<FungibleBucket> for Bucket {
102    fn from(value: FungibleBucket) -> Self {
103        value.0
104    }
105}
106
107impl AsRef<Bucket> for NonFungibleBucket {
108    fn as_ref(&self) -> &Bucket {
109        &self.0
110    }
111}
112
113impl From<NonFungibleBucket> for Bucket {
114    fn from(value: NonFungibleBucket) -> Self {
115        value.0
116    }
117}
118
119//========
120// binary
121//========
122
123impl Categorize<ScryptoCustomValueKind> for Bucket {
124    #[inline]
125    fn value_kind() -> ValueKind<ScryptoCustomValueKind> {
126        Own::value_kind()
127    }
128}
129
130impl<E: Encoder<ScryptoCustomValueKind>> Encode<ScryptoCustomValueKind, E> for Bucket {
131    #[inline]
132    fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError> {
133        encoder.write_value_kind(Self::value_kind())
134    }
135
136    #[inline]
137    fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError> {
138        self.0.encode_body(encoder)
139    }
140}
141
142impl<D: Decoder<ScryptoCustomValueKind>> Decode<ScryptoCustomValueKind, D> for Bucket {
143    fn decode_body_with_value_kind(
144        decoder: &mut D,
145        value_kind: ValueKind<ScryptoCustomValueKind>,
146    ) -> Result<Self, DecodeError> {
147        Own::decode_body_with_value_kind(decoder, value_kind).map(Self)
148    }
149}
150
151impl Describe<ScryptoCustomTypeKind> for Bucket {
152    const TYPE_ID: RustTypeId =
153        RustTypeId::WellKnown(well_known_scrypto_custom_types::OWN_BUCKET_TYPE);
154
155    fn type_data() -> TypeData<ScryptoCustomTypeKind, RustTypeId> {
156        well_known_scrypto_custom_types::own_bucket_type_data()
157    }
158}
159
160impl Describe<ScryptoCustomTypeKind> for FungibleBucket {
161    const TYPE_ID: RustTypeId =
162        RustTypeId::WellKnown(well_known_scrypto_custom_types::OWN_FUNGIBLE_BUCKET_TYPE);
163
164    fn type_data() -> TypeData<ScryptoCustomTypeKind, RustTypeId> {
165        well_known_scrypto_custom_types::own_fungible_bucket_type_data()
166    }
167}
168
169impl Describe<ScryptoCustomTypeKind> for NonFungibleBucket {
170    const TYPE_ID: RustTypeId =
171        RustTypeId::WellKnown(well_known_scrypto_custom_types::OWN_NON_FUNGIBLE_BUCKET_TYPE);
172
173    fn type_data() -> TypeData<ScryptoCustomTypeKind, RustTypeId> {
174        well_known_scrypto_custom_types::own_non_fungible_bucket_type_data()
175    }
176}