diff --git a/CHANGELOG.md b/CHANGELOG.md index a4a99b9008..d733b2dd88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ - Added shared `ProcedurePolicy` for AuthMultisig ([#2670](https://github.com/0xMiden/protocol/pull/2670)). - [BREAKING] Changed `NoteType` encoding from 2 bits to 1 and makes `NoteType::Private` the default ([#2691](https://github.com/0xMiden/miden-base/issues/2691)). - Added `BlockNumber::saturating_sub()` ([#2660](https://github.com/0xMiden/protocol/issues/2660)). +- Added `TransactionScript::from_package()` method to create `TransactionScript` from `miden-mast-package::Package` ([#2779](https://github.com/0xMiden/protocol/pull/2779)). + ## 0.14.3 (2026-04-07) diff --git a/crates/miden-protocol/src/errors/mod.rs b/crates/miden-protocol/src/errors/mod.rs index 15edb8c345..0d4293d3fc 100644 --- a/crates/miden-protocol/src/errors/mod.rs +++ b/crates/miden-protocol/src/errors/mod.rs @@ -764,6 +764,10 @@ impl PartialBlockchainError { pub enum TransactionScriptError { #[error("failed to assemble transaction script:\n{}", PrintDiagnostic::new(.0))] AssemblyError(Report), + #[error("failed to convert package to transaction script:\n{}", PrintDiagnostic::new(.0))] + PackageNotProgram(Report), + #[error("failed to convert package to transaction script:\n{}", PrintDiagnostic::new(.0))] + PackageNotTransactionScript(Report), } // TRANSACTION INPUT ERROR diff --git a/crates/miden-protocol/src/transaction/tx_args.rs b/crates/miden-protocol/src/transaction/tx_args.rs index 1e6657bfaf..1457b7b746 100644 --- a/crates/miden-protocol/src/transaction/tx_args.rs +++ b/crates/miden-protocol/src/transaction/tx_args.rs @@ -2,11 +2,14 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; use alloc::vec::Vec; +use miden_assembly::Report; use miden_core::mast::MastNodeExt; use miden_crypto::merkle::InnerNodeInfo; +use miden_mast_package::{Package, TargetType}; use super::{Felt, Hasher, Word}; use crate::account::auth::{PublicKeyCommitment, Signature}; +use crate::errors::TransactionScriptError; use crate::note::{NoteId, NoteRecipient}; use crate::utils::serde::{ ByteReader, @@ -308,6 +311,29 @@ impl TransactionScript { Self { mast, entrypoint } } + /// Creates a [TransactionScript] from a [`Package`]. + /// + /// The package must be an executable (i.e., its target type must be + /// [`TargetType::TransactionScript`](miden_mast_package::TargetType::TransactionScript)). + /// + /// # Errors + /// Returns an error if the package cannot be converted to an executable program. + pub fn from_package(package: &Package) -> Result { + let package_kind = package.kind; + if !matches!(package_kind, TargetType::TransactionScript) { + let err_report = Report::msg(format!( + "package's kind is {}, expected TransactionScript", + package_kind + )); + return Err(TransactionScriptError::PackageNotTransactionScript(err_report)); + }; + + let program = + package.try_into_program().map_err(TransactionScriptError::PackageNotProgram)?; + + Ok(TransactionScript::new(program)) + } + // PUBLIC ACCESSORS // --------------------------------------------------------------------------------------------