From aff224352689ca957b8eed032e2a35ce432bc4a1 Mon Sep 17 00:00:00 2001 From: Jeanmichel7 Date: Sun, 19 Jan 2025 19:47:30 +0100 Subject: [PATCH] add txid, rework midhash, init hashcache --- packages/cmds/src/main.cairo | 26 +- packages/engine/src/hash_cache.cairo | 157 +++++----- packages/engine/src/opcodes/crypto.cairo | 2 +- packages/engine/src/signature/sighash.cairo | 48 ++- packages/engine/src/signature/signature.cairo | 2 +- .../src/signature/taproot_signature.cairo | 6 +- packages/engine/src/signature/utils.cairo | 1 + .../engine/src/tests/test_taproot_hash.cairo | 275 ++++++------------ packages/engine/src/transaction.cairo | 85 ++++-- packages/tests/src/tests/test_coinbase.cairo | 18 +- packages/tests/src/tests/test_p2ms.cairo | 14 +- packages/tests/src/tests/test_p2pk.cairo | 8 +- packages/tests/src/tests/test_p2pkh.cairo | 8 +- packages/tests/src/tests/test_p2sh.cairo | 13 +- packages/tests/src/tests/test_p2wpkh.cairo | 10 +- packages/tests/src/tests/test_p2wsh.cairo | 14 +- .../tests/src/tests/test_transactions.cairo | 12 +- packages/tests/src/utils.cairo | 2 + 18 files changed, 343 insertions(+), 358 deletions(-) diff --git a/packages/cmds/src/main.cairo b/packages/cmds/src/main.cairo index eb6e2654..58cbd8dd 100644 --- a/packages/cmds/src/main.cairo +++ b/packages/cmds/src/main.cairo @@ -14,6 +14,7 @@ use shinigami_tests::validate; struct InputData { ScriptSig: ByteArray, ScriptPubKey: ByteArray, + txid: u256, } #[derive(Clone, Drop)] @@ -21,6 +22,7 @@ struct InputDataWithFlags { ScriptSig: ByteArray, ScriptPubKey: ByteArray, Flags: ByteArray, + txid: u256, } #[derive(Clone, Drop)] @@ -29,6 +31,7 @@ struct InputDataWithWitness { ScriptPubKey: ByteArray, Flags: ByteArray, Witness: ByteArray, + txid: u256, } fn run_with_flags(input: InputDataWithFlags) -> Result<(), felt252> { @@ -42,7 +45,9 @@ fn run_with_flags(input: InputDataWithFlags) -> Result<(), felt252> { let script_pubkey = compiler.compile(input.ScriptPubKey)?; let compiler = CompilerImpl::new(); let script_sig = compiler.compile(input.ScriptSig)?; - let tx = EngineInternalTransactionImpl::new_signed(script_sig, script_pubkey.clone(), array![]); + let tx = EngineInternalTransactionImpl::new_signed( + script_sig, script_pubkey.clone(), input.txid, array![], + ); let flags = flags::parse_flags(input.Flags); let hash_cache = HashCacheImpl::new(@tx); let mut engine = EngineImpl::new(@script_pubkey, @tx, 0, flags, 0, @hash_cache)?; @@ -65,7 +70,7 @@ fn run_with_witness(input: InputDataWithWitness) -> Result<(), felt252> { let witness = witness::parse_witness_input(input.Witness); let value = 1; // TODO let tx = EngineInternalTransactionImpl::new_signed_witness( - script_sig, script_pubkey.clone(), witness, value, array![], + script_sig, script_pubkey.clone(), witness, value, input.txid, array![], ); let flags = flags::parse_flags(input.Flags); let hash_cache = HashCacheImpl::new(@tx); @@ -84,7 +89,9 @@ fn run(input: InputData) -> Result<(), felt252> { let script_pubkey = compiler.compile(input.ScriptPubKey)?; let compiler = CompilerImpl::new(); let script_sig = compiler.compile(input.ScriptSig)?; - let tx = EngineInternalTransactionImpl::new_signed(script_sig, script_pubkey.clone(), array![]); + let tx = EngineInternalTransactionImpl::new_signed( + script_sig, script_pubkey.clone(), input.txid, array![], + ); let hash_cache = HashCacheImpl::new(@tx); let mut engine = EngineImpl::new(@script_pubkey, @tx, 0, 0, 0, @hash_cache)?; let res = engine.execute(); @@ -110,7 +117,9 @@ fn run_with_json(input: InputData) -> Result<(), felt252> { let script_pubkey = compiler.compile(input.ScriptPubKey)?; let compiler = CompilerImpl::new(); let script_sig = compiler.compile(input.ScriptSig)?; - let tx = EngineInternalTransactionImpl::new_signed(script_sig, script_pubkey.clone(), array![]); + let tx = EngineInternalTransactionImpl::new_signed( + script_sig, script_pubkey.clone(), input.txid, array![], + ); let hash_cache = HashCacheImpl::new(@tx); let mut engine = EngineImpl::new(@script_pubkey, @tx, 0, 0, 0, @hash_cache)?; let _ = engine.execute()?; @@ -128,7 +137,9 @@ fn debug(input: InputData) -> Result { let script_pubkey = compiler.compile(input.ScriptPubKey)?; let compiler = CompilerImpl::new(); let script_sig = compiler.compile(input.ScriptSig)?; - let tx = EngineInternalTransactionImpl::new_signed(script_sig, script_pubkey.clone(), array![]); + let tx = EngineInternalTransactionImpl::new_signed( + script_sig, script_pubkey.clone(), input.txid, array![], + ); let hash_cache = HashCacheImpl::new(@tx); let mut engine = EngineImpl::new(@script_pubkey, @tx, 0, 0, 0, @hash_cache)?; let mut res = Result::Ok(true); @@ -206,6 +217,7 @@ struct ValidateRawInput { raw_transaction: ByteArray, utxo_hints: Array, flags: ByteArray, + txid: u256 // from raito or calculate from raw_transaction in decode ? } fn run_raw_transaction(mut input: ValidateRawInput) -> u8 { @@ -236,7 +248,9 @@ fn run_raw_transaction(mut input: ValidateRawInput) -> u8 { ); }; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize( + raw_transaction, input.txid, utxo_hints, + ); // transaction.set_utxos(utxo_hints); let res = validate::validate_transaction(@transaction, script_flags); diff --git a/packages/engine/src/hash_cache.cairo b/packages/engine/src/hash_cache.cairo index c70c2adc..b9d24313 100644 --- a/packages/engine/src/hash_cache.cairo +++ b/packages/engine/src/hash_cache.cairo @@ -6,6 +6,9 @@ use core::sha256::compute_sha256_byte_array; use crate::signature::utils::is_witness_v1_pub_key_hash; use core::dict::Felt252Dict; +// use core::poseidon::PoseidonTrait; +// use core::hash::{HashStateTrait, HashStateExTrait}; + // SegwitSigHashMidstate is the sighash midstate used in the base segwit // sighash calculation as defined in BIP 143. #[derive(Clone, Copy, Drop, Default)] @@ -26,27 +29,13 @@ pub struct TaprootSigHashMidState { pub hash_input_amounts_v1: u256, } -pub trait SigHashMidstateTrait< - I, - O, - T, - +EngineTransactionInputTrait, - +EngineTransactionOutputTrait, - +EngineTransactionTrait, -> { - fn new(transaction: @T, tx_idx: u32) -> TxSigHashes; +pub trait SigHashMidstateTrait { + fn new(transaction: @T) -> TxSigHashes; fn calc_hash_inputs_amount(transaction: @T) -> u256; fn calc_hash_input_scripts(transaction: @T) -> u256; } // TxSigHashes houses the partial set of sighashes introduced within BIP0143. -#[derive(Drop, Default)] -pub enum TxSigHashes { - Segwit: @SegwitSigHashMidstate, - #[default] // make sense ? for TaprootSigVerifierTrait::empty() - Taproot: @TaprootSigHashMidState, -} - pub impl SigHashMidstateImpl< I, O, @@ -56,14 +45,23 @@ pub impl SigHashMidstateImpl< impl IEngineTransaction: EngineTransactionTrait< T, I, O, IEngineTransactionInput, IEngineTransactionOutput, >, -> of SigHashMidstateTrait { - fn new(transaction: @T, tx_idx: u32) -> TxSigHashes { +> of SigHashMidstateTrait { + fn new(transaction: @T) -> TxSigHashes { let mut hasV0Inputs = false; let mut hasV1Inputs = false; - let prevout: ByteArray = transaction.get_input_utxo(tx_idx).pubkey_script; - for _ in transaction.get_transaction_inputs() { - if is_witness_v1_pub_key_hash(@prevout) { + for i in 0..transaction.get_transaction_inputs().len() { + let input = transaction.get_transaction_inputs()[i]; + let input_txid = input.get_prevout_txid(); + let input_vout = input.get_prevout_vout(); + + if (input_vout == 0xFFFFFFFF && input_txid == 0) { + hasV0Inputs = true; + continue; + } + + let utxo = transaction.get_input_utxo(i); + if is_witness_v1_pub_key_hash(@utxo.pubkey_script) { hasV1Inputs = true; } else { hasV0Inputs = true; @@ -74,7 +72,6 @@ pub impl SigHashMidstateImpl< } }; - // compute v0 hash midstate let mut prevouts_v0_bytes: ByteArray = ""; let inputs = transaction.get_transaction_inputs(); for input in inputs { @@ -99,28 +96,33 @@ pub impl SigHashMidstateImpl< let hashSequenceV1: [u32; 8] = compute_sha256_byte_array(@sequence_v0_bytes); let hashOutputsV1: [u32; 8] = compute_sha256_byte_array(@outputs_v0_bytes); + let mut txSigHashes: TxSigHashes = Default::default(); if hasV0Inputs { - return TxSigHashes::Segwit( - @SegwitSigHashMidstate { - hash_prevouts_v0: sha256_u256(hashPrevOutsV1), - hash_sequence_v0: sha256_u256(hashSequenceV1), - hash_outputs_v0: sha256_u256(hashOutputsV1), - }, - ); - } else { + txSigHashes + .set_v0_sighash( + SegwitSigHashMidstate { + hash_prevouts_v0: sha256_u256(hashPrevOutsV1), + hash_sequence_v0: sha256_u256(hashSequenceV1), + hash_outputs_v0: sha256_u256(hashOutputsV1), + }, + ); + } + if hasV1Inputs { let hash_input_amounts_v1 = Self::calc_hash_inputs_amount(transaction); let hash_input_scripts_v1 = Self::calc_hash_input_scripts(transaction); - return TxSigHashes::Taproot( - @TaprootSigHashMidState { - hash_prevouts_v1: hash_to_u256(hashPrevOutsV1), - hash_sequence_v1: hash_to_u256(hashSequenceV1), - hash_outputs_v1: hash_to_u256(hashOutputsV1), - hash_input_scripts_v1: hash_input_scripts_v1, - hash_input_amounts_v1: hash_input_amounts_v1, - }, - ); + txSigHashes + .set_v1_sighash( + TaprootSigHashMidState { + hash_prevouts_v1: hash_to_u256(hashPrevOutsV1), + hash_sequence_v1: hash_to_u256(hashSequenceV1), + hash_outputs_v1: hash_to_u256(hashOutputsV1), + hash_input_scripts_v1: hash_input_scripts_v1, + hash_input_amounts_v1: hash_input_amounts_v1, + }, + ); } + txSigHashes } // calcHashInputAmounts computes a hash digest of the input amounts of all @@ -155,39 +157,57 @@ pub trait SigCacheTrait { fn add(sig_hash: u256, signature: ByteArray, pub_key: ByteArray); } +#[derive(Drop, Default, Copy)] +pub struct TxSigHashes { + pub segwit: SegwitSigHashMidstate, + pub taproot: TaprootSigHashMidState, +} + +#[generate_trait] +impl TxSigHashesImpl of TxSigHashesTrait { + fn new() -> TxSigHashes { + TxSigHashes { segwit: Default::default(), taproot: Default::default() } + } + + fn set_v0_sighash(ref self: TxSigHashes, sighash: SegwitSigHashMidstate) { + self.segwit = sighash; + } + + fn set_v1_sighash(ref self: TxSigHashes, sighash: TaprootSigHashMidState) { + self.taproot = sighash; + } +} -// TODO #[derive(Destruct, Default)] pub struct HashCache { - // use dict ? index = hash = u256 != felt sigHashes: Felt252Dict>, } // HashCache caches the midstate of segwit v0 and v1 sighashes -pub trait HashCacheTrait< - I, - O, - T, - +EngineTransactionInputTrait, - +EngineTransactionOutputTrait, - +EngineTransactionTrait, -> { - fn new(transaction: @T) -> HashCache; - // fn add_sig_hashes(ref self: HashCache, tx: @T); - // fn get_sig_hashes(ref self: HashCache, tx_hash: felt252) -> Option; - - // v0 represents sighash midstate used in the base segwit signatures BIP-143 - fn get_hash_prevouts_v0(self: @HashCache) -> u256; - fn get_hash_sequence_v0(self: @HashCache) -> u256; - fn get_hash_outputs_v0(self: @HashCache) -> u256; - - // v1 represents sighash midstate used to compute taproot signatures BIP-341 - fn get_hash_prevouts_v1(self: @HashCache) -> u256; - fn get_hash_sequence_v1(self: @HashCache) -> u256; - fn get_hash_outputs_v1(self: @HashCache) -> u256; - fn get_hash_input_scripts_v1(self: @HashCache) -> u256; -} +// pub trait HashCacheTrait< +// I, +// O, +// T, +// +EngineTransactionInputTrait, +// +EngineTransactionOutputTrait, +// +EngineTransactionTrait, +// > { +// fn new(transaction: @T) -> HashCache; +// // fn add_sig_hashes(ref self: HashCache, tx: @T); +// // fn get_sig_hashes(ref self: HashCache, tx_hash: felt252) -> Option; +// // v0 represents sighash midstate used in the base segwit signatures BIP-143 +// fn get_hash_prevouts_v0(self: @HashCache) -> u256; +// fn get_hash_sequence_v0(self: @HashCache) -> u256; +// fn get_hash_outputs_v0(self: @HashCache) -> u256; + +// // v1 represents sighash midstate used to compute taproot signatures BIP-341 +// fn get_hash_prevouts_v1(self: @HashCache) -> u256; +// fn get_hash_sequence_v1(self: @HashCache) -> u256; +// fn get_hash_outputs_v1(self: @HashCache) -> u256; +// fn get_hash_input_scripts_v1(self: @HashCache) -> u256; +// } +#[generate_trait] pub impl HashCacheImpl< I, O, @@ -202,11 +222,14 @@ pub impl HashCacheImpl< HashCache { sigHashes: Default::default() } } + // fn set_v0_sighash(self: @HashCache, tx_hash: u256, sighash: SegwitSigHashMidstate) { + // self.sigHashes.insert(tx_hash, NullableTrait::new(TxSigHashes::Segwit(@sighash))); + // } + // Add sighashes for a transaction // fn add_sig_hashes(ref self: HashCache, tx: @T) { - // self - // .sigHashes - // .insert(tx.get_prevout_txid(), NullableTrait::new(SigHashMidstateTrait::new(tx))); + // let txid_hash = PoseidonTrait::new().update_with(tx.get_txid()).finalize(); + // self.sigHashes.insert(txid_hash, NullableTrait::new(SigHashMidstateTrait::new(tx))); // } // Get sighashes for a transaction diff --git a/packages/engine/src/opcodes/crypto.cairo b/packages/engine/src/opcodes/crypto.cairo index 72de606e..a092657b 100644 --- a/packages/engine/src/opcodes/crypto.cairo +++ b/packages/engine/src/opcodes/crypto.cairo @@ -277,7 +277,7 @@ pub fn opcode_checkmultisig< let amount = engine.amount; if engine.is_witness_active(BASE_SEGWIT_VERSION) { - let sig_hashes = SigHashMidstateTrait::new(transaction, tx_idx); + let sig_hashes = SigHashMidstateTrait::new(transaction); sig_hash = sighash::calc_witness_signature_hash( @script, sig_hashes, hash_type, transaction, tx_idx, amount, diff --git a/packages/engine/src/signature/sighash.cairo b/packages/engine/src/signature/sighash.cairo index e6e86c31..c0f50f1a 100644 --- a/packages/engine/src/signature/sighash.cairo +++ b/packages/engine/src/signature/sighash.cairo @@ -10,7 +10,7 @@ use crate::transaction::{EngineTransactionOutput}; use shinigami_utils::bytecode::write_var_int; use shinigami_utils::hash::{sha256_byte_array, simple_sha256, double_sha256}; use crate::opcodes::opcodes::Opcode; -use crate::hash_cache::{TxSigHashes, SegwitSigHashMidstate, TaprootSigHashMidState}; +use crate::hash_cache::{TxSigHashes}; use crate::hash_tag::{HashTag, tagged_hash}; use crate::errors::Error; @@ -69,18 +69,18 @@ pub fn calc_witness_signature_hash< +Drop, >( sub_script: @ByteArray, - sig_hashes_enum: TxSigHashes, + sig_hashes: TxSigHashes, hash_type: u32, transaction: @T, tx_idx: u32, amount: i64, ) -> u256 { - let mut sig_hashes: @SegwitSigHashMidstate = Default::default(); - match sig_hashes_enum { - TxSigHashes::Segwit(segwit_midstate) => { sig_hashes = segwit_midstate; }, - // Handle error ? - _ => { return 0; }, - } + // let mut sig_hashes: @SegwitSigHashMidstate = Default::default(); + // match sig_hashes_enum { + // TxSigHashes::Segwit(segwit_midstate) => { sig_hashes = segwit_midstate; }, + // // Handle error ? + // _ => { return 0; }, + // } // TODO: Bounds check? let mut sig_hash_bytes: ByteArray = ""; @@ -88,7 +88,7 @@ pub fn calc_witness_signature_hash< let zero: u256 = 0; if hash_type & constants::SIG_HASH_ANYONECANPAY == 0 { - let hash_prevouts_v0: u256 = *sig_hashes.hash_prevouts_v0; + let hash_prevouts_v0: u256 = sig_hashes.segwit.hash_prevouts_v0; sig_hash_bytes.append_word(hash_prevouts_v0.high.into(), 16); sig_hash_bytes.append_word(hash_prevouts_v0.low.into(), 16); } else { @@ -99,7 +99,7 @@ pub fn calc_witness_signature_hash< if hash_type & constants::SIG_HASH_ANYONECANPAY == 0 && hash_type & constants::SIG_HASH_MASK != constants::SIG_HASH_SINGLE && hash_type & constants::SIG_HASH_MASK != constants::SIG_HASH_NONE { - let hash_sequence_v0: u256 = *sig_hashes.hash_sequence_v0; + let hash_sequence_v0: u256 = sig_hashes.segwit.hash_sequence_v0; sig_hash_bytes.append_word(hash_sequence_v0.high.into(), 16); sig_hash_bytes.append_word(hash_sequence_v0.low.into(), 16); } else { @@ -137,7 +137,7 @@ pub fn calc_witness_signature_hash< if hash_type & constants::SIG_HASH_MASK != constants::SIG_HASH_SINGLE && hash_type & constants::SIG_HASH_MASK != constants::SIG_HASH_NONE { - let hash_outputs_v0: u256 = *sig_hashes.hash_outputs_v0; + let hash_outputs_v0: u256 = sig_hashes.segwit.hash_outputs_v0; sig_hash_bytes.append_word(hash_outputs_v0.high.into(), 16); sig_hash_bytes.append_word(hash_outputs_v0.low.into(), 16); } else if hash_type & constants::SIG_HASH_MASK == constants::SIG_HASH_SINGLE @@ -268,7 +268,7 @@ pub fn calc_taproot_signature_hash< T, I, O, IEngineTransactionInputTrait, IEngineTransactionOutputTrait, >, >( - sig_hashes_enum: TxSigHashes, + sig_hashes: TxSigHashes, h_type: u32, transaction: @T, input_idx: u32, @@ -291,26 +291,26 @@ pub fn calc_taproot_signature_hash< sig_msg.append_word_rev(transaction.get_version().into(), 4); sig_msg.append_word_rev(transaction.get_locktime().into(), 4); - let mut sig_hashes: @TaprootSigHashMidState = Default::default(); - match sig_hashes_enum { - TxSigHashes::Taproot(midstate) => { sig_hashes = midstate; }, - _ => { return Result::Err(Error::TAPROOT_INVALID_SIGHASH_MIDSTATE); }, - } + // let mut sig_hashes: @TaprootSigHashMidState = Default::default(); + // match sig_hashes_enum { + // TxSigHashes::Taproot(midstate) => { sig_hashes = midstate; }, + // _ => { return Result::Err(Error::TAPROOT_INVALID_SIGHASH_MIDSTATE); }, + // } if (h_type & constants::SIG_HASH_ANYONECANPAY) != constants::SIG_HASH_ANYONECANPAY { - let hash_prevouts_v1: u256 = *sig_hashes.hash_prevouts_v1; + let hash_prevouts_v1: u256 = sig_hashes.taproot.hash_prevouts_v1; sig_msg.append_word(hash_prevouts_v1.high.into(), 16); sig_msg.append_word(hash_prevouts_v1.low.into(), 16); - let hash_input_amounts_v1: u256 = *sig_hashes.hash_input_amounts_v1; + let hash_input_amounts_v1: u256 = sig_hashes.taproot.hash_input_amounts_v1; sig_msg.append_word(hash_input_amounts_v1.high.into(), 16); sig_msg.append_word(hash_input_amounts_v1.low.into(), 16); - let hash_input_scripts_v1: u256 = *sig_hashes.hash_input_scripts_v1; + let hash_input_scripts_v1: u256 = sig_hashes.taproot.hash_input_scripts_v1; sig_msg.append_word(hash_input_scripts_v1.high.into(), 16); sig_msg.append_word(hash_input_scripts_v1.low.into(), 16); - let hash_sequence_v1: u256 = *sig_hashes.hash_sequence_v1; + let hash_sequence_v1: u256 = sig_hashes.taproot.hash_sequence_v1; sig_msg.append_word(hash_sequence_v1.high.into(), 16); sig_msg.append_word(hash_sequence_v1.low.into(), 16); } @@ -318,7 +318,7 @@ pub fn calc_taproot_signature_hash< // If SIGHASH_ALL or SIGHASH_DEFAULT, include all output digests if (h_type & constants::SIG_HASH_SINGLE) != constants::SIG_HASH_SINGLE && (h_type & constants::SIG_HASH_SINGLE) != constants::SIG_HASH_NONE { - let hash_outputs_v1: u256 = *sig_hashes.hash_outputs_v1; + let hash_outputs_v1: u256 = sig_hashes.taproot.hash_outputs_v1; sig_msg.append_word(hash_outputs_v1.high.into(), 16); sig_msg.append_word(hash_outputs_v1.low.into(), 16); } @@ -379,7 +379,3 @@ pub fn calc_taproot_signature_hash< // The final sighash is computed as: hash_TagSigHash(0x00 || sigMsg). Result::Ok(tagged_hash(HashTag::TapSighash, @sig_msg)) } - -pub fn calc_tapscript_signature_hash() -> u256 { - 0 // TODO -} diff --git a/packages/engine/src/signature/signature.cairo b/packages/engine/src/signature/signature.cairo index 328e63c3..db1ee456 100644 --- a/packages/engine/src/signature/signature.cairo +++ b/packages/engine/src/signature/signature.cairo @@ -102,7 +102,7 @@ impl BaseSegwitSigVerifierImpl< +Drop, > of BaseSegwitSigVerifierTrait { fn verify(ref self: BaseSigVerifier, ref vm: Engine) -> bool { - let sig_hashes = SigHashMidstateTrait::new(vm.transaction, vm.tx_idx); + let sig_hashes = SigHashMidstateTrait::new(vm.transaction); let sig_hash: u256 = sighash::calc_witness_signature_hash::< I, O, T, >(@self.sub_script, sig_hashes, self.hash_type, vm.transaction, vm.tx_idx, vm.amount); diff --git a/packages/engine/src/signature/taproot_signature.cairo b/packages/engine/src/signature/taproot_signature.cairo index 2f486a2d..9da4f673 100644 --- a/packages/engine/src/signature/taproot_signature.cairo +++ b/packages/engine/src/signature/taproot_signature.cairo @@ -4,9 +4,7 @@ use crate::transaction::{ EngineTransactionTrait, }; use crate::flags::ScriptFlags; -use crate::signature::{ - constants, schnorr, sighash, sighash::{TaprootSighashOptionsTrait, TaprootSighashOptions}, -}; +use crate::signature::{constants, schnorr, sighash, sighash::{TaprootSighashOptionsTrait}}; use crate::hash_cache::{TxSigHashes, SigHashMidstateTrait}; use crate::errors::Error; @@ -141,7 +139,7 @@ pub impl TaprootSigVerifierImpl< sig_bytes: @ByteArray, pk_bytes: @ByteArray, annex: @ByteArray, ref engine: Engine, ) -> Result, felt252> { let (pub_key, sig, hash_type) = parse_taproot_sig_and_pk(ref engine, pk_bytes, sig_bytes)?; - let sig_hashes = SigHashMidstateTrait::new(engine.transaction, engine.tx_idx); + let sig_hashes = SigHashMidstateTrait::new(engine.transaction); let prevOutput = EngineTransactionOutput { value: engine.amount, publickey_script: (*engine.scripts[1]).clone(), }; diff --git a/packages/engine/src/signature/utils.cairo b/packages/engine/src/signature/utils.cairo index 89ec69ef..bccc6d9a 100644 --- a/packages/engine/src/signature/utils.cairo +++ b/packages/engine/src/signature/utils.cairo @@ -83,6 +83,7 @@ pub fn transaction_procedure< transaction_outputs: transaction_outputs_clone, locktime: transaction.get_locktime(), utxos: transaction.get_transaction_utxos(), + txid: transaction.get_txid(), }; let mut i: usize = 0; let mut transaction_input: Array = transaction_copy.transaction_inputs; diff --git a/packages/engine/src/tests/test_taproot_hash.cairo b/packages/engine/src/tests/test_taproot_hash.cairo index 2c73776a..be87fd4e 100644 --- a/packages/engine/src/tests/test_taproot_hash.cairo +++ b/packages/engine/src/tests/test_taproot_hash.cairo @@ -2,8 +2,10 @@ use crate::signature::sighash::{ calc_taproot_signature_hash, TaprootSighashOptions, BASE_SIGHASH_EXT_FLAG, TAPSCRIPT_SIGHASH_EXT_FLAG, }; + use crate::transaction::{ - EngineTransactionOutput, EngineTransaction, EngineTransactionInput, EngineOutPoint, UTXO, + EngineTransactionOutput, EngineTransaction, EngineTransactionInput, EngineOutPoint, + EngineInternalTransactionTrait, UTXO, }; use crate::hash_cache::{TxSigHashes, SigHashMidstateTrait}; use shinigami_engine::utxo::{}; @@ -14,196 +16,93 @@ use shinigami_utils::byte_array::{U256IntoByteArray}; #[test] fn test_new_sigHashMidstate() { // https://github.com/bitcoin/bips/blob/master/bip-0341/wallet-test-vectors.json#l227 - let transaction = EngineTransaction { - version: 2, - transaction_inputs: array![ - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0x7de20cbff686da83a54981d2b9bab3586f4ca7e48f57f5b55963115f3b334e9c_u256, - vout: 1, - }, - signature_script: Default::default(), - sequence: 0x0, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xd7b7cab57b1393ace2d064f4d4a2cb8af6def61273e127517d44759b6dafdd99_u256, - vout: 0, - }, - signature_script: Default::default(), - sequence: 0xffffffff, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xf8e1f583384333689228c5d28eac13366be082dc57441760d957275419a41842_u256, - vout: 0, - }, - signature_script: Default::default(), - sequence: 0xffffffff, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xf0689180aa63b30cb162a73c6d2a38b7eeda2a83ece74310fda0843ad604853b_u256, - vout: 1, - }, - signature_script: Default::default(), - sequence: 0xfffffffe, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xaa5202bdf6d8ccd2ee0f0202afbbb7461d9264a25e5bfd3c5a52ee1239e0ba6c_u256, - vout: 0, - }, - signature_script: Default::default(), - sequence: 0xfffffffe, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0x956149bdc66faa968eb2be2d2faa29718acbfe3941215893a2a3446d32acd050_u256, - vout: 0, - }, - signature_script: Default::default(), - sequence: 0x0, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xe664b9773b88c09c32cb70a2a3e4da0ced63b7ba3b22f848531bbb1d5d5f4c94_u256, - vout: 1, - }, - signature_script: Default::default(), - sequence: 0x0, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xe9aa6b8e6c9de67619e6a3924ae25696bb7b694bb677a632a74ef7eadfd4eabf_u256, - vout: 0, - }, - signature_script: Default::default(), - sequence: 0xffffffff, - witness: array![], - }, - EngineTransactionInput { - previous_outpoint: EngineOutPoint { - txid: 0xa778eb6a263dc090464cd125c466b5a99667720b1c110468831d058aa1b82af1_u256, - vout: 1, - }, - signature_script: Default::default(), - sequence: 0xffffffff, - witness: array![], - }, - ], - transaction_outputs: array![ - EngineTransactionOutput { - value: 0x000000003B9ACA00, // 10_00000000 - publickey_script: hex_to_bytecode( - @"0x76a91406afd46bcdfd22ef94ac122aa11f241244a37ecc88ac", - ), - }, - EngineTransactionOutput { - value: 0x00000000CB407880, // 34_10000000 - publickey_script: hex_to_bytecode( - @"0xac9a87f5594be208f8532db38cff670c450ed2fea8fcdefcc9a663f78bab962b", - ), - }, - ], - locktime: 0x1DCD6500, //le - utxos: array![ - UTXO { - amount: 420000000, - pubkey_script: hex_to_bytecode( - @"0x512053a1f6e454df1aa2776a2814a721372d6258050de330b3c6d10ee8f4e0dda343", - ), - block_height: Default::default(), - }, - UTXO { - amount: 462000000, - pubkey_script: hex_to_bytecode( - @"0x5120147c9c57132f6e7ecddba9800bb0c4449251c92a1e60371ee77557b6620f3ea3", - ), - block_height: Default::default(), - }, - UTXO { - amount: 294000000, - pubkey_script: hex_to_bytecode( - @"0x76a914751e76e8199196d454941c45d1b3a323f1433bd688ac", - ), - block_height: Default::default(), - }, - UTXO { - amount: 504000000, - pubkey_script: hex_to_bytecode( - @"0x5120e4d810fd50586274face62b8a807eb9719cef49c04177cc6b76a9a4251d5450e", - ), - block_height: Default::default(), - }, - UTXO { - amount: 630000000, - pubkey_script: hex_to_bytecode( - @"0x512091b64d5324723a985170e4dc5a0f84c041804f2cd12660fa5dec09fc21783605", - ), - block_height: Default::default(), - }, - UTXO { - amount: 378000000, - pubkey_script: hex_to_bytecode(@"0x00147dd65592d0ab2fe0d0257d571abf032cd9db93dc"), - block_height: Default::default(), - }, - UTXO { - amount: 672000000, - pubkey_script: hex_to_bytecode( - @"0x512075169f4001aa68f15bbed28b218df1d0a62cbbcf1188c6665110c293c907b831", - ), - block_height: Default::default(), - }, - UTXO { - amount: 546000000, - pubkey_script: hex_to_bytecode( - @"0x5120712447206d7a5238acc7ff53fbe94a3b64539ad291c7cdbc490b7577e4b17df5", - ), - block_height: Default::default(), - }, - UTXO { - amount: 588000000, - pubkey_script: hex_to_bytecode( - @"0x512077e30a5522dd9f894c3f8b8bd4c4b2cf82ca7da8a3ea6a239655c39c050ab220", - ), - block_height: Default::default(), - }, - ], - }; - let tx_idx = 0; - let sig_hash = SigHashMidstateTrait::new(@transaction, tx_idx); + let raw_transaction_hex = + "0x02000000097de20cbff686da83a54981d2b9bab3586f4ca7e48f57f5b55963115f3b334e9c010000000000000000d7b7cab57b1393ace2d064f4d4a2cb8af6def61273e127517d44759b6dafdd990000000000fffffffff8e1f583384333689228c5d28eac13366be082dc57441760d957275419a418420000000000fffffffff0689180aa63b30cb162a73c6d2a38b7eeda2a83ece74310fda0843ad604853b0100000000feffffffaa5202bdf6d8ccd2ee0f0202afbbb7461d9264a25e5bfd3c5a52ee1239e0ba6c0000000000feffffff956149bdc66faa968eb2be2d2faa29718acbfe3941215893a2a3446d32acd050000000000000000000e664b9773b88c09c32cb70a2a3e4da0ced63b7ba3b22f848531bbb1d5d5f4c94010000000000000000e9aa6b8e6c9de67619e6a3924ae25696bb7b694bb677a632a74ef7eadfd4eabf0000000000ffffffffa778eb6a263dc090464cd125c466b5a99667720b1c110468831d058aa1b82af10100000000ffffffff0200ca9a3b000000001976a91406afd46bcdfd22ef94ac122aa11f241244a37ecc88ac807840cb0000000020ac9a87f5594be208f8532db38cff670c450ed2fea8fcdefcc9a663f78bab962b0065cd1d"; + let raw_transaction = hex_to_bytecode(@raw_transaction_hex); + + let utxos = array![ + UTXO { + amount: 420000000, + pubkey_script: hex_to_bytecode( + @"0x512053a1f6e454df1aa2776a2814a721372d6258050de330b3c6d10ee8f4e0dda343", + ), + block_height: Default::default(), + }, + UTXO { + amount: 462000000, + pubkey_script: hex_to_bytecode( + @"0x5120147c9c57132f6e7ecddba9800bb0c4449251c92a1e60371ee77557b6620f3ea3", + ), + block_height: Default::default(), + }, + UTXO { + amount: 294000000, + pubkey_script: hex_to_bytecode(@"0x76a914751e76e8199196d454941c45d1b3a323f1433bd688ac"), + block_height: Default::default(), + }, + UTXO { + amount: 504000000, + pubkey_script: hex_to_bytecode( + @"0x5120e4d810fd50586274face62b8a807eb9719cef49c04177cc6b76a9a4251d5450e", + ), + block_height: Default::default(), + }, + UTXO { + amount: 630000000, + pubkey_script: hex_to_bytecode( + @"0x512091b64d5324723a985170e4dc5a0f84c041804f2cd12660fa5dec09fc21783605", + ), + block_height: Default::default(), + }, + UTXO { + amount: 378000000, + pubkey_script: hex_to_bytecode(@"0x00147dd65592d0ab2fe0d0257d571abf032cd9db93dc"), + block_height: Default::default(), + }, + UTXO { + amount: 672000000, + pubkey_script: hex_to_bytecode( + @"0x512075169f4001aa68f15bbed28b218df1d0a62cbbcf1188c6665110c293c907b831", + ), + block_height: Default::default(), + }, + UTXO { + amount: 546000000, + pubkey_script: hex_to_bytecode( + @"0x5120712447206d7a5238acc7ff53fbe94a3b64539ad291c7cdbc490b7577e4b17df5", + ), + block_height: Default::default(), + }, + UTXO { + amount: 588000000, + pubkey_script: hex_to_bytecode( + @"0x512077e30a5522dd9f894c3f8b8bd4c4b2cf82ca7da8a3ea6a239655c39c050ab220", + ), + block_height: Default::default(), + }, + ]; + + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxos); + let sig_hash = SigHashMidstateTrait::new(@transaction); let expected_hash_prevouts = - @0xe3b33bb4ef3a52ad1fffb555c0d82828eb22737036eaeb02a235d82b909c4c3f_u256; + 0xe3b33bb4ef3a52ad1fffb555c0d82828eb22737036eaeb02a235d82b909c4c3f_u256; let expected_hash_sequence = - @0x18959c7221ab5ce9e26c3cd67b22c24f8baa54bac281d8e6b05e400e6c3a957e_u256; + 0x18959c7221ab5ce9e26c3cd67b22c24f8baa54bac281d8e6b05e400e6c3a957e_u256; let expected_hash_outputs = - @0xa2e6dab7c1f0dcd297c8d61647fd17d821541ea69c3cc37dcbad7f90d4eb4bc5_u256; + 0xa2e6dab7c1f0dcd297c8d61647fd17d821541ea69c3cc37dcbad7f90d4eb4bc5_u256; let exepected_hash_amount = - @0x58a6964a4f5f8f0b642ded0a8a553be7622a719da71d1f5befcefcdee8e0fde6_u256; + 0x58a6964a4f5f8f0b642ded0a8a553be7622a719da71d1f5befcefcdee8e0fde6_u256; let expected_hash_script_pubkeys = - @0x23ad0f61ad2bca5ba6a7693f50fce988e17c3780bf2b1e720cfbb38fbdd52e21_u256; + 0x23ad0f61ad2bca5ba6a7693f50fce988e17c3780bf2b1e720cfbb38fbdd52e21_u256; - match sig_hash { - TxSigHashes::Taproot(sig_hash) => { - assert_eq!(sig_hash.hash_prevouts_v1, expected_hash_prevouts); - assert_eq!(sig_hash.hash_sequence_v1, expected_hash_sequence); - assert_eq!(sig_hash.hash_outputs_v1, expected_hash_outputs); + assert_eq!(sig_hash.taproot.hash_prevouts_v1, expected_hash_prevouts); + assert_eq!(sig_hash.taproot.hash_sequence_v1, expected_hash_sequence); + assert_eq!(sig_hash.taproot.hash_outputs_v1, expected_hash_outputs); - assert_eq!(sig_hash.hash_input_scripts_v1, expected_hash_script_pubkeys); - assert_eq!(sig_hash.hash_input_amounts_v1, exepected_hash_amount); - }, - _ => panic!("unexpected sighash type midstate"), - } + assert_eq!(sig_hash.taproot.hash_input_scripts_v1, expected_hash_script_pubkeys); + assert_eq!(sig_hash.taproot.hash_input_amounts_v1, exepected_hash_amount); } #[test] @@ -212,6 +111,7 @@ fn test_calc_taproot_signature_hash_key_path_spend() { // txid 091d2aaadc409298fd8353a4cd94c319481a0b4623fb00872fe240448e93fcbe input 0 let h_type: u32 = 0x01; // SIGHASH_ALL let transaction = EngineTransaction { + txid: 0, version: 2, transaction_inputs: array![ EngineTransactionInput { @@ -248,7 +148,7 @@ fn test_calc_taproot_signature_hash_key_path_spend() { ], }; - let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction, 0); + let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction); let input_idx: u32 = 0; let prev_output: EngineTransactionOutput = Default::default(); @@ -275,6 +175,7 @@ fn test_calc_taproot_signature_hash_script_path_spend_simple() { // txid 5ff05f74d385bd39e344329330461f74b390c1b5ead87c4f51b40c555b75719d input 1 let h_type: u32 = 0x01; // SIGHASH_ALL let transaction = EngineTransaction { + txid: 0, version: 2, transaction_inputs: array![ EngineTransactionInput { @@ -335,7 +236,7 @@ fn test_calc_taproot_signature_hash_script_path_spend_simple() { }; let input_idx: u32 = 1; - let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction, input_idx); + let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction); let prev_output: EngineTransactionOutput = Default::default(); let mut opts = TaprootSighashOptions { @@ -362,6 +263,7 @@ fn test_calc_taproot_signature_hash_script_path_spend_signature() { let input_idx: u32 = 0; let h_type: u32 = 0x01; // SIGHASH_ALL let transaction = EngineTransaction { + txid: 0, version: 2, transaction_inputs: array![ EngineTransactionInput { @@ -404,7 +306,7 @@ fn test_calc_taproot_signature_hash_script_path_spend_signature() { ], }; - let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction, input_idx); + let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction); let prev_output: EngineTransactionOutput = Default::default(); let mut opts = TaprootSighashOptions { @@ -433,6 +335,7 @@ fn test_calc_taproot_signature_hash_script_path_spend_tree() { let input_idx: u32 = 0; let h_type: u32 = 0x01; // SIGHASH_ALL let transaction = EngineTransaction { + txid: 0, version: 2, transaction_inputs: array![ EngineTransactionInput { @@ -471,7 +374,7 @@ fn test_calc_taproot_signature_hash_script_path_spend_tree() { ], }; - let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction, input_idx); + let sig_hashes: TxSigHashes = SigHashMidstateTrait::new(@transaction); let prev_output: EngineTransactionOutput = Default::default(); let mut opts = TaprootSighashOptions { diff --git a/packages/engine/src/transaction.cairo b/packages/engine/src/transaction.cairo index 5e254be0..e1bb4c92 100644 --- a/packages/engine/src/transaction.cairo +++ b/packages/engine/src/transaction.cairo @@ -41,7 +41,8 @@ pub struct EngineTransaction { pub transaction_inputs: Array, pub transaction_outputs: Array, pub locktime: u32, - // TODO replace UTXO by EngineTransactionOutput + // TODO replace UTXO by EngineTransactionOutput? + pub txid: u256, pub utxos: Array, } @@ -51,21 +52,27 @@ pub trait EngineInternalTransactionTrait { transaction_inputs: Array, transaction_outputs: Array, locktime: u32, + txid: u256, utxos: Array, ) -> EngineTransaction; fn new_signed( - script_sig: ByteArray, pubkey_script: ByteArray, utxos: Array, + script_sig: ByteArray, pubkey_script: ByteArray, txid: u256, utxos: Array, ) -> EngineTransaction; fn new_signed_witness( script_sig: ByteArray, pubkey_script: ByteArray, witness: Array, value: i64, + txid: u256, utxos: Array, ) -> EngineTransaction; - fn btc_decode(raw: ByteArray, encoding: u32, utxos: Array) -> EngineTransaction; - fn deserialize(raw: ByteArray, utxos: Array) -> EngineTransaction; - fn deserialize_no_witness(raw: ByteArray, utxos: Array) -> EngineTransaction; + fn btc_decode( + raw: ByteArray, encoding: u32, txid: u256, utxos: Array, + ) -> EngineTransaction; + fn deserialize(raw: ByteArray, txid: u256, utxos: Array) -> EngineTransaction; + fn deserialize_no_witness( + raw: ByteArray, txid: u256, utxos: Array, + ) -> EngineTransaction; //never used ? fn btc_encode(self: EngineTransaction, encoding: u32) -> ByteArray; fn serialize(self: EngineTransaction) -> ByteArray; fn serialize_no_witness(self: EngineTransaction) -> ByteArray; @@ -86,6 +93,7 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { transaction_inputs: Array, transaction_outputs: Array, locktime: u32, + txid: u256, utxos: Array, ) -> EngineTransaction { EngineTransaction { @@ -93,12 +101,13 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { transaction_inputs: transaction_inputs, transaction_outputs: transaction_outputs, locktime: locktime, + txid: txid, utxos: utxos, } } fn new_signed( - script_sig: ByteArray, pubkey_script: ByteArray, utxos: Array, + script_sig: ByteArray, pubkey_script: ByteArray, txid: u256, utxos: Array, ) -> EngineTransaction { let coinbase_tx_inputs = array![ EngineTransactionInput { @@ -116,6 +125,7 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { transaction_inputs: coinbase_tx_inputs, transaction_outputs: coinbase_tx_outputs, locktime: 0, + txid: 0, utxos: Default::default(), }; let coinbase_bytes = coinbase_tx.serialize_no_witness(); @@ -132,6 +142,7 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { ], transaction_outputs: array![EngineTransactionOutput { value: 0, publickey_script: "" }], locktime: 0, + txid: txid, utxos: utxos, }; // let transaction = EngineTransaction { @@ -155,6 +166,7 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { pubkey_script: ByteArray, witness: Array, value: i64, + txid: u256, utxos: Array, ) -> EngineTransaction { let coinbase_tx_inputs = array![ @@ -173,6 +185,7 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { transaction_inputs: coinbase_tx_inputs, transaction_outputs: coinbase_tx_outputs, locktime: 0, + txid: 0, utxos: Default::default(), }; let coinbase_bytes = coinbase_tx.serialize_no_witness(); @@ -191,13 +204,16 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { EngineTransactionOutput { value: value, publickey_script: "" }, ], locktime: 0, + txid: txid, utxos: utxos, }; transaction } // Deserialize a transaction from a byte array. - fn btc_decode(raw: ByteArray, encoding: u32, utxos: Array) -> EngineTransaction { + fn btc_decode( + raw: ByteArray, encoding: u32, txid: u256, utxos: Array, + ) -> EngineTransaction { let mut offset: usize = 0; let version: i32 = byte_array_value_at_le(@raw, ref offset, 4).try_into().unwrap(); if encoding == WITNESS_ENCODING { @@ -242,7 +258,6 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { }; let mut inputs_with_witness: Array = array![]; - if encoding == WITNESS_ENCODING { // one witness for each input i = 0; @@ -271,33 +286,36 @@ pub impl EngineInternalTransactionImpl of EngineInternalTransactionTrait { version: version, transaction_inputs: inputs_with_witness, transaction_outputs: outputs, - locktime: locktime, - utxos: utxos, + locktime, + txid, + utxos, } } else { EngineTransaction { version: version, transaction_inputs: inputs, transaction_outputs: outputs, - locktime: locktime, - utxos: utxos, + locktime, + txid, + utxos, } } } - fn deserialize(raw: ByteArray, utxos: Array) -> EngineTransaction { + fn deserialize(raw: ByteArray, txid: u256, utxos: Array) -> EngineTransaction { let mut offset: usize = 0; let _version: i32 = byte_array_value_at_le(@raw, ref offset, 4).try_into().unwrap(); let flags: u16 = byte_array_value_at_le(@raw, ref offset, 2).try_into().unwrap(); + if flags == 0x100 { - Self::btc_decode(raw, WITNESS_ENCODING, utxos) + Self::btc_decode(raw, WITNESS_ENCODING, txid, utxos) } else { - Self::btc_decode(raw, BASE_ENCODING, utxos) + Self::btc_decode(raw, BASE_ENCODING, txid, utxos) } } - fn deserialize_no_witness(raw: ByteArray, utxos: Array) -> EngineTransaction { - Self::btc_decode(raw, BASE_ENCODING, utxos) + fn deserialize_no_witness(raw: ByteArray, txid: u256, utxos: Array) -> EngineTransaction { + Self::btc_decode(raw, BASE_ENCODING, txid, utxos) } // Serialize the transaction data for hashing based on encoding used. @@ -453,6 +471,7 @@ impl TransactionDefault of Default { transaction_inputs: array![default_txin], transaction_outputs: array![], locktime: 0, + txid: 0, utxos: Default::default(), }; transaction @@ -508,13 +527,37 @@ pub impl EngineTransactionOutputTraitInternalImpl of EngineTransactionOutputTrai } } +// #[derive(Drop, Copy, Default)] +// pub struct EngineDataFromRaito { +// pub txid: u256, +// } + +// pub trait TransactionDataFromRaitoTrait { +// fn set_data_from_raito(ref self: R, txid: u256); +// fn get_txid(self: @R) -> u256; +// fn get_utxos(self: @R) -> Array; +// } + +// pub impl TransactionDataFromRaitoImpl of TransactionDataFromRaitoTrait { +// fn set_data_from_raito(ref self: EngineDataFromRaito, txid: u256) { +// EngineDataFromRaito { txid: txid }; +// } + +// fn get_txid(self: @EngineDataFromRaito) -> u256 { +// *self.txid +// } +// } + pub trait EngineTransactionTrait< - T, I, O, +EngineTransactionInputTrait, +EngineTransactionOutputTrait, + T, I, O, // R, + +EngineTransactionInputTrait, +EngineTransactionOutputTrait, + // +TransactionDataFromRaitoTrait, > { fn get_version(self: @T) -> i32; fn get_transaction_inputs(self: @T) -> Span; fn get_transaction_outputs(self: @T) -> Span; fn get_locktime(self: @T) -> u32; + fn get_txid(self: @T) -> u256; fn get_transaction_utxos(self: @T) -> Array; //Span? fn get_input_utxo(self: @T, input_index: u32) -> UTXO; } @@ -523,8 +566,10 @@ pub impl EngineTransactionTraitInternalImpl of EngineTransactionTrait< EngineTransaction, EngineTransactionInput, EngineTransactionOutput, + // EngineDataFromRaito, EngineTransactionInputTraitInternalImpl, EngineTransactionOutputTraitInternalImpl, + // TransactionDataFromRaitoImpl, > { fn get_version(self: @EngineTransaction) -> i32 { *self.version @@ -542,6 +587,10 @@ pub impl EngineTransactionTraitInternalImpl of EngineTransactionTrait< *self.locktime } + fn get_txid(self: @EngineTransaction) -> u256 { + *self.txid + } + fn get_transaction_utxos(self: @EngineTransaction) -> Array { self.utxos.clone() } diff --git a/packages/tests/src/tests/test_coinbase.cairo b/packages/tests/src/tests/test_coinbase.cairo index 8bf28eef..0533d8cc 100644 --- a/packages/tests/src/tests/test_coinbase.cairo +++ b/packages/tests/src/tests/test_coinbase.cairo @@ -27,7 +27,7 @@ fn test_validate_coinbase_block_0() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(0, 5000000000).is_ok(), "Genesis block coinbase transaction invalid", @@ -40,7 +40,7 @@ fn test_validate_coinbase_block_1() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(1, 5000000000).is_ok(), "Block 1 coinbase transaction invalid", @@ -53,7 +53,7 @@ fn test_validate_coinbase_block_150007() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804233fa04e028b12ffffffff0130490b2a010000004341047eda6bd04fb27cab6e7c28c99b94977f073e912f25d1ff7165d9c95cd9bbe6da7e7ad7f2acb09e0ced91705f7616af53bee51a238b7dc527f2be0aa60469d140ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(150007, 350000).is_ok(), "Block 150007 coinbase transaction invalid", @@ -66,7 +66,7 @@ fn test_validate_coinbase_block_227835() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0f0479204f51024f09062f503253482fffffffff01da495f9500000000232103ddcdae35e28aca364daa1397612d2dafd891ee136d2ca5ab83faff6bc12ed67eac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(227835, 6050010).is_ok(), "Block 227835 coinbase transaction invalid", @@ -79,7 +79,7 @@ fn test_validate_coinbase_block_227836() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2703fc7903062f503253482f04ac204f510858029a11000003550d3363646164312f736c7573682f0000000001207e6295000000001976a914e285a29e0704004d4e95dbb7c57a98563d9fb2eb88ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(227836, 6260000).is_ok(), "Block 227836 coinbase transaction invalid", @@ -92,7 +92,7 @@ fn test_validate_coinbase_block_400021() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03951a0604f15ccf5609013803062b9b5a0100072f425443432f200000000001ebc31495000000001976a9142c30a6aaac6d96687291475d7d52f4b469f665a688ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(400021, 1166059).is_ok(), "Block 400021 coinbase transaction invalid", @@ -105,7 +105,7 @@ fn test_validate_coinbase_block_481823() { let raw_transaction_hex = "0x01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4e031f5a070473319e592f4254432e434f4d2f4e59412ffabe6d6dcceb2a9d0444c51cabc4ee97a1a000036ca0cb48d25b94b78c8367d8b868454b0100000000000000c0309b21000008c5f8f80000ffffffff0291920b5d0000000017a914e083685a1097ce1ea9e91987ab9e94eae33d8a13870000000000000000266a24aa21a9ede6c99265a6b9e1d36c962fda0516b35709c49dc3b8176fa7e5d5f1f6197884b400000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(481823, 311039505).is_ok(), "Block 481823 coinbase transaction invalid", @@ -118,7 +118,7 @@ fn test_validate_coinbase_block_481824() { let raw_transaction_hex = "0x010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff6403205a07f4d3f9da09acf878c2c9c96c410d69758f0eae0e479184e0564589052e832c42899c867100010000000000000000db9901006052ce25d80acfde2f425443432f20537570706f7274202f4e59412f00000000000000000000000000000000000000000000025d322c57000000001976a9142c30a6aaac6d96687291475d7d52f4b469f665a688ac0000000000000000266a24aa21a9ed6c3c4dff76b5760d58694147264d208689ee07823e5694c4872f856eacf5a5d80120000000000000000000000000000000000000000000000000000000000000000000000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(481824, 212514269).is_ok(), "Block 481824 coinbase transaction invalid", @@ -131,7 +131,7 @@ fn test_validate_coinbase_block_538403() { let raw_transaction_hex = "0x010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2503233708184d696e656420627920416e74506f6f6c373946205b8160a4256c0000946e0100ffffffff02f595814a000000001976a914edf10a7fac6b32e24daa5305c723f3de58db1bc888ac0000000000000000266a24aa21a9edfaa194df59043645ba0f58aad74bfd5693fa497093174d12a4bb3b0574a878db0120000000000000000000000000000000000000000000000000000000000000000000000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert!( transaction.validate_coinbase(538403, 6517).is_ok(), "Block 538403 coinbase transaction invalid", diff --git a/packages/tests/src/tests/test_p2ms.cairo b/packages/tests/src/tests/test_p2ms.cairo index 0357bd9d..eaf8aa61 100644 --- a/packages/tests/src/tests/test_p2ms.cairo +++ b/packages/tests/src/tests/test_p2ms.cairo @@ -15,7 +15,7 @@ fn test_p2ms_1_of_2() { let raw_transaction_hex = "0x0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let utxo_hints = array![prev_out]; let res = validate::validate_p2ms(@transaction, 0, utxo_hints); @@ -38,7 +38,7 @@ fn test_p2ms_2_of_3() { let raw_transaction_hex = "0x010000000139c92b102879eb95f14e7344e4dd7d481e1238b1bfb1fa0f735068d2927b231400000000910047304402208fc06d216ebb4b6a3a3e0f906e1512c372fa8a9c2a92505d04e9b451ea7acd0c0220764303bb7e514ddd77855949d941c934e9cbda8e3c3827bfdb5777477e73885b014730440220569ec6d2e81625dd18c73920e0079cdb4c1d67d3d7616759eb0c18cf566b3d3402201c60318f0a62e3ba85ca0f158d4dfe63c0779269eb6765b6fc939fc51e7a8ea901ffffffff0140787d01000000001976a914641ad5051edd97029a003fe9efb29359fcee409d88ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let utxo_hints = array![prev_out]; let res = validate::validate_p2ms(@transaction, 0, utxo_hints); @@ -58,7 +58,7 @@ fn test_p2ms_3_of_3() { let raw_transaction_hex = "0x0100000001269ca5990a6bdd62b12dc7c03d05edbb98b94742c075c44686a911df75a7ae2d00000000d9004730440220c0949354ad3a8b7162360a3b513683c417b38ea237805580d75e14950f3a4fed02206f95bc753511e96d82592b01eea4ce0f05b76d24c19e6b707a6468f1f7943a18014730440220a5f9c09fb40a6b02a7d20fcd246ba72995f34613b5afe18bd1b8b197b756aea402200511aecc66f7d7738baca0515c18444ba024d30ef304cdcf375fa163d4217b34014730440220938b9fd2b543e544eeb09abe519a1dbe900ec2761eff7277d8fea2e8397b6687022002886dd0e36aeb18c0c8752303f6898776552f7f877ff1d900d9078b26314aba01ffffffff0180f0fa02000000001976a914641ad5051edd97029a003fe9efb29359fcee409d88ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let utxo_hints = array![prev_out]; let res = validate::validate_p2ms(@transaction, 0, utxo_hints); @@ -80,7 +80,7 @@ fn test_p2ms_1of2_invalid_pubkey() { let raw_transaction_hex = "0x01000000013de6aff69d5ebeca70a84d1dcef768bbcadbad210084012f8cda24233c8db278000000004b00493046022100a41a9015c847f404a14fcc81bf711ee2ce57583987948d54ebe540aafca97e0d022100d4e30d1ca42f77df8290b8975aa8fc0733d7c0cfdd5067ca516bac6c4012b47a01ffffffff01607d860500000000475121037953dbf08030f67352134992643d033417eaa6fcfb770c038f364ff40d7615882100dd28dfb81abe444429c466a1e3ab7c22365c48f234ef0f8d40397202969d4e9552ae00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let utxo_hints = array![prev_out_1of2_invalid]; let res = validate::validate_p2ms(@transaction, 0, utxo_hints); @@ -100,7 +100,7 @@ fn test_p2ms_2_of_3_random() { let raw_transaction_hex = "0x010000000110a5fee9786a9d2d72c25525e52dd70cbd9035d5152fac83b62d3aa7e2301d58000000009300483045022100af204ef91b8dba5884df50f87219ccef22014c21dd05aa44470d4ed800b7f6e40220428fe058684db1bb2bfb6061bff67048592c574effc217f0d150daedcf36787601483045022100e8547aa2c2a2761a5a28806d3ae0d1bbf0aeff782f9081dfea67b86cacb321340220771a166929469c34959daf726a2ac0c253f9aff391e58a3c7cb46d8b7e0fdc4801ffffffff0180a21900000000001976a914971802edf585cdbc4e57017d6e5142515c1e502888ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let utxo_hints = array![prev_out]; let res = validate::validate_p2ms(@transaction, 0, utxo_hints); @@ -120,7 +120,7 @@ fn test_p2ms_1_of_1() { let raw_transaction_hex = "0x01000000160bc5e16112acf01a64ab1013c7e9b34f76e2949c441ab46a086f66e9fd7a14930100000069463043021f6f7901a657289e36c25f5697a943e5013cb212ad10a2507dcace9e0e4c79230220480a8b35a574a7ba9c6073ada81c74e8e3aa63be92783211cd4dcb7d0d058346012103a2d725439d181166ac95e210f46f66c3f1088066bbfd4f534dd59488a02b4c3afffffffff3ed1ba6b8573906c810041d3418258492b1f7404656f4beb9a5adc304a5c0eb000000004746304302202ea812a99f9f8749bcd86e4e6dd0dba57fed2d7710152eec2a7688705f91cdd7021f176a029635ac01704dc425a2ba3f52e2f2290ab259a915c563be9c78083e3d01ffffffff8d68f286af7ec5a9450130f3e3c603bef4a95eaf9629b904c917d3b8f8e5486a00000000894630430220564f7beba5e28cd71fab7d3e8f359af94718938e451a653a5753896b50f87837021f32395bf3973c4b3f10ea86c7b81e38dcc2349a355ea3710d2c3bb57e8af2fb014104ab24a3241d2ab64955b9c7891fa7e7f0f5272c19db9034fdb02ef0414ab2583ea0588dabd07956b5f455e58fbf1da0c554362fc6600c3761b71aa933fd078496ffffffff1628a0ef1d36fdb5e4d16ca3768bce09328a6b8bc51c4ff37a629417454cc9560000000089463043021f0383c75fbdffb8ebc153577b4504cefe30f17969935e6cc4983adde4e069a5022070ece7763f97010534edcb6f80e1cfee88c1e30d0672cf47750c4f4e81771a2301410413c550cdb368790ba8ff0b70ac219b3016e9dcb11d8c7d62f77f94d133700e1e99f5ddfbdb8a2a2748ab2d93e1ec35c475f75e1a3a1f02bedb95ae3bdf757ed0ffffffff0bc5e16112acf01a64ab1013c7e9b34f76e2949c441ab46a086f66e9fd7a149300000000480046304302206b77a5f4395be4702a6fdf9d8233fc43ebcbb46010cba836be326cf548b9f993021f3267322bda863128d87be3cd4f3f1d3d1b4593113469bda89bd2b525b296a101ffffffffe75eb07f3d1bb6f1513555f04c58e3a41bfbac3408bdfa52ea32af01d79e1dac000000004800463043021f0ce39527434f3486c4f936f6fd8c3a3a5d7c889ee26b53be4f1302d87a82ca02202e543448f986aedc8ae72834e9ffab070267b022fada952bdcd25f2e459dbd1601ffffffffe75eb07f3d1bb6f1513555f04c58e3a41bfbac3408bdfa52ea32af01d79e1dac0100000069463043022020a90bb3d2a2056784ba36ba8582919695fc38b8a4c4809cb8d8c9b80027acff021f59c9d5a20f41debd5ba18ba1e95e458205b2b0db47a5010ae4e8b41989851101210281feb90c058c3436f8bc361930ae99fcfb530a699cdad141d7244bfcad521a1fffffffff4f29f13df6ddd7958770536d0edb19f4be03649ffa16b829f443e6536dfb333800000000474630430220345e21582d8a72ea3a4c390cfb021750147d5e490359fbcc7ef2345ee6284e90021f566b1fc655a0551383c36a5a94ad1fd44354ccbd48f1971895b6b422ba0e7301ffffffff1e563aa032652ef37a62964bda78ffa0ca97c9e644703f4494fc653f09c151e901000000480046304302203a0f649a666d4d3d5dec37cad6ff5fafea7c8767c54f6b715725bebc353176e9021f065a848bb213d0f4d0f69d156f284d25585d21bc28a288e54f15f36bb6b3bd01ffffffff1e563aa032652ef37a62964bda78ffa0ca97c9e644703f4494fc653f09c151e9020000006946304302207c4c5f02f2d8975418062107ee53d7fa9b7156437b4042deee63b38ab872a1c0021f30bf4f46ceec9c11bf72fae4fda65e57815742185264d6de872a9b6061326c01210281feb90c058c3436f8bc361930ae99fcfb530a699cdad141d7244bfcad521a1fffffffff3b8e11f993e5d512fbe70f6bd69df5510d87af895405f7bb07a3c3e5346813e6010000004800463043021f270dca121a53d5fd4a3fde799c0d24433c6893c48dae8ebfcd3675b66f06e10220183b3b56de5389fd6b5a7a71973df1a22da4c992ecc3bd32947be98b9ff9a5e601ffffffff3b8e11f993e5d512fbe70f6bd69df5510d87af895405f7bb07a3c3e5346813e60200000069463043021f34293f84b57d2805e6304d658c3764bc4da25685b0496d9c380115fcfb454b02206ae45d29bf23350371592f1bfba867b6fb2e594a4127d5f4e629ad7d4d018a4c01210281feb90c058c3436f8bc361930ae99fcfb530a699cdad141d7244bfcad521a1fffffffff288de338771ab35855db114211dc0fbbe772ad0ffba74e61ee21b5b53f8dac49010000004800463043021f6a4e7fdb0caac5b8864d0ca6b554c8bc1218df0fcefbd290e35a5659d82f85022075a2ea7b65c9eb69271179b4bf3c30a4b38b1867d1aa69059ca6073fe4317f0101ffffffff288de338771ab35855db114211dc0fbbe772ad0ffba74e61ee21b5b53f8dac4902000000694630430220478ef2590f1234e3daf0c9427ebc323d04f9ad25ddd8ea97eb51c66fa9c87e2e021f42500217ac76ce8368560e8521e58b050d62d9fd5bd40f4e8cf3acc286ebcc01210281feb90c058c3436f8bc361930ae99fcfb530a699cdad141d7244bfcad521a1fffffffff8ef083f541c2de13ae0233a35313b5c0fa936ae0f370c45077553d9508b0c71f01000000480046304302207a227400e6d30d1066a4659e5c655fc5870a12b229271bcb92c8a0fa90701604021f1e9783d80b8ef66f7a046c26022320259f1725aa9dba3549b9ecc2a3da627301ffffffff8ef083f541c2de13ae0233a35313b5c0fa936ae0f370c45077553d9508b0c71f02000000694630430220196990be449654b189ecd889240fe82d985af2cd42b690237415f3af72f507e6021f540f28bf9d553ce3d34c3e423241b498c5bfd91c69430d585811526d52570a012102c9c4ae505aeb0a50f1aa138e206c565ce6c49e0bf53d65fa1b2a8c80fd67f76cffffffff38e8175faf2547691f8fc068b7f0f55ce935f0ca5c2bb0cdb4c963c75ae7f5d60000000069463043021f432f653385412babd4a2cd040224c86b33eaaa8a0f269db23f431b3635e99102204df783d7a847551f5fd4d035e1d6fbb4f805d02e185fc0652e9948f203ce87e301210281feb90c058c3436f8bc361930ae99fcfb530a699cdad141d7244bfcad521a1fffffffff0a0ffeda5bd362eff2b94acbf57e122517d4f646fbc2905b57111c5eae41427f0000000089463043021f7bb3bc842a55b53b82390910bd1841c82dc81aec59c802f76c339bdf009e2f022042dc6eb57e126ed43d5b80645fc4403d2f139e5778e11628c65c124f8fae724b0141043f4a57ae0ab1537a4989c8364aba45f809950d233c8d517f08b040a5e9e3f5cd72c408045d551e74b9d03ec2747374c9adbf70edbdae19b97b50f08f6940b75bffffffff3087672cbdd861bd4ebad66b6d1d2cf247ba70aa11eb2042cc65f67c00ca5df500000000894630430220660ebc07d3f0e526b3ffd315009f80b3dc795bf17e95110b00250187a5aeafc0021f2e2cc2144b22cbffe429ea739a7887aa8e57fa29be7b860e8c239427563c500141043f4a57ae0ab1537a4989c8364aba45f809950d233c8d517f08b040a5e9e3f5cd72c408045d551e74b9d03ec2747374c9adbf70edbdae19b97b50f08f6940b75bffffffff68559862052c2544cda16af407017b091fd9b378c9ebeb58dd7957b6ba007aa602000000894630430220758a9dc0ff31e2876451a036491361cbc0e35b8a5239248ec163a79e7dc215c6021f0370556d36e1dc82d35aff0ea725687441d31d037d7d1573e4e01c3164ee650141043f4a57ae0ab1537a4989c8364aba45f809950d233c8d517f08b040a5e9e3f5cd72c408045d551e74b9d03ec2747374c9adbf70edbdae19b97b50f08f6940b75bffffffff04f2365e9cc619ac1b1d75b94cee48137dd559427b888d81d86fac8a5a15d0d30000000089463043021f206e176f5625b4677d616cb8a0150ca581aa368830452b2f6d09a2ce46d9cb022009bf3af7a5286bc8d93326f1de80e207021868a5acd72f24bf5ad2a3a15053e70141043f4a57ae0ab1537a4989c8364aba45f809950d233c8d517f08b040a5e9e3f5cd72c408045d551e74b9d03ec2747374c9adbf70edbdae19b97b50f08f6940b75bffffffffc7d8b5acf21826368095a66aa016566571c5c6b36ffda3d919a7c4aa756a1d8e0000000069463043021f5d87c2d418050a0f6c3c82d9924d6fe30de08577dcdfea9a0e2090cfb6001e02203d852275d29b51ef676e4ff3012a012c62f3c082aa4b842d85725f33d516ebaa012103a2d725439d181166ac95e210f46f66c3f1088066bbfd4f534dd59488a02b4c3affffffff0280c3c901000000001976a914161d7a3d0ee15c793ab300433192f949d8f3566588ac581d0909000000001976a9141c7260b625f21287e7c9c1147f2fd73ed69025a288ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let res = validate::validate_transaction_at(@transaction, 0, prev_out, 5); assert!(res.is_ok(), "P2MS 1-of-1 transaction validation failed"); @@ -142,7 +142,7 @@ fn test_p2ms_20_of_20() { let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let transaction = EngineInternalTransactionTrait::deserialize( - raw_transaction, array![prev_out], + raw_transaction, 0, array![prev_out], ); let res = validate::validate_transaction(@transaction, 0); diff --git a/packages/tests/src/tests/test_p2pk.cairo b/packages/tests/src/tests/test_p2pk.cairo index 10334351..0bf35f93 100644 --- a/packages/tests/src/tests/test_p2pk.cairo +++ b/packages/tests/src/tests/test_p2pk.cairo @@ -15,7 +15,7 @@ fn test_compressed_pubkey() { "0x0100000001475948774538830c533ad43cd5cd9a241a72569679e5f0474e670f466c81b83d00000000494830450221009c31a8561a3e422211e72242170d63d5d420398629475b48925720b4ba5b064202201b72633207c17b6129b9fee23247f48a11eb656c1ca4c50c828e4fdbf881be6301ffffffff0160090000000000001976a91474d03dbb59f75ff54ee97dadf221d74a48c3b52288ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); @@ -33,7 +33,7 @@ fn test_block_181_tx_mainnet() { "0x0100000001169e1e83e930853391bc6f35f605c6754cfead57cf8387639d3b4096c54f18f40100000048473044022027542a94d6646c51240f23a76d33088d3dd8815b25e9ea18cac67d1171a3212e02203baf203c6e7b80ebd3e588628466ea28be572fe1aaa3f30947da4763dd3b3d2b01ffffffff0200ca9a3b00000000434104b5abd412d4341b45056d3e376cd446eca43fa871b51961330deebd84423e740daa520690e1d9e074654c59ff87b408db903649623e86f1ca5412786f61ade2bfac005ed0b20000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); @@ -51,7 +51,7 @@ fn test_block_182_tx_mainnet() { "0x0100000001be141eb442fbc446218b708f40caeb7507affe8acff58ed992eb5ddde43c6fa1010000004847304402201f27e51caeb9a0988a1e50799ff0af94a3902403c3ad4068b063e7b4d1b0a76702206713f69bd344058b0dee55a9798759092d0916dbbc3e592fee43060005ddc17401ffffffff0200e1f5050000000043410401518fa1d1e1e3e162852d68d9be1c0abad5e3d6297ec95f1f91b909dc1afe616d6876f92918451ca387c4387609ae1a895007096195a824baf9c38ea98c09c3ac007ddaac0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); @@ -80,7 +80,7 @@ fn test_block_496_tx_mainnet() { "0x010000000321f75f3139a013f50f315b23b0c9a2b6eac31e2bec98e5891c924664889942260000000049483045022100cb2c6b346a978ab8c61b18b5e9397755cbd17d6eb2fe0083ef32e067fa6c785a02206ce44e613f31d9a6b0517e46f3db1576e9812cc98d159bfdaf759a5014081b5c01ffffffff79cda0945903627c3da1f85fc95d0b8ee3e76ae0cfdc9a65d09744b1f8fc85430000000049483045022047957cdd957cfd0becd642f6b84d82f49b6cb4c51a91f49246908af7c3cfdf4a022100e96b46621f1bffcf5ea5982f88cef651e9354f5791602369bf5a82a6cd61a62501fffffffffe09f5fe3ffbf5ee97a54eb5e5069e9da6b4856ee86fc52938c2f979b0f38e82000000004847304402204165be9a4cbab8049e1af9723b96199bfd3e85f44c6b4c0177e3962686b26073022028f638da23fc003760861ad481ead4099312c60030d4cb57820ce4d33812a5ce01ffffffff01009d966b01000000434104ea1feff861b51fe3f5f8a3b12d0f4712db80e919548a80839fc47c6a21e66d957e9c5d8cd108c7a2d2324bad71f9904ac0ae7336507d785b17a2c115e427a32fac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let utxo_hints = array![prev_out, prev_out2, prev_out3]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); diff --git a/packages/tests/src/tests/test_p2pkh.cairo b/packages/tests/src/tests/test_p2pkh.cairo index baf697ef..1568c792 100644 --- a/packages/tests/src/tests/test_p2pkh.cairo +++ b/packages/tests/src/tests/test_p2pkh.cairo @@ -23,7 +23,7 @@ fn test_p2pkh_transaction() { block_height: 357, }; let utxo_hints = array![prevout_1, prevout_2]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); @@ -62,7 +62,7 @@ fn test_p2pkh_transaction_spend() { }; let utxo_hints = array![prev_out0, prev_out1, prev_out2]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); // Run Shinigami and validate the transaction execution let res = validate::validate_transaction(@transaction, 0); @@ -90,7 +90,7 @@ fn test_block_770000_p2pkh_transaction() { block_height: 769998, }; let utxo_hints = array![prevout]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); @@ -110,7 +110,7 @@ fn test_block_770002_p2pkh_transaction() { block_height: 769998, }; let utxo_hints = array![prevout]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, 0); assert!(res.is_ok(), "Transaction validation failed"); diff --git a/packages/tests/src/tests/test_p2sh.cairo b/packages/tests/src/tests/test_p2sh.cairo index 7b1aee13..1b8c5961 100644 --- a/packages/tests/src/tests/test_p2sh.cairo +++ b/packages/tests/src/tests/test_p2sh.cairo @@ -15,13 +15,12 @@ fn test_p2sh_transaction_1() { let prevout_pubkey = "0xa914748284390f9e263a4b766a75d0633c50426eb87587"; // why this one works 0xa914748284390f9e263a4b766a75d0633c50426eb87588 - // correct name ? let prev_out_1of2_invalid = UTXO { amount: 10000000, pubkey_script: hex_to_bytecode(@prevout_pubkey), block_height: 177625, }; // set utxo directly in validate_at - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let flags: u32 = ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction_at(@transaction, flags, prev_out_1of2_invalid, 2); @@ -41,7 +40,7 @@ fn test_p2sh_transaction_2() { }; let utxo_hints = array![prev_out_1of2_invalid]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -61,7 +60,7 @@ fn test_p2sh_transaction_3() { amount: 10000000, pubkey_script: hex_to_bytecode(@prevout_pubkey), block_height: 183729, }; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let flags: u32 = ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction_at(@transaction, flags, prev_out, 11); @@ -82,7 +81,7 @@ fn test_p2sh_transaction_4() { }; let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -103,7 +102,7 @@ fn test_p2sh_transaction_5() { }; let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); // let res = validate_p2sh(@transaction, 0, 0); @@ -124,7 +123,7 @@ fn test_p2sh_transaction_6() { let prev_out = UTXO { amount: 100000000, pubkey_script: hex_to_bytecode(@prevout_pubkey), block_height: 257797, }; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); let flags: u32 = ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction_at(@transaction, flags, prev_out, 4); diff --git a/packages/tests/src/tests/test_p2wpkh.cairo b/packages/tests/src/tests/test_p2wpkh.cairo index 13f89db0..afc09445 100644 --- a/packages/tests/src/tests/test_p2wpkh.cairo +++ b/packages/tests/src/tests/test_p2wpkh.cairo @@ -16,7 +16,7 @@ fn test_p2wpkh_create_transaction() { }; let utxo_hints = array![prevout]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -37,7 +37,7 @@ fn test_p2wpkh_unlock_transaction() { }; let utxo_hints = array![prevout]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -58,7 +58,7 @@ fn test_p2wpkh_first_transaction() { }; let utxo_hints = array![prevout]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -78,7 +78,7 @@ fn test_p2wpkh_first_witness_spend() { }; let utxo_hints = array![prevout]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_ok(), "P2WPKH first follow-up spend witness validation failed"); @@ -98,7 +98,7 @@ fn test_p2wpkh_uncompressed_key_scriptpubkey_validation() { let utxo_hints = array![prevout]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_ok(), "P2WPKH uncompressed key ScriptPubKey validation failed"); diff --git a/packages/tests/src/tests/test_p2wsh.cairo b/packages/tests/src/tests/test_p2wsh.cairo index 7d9d3ab4..c4abd116 100644 --- a/packages/tests/src/tests/test_p2wsh.cairo +++ b/packages/tests/src/tests/test_p2wsh.cairo @@ -20,7 +20,7 @@ fn test_learnmeabitcoin_usage() { let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -43,7 +43,7 @@ fn test_learnmeabitcoin_usage_wrong_hash_in_pubkey_script() { let raw_transaction = hex_to_bytecode(@raw_transaction_hex); let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); let res = validate::validate_transaction(@transaction, flags); @@ -70,7 +70,7 @@ fn test_learnmeabitcoin_usage_different_witness_script_from_hash() { let utxo_hints = array![prev_out]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_err(), "Transaction validation should fail"); @@ -93,7 +93,7 @@ fn test_custom_hash_puzzle() { let utxo_hints = array![prev_out]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_ok(), "Transaction validation failed"); @@ -115,7 +115,7 @@ fn test_custom_hash_puzzle_invalid_unlock_code() { let utxo_hints = array![prev_out]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_err(), "Transaction validation should fail"); @@ -138,7 +138,7 @@ fn test_custom_hash_puzzle_wrong_hash_script_in_pubkey_script() { let utxo_hints = array![prev_out]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_err(), "Transaction validation should fail"); @@ -164,7 +164,7 @@ fn test_custom_hash_puzzle_different_witness_script_from_hash() { let utxo_hints = array![prev_out]; let flags: u32 = ScriptFlags::ScriptVerifyWitness.into() | ScriptFlags::ScriptBip16.into(); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); let res = validate::validate_transaction(@transaction, flags); assert!(res.is_err(), "Transaction validation should fail"); diff --git a/packages/tests/src/tests/test_transactions.cairo b/packages/tests/src/tests/test_transactions.cairo index 14fda14f..9f6d5722 100644 --- a/packages/tests/src/tests/test_transactions.cairo +++ b/packages/tests/src/tests/test_transactions.cairo @@ -13,7 +13,7 @@ fn test_deserialize_transaction() { let raw_transaction_hex = "0x010000000291056d7ab3e99f9506f248783e0801c9039082d7d876dd45a8ab1f0a166226e2000000008c493046022100a3deff7d28eca94e018cfafcf4e705cc6bb56ce1dab83a6377e6e97d28d305d90221008cfc8d40bb8e336f5210a4197760f6b9650ae6ec4682cc1626841d9c87d1b0f20141049305a94c5b8e71d8be2a2d7188d74cb38affc9dc83ab77cc2fedf7c03a82a56175b9c335ce4546a943a2215a9c04757f08c2cc97f731a208ea767119050e0b97ffffffff465345e66a84047bf58a3787456d8023c38e04734c72d7f7039b9220ac503b6e000000008a47304402202ff5fe06ff3ee680e069cd28ff3ed9a60050ba52ed811a739a29b81e3667074602203c0d1b63d0c495ee1b63886e42c2db0c4cb041ce0c957ad7febe0fbcd23498ee014104cc2cb6eb11b7b504e1aa2826cf8ce7568bc757d7f58ab1eaa0b5e6945ccdcc5b111c0c1163a28037b89501e0b83e3fdceb22a2fd80533e5211acac060b17b2a4ffffffff0243190600000000001976a914a2baed4cdeda71053537312ee32cf0ab9f22cf1888acc0451b11000000001976a914f3e0b1ca6d94a95e1f3683ea6f3d2b563ad475e688ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert_eq!(transaction.version, 1, "Version is not correct"); assert_eq!(transaction.transaction_inputs.len(), 2, "Transaction inputs length is not correct"); @@ -74,7 +74,7 @@ fn test_deserialize_first_p2pkh_transaction() { let raw_transaction_hex = "0x0100000002f60b5e96f09422354ab150b0e506c4bffedaf20216d30059cc5a3061b4c83dff000000004a493046022100e26d9ff76a07d68369e5782be3f8532d25ecc8add58ee256da6c550b52e8006b022100b4431f5a9a4dcb51cbdcaae935218c0ae4cfc8aa903fe4e5bac4c208290b7d5d01fffffffff7272ef43189f5553c2baea50f59cde99b3220fd518884d932016d055895b62d000000004a493046022100a2ab7cdc5b67aca032899ea1b262f6e8181060f5a34ee667a82dac9c7b7db4c3022100911bc945c4b435df8227466433e56899fbb65833e4853683ecaa12ee840d16bf01ffffffff0100e40b54020000001976a91412ab8dc588ca9d5787dde7eb29569da63c3a238c88ac00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert_eq!(transaction.version, 1, "Version is not correct"); assert_eq!(transaction.transaction_inputs.len(), 2, "Transaction inputs length is not correct"); @@ -127,7 +127,7 @@ fn test_deserialize_first_p2sh_transaction() { let raw_transaction_hex = "0x01000000014ce7153d92e3b24d9eea31f8cf391c3fb4c39f7742b341b2d36c6367e7546474000000006c493046022100c554360535b2ad3b1cb1b966a87807f7a7e45fa485348d662a1e7413dced8471022100d6bcfc4385b7ac41ca3968a73c4a28e38879192c3db1286b36e59ec9fce52bbd012103c96e3a9e63986801269d5f278246ed7cdc2d392595d0a25b102e04598f4b4fa9ffffffff02cb871a00000000001976a914c02ebae82202119f23f330781ff26b303edb7dbd88ac809698000000000017a914748284390f9e263a4b766a75d0633c50426eb8758700000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert_eq!(transaction.version, 1, "Version is not correct"); assert_eq!(transaction.transaction_inputs.len(), 1, "Transaction inputs length is not correct"); let input0 = transaction.transaction_inputs[0]; @@ -175,7 +175,7 @@ fn test_deserialize_p2wsh_transaction() { let raw_transaction_hex = "0x020000000001018a39b5cdd48c7d45a31a89cd675a95f5de78aebeeda1e55ac35d7110c3bacfc60000000000ffffffff01204e0000000000001976a914ee63c8c790952de677d1f8019c9474d84098d6e188ac0202123423aa20a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa8700000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert_eq!(transaction.version, 2, "Version is not correct"); assert_eq!(transaction.transaction_inputs.len(), 1, "Transaction inputs length is not correct"); @@ -215,7 +215,7 @@ fn test_deserialize_p2wpkh_transaction() { let raw_transaction_hex = "0x020000000001016972546966be990440a0665b73d0f4c3c942592d1f64d1033717aaa3e2c2ec913300000000ffffffff024087100000000000160014841b80d2cc75f5345c482af96294d04fdd66b2b760e31600000000001600142e8734f8e263e516d47fcaa2dfe1bd01e0dc935802473044022042e5e3ed2a41214ae864634b6fde33ca2ff312f3d89d6aa3e14c026d50d8ed3202206c38dcd0432a0724490356fbf599cdae40e334c3667a9253f8f4cc57cf3c4480012103f465315805ed271eb972e43d84d2a9e19494d10151d9f6adb32b8534bfd764ab00000000"; let raw_transaction = hex_to_bytecode(@raw_transaction_hex); - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, array![]); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, array![]); assert_eq!(transaction.version, 2, "Transaction version is incorrect"); assert_eq!(transaction.transaction_inputs.len(), 1, "Incorrect number of transaction inputs"); @@ -280,7 +280,7 @@ fn test_validate_transaction() { amount: 5000000000, pubkey_script: hex_to_bytecode(@prevout_pk_script), block_height: 9, }; let utxo_hints = array![prev_out]; - let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, utxo_hints); + let transaction = EngineInternalTransactionTrait::deserialize(raw_transaction, 0, utxo_hints); // Run Shinigami and validate the transaction execution let res = validate::validate_transaction(@transaction, 0); diff --git a/packages/tests/src/utils.cairo b/packages/tests/src/utils.cairo index ec37f90f..c274ba8e 100644 --- a/packages/tests/src/utils.cairo +++ b/packages/tests/src/utils.cairo @@ -155,6 +155,7 @@ pub fn mock_transaction_with( transaction_inputs: tx_inputs, transaction_outputs: tx_outputs, locktime: locktime, + txid: 0, utxos: array![], } } @@ -226,6 +227,7 @@ pub fn mock_witness_transaction() -> EngineTransaction { transaction_inputs: transaction_inputs, transaction_outputs: transaction_outputs, locktime: 0, + txid: 0, utxos: array![], } }