@@ -4875,5 +4875,74 @@ mod tests {
48754875 ) ;
48764876 assert_eq ! ( tx_builder. script_data_hash. unwrap( ) , data_hash) ;
48774877 }
4878+
4879+ #[ test]
4880+ fn test_plutus_witness_redeemer_index_auto_changing ( ) {
4881+ let mut tx_builder = create_reallistic_tx_builder ( ) ;
4882+ tx_builder. set_fee ( & to_bignum ( 42 ) ) ;
4883+ let ( script1, _) = plutus_script_and_hash ( 0 ) ;
4884+ let ( script2, _) = plutus_script_and_hash ( 1 ) ;
4885+ let datum1 = PlutusData :: new_bytes ( fake_bytes ( 10 ) ) ;
4886+ let datum2 = PlutusData :: new_bytes ( fake_bytes ( 11 ) ) ;
4887+
4888+ // Creating redeemers with indexes ZERO
4889+ let redeemer1 = Redeemer :: new (
4890+ & RedeemerTag :: new_spend ( ) ,
4891+ & to_bignum ( 0 ) ,
4892+ & PlutusData :: new_bytes ( fake_bytes ( 20 ) ) ,
4893+ & ExUnits :: new ( & to_bignum ( 1 ) , & to_bignum ( 2 ) ) ,
4894+ ) ;
4895+ let redeemer2 = Redeemer :: new (
4896+ & RedeemerTag :: new_spend ( ) ,
4897+ & to_bignum ( 0 ) ,
4898+ & PlutusData :: new_bytes ( fake_bytes ( 21 ) ) ,
4899+ & ExUnits :: new ( & to_bignum ( 1 ) , & to_bignum ( 2 ) ) ,
4900+ ) ;
4901+
4902+ // Add a regular NON-script input first
4903+ tx_builder. add_input (
4904+ & byron_address ( ) ,
4905+ & TransactionInput :: new ( & genesis_id ( ) , 0 ) ,
4906+ & Value :: new ( & to_bignum ( 1_000_000 ) ) ,
4907+ ) ;
4908+
4909+ // Adding two plutus inputs then
4910+ // both have redeemers with index ZERO
4911+ tx_builder. add_plutus_script_input (
4912+ & PlutusWitness :: new ( & script1, & datum1, & redeemer1) ,
4913+ & TransactionInput :: new ( & genesis_id ( ) , 0 ) ,
4914+ & Value :: new ( & to_bignum ( 1_000_000 ) ) ,
4915+ ) ;
4916+ tx_builder. add_plutus_script_input (
4917+ & PlutusWitness :: new ( & script2, & datum2, & redeemer2) ,
4918+ & TransactionInput :: new ( & genesis_id ( ) , 0 ) ,
4919+ & Value :: new ( & to_bignum ( 1_000_000 ) ) ,
4920+ ) ;
4921+
4922+ // Calc the script data hash
4923+ tx_builder. calc_script_data_hash (
4924+ & TxBuilderConstants :: plutus_default_cost_models ( ) ,
4925+ ) ;
4926+
4927+ let tx: Transaction = tx_builder. build_tx ( ) . unwrap ( ) ;
4928+ assert ! ( tx. witness_set. redeemers. is_some( ) ) ;
4929+ let redeems = tx. witness_set . redeemers . unwrap ( ) ;
4930+ assert_eq ! ( redeems. len( ) , 2 ) ;
4931+
4932+ fn compare_redeems ( r1 : Redeemer , r2 : Redeemer ) {
4933+ assert_eq ! ( r1. tag( ) , r2. tag( ) ) ;
4934+ assert_eq ! ( r1. data( ) , r2. data( ) ) ;
4935+ assert_eq ! ( r1. ex_units( ) , r2. ex_units( ) ) ;
4936+ }
4937+
4938+ compare_redeems ( redeems. get ( 0 ) , redeemer1) ;
4939+ compare_redeems ( redeems. get ( 1 ) , redeemer2) ;
4940+
4941+ // Note the redeemers from the result transaction are equal with source redeemers
4942+ // In everything EXCEPT the index field, the indexes have changed to 1 and 2
4943+ // To match the position of their corresponding input
4944+ assert_eq ! ( redeems. get( 0 ) . index( ) , to_bignum( 1 ) ) ;
4945+ assert_eq ! ( redeems. get( 1 ) . index( ) , to_bignum( 2 ) ) ;
4946+ }
48784947}
48794948
0 commit comments