Skip to content

Commit 0fc2eb3

Browse files
authored
Merge pull request #374 from Emurgo/ruslan/burn-is-output
[10.0.5] Treat burn as part of output in tx-builder
2 parents 2b0ba84 + 4fb5faa commit 0fc2eb3

File tree

6 files changed

+51
-24
lines changed

6 files changed

+51
-24
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cardano-serialization-lib",
3-
"version": "10.0.4",
3+
"version": "10.0.5-beta.1",
44
"description": "(De)serialization functions for the Cardano blockchain along with related utility functions",
55
"scripts": {
66
"rust:build-nodejs": "(rimraf ./rust/pkg && cd rust; wasm-pack build --target=nodejs; wasm-pack pack) && npm run js:flowgen",

rust/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "cardano-serialization-lib"
3-
version = "10.0.4"
3+
version = "10.0.5-beta.1"
44
edition = "2018"
55
authors = ["EMURGO"]
66
license = "MIT"

rust/pkg/cardano_serialization_lib.js.flow

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5485,11 +5485,17 @@ declare export class TransactionBuilder {
54855485
get_implicit_input(): Value;
54865486

54875487
/**
5488-
* Return explicit input plus implicit input plus mint minus burn
5488+
* Return explicit input plus implicit input plus mint
54895489
* @returns {Value}
54905490
*/
54915491
get_total_input(): Value;
54925492

5493+
/**
5494+
* Return explicit output plus deposit plus burn
5495+
* @returns {Value}
5496+
*/
5497+
get_total_output(): Value;
5498+
54935499
/**
54945500
* does not include fee
54955501
* @returns {Value}

rust/src/tx_builder.rs

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,7 @@ impl TransactionBuilder {
330330
pub fn add_inputs_from(&mut self, inputs: &TransactionUnspentOutputs, strategy: CoinSelectionStrategyCIP2) -> Result<(), JsError> {
331331
let available_inputs = &inputs.0.clone();
332332
let mut input_total = self.get_total_input()?;
333-
let mut output_total = self
334-
.get_explicit_output()?
335-
.checked_add(&Value::new(&self.get_deposit()?))?
333+
let mut output_total = self.get_total_output()?
336334
.checked_add(&Value::new(&self.min_fee()?))?;
337335
match strategy {
338336
CoinSelectionStrategyCIP2::LargestFirst => {
@@ -969,13 +967,20 @@ impl TransactionBuilder {
969967
}).unwrap_or((Value::zero(), Value::zero()))
970968
}
971969

972-
/// Return explicit input plus implicit input plus mint minus burn
970+
/// Return explicit input plus implicit input plus mint
973971
pub fn get_total_input(&self) -> Result<Value, JsError> {
974-
let (mint_value, burn_value) = self.get_mint_as_values();
972+
let (mint_value, _) = self.get_mint_as_values();
975973
self.get_explicit_input()?
976974
.checked_add(&self.get_implicit_input()?)?
977-
.checked_add(&mint_value)?
978-
.checked_sub(&burn_value)
975+
.checked_add(&mint_value)
976+
}
977+
978+
/// Return explicit output plus deposit plus burn
979+
pub fn get_total_output(&self) -> Result<Value, JsError> {
980+
let (_, burn_value) = self.get_mint_as_values();
981+
self.get_explicit_output()?
982+
.checked_add(&Value::new(&self.get_deposit()?))?
983+
.checked_add(&burn_value)
979984
}
980985

981986
/// does not include fee
@@ -1020,10 +1025,7 @@ impl TransactionBuilder {
10201025
let data_hash = None;
10211026

10221027
let input_total = self.get_total_input()?;
1023-
1024-
let output_total = self
1025-
.get_explicit_output()?
1026-
.checked_add(&Value::new(&self.get_deposit()?))?;
1028+
let output_total = self.get_total_output()?;
10271029

10281030
use std::cmp::Ordering;
10291031
match &input_total.partial_cmp(&output_total.checked_add(&Value::new(&fee))?) {
@@ -4157,7 +4159,7 @@ mod tests {
41574159
}
41584160

41594161
#[test]
4160-
fn total_input_with_mint_and_burn() {
4162+
fn total_input_output_with_mint_and_burn() {
41614163
let mut tx_builder = create_tx_builder_with_fee(&create_linear_fee(0, 1));
41624164
let spend = root_key_15()
41634165
.derive(harden(1852))
@@ -4208,22 +4210,41 @@ mod tests {
42084210
);
42094211
}
42104212

4213+
tx_builder.add_output(
4214+
&TransactionOutputBuilder::new()
4215+
.with_address(&byron_address())
4216+
.next().unwrap()
4217+
.with_coin(&to_bignum(42))
4218+
.build().unwrap()
4219+
).unwrap();
4220+
42114221
let total_input_before_mint = tx_builder.get_total_input().unwrap();
4222+
let total_output_before_mint = tx_builder.get_total_output().unwrap();
42124223

42134224
assert_eq!(total_input_before_mint.coin, to_bignum(300));
4214-
let ma1 = total_input_before_mint.multiasset.unwrap();
4215-
assert_eq!(ma1.get(&policy_id1).unwrap().get(&name).unwrap(), to_bignum(360));
4216-
assert_eq!(ma1.get(&policy_id2).unwrap().get(&name).unwrap(), to_bignum(360));
4217-
4225+
assert_eq!(total_output_before_mint.coin, to_bignum(42));
4226+
let ma1_input = total_input_before_mint.multiasset.unwrap();
4227+
let ma1_output = total_output_before_mint.multiasset;
4228+
assert_eq!(ma1_input.get(&policy_id1).unwrap().get(&name).unwrap(), to_bignum(360));
4229+
assert_eq!(ma1_input.get(&policy_id2).unwrap().get(&name).unwrap(), to_bignum(360));
4230+
assert!(ma1_output.is_none());
4231+
4232+
// Adding mint
42184233
tx_builder.add_mint_asset(&mint_script1, &name, Int::new_i32(40));
4234+
4235+
// Adding burn
42194236
tx_builder.add_mint_asset(&mint_script2, &name, Int::new_i32(-40));
42204237

42214238
let total_input_after_mint = tx_builder.get_total_input().unwrap();
4239+
let total_output_after_mint = tx_builder.get_total_output().unwrap();
42224240

42234241
assert_eq!(total_input_after_mint.coin, to_bignum(300));
4224-
let ma2 = total_input_after_mint.multiasset.unwrap();
4225-
assert_eq!(ma2.get(&policy_id1).unwrap().get(&name).unwrap(), to_bignum(400));
4226-
assert_eq!(ma2.get(&policy_id2).unwrap().get(&name).unwrap(), to_bignum(320));
4242+
assert_eq!(total_output_before_mint.coin, to_bignum(42));
4243+
let ma2_input = total_input_after_mint.multiasset.unwrap();
4244+
let ma2_output = total_output_after_mint.multiasset.unwrap();
4245+
assert_eq!(ma2_input.get(&policy_id1).unwrap().get(&name).unwrap(), to_bignum(400));
4246+
assert_eq!(ma2_input.get(&policy_id2).unwrap().get(&name).unwrap(), to_bignum(360));
4247+
assert_eq!(ma2_output.get(&policy_id2).unwrap().get(&name).unwrap(), to_bignum(40));
42274248
}
42284249

42294250
}

0 commit comments

Comments
 (0)