Skip to content

Commit 3c958de

Browse files
authored
Merge pull request #304 from Emurgo/simplify-txbuilder-outputs
Simplify txbuilder output addition
2 parents d31bd80 + 7634ebc commit 3c958de

File tree

7 files changed

+518
-249
lines changed

7 files changed

+518
-249
lines changed

rust/pkg/cardano_serialization_lib.js.flow

Lines changed: 78 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5114,44 +5114,6 @@ declare export class TransactionBuilder {
51145114
amount: Value
51155115
): BigNum;
51165116

5117-
/**
5118-
* Add output by specifying the Address and Value
5119-
* @param {Address} address
5120-
* @param {Value} amount
5121-
*/
5122-
add_output_amount(address: Address, amount: Value): void;
5123-
5124-
/**
5125-
* Add output by specifying the Address and Coin (BigNum)
5126-
* Output will have no additional assets
5127-
* @param {Address} address
5128-
* @param {BigNum} coin
5129-
*/
5130-
add_output_coin(address: Address, coin: BigNum): void;
5131-
5132-
/**
5133-
* Add output by specifying the Address, the Coin (BigNum), and the MultiAsset
5134-
* @param {Address} address
5135-
* @param {BigNum} coin
5136-
* @param {MultiAsset} multiasset
5137-
*/
5138-
add_output_coin_and_asset(
5139-
address: Address,
5140-
coin: BigNum,
5141-
multiasset: MultiAsset
5142-
): void;
5143-
5144-
/**
5145-
* Add output by specifying the Address and the MultiAsset
5146-
* The output will be set to contain the minimum required amount of Coin
5147-
* @param {Address} address
5148-
* @param {MultiAsset} multiasset
5149-
*/
5150-
add_output_asset_and_min_required_coin(
5151-
address: Address,
5152-
multiasset: MultiAsset
5153-
): void;
5154-
51555117
/**
51565118
* Add explicit output via a TransactionOutput object
51575119
* @param {TransactionOutput} output
@@ -5290,14 +5252,14 @@ declare export class TransactionBuilder {
52905252
* @param {NativeScript} policy_script
52915253
* @param {AssetName} asset_name
52925254
* @param {Int} amount
5293-
* @param {Address} address
5255+
* @param {TransactionOutputAmountBuilder} output_builder
52945256
* @param {BigNum} output_coin
52955257
*/
52965258
add_mint_asset_and_output(
52975259
policy_script: NativeScript,
52985260
asset_name: AssetName,
52995261
amount: Int,
5300-
address: Address,
5262+
output_builder: TransactionOutputAmountBuilder,
53015263
output_coin: BigNum
53025264
): void;
53035265

@@ -5310,13 +5272,13 @@ declare export class TransactionBuilder {
53105272
* @param {NativeScript} policy_script
53115273
* @param {AssetName} asset_name
53125274
* @param {Int} amount
5313-
* @param {Address} address
5275+
* @param {TransactionOutputAmountBuilder} output_builder
53145276
*/
53155277
add_mint_asset_and_output_min_required_coin(
53165278
policy_script: NativeScript,
53175279
asset_name: AssetName,
53185280
amount: Int,
5319-
address: Address
5281+
output_builder: TransactionOutputAmountBuilder
53205282
): void;
53215283

53225284
/**
@@ -5717,6 +5679,80 @@ declare export class TransactionOutput {
57175679
*/
57185680
static new(address: Address, amount: Value): TransactionOutput;
57195681
}
5682+
/**
5683+
*/
5684+
declare export class TransactionOutputAmountBuilder {
5685+
free(): void;
5686+
5687+
/**
5688+
* @param {Value} amount
5689+
* @returns {TransactionOutputAmountBuilder}
5690+
*/
5691+
with_value(amount: Value): TransactionOutputAmountBuilder;
5692+
5693+
/**
5694+
* @param {BigNum} coin
5695+
* @returns {TransactionOutputAmountBuilder}
5696+
*/
5697+
with_coin(coin: BigNum): TransactionOutputAmountBuilder;
5698+
5699+
/**
5700+
* @param {BigNum} coin
5701+
* @param {MultiAsset} multiasset
5702+
* @returns {TransactionOutputAmountBuilder}
5703+
*/
5704+
with_coin_and_asset(
5705+
coin: BigNum,
5706+
multiasset: MultiAsset
5707+
): TransactionOutputAmountBuilder;
5708+
5709+
/**
5710+
* @param {BigNum} coins_per_utxo_word
5711+
* @param {MultiAsset} multiasset
5712+
* @returns {TransactionOutputAmountBuilder}
5713+
*/
5714+
with_asset_and_min_required_coin(
5715+
coins_per_utxo_word: BigNum,
5716+
multiasset: MultiAsset
5717+
): TransactionOutputAmountBuilder;
5718+
5719+
/**
5720+
* @returns {TransactionOutput}
5721+
*/
5722+
build(): TransactionOutput;
5723+
}
5724+
/**
5725+
* We introduce a builder-pattern format for creating transaction outputs
5726+
* This is because:
5727+
* 1. Some fields (i.e. data hash) are optional, and we can't easily expose Option<> in WASM
5728+
* 2. Some fields like amounts have many ways it could be set (some depending on other field values being known)
5729+
* 3. Easier to adapt as the output format gets more complicated in future Cardano releases
5730+
*/
5731+
declare export class TransactionOutputBuilder {
5732+
free(): void;
5733+
5734+
/**
5735+
* @returns {TransactionOutputBuilder}
5736+
*/
5737+
static new(): TransactionOutputBuilder;
5738+
5739+
/**
5740+
* @param {Address} address
5741+
* @returns {TransactionOutputBuilder}
5742+
*/
5743+
with_address(address: Address): TransactionOutputBuilder;
5744+
5745+
/**
5746+
* @param {DataHash} data_hash
5747+
* @returns {TransactionOutputBuilder}
5748+
*/
5749+
with_data_hash(data_hash: DataHash): TransactionOutputBuilder;
5750+
5751+
/**
5752+
* @returns {TransactionOutputAmountBuilder}
5753+
*/
5754+
next(): TransactionOutputAmountBuilder;
5755+
}
57205756
/**
57215757
*/
57225758
declare export class TransactionOutputs {

rust/src/fees.rs

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ mod tests {
3838
use super::*;
3939
use crypto::*;
4040
use address::*;
41+
use super::output_builder::TransactionOutputBuilder;
4142

4243
// based off tx test vectors (https://gist.github.com/KtorZ/5a2089df0915f21aca368d12545ab230)
4344

@@ -54,13 +55,16 @@ mod tests {
5455
));
5556
let mut outputs = TransactionOutputs::new();
5657

57-
outputs.add(&TransactionOutput::new(
58-
&Address::from_bytes(
59-
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
60-
)
61-
.unwrap(),
62-
&Value::new(&to_bignum(1)),
63-
));
58+
outputs.add(
59+
&TransactionOutputBuilder::new()
60+
.with_address(
61+
&Address::from_bytes(
62+
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
63+
).unwrap())
64+
.next().unwrap()
65+
.with_coin(&to_bignum(1))
66+
.build().unwrap()
67+
);
6468
let body = TransactionBody::new(&inputs, &outputs, &to_bignum(94002), Some(10));
6569

6670
let mut w = TransactionWitnessSet::new();
@@ -99,13 +103,16 @@ mod tests {
99103
));
100104
let mut outputs = TransactionOutputs::new();
101105

102-
outputs.add(&TransactionOutput::new(
103-
&Address::from_bytes(
104-
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
105-
)
106-
.unwrap(),
107-
&Value::new(&to_bignum(1)),
108-
));
106+
outputs.add(
107+
&TransactionOutputBuilder::new()
108+
.with_address(
109+
&Address::from_bytes(
110+
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
111+
).unwrap())
112+
.next().unwrap()
113+
.with_coin(&to_bignum(1))
114+
.build().unwrap()
115+
);
109116
let body = TransactionBody::new(&inputs, &outputs, &to_bignum(112002), Some(10));
110117

111118
let mut w = TransactionWitnessSet::new();
@@ -157,20 +164,27 @@ mod tests {
157164
7,
158165
));
159166
let mut outputs = TransactionOutputs::new();
160-
outputs.add(&TransactionOutput::new(
161-
&Address::from_bytes(
162-
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
163-
)
164-
.unwrap(),
165-
&Value::new(&to_bignum(289)),
166-
));
167-
outputs.add(&TransactionOutput::new(
168-
&Address::from_bytes(
169-
hex::decode("61bcd18fcffa797c16c007014e2b8553b8b9b1e94c507688726243d611").unwrap(),
170-
)
171-
.unwrap(),
172-
&Value::new(&to_bignum(874551452)),
173-
));
167+
168+
outputs.add(
169+
&TransactionOutputBuilder::new()
170+
.with_address(
171+
&Address::from_bytes(
172+
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
173+
).unwrap())
174+
.next().unwrap()
175+
.with_coin(&to_bignum(289))
176+
.build().unwrap()
177+
);
178+
outputs.add(
179+
&TransactionOutputBuilder::new()
180+
.with_address(
181+
&Address::from_bytes(
182+
hex::decode("61bcd18fcffa797c16c007014e2b8553b8b9b1e94c507688726243d611").unwrap(),
183+
).unwrap())
184+
.next().unwrap()
185+
.with_coin(&to_bignum(874551452))
186+
.build().unwrap()
187+
);
174188
let body = TransactionBody::new(&inputs, &outputs, &to_bignum(183502), Some(999));
175189

176190
let mut w = TransactionWitnessSet::new();
@@ -216,12 +230,16 @@ mod tests {
216230
));
217231
let mut outputs = TransactionOutputs::new();
218232

219-
outputs.add(&TransactionOutput::new(
220-
&Address::from_bytes(
221-
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap()
222-
).unwrap(),
223-
&Value::new(&to_bignum(1))
224-
));
233+
outputs.add(
234+
&TransactionOutputBuilder::new()
235+
.with_address(
236+
&Address::from_bytes(
237+
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
238+
).unwrap())
239+
.next().unwrap()
240+
.with_coin(&to_bignum(1))
241+
.build().unwrap()
242+
);
225243
let mut body = TransactionBody::new(&inputs, &outputs, &to_bignum(266002), Some(10));
226244

227245
let mut certs = Certificates::new();
@@ -445,12 +463,16 @@ mod tests {
445463
));
446464
let mut outputs = TransactionOutputs::new();
447465

448-
outputs.add(&TransactionOutput::new(
449-
&Address::from_bytes(
450-
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap()
451-
).unwrap(),
452-
&Value::new(&to_bignum(1))
453-
));
466+
outputs.add(
467+
&TransactionOutputBuilder::new()
468+
.with_address(
469+
&Address::from_bytes(
470+
hex::decode("611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c").unwrap(),
471+
).unwrap())
472+
.next().unwrap()
473+
.with_coin(&to_bignum(1))
474+
.build().unwrap()
475+
);
454476
let mut body = TransactionBody::new(&inputs, &outputs, &to_bignum(162502), Some(10));
455477
let mut withdrawals = Withdrawals::new();
456478
withdrawals.insert(

rust/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ pub mod fees;
4444
pub mod impl_mockchain;
4545
pub mod legacy_address;
4646
pub mod metadata;
47+
pub mod output_builder;
4748
pub mod plutus;
4849
pub mod serialization;
4950
pub mod tx_builder;

0 commit comments

Comments
 (0)