Skip to content

Commit

Permalink
Add support for communication datums in outputs
Browse files Browse the repository at this point in the history
  • Loading branch information
SebastienGllmt committed Aug 25, 2022
1 parent fd5c532 commit 570db1d
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 62 deletions.
96 changes: 65 additions & 31 deletions rust/pkg/cardano_multiplatform_lib.js.flow
Original file line number Diff line number Diff line change
Expand Up @@ -184,30 +184,6 @@ declare export function min_fee(
ex_unit_prices: ExUnitPrices
): BigNum;

/**
* @param {TransactionBody} txbody
* @param {BigNum} pool_deposit
* @param {BigNum} key_deposit
* @returns {Value}
*/
declare export function get_implicit_input(
txbody: TransactionBody,
pool_deposit: BigNum,
key_deposit: BigNum
): Value;

/**
* @param {TransactionBody} txbody
* @param {BigNum} pool_deposit
* @param {BigNum} key_deposit
* @returns {BigNum}
*/
declare export function get_deposit(
txbody: TransactionBody,
pool_deposit: BigNum,
key_deposit: BigNum
): BigNum;

/**
* @param {AuxiliaryData} auxiliary_data
* @returns {AuxiliaryDataHash}
Expand Down Expand Up @@ -256,6 +232,30 @@ declare export function calc_script_data_hash(
used_langs: Languages
): ScriptDataHash | void;

/**
* @param {TransactionBody} txbody
* @param {BigNum} pool_deposit
* @param {BigNum} key_deposit
* @returns {Value}
*/
declare export function get_implicit_input(
txbody: TransactionBody,
pool_deposit: BigNum,
key_deposit: BigNum
): Value;

/**
* @param {TransactionBody} txbody
* @param {BigNum} pool_deposit
* @param {BigNum} key_deposit
* @returns {BigNum}
*/
declare export function get_deposit(
txbody: TransactionBody,
pool_deposit: BigNum,
key_deposit: BigNum
): BigNum;

/**
* @param {TransactionHash} tx_body_hash
* @param {PrivateKey} sk
Expand Down Expand Up @@ -7052,6 +7052,32 @@ declare export class SingleMintBuilder {
required_signers: Ed25519KeyHashes
): MintBuilderResult;
}
/**
*/
declare export class SingleOutputBuilderResult {
free(): void;

/**
* @param {TransactionOutput} output
* @returns {SingleOutputBuilderResult}
*/
static new(output: TransactionOutput): SingleOutputBuilderResult;

/**
* @param {PlutusData} datum
*/
set_communication_datum(datum: PlutusData): void;

/**
* @returns {TransactionOutput}
*/
output(): TransactionOutput;

/**
* @returns {PlutusData | void}
*/
communication_datum(): PlutusData | void;
}
/**
*/
declare export class SingleWithdrawalBuilder {
Expand Down Expand Up @@ -8127,16 +8153,16 @@ declare export class TransactionBuilder {

/**
* Add explicit output via a TransactionOutput object
* @param {TransactionOutput} output
* @param {SingleOutputBuilderResult} builder_result
*/
add_output(output: TransactionOutput): void;
add_output(builder_result: SingleOutputBuilderResult): void;

/**
* calculates how much the fee would increase if you added a given output
* @param {TransactionOutput} output
* @param {SingleOutputBuilderResult} builder
* @returns {BigNum}
*/
fee_for_output(output: TransactionOutput): BigNum;
fee_for_output(builder: SingleOutputBuilderResult): BigNum;

/**
* @param {BigNum} fee
Expand Down Expand Up @@ -8818,9 +8844,9 @@ declare export class TransactionOutputAmountBuilder {
): TransactionOutputAmountBuilder;

/**
* @returns {TransactionOutput}
* @returns {SingleOutputBuilderResult}
*/
build(): TransactionOutput;
build(): SingleOutputBuilderResult;
}
/**
* We introduce a builder-pattern format for creating transaction outputs
Expand All @@ -8843,6 +8869,14 @@ declare export class TransactionOutputBuilder {
*/
with_address(address: Address): TransactionOutputBuilder;

/**
* A communication datum is one where the data hash is used in the tx output
* Yet the full datum is included in the witness of the same transaction
* @param {PlutusData} datum
* @returns {TransactionOutputBuilder}
*/
with_communication_data(datum: PlutusData): TransactionOutputBuilder;

/**
* @param {Datum} datum
* @returns {TransactionOutputBuilder}
Expand Down Expand Up @@ -9264,7 +9298,7 @@ declare export class TxRedeemerBuilder {
/**
* Builds the transaction and moves to the next step where any real witness can be added
* NOTE: is_valid set to true
* Will NOT require you to have set required signers & witnesses
* WILL require you to have set required signers & witnesses
* @returns {SignedTxBuilder}
*/
build_checked(): SignedTxBuilder;
Expand Down
50 changes: 47 additions & 3 deletions rust/src/builders/output_builder.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{*, ledger::babbage::min_ada::{min_ada_required, compatible_min_ada_required}};
use crate::{*, ledger::{babbage::min_ada::{min_ada_required, compatible_min_ada_required}, common::hash::hash_plutus_data}};

/// We introduce a builder-pattern format for creating transaction outputs
/// This is because:
Expand All @@ -11,6 +11,7 @@ use crate::{*, ledger::babbage::min_ada::{min_ada_required, compatible_min_ada_r
pub struct TransactionOutputBuilder {
pub(crate) address: Option<Address>,
pub(crate) datum: Option<DatumEnum>,
pub(crate) communication_datum: Option<PlutusData>,
pub(crate) script_ref: Option<ScriptRef>,
}

Expand All @@ -27,9 +28,18 @@ impl TransactionOutputBuilder {
cfg
}

/// A communication datum is one where the data hash is used in the tx output
/// Yet the full datum is included in the witness of the same transaction
pub fn with_communication_data(&self, datum: &PlutusData) -> Self {
let mut cfg = self.clone();
cfg.datum = Some(DatumEnum::DatumHash(hash_plutus_data(datum)));
cfg.communication_datum = Some(datum.clone());
cfg
}
pub fn with_data(&self, datum: &Datum) -> Self {
let mut cfg = self.clone();
cfg.datum = Some(datum.0.clone());
cfg.communication_datum = None;
cfg
}

Expand All @@ -45,6 +55,7 @@ impl TransactionOutputBuilder {
amount: None,
datum: self.datum.clone(),
script_ref: self.script_ref.clone(),
communication_datum: self.communication_datum.clone(),
})
}
}
Expand All @@ -56,6 +67,7 @@ pub struct TransactionOutputAmountBuilder {
amount: Option<Value>,
datum: Option<DatumEnum>,
script_ref: Option<ScriptRef>,
communication_datum: Option<PlutusData>,
}

#[wasm_bindgen]
Expand Down Expand Up @@ -104,16 +116,48 @@ impl TransactionOutputAmountBuilder {
Ok(self.with_coin_and_asset(&required_coin, multiasset))
}

pub fn build(&self) -> Result<TransactionOutput, JsError> {
Ok(TransactionOutput {
pub fn build(&self) -> Result<SingleOutputBuilderResult, JsError> {
let output = TransactionOutput {
address: self.address.clone(),
amount: self.amount.clone().ok_or_else(|| JsError::from_str("TransactionOutputAmountBuilder: amount missing"))?,
datum_option: self.datum.clone(),
script_ref: self.script_ref.clone(),
};
Ok(SingleOutputBuilderResult {
output,
communication_datum: self.communication_datum.clone()
})
}
}

#[wasm_bindgen]
#[derive(Clone, Debug)]
pub struct SingleOutputBuilderResult {
output: TransactionOutput,
communication_datum: Option<PlutusData>,
}
#[wasm_bindgen]
impl SingleOutputBuilderResult {
pub fn new(output: &TransactionOutput) -> SingleOutputBuilderResult {
Self {
output: output.clone(),
communication_datum: None,
}
}

pub fn set_communication_datum(&mut self, datum: &PlutusData) {
self.communication_datum = Some(datum.clone());
}

pub fn output(&self) -> TransactionOutput {
self.output.clone()
}

pub fn communication_datum(&self) -> Option<PlutusData> {
self.communication_datum.clone()
}
}

#[deprecated(
since = "1.0.0",
note = "If you don't need to support Alonzo, you don't need this function"
Expand Down
Loading

0 comments on commit 570db1d

Please sign in to comment.