added all necessary trait impl for PlutusV2 scriptContext

This commit is contained in:
alessandrokonrad 2022-09-10 15:55:19 +02:00 committed by rvcas
parent 4e51826981
commit c0c7bd58b3
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
1 changed files with 229 additions and 14 deletions

View File

@ -6,13 +6,13 @@ use pallas_codec::{
use pallas_crypto::hash::Hash; use pallas_crypto::hash::Hash;
use pallas_primitives::{ use pallas_primitives::{
babbage::{ babbage::{
AddrKeyhash, AssetName, BigInt, Certificate, Constr, DatumHash, DatumOption, PolicyId, AddrKeyhash, AssetName, BigInt, Certificate, Constr, DatumHash, DatumOption, Mint,
PostAlonzoTransactionOutput, Redeemer, RewardAccount, Script, ScriptRef, StakeCredential, PolicyId, Redeemer, RewardAccount, Script, ScriptRef, StakeCredential, TransactionInput,
TransactionInput, TransactionOutput, Value, Withdrawals, TransactionOutput, Value, Withdrawals,
}, },
ToHash, ToHash,
}; };
use std::str::FromStr; use std::{str::FromStr, vec};
use uplc::PlutusData; use uplc::PlutusData;
use crate::args::ResolvedInput; use crate::args::ResolvedInput;
@ -86,8 +86,10 @@ pub fn get_tx_in_info(resolved_inputs: &[ResolvedInput]) -> anyhow::Result<Vec<P
type Slot = u64; type Slot = u64;
type PosixTime = u64; // in milliseconds type PosixTime = u64; // in milliseconds
type SlotRange = (Slot, Slot); struct TimeRange<A> {
type PosixTimeRange = (PosixTime, PosixTime); lower_bound: A,
upper_bound: A,
}
struct SlotConfig { struct SlotConfig {
slot_length: u64, slot_length: u64,
@ -99,11 +101,14 @@ fn slot_to_begin_posix_time(slot: Slot, sc: &SlotConfig) -> PosixTime {
sc.zero_time + ms_after_begin sc.zero_time + ms_after_begin
} }
fn slot_range_to_posix_time_range(slot_range: SlotRange, sc: &SlotConfig) -> PosixTimeRange { fn slot_range_to_posix_time_range(
( slot_range: TimeRange<Slot>,
slot_to_begin_posix_time(slot_range.0, sc), sc: &SlotConfig,
slot_to_begin_posix_time(slot_range.1, sc), ) -> 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),
}
} }
// --------------- // ---------------
@ -207,6 +212,16 @@ impl<A: ToPlutusData> ToPlutusData for Vec<A> {
} }
} }
impl<K: ToPlutusData, V: ToPlutusData> ToPlutusData for KeyValuePairs<K, V> {
fn to_plutus_data(&self) -> PlutusData {
let mut data_vec: Vec<(PlutusData, PlutusData)> = vec![];
for (key, value) in self.iter() {
data_vec.push((key.to_plutus_data(), value.to_plutus_data()))
}
PlutusData::Map(KeyValuePairs::Def(data_vec))
}
}
impl<A: ToPlutusData> ToPlutusData for Option<A> { impl<A: ToPlutusData> ToPlutusData for Option<A> {
fn to_plutus_data(&self) -> PlutusData { fn to_plutus_data(&self) -> PlutusData {
match self { match self {
@ -254,6 +269,30 @@ impl ToPlutusData for AnyUInt {
} }
} }
impl ToPlutusData for Int {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::BigInt(BigInt::Int(self.clone()))
}
}
impl ToPlutusData for BigInt {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::BigInt(self.clone())
}
}
impl ToPlutusData for i64 {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::BigInt(BigInt::Int(Int::from(*self)))
}
}
impl ToPlutusData for u64 {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::BigInt(BigInt::Int(Int::from(*self)))
}
}
impl ToPlutusData for Value { impl ToPlutusData for Value {
fn to_plutus_data(&self) -> PlutusData { fn to_plutus_data(&self) -> PlutusData {
match self { match self {
@ -341,6 +380,119 @@ impl ToPlutusData for TransactionOutput {
} }
} }
impl ToPlutusData for StakeCredential {
fn to_plutus_data(&self) -> PlutusData {
match self {
StakeCredential::AddrKeyhash(addr_keyhas) => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![addr_keyhas.to_plutus_data()]),
}),
StakeCredential::Scripthash(script_hash) => PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![script_hash.to_plutus_data()]),
}),
}
}
}
impl ToPlutusData for Certificate {
fn to_plutus_data(&self) -> PlutusData {
match self {
Certificate::StakeRegistration(stake_credential) => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![stake_credential.to_plutus_data()]),
}),
Certificate::StakeDeregistration(stake_credential) => PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![stake_credential.to_plutus_data()]),
}),
Certificate::StakeDelegation(stake_credential, pool_keyhash) => {
PlutusData::Constr(Constr {
tag: 2,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
stake_credential.to_plutus_data(),
pool_keyhash.to_plutus_data(),
]),
})
}
Certificate::PoolRegistration {
operator,
vrf_keyhash,
pledge: _,
cost: _,
margin: _,
reward_account: _,
pool_owners: _,
relays: _,
pool_metadata: _,
} => PlutusData::Constr(Constr {
tag: 3,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
operator.to_plutus_data(),
vrf_keyhash.to_plutus_data(),
]),
}),
Certificate::PoolRetirement(pool_keyhash, epoch) => PlutusData::Constr(Constr {
tag: 4,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
pool_keyhash.to_plutus_data(),
epoch.to_plutus_data(),
]),
}),
Certificate::GenesisKeyDelegation(_, _, _) => PlutusData::Constr(Constr {
tag: 5,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
Certificate::MoveInstantaneousRewardsCert(_) => PlutusData::Constr(Constr {
tag: 6,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![]),
}),
}
}
}
impl ToPlutusData for Redeemer {
fn to_plutus_data(&self) -> PlutusData {
self.data.clone()
}
}
impl ToPlutusData for PlutusData {
fn to_plutus_data(&self) -> PlutusData {
self.clone()
}
}
impl ToPlutusData for TimeRange<u64> {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![self.lower_bound.to_plutus_data()]),
}),
PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![self.upper_bound.to_plutus_data()]),
}),
]),
})
}
}
impl ToPlutusData for TxInInfo { impl ToPlutusData for TxInInfo {
fn to_plutus_data(&self) -> PlutusData { fn to_plutus_data(&self) -> PlutusData {
PlutusData::Constr(Constr { PlutusData::Constr(Constr {
@ -354,6 +506,69 @@ impl ToPlutusData for TxInInfo {
} }
} }
impl ToPlutusData for ScriptPurpose {
fn to_plutus_data(&self) -> PlutusData {
match self {
ScriptPurpose::Minting(policy_id) => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![policy_id.to_plutus_data()]),
}),
ScriptPurpose::Spending(out_ref) => PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![out_ref.to_plutus_data()]),
}),
ScriptPurpose::Rewarding(stake_credential) => PlutusData::Constr(Constr {
tag: 3,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![stake_credential.to_plutus_data()]),
}),
ScriptPurpose::Certifying(dcert) => PlutusData::Constr(Constr {
tag: 4,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![dcert.to_plutus_data()]),
}),
}
}
}
impl ToPlutusData for TxInfo {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
self.inputs.to_plutus_data(),
self.reference_inputs.to_plutus_data(),
self.outputs.to_plutus_data(),
self.fee.to_plutus_data(),
self.mint.to_plutus_data(),
self.dcert.to_plutus_data(),
self.wdrl.to_plutus_data(),
self.valid_range.to_plutus_data(),
self.signatories.to_plutus_data(),
self.redeemers.to_plutus_data(),
self.data.to_plutus_data(),
self.id.to_plutus_data(),
]),
})
}
}
impl ToPlutusData for ScriptContext {
fn to_plutus_data(&self) -> PlutusData {
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
self.tx_info.to_plutus_data(),
self.purpose.to_plutus_data(),
]),
})
}
}
// Plutus V2 only for now // Plutus V2 only for now
pub struct TxInInfo { pub struct TxInInfo {
@ -364,7 +579,7 @@ pub struct TxInInfo {
pub enum ScriptPurpose { pub enum ScriptPurpose {
Minting(PolicyId), Minting(PolicyId),
Spending(TransactionInput), Spending(TransactionInput),
Reward(StakeCredential), Rewarding(StakeCredential),
Certifying(Certificate), Certifying(Certificate),
} }
@ -373,10 +588,10 @@ pub struct TxInfo {
reference_inputs: Vec<TxInInfo>, reference_inputs: Vec<TxInInfo>,
outputs: Vec<TransactionOutput>, outputs: Vec<TransactionOutput>,
fee: Value, fee: Value,
mint: Value, mint: Mint,
dcert: Vec<Certificate>, dcert: Vec<Certificate>,
wdrl: Withdrawals, wdrl: Withdrawals,
valid_range: PosixTimeRange, valid_range: TimeRange<PosixTime>,
signatories: Vec<AddrKeyhash>, signatories: Vec<AddrKeyhash>,
redeemers: KeyValuePairs<ScriptPurpose, Redeemer>, redeemers: KeyValuePairs<ScriptPurpose, Redeemer>,
data: KeyValuePairs<DatumHash, PlutusData>, data: KeyValuePairs<DatumHash, PlutusData>,