|
1 | 1 | use strata_asm_checkpoint_msgs::CheckpointIncomingMsg; |
2 | 2 | use strata_asm_common::{ |
3 | | - MsgRelayer, |
| 3 | + AsmLogEntry, MsgRelayer, |
4 | 4 | logging::{error, info}, |
5 | 5 | }; |
| 6 | +use strata_asm_logs::AsmStfUpdate; |
6 | 7 | use strata_asm_txs_admin::{ |
7 | 8 | actions::{MultisigAction, UpdateAction, updates::predicate::ProofType}, |
8 | 9 | parser::SignedPayload, |
@@ -56,7 +57,13 @@ pub(crate) fn handle_pending_updates( |
56 | 57 | let (key, kind) = update.into_inner(); |
57 | 58 | match kind { |
58 | 59 | ProofType::Asm => { |
59 | | - // TODO(STR-1721): Emit ASM Log |
| 60 | + let log_entry = AsmLogEntry::from_log(&AsmStfUpdate::new(key)) |
| 61 | + .expect("AsmStfUpdate encoding is infallible"); |
| 62 | + relayer.emit_log(log_entry); |
| 63 | + info!( |
| 64 | + %update_id, |
| 65 | + "Emitted ASM STF verifying key update log", |
| 66 | + ); |
60 | 67 | } |
61 | 68 | ProofType::OLStf => { |
62 | 69 | relay_checkpoint_predicate(relayer, key); |
@@ -183,6 +190,7 @@ mod tests { |
183 | 190 | use rand::{rngs::OsRng, seq::SliceRandom, thread_rng}; |
184 | 191 | use strata_asm_checkpoint_msgs::CheckpointIncomingMsg; |
185 | 192 | use strata_asm_common::{AsmLogEntry, InterprotoMsg, MsgRelayer}; |
| 193 | + use strata_asm_logs::AsmStfUpdate; |
186 | 194 | use strata_asm_params::{AdministrationInitConfig, Role}; |
187 | 195 | use strata_asm_txs_admin::{ |
188 | 196 | actions::{ |
@@ -502,6 +510,38 @@ mod tests { |
502 | 510 | } |
503 | 511 | } |
504 | 512 |
|
| 513 | + #[test] |
| 514 | + fn test_asm_verifying_key_update_emits_log() { |
| 515 | + let (params, _, _) = create_test_params(); |
| 516 | + let mut state = AdministrationSubprotoState::new(¶ms); |
| 517 | + let mut relayer = MockRelayer::<CheckpointIncomingMsg>::new(); |
| 518 | + |
| 519 | + let predicate = PredicateKey::always_accept(); |
| 520 | + |
| 521 | + let update = PredicateUpdate::new(predicate.clone(), ProofType::Asm); |
| 522 | + let update_id = state.next_update_id(); |
| 523 | + let activation_height = 42; |
| 524 | + state.enqueue(QueuedUpdate::new( |
| 525 | + update_id, |
| 526 | + update.into(), |
| 527 | + activation_height, |
| 528 | + )); |
| 529 | + |
| 530 | + handle_pending_updates(&mut state, &mut relayer, activation_height); |
| 531 | + |
| 532 | + assert!(state.queued().is_empty()); |
| 533 | + // No inter-protocol messages should be sent for ASM updates |
| 534 | + assert!(relayer.messages().is_empty()); |
| 535 | + // Exactly one log should be emitted |
| 536 | + assert_eq!(relayer.logs.len(), 1); |
| 537 | + |
| 538 | + let log_entry = &relayer.logs[0]; |
| 539 | + let asm_update = log_entry |
| 540 | + .try_into_log::<AsmStfUpdate>() |
| 541 | + .expect("log should deserialize as AsmStfUpdate"); |
| 542 | + assert_eq!(asm_update.new_predicate(), &predicate); |
| 543 | + } |
| 544 | + |
505 | 545 | /// Test that cancel actions properly remove queued updates: |
506 | 546 | /// - First queue 5 update actions. |
507 | 547 | /// - Then cancel each one individually. |
|
0 commit comments