fixed time range

This commit is contained in:
alessandrokonrad 2022-09-10 21:25:23 +02:00 committed by rvcas
parent 57816d4c09
commit 24397d4b58
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
1 changed files with 229 additions and 49 deletions

View File

@ -81,36 +81,6 @@ pub fn get_tx_in_info_old(resolved_inputs: &[ResolvedInput]) -> anyhow::Result<V
Ok(tx_in_info) Ok(tx_in_info)
} }
//---- Time conversion: slot range => posix time range
type Slot = u64;
type PosixTime = u64; // in milliseconds
struct TimeRange<A> {
lower_bound: A,
upper_bound: A,
}
struct SlotConfig {
slot_length: u64,
zero_time: PosixTime,
}
fn slot_to_begin_posix_time(slot: Slot, sc: &SlotConfig) -> PosixTime {
let ms_after_begin = slot * sc.slot_length;
sc.zero_time + ms_after_begin
}
fn slot_range_to_posix_time_range(
slot_range: TimeRange<Slot>,
sc: &SlotConfig,
) -> TimeRange<PosixTime> {
TimeRange {
lower_bound: slot_to_begin_posix_time(slot_range.lower_bound, sc),
upper_bound: slot_to_begin_posix_time(slot_range.upper_bound, sc),
}
}
// --------------- // ---------------
pub trait ToPlutusData { pub trait ToPlutusData {
@ -472,24 +442,178 @@ impl ToPlutusData for PlutusData {
} }
} }
impl ToPlutusData for TimeRange<u64> { impl ToPlutusData for TimeRange {
fn to_plutus_data(&self) -> PlutusData { fn to_plutus_data(&self) -> PlutusData {
PlutusData::Constr(Constr { match &self {
tag: 0, TimeRange {
any_constructor: None, lower_bound: Some(lower_bound),
fields: MaybeIndefArray::Indef(vec![ upper_bound: None,
} => {
PlutusData::Constr(Constr { PlutusData::Constr(Constr {
tag: 0, tag: 0,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![self.lower_bound.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![
}), // LowerBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// Finite
PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
lower_bound.to_plutus_data()
]),
}),
// Closure
true.to_plutus_data(),
]),
}), //UpperBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// PosInf
PlutusData::Constr(Constr {
tag: 2,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
// Closure
true.to_plutus_data(),
]),
}),
]),
})
}
TimeRange {
lower_bound: None,
upper_bound: Some(upper_bound),
} => {
PlutusData::Constr(Constr { PlutusData::Constr(Constr {
tag: 1, tag: 0,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![self.upper_bound.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![
}), // LowerBound
]), PlutusData::Constr(Constr {
}) tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// NegInf
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
// Closure
true.to_plutus_data(),
]),
}), //UpperBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// Finite
PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
upper_bound.to_plutus_data()
]),
}),
// Closure
true.to_plutus_data(),
]),
}),
]),
})
}
TimeRange {
lower_bound: Some(lower_bound),
upper_bound: Some(upper_bound),
} => {
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// LowerBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// Finite
PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
lower_bound.to_plutus_data()
]),
}),
// Closure
true.to_plutus_data(),
]),
}), //UpperBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// Finite
PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
upper_bound.to_plutus_data()
]),
}),
// Closure
false.to_plutus_data(),
]),
}),
]),
})
}
TimeRange {
lower_bound: None,
upper_bound: None,
} => {
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// LowerBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// NegInf
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
// Closure
true.to_plutus_data(),
]),
}), //UpperBound
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// PosInf
PlutusData::Constr(Constr {
tag: 2,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
// Closure
true.to_plutus_data(),
]),
}),
]),
})
}
}
} }
} }
@ -520,12 +644,12 @@ impl ToPlutusData for ScriptPurpose {
fields: MaybeIndefArray::Indef(vec![out_ref.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![out_ref.to_plutus_data()]),
}), }),
ScriptPurpose::Rewarding(stake_credential) => PlutusData::Constr(Constr { ScriptPurpose::Rewarding(stake_credential) => PlutusData::Constr(Constr {
tag: 3, tag: 2,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![stake_credential.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![stake_credential.to_plutus_data()]),
}), }),
ScriptPurpose::Certifying(dcert) => PlutusData::Constr(Constr { ScriptPurpose::Certifying(dcert) => PlutusData::Constr(Constr {
tag: 4, tag: 3,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![dcert.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![dcert.to_plutus_data()]),
}), }),
@ -569,6 +693,23 @@ impl ToPlutusData for ScriptContext {
} }
} }
impl ToPlutusData for bool {
fn to_plutus_data(&self) -> PlutusData {
match self {
false => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
true => PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
}
}
}
// Plutus V2 only for now // Plutus V2 only for now
pub struct TxInInfo { pub struct TxInInfo {
@ -591,7 +732,7 @@ pub struct TxInfo {
mint: Mint, mint: Mint,
dcert: MaybeIndefArray<Certificate>, dcert: MaybeIndefArray<Certificate>,
wdrl: Withdrawals, wdrl: Withdrawals,
valid_range: TimeRange<PosixTime>, valid_range: TimeRange,
signatories: MaybeIndefArray<AddrKeyhash>, signatories: MaybeIndefArray<AddrKeyhash>,
redeemers: KeyValuePairs<ScriptPurpose, Redeemer>, redeemers: KeyValuePairs<ScriptPurpose, Redeemer>,
data: KeyValuePairs<DatumHash, PlutusData>, data: KeyValuePairs<DatumHash, PlutusData>,
@ -603,6 +744,36 @@ pub struct ScriptContext {
purpose: ScriptPurpose, purpose: ScriptPurpose,
} }
//---- Time conversion: slot range => posix time range
struct TimeRange {
lower_bound: Option<u64>,
upper_bound: Option<u64>,
}
struct SlotConfig {
slot_length: u64,
zero_time: u64,
}
fn slot_to_begin_posix_time(slot: u64, sc: &SlotConfig) -> u64 {
let ms_after_begin = slot * sc.slot_length;
sc.zero_time + ms_after_begin
}
fn slot_range_to_posix_time_range(slot_range: TimeRange, sc: &SlotConfig) -> TimeRange {
TimeRange {
lower_bound: match slot_range.lower_bound {
Some(lower_bound) => Some(slot_to_begin_posix_time(lower_bound, sc)),
None => None,
},
upper_bound: match slot_range.upper_bound {
Some(upper_bound) => Some(slot_to_begin_posix_time(upper_bound, sc)),
None => None,
},
}
}
fn get_tx_in_info( fn get_tx_in_info(
inputs: &MaybeIndefArray<TransactionInput>, inputs: &MaybeIndefArray<TransactionInput>,
utxos: &Vec<(TransactionInput, TransactionOutput)>, utxos: &Vec<(TransactionInput, TransactionOutput)>,
@ -653,7 +824,14 @@ fn get_script_purpose(
.map(|input| input.out_ref.clone()) .map(|input| input.out_ref.clone())
.collect::<Vec<TransactionInput>>() .collect::<Vec<TransactionInput>>()
.clone(); .clone();
// inputs.sort(); // TODO!!!!!!!!!; // is this correct? Does this sort lexical from low to high? maybe get Ordering into pallas for TransactionInput?
inputs.sort_by(
|i_a, i_b| match i_a.transaction_id.cmp(&i_b.transaction_id) {
std::cmp::Ordering::Less => std::cmp::Ordering::Less,
std::cmp::Ordering::Equal => i_a.index.cmp(&i_b.index),
std::cmp::Ordering::Greater => std::cmp::Ordering::Greater,
},
);
let input = inputs[index as usize].clone(); let input = inputs[index as usize].clone();
Ok(ScriptPurpose::Spending(input)) Ok(ScriptPurpose::Spending(input))
} }
@ -709,11 +887,11 @@ fn get_tx_info(
let wdrl = body.withdrawals.unwrap_or(KeyValuePairs::Indef(vec![])); let wdrl = body.withdrawals.unwrap_or(KeyValuePairs::Indef(vec![]));
let valid_range = slot_range_to_posix_time_range( let valid_range = slot_range_to_posix_time_range(
TimeRange { TimeRange {
lower_bound: 0, lower_bound: body.validity_interval_start,
upper_bound: 0, upper_bound: body.ttl,
}, },
&slot_config, &slot_config,
); // TODO!!!! );
let signatories = body let signatories = body
.required_signers .required_signers
.unwrap_or(MaybeIndefArray::Indef(vec![])); .unwrap_or(MaybeIndefArray::Indef(vec![]));
@ -774,3 +952,5 @@ fn get_script_context(
)?; )?;
Ok(ScriptContext { tx_info, purpose }) Ok(ScriptContext { tx_info, purpose })
} }
// TODO: Maybe make ToPlutusData dependent on a Plutus Language so it works for V1 and V2?