@@ -619,11 +619,14 @@ impl EventObserver {
619
619
}
620
620
( true , Value :: Response ( _) ) => STATUS_RESP_POST_CONDITION ,
621
621
_ => {
622
- let TransactionOrigin :: Stacks ( inner_tx) = tx else {
623
- unreachable ! ( "Transaction results should always be a Value::Response type" ) ;
624
- } ;
625
- if !matches ! ( inner_tx. payload, TransactionPayload :: PoisonMicroblock ( ..) ) {
626
- unreachable ! ( "Transaction results should always be a Value::Response type" ) ;
622
+ if !matches ! (
623
+ tx,
624
+ TransactionOrigin :: Stacks ( StacksTransaction {
625
+ payload: TransactionPayload :: PoisonMicroblock ( _, _) ,
626
+ ..
627
+ } )
628
+ ) {
629
+ unreachable ! ( "Unexpexted transaction result type" ) ;
627
630
}
628
631
STATUS_RESP_TRUE
629
632
}
@@ -1841,13 +1844,21 @@ mod test {
1841
1844
use std:: time:: Instant ;
1842
1845
1843
1846
use clarity:: vm:: costs:: ExecutionCost ;
1847
+ use clarity:: vm:: types:: StacksAddressExtensions ;
1844
1848
use serial_test:: serial;
1849
+ use stacks:: address:: { AddressHashMode , C32_ADDRESS_VERSION_TESTNET_SINGLESIG } ;
1845
1850
use stacks:: burnchains:: { PoxConstants , Txid } ;
1851
+ use stacks:: chainstate:: burn:: operations:: TransferStxOp ;
1846
1852
use stacks:: chainstate:: nakamoto:: { NakamotoBlock , NakamotoBlockHeader } ;
1847
1853
use stacks:: chainstate:: stacks:: db:: { StacksBlockHeaderTypes , StacksHeaderInfo } ;
1848
1854
use stacks:: chainstate:: stacks:: events:: StacksBlockEventData ;
1849
- use stacks:: chainstate:: stacks:: StacksBlock ;
1850
- use stacks:: types:: chainstate:: BlockHeaderHash ;
1855
+ use stacks:: chainstate:: stacks:: {
1856
+ StacksBlock , TokenTransferMemo , TransactionAnchorMode , TransactionAuth ,
1857
+ TransactionPostConditionMode , TransactionVersion ,
1858
+ } ;
1859
+ use stacks:: types:: chainstate:: {
1860
+ BlockHeaderHash , StacksAddress , StacksPrivateKey , StacksPublicKey ,
1861
+ } ;
1851
1862
use stacks:: util:: secp256k1:: MessageSignature ;
1852
1863
use stacks_common:: bitvec:: BitVec ;
1853
1864
use stacks_common:: types:: chainstate:: { BurnchainHeaderHash , StacksBlockId } ;
@@ -2658,4 +2669,71 @@ mod test {
2658
2669
2659
2670
assert_eq ! ( event_dispatcher. registered_observers. len( ) , 1 ) ;
2660
2671
}
2672
+
2673
+ #[ test]
2674
+ /// This test checks that tx payloads properly convert the stacks transaction receipt regardless of the presence of the vm_error
2675
+ fn make_new_block_txs_payload_vm_error ( ) {
2676
+ let privkey = StacksPrivateKey :: random ( ) ;
2677
+ let pubkey = StacksPublicKey :: from_private ( & privkey) ;
2678
+ let addr = StacksAddress :: from_public_keys (
2679
+ C32_ADDRESS_VERSION_TESTNET_SINGLESIG ,
2680
+ & AddressHashMode :: SerializeP2PKH ,
2681
+ 1 ,
2682
+ & vec ! [ pubkey] ,
2683
+ )
2684
+ . unwrap ( ) ;
2685
+
2686
+ let tx = StacksTransaction {
2687
+ version : TransactionVersion :: Testnet ,
2688
+ chain_id : 0x80000000 ,
2689
+ auth : TransactionAuth :: from_p2pkh ( & privkey) . unwrap ( ) ,
2690
+ anchor_mode : TransactionAnchorMode :: Any ,
2691
+ post_condition_mode : TransactionPostConditionMode :: Allow ,
2692
+ post_conditions : vec ! [ ] ,
2693
+ payload : TransactionPayload :: TokenTransfer (
2694
+ addr. to_account_principal ( ) ,
2695
+ 123 ,
2696
+ TokenTransferMemo ( [ 0u8 ; 34 ] ) ,
2697
+ ) ,
2698
+ } ;
2699
+ let txid = tx. txid ( ) ;
2700
+
2701
+ let mut receipt = StacksTransactionReceipt {
2702
+ transaction : TransactionOrigin :: Burn ( BlockstackOperationType :: TransferStx (
2703
+ TransferStxOp {
2704
+ sender : addr,
2705
+ recipient : addr,
2706
+ memo : vec ! [ ] ,
2707
+ transfered_ustx : 123 ,
2708
+ txid,
2709
+ vtxindex : 0 ,
2710
+ block_height : 0 ,
2711
+ burn_header_hash : BurnchainHeaderHash ( [ 0u8 ; 32 ] ) ,
2712
+ } ,
2713
+ ) ) ,
2714
+ events : vec ! [ ] ,
2715
+ post_condition_aborted : true ,
2716
+ result : Value :: okay_true ( ) ,
2717
+ contract_analysis : None ,
2718
+ execution_cost : ExecutionCost {
2719
+ write_length : 0 ,
2720
+ write_count : 0 ,
2721
+ read_length : 0 ,
2722
+ read_count : 0 ,
2723
+ runtime : 0 ,
2724
+ } ,
2725
+ microblock_header : None ,
2726
+ vm_error : None ,
2727
+ stx_burned : 0u128 ,
2728
+ tx_index : 0 ,
2729
+ } ;
2730
+
2731
+ let payload_no_error = EventObserver :: make_new_block_txs_payload ( & receipt, 0 ) ;
2732
+ assert_eq ! ( payload_no_error. vm_error, receipt. vm_error) ;
2733
+
2734
+ receipt. vm_error = Some ( "Inconceivable!" . into ( ) ) ;
2735
+
2736
+ let payload_with_error = EventObserver :: make_new_block_txs_payload ( & receipt, 0 ) ;
2737
+ assert_eq ! ( payload_with_error. vm_error, receipt. vm_error) ;
2738
+ }
2661
2739
}
0 commit comments