fixed bugs

This commit is contained in:
alessandrokonrad 2022-09-10 23:07:51 +02:00 committed by rvcas
parent 24397d4b58
commit 4060a25324
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
1 changed files with 82 additions and 59 deletions

View File

@ -1,4 +1,4 @@
use pallas_addresses::{Address, StakePayload}; use pallas_addresses::{Address, ShelleyDelegationPart, ShelleyPaymentPart, StakePayload};
use pallas_codec::{ use pallas_codec::{
minicbor::{bytes::ByteVec, data::Int}, minicbor::{bytes::ByteVec, data::Int},
utils::{AnyUInt, KeyValuePairs, MaybeIndefArray}, utils::{AnyUInt, KeyValuePairs, MaybeIndefArray},
@ -22,7 +22,7 @@ pub fn get_tx_in_info_old(resolved_inputs: &[ResolvedInput]) -> anyhow::Result<V
for resolved_input in resolved_inputs { for resolved_input in resolved_inputs {
let tx_out_ref = TransactionInput { let tx_out_ref = TransactionInput {
transaction_id: Hash::from_str(resolved_input.input.tx_hash.as_str())?, // Not sure if this is the best approach? transaction_id: Hash::from_str(resolved_input.input.tx_hash.as_str())?,
index: resolved_input.input.index, index: resolved_input.input.index,
} }
.to_plutus_data(); .to_plutus_data();
@ -89,64 +89,76 @@ pub trait ToPlutusData {
impl ToPlutusData for Address { impl ToPlutusData for Address {
fn to_plutus_data(&self) -> PlutusData { fn to_plutus_data(&self) -> PlutusData {
//TOD: Byron address and reward address match self {
Address::Byron(byron_address) => {
let payment_tag = match self.typeid() % 2 {
0 => 0,
1 => 1,
_ => unreachable!(),
};
let stake_tag = match self.typeid() {
0 | 1 => Some(0),
2 | 3 => Some(1),
_ => None,
};
let (payment_part, stake_part) = match self {
Address::Shelley(s) => (s.payment().to_vec(), s.delegation().to_vec()),
_ => unreachable!(),
};
PlutusData::Constr(Constr { PlutusData::Constr(Constr {
tag: 0, tag: 0,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![ fields: MaybeIndefArray::Indef(vec![
// addressCredential //addressCredential
PlutusData::Constr(Constr {
tag: payment_tag,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![PlutusData::BoundedBytes(
payment_part.into(),
)]),
}),
// addressStakingCredential
PlutusData::Constr(Constr {
tag: if stake_tag.is_some() { 0 } else { 1 },
any_constructor: None,
fields: MaybeIndefArray::Indef(match stake_tag {
Some(stake_tag) => vec![
// StakingCredential
PlutusData::Constr(Constr { PlutusData::Constr(Constr {
tag: 0, tag: 0,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![ fields: MaybeIndefArray::Indef(vec![byron_address
// StakingHash .decode()
PlutusData::Constr(Constr { .unwrap()
tag: stake_tag, .root
any_constructor: None, .to_plutus_data()]),
fields: MaybeIndefArray::Indef(vec![
PlutusData::BoundedBytes(stake_part.into()),
]),
}),
]),
}),
],
None => vec![],
}),
}), }),
//addressStakeCredential
None::<StakeCredential>.to_plutus_data(),
]), ]),
}) })
} }
Address::Shelley(shelley_address) => {
let payment_part = shelley_address.payment();
let stake_part = shelley_address.delegation();
let payment_part_plutus_data = match payment_part {
ShelleyPaymentPart::Key(payment_keyhash) => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![payment_keyhash.to_plutus_data()]),
}),
ShelleyPaymentPart::Script(script_hash) => PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![script_hash.to_plutus_data()]),
}),
};
let stake_part_plutus_data = match stake_part {
ShelleyDelegationPart::Key(stake_keyhash) => {
Some(StakeCredential::AddrKeyhash(stake_keyhash.clone())).to_plutus_data()
}
ShelleyDelegationPart::Script(script_hash) => {
Some(StakeCredential::Scripthash(script_hash.clone())).to_plutus_data()
}
ShelleyDelegationPart::Pointer(pointer) => Some(PlutusData::Constr(Constr {
tag: 1,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
pointer.slot().to_plutus_data(),
pointer.tx_idx().to_plutus_data(),
pointer.cert_idx().to_plutus_data(),
]),
}))
.to_plutus_data(),
ShelleyDelegationPart::Null => None::<Address>.to_plutus_data(),
};
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
payment_part_plutus_data,
stake_part_plutus_data,
]),
})
}
Address::Stake(_) => unreachable!(),
}
}
} }
impl ToPlutusData for TransactionInput { impl ToPlutusData for TransactionInput {
@ -351,17 +363,28 @@ impl ToPlutusData for TransactionOutput {
} }
impl ToPlutusData for StakeCredential { impl ToPlutusData for StakeCredential {
// Stake Credential needs to be wrapped inside another Constr, because we could have either a StakingHash or a StakingPtr
// The current implementation of StakeCredential doesn't capture the credential of a Pointer address.
// So a StakeCredential for a Pointer address needs to be converted separately
fn to_plutus_data(&self) -> PlutusData { fn to_plutus_data(&self) -> PlutusData {
match self { match self {
StakeCredential::AddrKeyhash(addr_keyhas) => PlutusData::Constr(Constr { StakeCredential::AddrKeyhash(addr_keyhas) => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![PlutusData::Constr(Constr {
tag: 0, tag: 0,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![addr_keyhas.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![addr_keyhas.to_plutus_data()]),
})]),
}), }),
StakeCredential::Scripthash(script_hash) => PlutusData::Constr(Constr { StakeCredential::Scripthash(script_hash) => PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![PlutusData::Constr(Constr {
tag: 1, tag: 1,
any_constructor: None, any_constructor: None,
fields: MaybeIndefArray::Indef(vec![script_hash.to_plutus_data()]), fields: MaybeIndefArray::Indef(vec![script_hash.to_plutus_data()]),
})]),
}), }),
} }
} }