radix_engine_interface/blueprints/resource/
bucket.rs1use 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#[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
119impl 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}