Skip to content

Commit 707c09a

Browse files
committed
CRC: add unit tests for converting vm_error
Signed-off-by: Jacinta Ferrant <jacinta.ferrant@gmail.com>
1 parent 521558f commit 707c09a

File tree

1 file changed

+85
-7
lines changed

1 file changed

+85
-7
lines changed

testnet/stacks-node/src/event_dispatcher.rs

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -619,11 +619,14 @@ impl EventObserver {
619619
}
620620
(true, Value::Response(_)) => STATUS_RESP_POST_CONDITION,
621621
_ => {
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");
627630
}
628631
STATUS_RESP_TRUE
629632
}
@@ -1841,13 +1844,21 @@ mod test {
18411844
use std::time::Instant;
18421845

18431846
use clarity::vm::costs::ExecutionCost;
1847+
use clarity::vm::types::StacksAddressExtensions;
18441848
use serial_test::serial;
1849+
use stacks::address::{AddressHashMode, C32_ADDRESS_VERSION_TESTNET_SINGLESIG};
18451850
use stacks::burnchains::{PoxConstants, Txid};
1851+
use stacks::chainstate::burn::operations::TransferStxOp;
18461852
use stacks::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader};
18471853
use stacks::chainstate::stacks::db::{StacksBlockHeaderTypes, StacksHeaderInfo};
18481854
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+
};
18511862
use stacks::util::secp256k1::MessageSignature;
18521863
use stacks_common::bitvec::BitVec;
18531864
use stacks_common::types::chainstate::{BurnchainHeaderHash, StacksBlockId};
@@ -2658,4 +2669,71 @@ mod test {
26582669

26592670
assert_eq!(event_dispatcher.registered_observers.len(), 1);
26602671
}
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+
}
26612739
}

0 commit comments

Comments
 (0)