1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use super::*;
#[wasm_bindgen]
#[derive(Clone, Debug)]
pub struct TransactionOutputBuilder {
address: Option<Address>,
data_hash: Option<DataHash>,
}
#[wasm_bindgen]
impl TransactionOutputBuilder {
pub fn new() -> Self {
Self {
address: None,
data_hash: None,
}
}
pub fn with_address(&self, address: &Address) -> Self {
let mut cfg = self.clone();
cfg.address = Some(address.clone());
cfg
}
pub fn with_data_hash(&self, data_hash: &DataHash) -> Self {
let mut cfg = self.clone();
cfg.data_hash = Some(data_hash.clone());
cfg
}
pub fn next(&self) -> Result<TransactionOutputAmountBuilder, JsError> {
Ok(TransactionOutputAmountBuilder {
address: self.address.clone().ok_or(JsError::from_str("TransactionOutputBaseBuilder: Address missing"))?,
amount: None,
data_hash: self.data_hash.clone(),
})
}
}
#[wasm_bindgen]
#[derive(Clone, Debug)]
pub struct TransactionOutputAmountBuilder {
address: Address,
amount: Option<Value>,
data_hash: Option<DataHash>,
}
#[wasm_bindgen]
impl TransactionOutputAmountBuilder {
pub fn with_value(&self, amount: &Value) -> Self {
let mut cfg = self.clone();
cfg.amount = Some(amount.clone());
cfg
}
pub fn with_coin(&self, coin: &Coin) -> Self {
let mut cfg = self.clone();
cfg.amount = Some(Value::new(coin));
cfg
}
pub fn with_coin_and_asset(&self, coin: &Coin, multiasset: &MultiAsset) -> Self {
let mut cfg = self.clone();
let mut val = Value::new(coin);
val.set_multiasset(multiasset);
cfg.amount = Some(val.clone());
cfg
}
pub fn with_asset_and_min_required_coin(&self, multiasset: &MultiAsset, coins_per_utxo_word: &Coin) -> Result<TransactionOutputAmountBuilder, JsError> {
let min_possible_coin = min_pure_ada(&coins_per_utxo_word, self.data_hash.is_some())?;
let mut value = Value::new(&min_possible_coin);
value.set_multiasset(multiasset);
let required_coin = min_ada_required(
&value,
self.data_hash.is_some(),
&coins_per_utxo_word,
)?;
Ok(self.with_coin_and_asset(&required_coin, &multiasset))
}
pub fn build(&self) -> Result<TransactionOutput, JsError> {
Ok(TransactionOutput {
address: self.address.clone(),
amount: self.amount.clone().ok_or(JsError::from_str("TransactionOutputAmountBuilder: amount missing"))?,
data_hash: self.data_hash.clone(),
})
}
}