diff --git a/crates/aldabra-dao/src/builder/proposal_advance.rs b/crates/aldabra-dao/src/builder/proposal_advance.rs index 50b865c..44faf60 100644 --- a/crates/aldabra-dao/src/builder/proposal_advance.rs +++ b/crates/aldabra-dao/src/builder/proposal_advance.rs @@ -68,7 +68,7 @@ use pallas_codec::minicbor; use pallas_crypto::hash::Hash; -use pallas_txbuilder::{BuildConway, Input, Output, StagingTransaction}; +use pallas_txbuilder::{BuildConway, Input, Output, ScriptKind, StagingTransaction}; use crate::agora::proposal::{ ProposalDatum, ProposalRedeemer, ProposalStatus, ProposalThresholds, @@ -437,6 +437,16 @@ pub fn build_unsigned_proposal_advance( staging = staging.fee(args.fee_lovelace).network_id(network_id); + // Wire V2 cost model so pallas computes script_data_hash. Without + // this the chain rejects with PPViewHashesDontMatch — same trap + // proposal_create + plutus_mint hit. All Agora validators we + // witness here (proposal_validator, proposalSt policy when burning) + // are PlutusV2 on the preprod linker output. + staging = staging.language_view( + ScriptKind::PlutusV2, + aldabra_core::plutus_cost_models::PLUTUS_V2_COST_MODEL_PREPROD.to_vec(), + ); + let built = staging .build_conway_raw() .map_err(|e| DaoError::Backend(format!("build_conway_raw: {e}")))?; diff --git a/crates/aldabra-dao/src/builder/proposal_cosign.rs b/crates/aldabra-dao/src/builder/proposal_cosign.rs index c2e6c16..a83e031 100644 --- a/crates/aldabra-dao/src/builder/proposal_cosign.rs +++ b/crates/aldabra-dao/src/builder/proposal_cosign.rs @@ -53,7 +53,7 @@ use pallas_codec::minicbor; use pallas_crypto::hash::Hash; -use pallas_txbuilder::{BuildConway, Input, Output, StagingTransaction}; +use pallas_txbuilder::{BuildConway, Input, Output, ScriptKind, StagingTransaction}; use crate::agora::proposal::{ ProposalDatum, ProposalRedeemer, ProposalStatus, ProposalThresholds, @@ -415,6 +415,13 @@ pub fn build_unsigned_proposal_cosign( staging = staging.fee(args.fee_lovelace).network_id(network_id); + // Wire V2 cost model — same fix as proposal_create / proposal_advance. + // Without this the chain rejects with PPViewHashesDontMatch. + staging = staging.language_view( + ScriptKind::PlutusV2, + aldabra_core::plutus_cost_models::PLUTUS_V2_COST_MODEL_PREPROD.to_vec(), + ); + let built = staging .build_conway_raw() .map_err(|e| DaoError::Backend(format!("build_conway_raw: {e}")))?; diff --git a/crates/aldabra-dao/src/builder/proposal_vote.rs b/crates/aldabra-dao/src/builder/proposal_vote.rs index dffd09e..739e1c9 100644 --- a/crates/aldabra-dao/src/builder/proposal_vote.rs +++ b/crates/aldabra-dao/src/builder/proposal_vote.rs @@ -61,7 +61,7 @@ use pallas_codec::minicbor; use pallas_crypto::hash::Hash; -use pallas_txbuilder::{BuildConway, Input, Output, StagingTransaction}; +use pallas_txbuilder::{BuildConway, Input, Output, ScriptKind, StagingTransaction}; use crate::agora::proposal::{ ProposalDatum, ProposalRedeemer, ProposalStatus, ProposalVotes, @@ -499,6 +499,13 @@ pub fn build_unsigned_proposal_vote( staging = staging.fee(args.fee_lovelace).network_id(network_id); + // Wire V2 cost model — same fix as proposal_create / proposal_advance / proposal_cosign. + // Without this the chain rejects with PPViewHashesDontMatch. + staging = staging.language_view( + ScriptKind::PlutusV2, + aldabra_core::plutus_cost_models::PLUTUS_V2_COST_MODEL_PREPROD.to_vec(), + ); + let built = staging .build_conway_raw() .map_err(|e| DaoError::Backend(format!("build_conway_raw: {e}")))?; diff --git a/crates/aldabra-dao/src/builder/stake_destroy.rs b/crates/aldabra-dao/src/builder/stake_destroy.rs index e50d669..ef78952 100644 --- a/crates/aldabra-dao/src/builder/stake_destroy.rs +++ b/crates/aldabra-dao/src/builder/stake_destroy.rs @@ -32,7 +32,7 @@ use pallas_codec::minicbor; use pallas_crypto::hash::Hash; -use pallas_txbuilder::{BuildConway, Input, Output, StagingTransaction}; +use pallas_txbuilder::{BuildConway, Input, Output, ScriptKind, StagingTransaction}; use crate::agora::stake::{Credential, StakeRedeemer}; use crate::config::{DaoConfig, DaoNetwork}; @@ -246,6 +246,13 @@ pub fn build_unsigned_stake_destroy( staging = staging.fee(args.fee_lovelace).network_id(network_id); + // Wire V2 cost model — same fix as the proposal builders. + // stake_validator + stakeSt policy are PlutusV2. + staging = staging.language_view( + ScriptKind::PlutusV2, + aldabra_core::plutus_cost_models::PLUTUS_V2_COST_MODEL_PREPROD.to_vec(), + ); + let built = staging .build_conway_raw() .map_err(|e| DaoError::Backend(format!("build_conway_raw: {e}")))?;