use anyhow::Context;
use miden_block_prover::{BlockExecutor, LocalBlockProver};
use miden_protocol::Word;
use miden_protocol::asset::FungibleAsset;
use miden_protocol::block::ProposedBlock;
use miden_protocol::note::NoteType;
use super::utils::MockChainBlockExt;
use crate::{Auth, MockChain};
async fn two_batch_block() -> anyhow::Result<ProposedBlock> {
let mut builder = MockChain::builder();
let account0 = builder.add_existing_mock_account(Auth::IncrNonce)?;
let account1 = builder.add_existing_mock_account(Auth::IncrNonce)?;
let note0 =
builder.add_p2any_note(account0.id(), NoteType::Public, [FungibleAsset::mock(42)])?;
let note1 =
builder.add_p2any_note(account1.id(), NoteType::Public, [FungibleAsset::mock(42)])?;
let chain = builder.build()?;
let proven_tx0 =
chain.create_authenticated_notes_proven_tx(account0.id(), [note0.id()]).await?;
let proven_tx1 =
chain.create_authenticated_notes_proven_tx(account1.id(), [note1.id()]).await?;
let batches = [chain.create_batch(vec![proven_tx0])?, chain.create_batch(vec![proven_tx1])?];
let block_inputs = chain.get_block_inputs(&batches)?;
ProposedBlock::new(block_inputs, batches.to_vec()).context("failed to propose block")
}
#[tokio::test]
async fn block_kernel_skeleton_emits_empty_outputs() -> anyhow::Result<()> {
let block = two_batch_block().await?;
let executed = BlockExecutor::new().execute(block).context("block execution failed")?;
let output = executed.block_outputs();
assert_eq!(output.block_commitment(), Word::empty());
assert_eq!(output.nullifier_commitment(), Word::empty());
Ok(())
}
#[tokio::test]
async fn block_executor_then_prover_produces_block_proof() -> anyhow::Result<()> {
let block = two_batch_block().await?;
let executed = BlockExecutor::new().execute(block).context("block execution failed")?;
LocalBlockProver::default().prove(executed).context("block proving failed")?;
Ok(())
}