feat(applying): add cert and native script validation for ShelleyMA (#510)

BREAKING CHANGE: the `validate` fn signature has changed to support these changes

---------

Co-authored-by: Ale Gadea <ale.gadea@txpipe.io>
This commit is contained in:
Pedro Sánchez Terraf 2024-09-23 13:24:32 -03:00 committed by GitHub
parent 87e47de094
commit 7c7a3c25ab
15 changed files with 1881 additions and 134 deletions

View file

@ -28,9 +28,23 @@ Note that, since phase-1 validations do not include the execution of native scri
List of positive unit tests:
- **successful_mainnet_shelley_tx** ([here](https://cexplorer.io/tx/50eba65e73c8c5f7b09f4ea28cf15dce169f3d1c322ca3deff03725f51518bb2) to see on Cardano explorer) is a simple Shelley transaction, with no native scripts or metadata.
- **successful_mainnet_shelley_tx_with_script** ([here](https://cexplorer.io/tx/4a3f86762383f1d228542d383ae7ac89cf75cf7ff84dec8148558ea92b0b92d0) to see on Cardano explorer) is a Shelley transaction with a native script and no metadata.
- **successful_mainnet_shelley_tx_with_changed_script** is the same as the
previous transaction but the script is modified from requiring all signatures
to requiring only one of them, and with one key-witness pair removed.
- **successful_mainnet_shelley_tx_with_metadata** ([here](https://cexplorer.io/tx/c220e20cc480df9ce7cd871df491d7390c6a004b9252cf20f45fc3c968535b4a) to see on Cardano Explorer) is a Shelley transaction with metadata and no native scripts.
- **successful_mainnet_mary_tx_with_minting** ([here](https://cexplorer.io/tx/b7b1046d1787ac6917f5bb5841e73b3f4bef8f0a6bf692d05ef18e1db9c3f519) to see on Cardano Explorer) is a Mary transaction that mints assets and has, therefore, a native script. It has no metadata.
- **successful_mainnet_mary_tx_with_pool_reg**
([here](https://cexplorer.io/tx/ce8ba608357e31695ce7be1a4a9875f43b3fd264f106e455e870714f149af925)
to see on Cardano explorer) is a Mary transaction with a pool registration.
- **successful_mainnet_mary_tx_with_stk_deleg**
([here](https://cexplorer.io/tx/cc6a92cc0f4ea326439bac6b18bc7b424470c508a99b9aebc8fafc027d906465)
to see on Cardano explorer) is a Mary transaction with a staking key
registration and delegation to the pool above.
- **successful_mainnet_allegra_tx_with_mir**
([here](https://cexplorer.io/tx/99f621beaacefc14ad8912b777422600e707f75bf619b2af20e918b0fe53f882)
to see on Cardano explorer) is a Mary transaction moving instantaneous
rewards, drawn from the Treasury.
List of negative unit tests:
- **empty_ins** takes successful_mainnet_shelley_tx and removes its input.
- **unfound_utxo** takes successful_mainnet_shelley_tx and calls validation on it without a proper UTxO set containing the transaction input information.
@ -45,6 +59,16 @@ List of negative unit tests:
- **missing_vk_witness** takes successful_mainnet_shelley_tx and removes the verification-key witness associated to one of its inputs.
- **vk_witness_changed** takes successful_mainnet_shelley_tx and modifies the verification-key witness associated to one of its inputs.
- **missing_native_script_witness** takes successful_mainnet_shelley_tx_with_script and removes the native script associated to one of its inputs.
- **missing_signature_native_script** takes successful_mainnet_shelley_tx but
one verification-key witness is removed (the same one of
successful_mainnet_shelley_tx_with_changed_script).
- **unregistered_pool** takes successful_mainnet_mary_tx_with_stk_deleg,
but the pool to which the delegation occurs is not registered.
- **delegation_before_registration** takes
successful_mainnet_mary_tx_with_stk_deleg and flips the order of the
certificates (stake registration and delegation).
- **too_late_for_mir** takes successful_mainnet_allegra_tx_with_mir but the slot
is advanced to a later moment.
### Alonzo
*pallas-applying/tests/alonzo.rs* contains multiple unit tests for validation in the Alonzo era.

View file

@ -5,9 +5,10 @@ use common::*;
use pallas_addresses::{Address, Network, ShelleyAddress, ShelleyPaymentPart};
use pallas_applying::{
utils::{
AlonzoError, AlonzoProtParams, Environment, MultiEraProtocolParameters, ValidationError::*,
AccountState, AlonzoError, AlonzoProtParams, Environment, MultiEraProtocolParameters,
ValidationError::*,
},
validate, UTxOs,
validate_txs, CertState, UTxOs,
};
use pallas_codec::{
minicbor::{
@ -43,13 +44,21 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => (),
Err(err) => panic!("Unexpected error ({:?})", err),
}
@ -143,13 +152,21 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => (),
Err(err) => panic!("Unexpected error ({:?})", err),
}
@ -170,13 +187,21 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 6447035,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => (),
Err(err) => panic!("Unexpected error ({:?})", err),
}
@ -197,13 +222,21 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 6447038,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => (),
Err(err) => panic!("Unexpected error ({:?})", err),
}
@ -229,13 +262,21 @@ mod alonzo_tests {
mtx.transaction_body =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Inputs set should not be empty"),
Err(err) => match err {
Alonzo(AlonzoError::TxInsEmpty) => (),
@ -252,13 +293,21 @@ mod alonzo_tests {
let mtx: MintedTx = minted_tx_from_cbor(&cbor_bytes);
let utxos: UTxOs = UTxOs::new();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("All inputs should be within the UTxO set"),
Err(err) => match err {
Alonzo(AlonzoError::InputNotInUTxO) => (),
@ -288,13 +337,21 @@ mod alonzo_tests {
mtx.transaction_body =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Validity interval lower bound should have been reached"),
Err(err) => match err {
Alonzo(AlonzoError::BlockPrecedesValInt) => (),
@ -324,13 +381,21 @@ mod alonzo_tests {
mtx.transaction_body =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Validity interval upper bound should not have been surpassed"),
Err(err) => match err {
Alonzo(AlonzoError::BlockExceedsValInt) => (),
@ -356,13 +421,21 @@ mod alonzo_tests {
);
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_334();
alonzo_prot_params.minfee_a = 79; // This value was 44 during Alonzo on mainnet
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Fee should not be below minimum"),
Err(err) => match err {
Alonzo(AlonzoError::FeeBelowMin) => (),
@ -465,13 +538,21 @@ mod alonzo_tests {
mtx.transaction_body =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("No collateral inputs"),
Err(err) => match err {
Alonzo(AlonzoError::CollateralMissing) => (),
@ -571,13 +652,20 @@ mod alonzo_tests {
);
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_300();
alonzo_prot_params.max_collateral_inputs = 0; // This value was 3 during Alonzo on mainnet
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Number of collateral inputs should be within limits"),
Err(err) => match err {
Alonzo(AlonzoError::TooManyCollaterals) => (),
@ -696,13 +784,20 @@ mod alonzo_tests {
);
utxos.insert(multi_era_in, multi_era_out);
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Collateral inputs should be verification-key locked"),
Err(err) => match err {
Alonzo(AlonzoError::CollateralNotVKeyLocked) => (),
@ -810,13 +905,20 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Collateral inputs should contain only lovelace"),
Err(err) => match err {
Alonzo(AlonzoError::NonLovelaceCollateral) => (),
@ -915,13 +1017,20 @@ mod alonzo_tests {
);
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_300();
alonzo_prot_params.collateral_percentage = 700; // This was 150 during Alonzo on mainnet.
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Collateral inputs should contain the minimum lovelace"),
Err(err) => match err {
Alonzo(AlonzoError::CollateralMinLovelace) => (),
@ -951,13 +1060,20 @@ mod alonzo_tests {
mtx.transaction_body =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Preservation of value does not hold"),
Err(err) => match err {
Alonzo(AlonzoError::PreservationOfValue) => (),
@ -1007,13 +1123,20 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Output network ID should match environment network ID"),
Err(err) => match err {
Alonzo(AlonzoError::OutputWrongNetworkID) => (),
@ -1045,13 +1168,20 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Transaction network ID should match environment network ID"),
Err(err) => match err {
Alonzo(AlonzoError::TxWrongNetworkID) => (),
@ -1151,13 +1281,20 @@ mod alonzo_tests {
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_300();
alonzo_prot_params.max_tx_ex_units.mem = 4649575; // This is 1 lower than that of the transaction
alonzo_prot_params.max_tx_ex_units.steps = 1765246503; // This is 1 lower than that of the transaction
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Transaction ex units should be below maximum"),
Err(err) => match err {
Alonzo(AlonzoError::TxExUnitsExceeded) => (),
@ -1184,13 +1321,20 @@ mod alonzo_tests {
);
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_334();
alonzo_prot_params.max_transaction_size = 158; // 1 byte less than the size of the tx
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!(
"Transaction size should not exceed the maximum allowed by the protocol parameter"
),
@ -1301,13 +1445,20 @@ mod alonzo_tests {
mtx.transaction_body =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("All required signers should have signed the transaction"),
Err(err) => match err {
Alonzo(AlonzoError::ReqSignerMissing) => (),
@ -1337,13 +1488,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Missing verification key witness"),
Err(err) => match err {
Alonzo(AlonzoError::VKWitnessMissing) => (),
@ -1380,13 +1538,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_334()),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Witness signature should verify the transaction"),
Err(err) => match err {
Alonzo(AlonzoError::VKWrongSignature) => (),
@ -1489,13 +1654,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Missing Plutus script"),
Err(err) => match err {
Alonzo(AlonzoError::ScriptWitnessMissing) => (),
@ -1606,13 +1778,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Unneeded Plutus script"),
Err(err) => match err {
Alonzo(AlonzoError::UnneededNativeScript) => (),
@ -1642,13 +1821,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 6447035,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Minting policy is not supported by a matching native script"),
Err(err) => match err {
Alonzo(AlonzoError::MintingLacksPolicy) => (),
@ -1751,13 +1937,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Missing datum"),
Err(err) => match err {
Alonzo(AlonzoError::DatumMissing) => (),
@ -1866,13 +2059,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Unneeded datum"),
Err(err) => match err {
Alonzo(AlonzoError::UnneededDatum) => (),
@ -1982,13 +2182,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Unneeded redeemer"),
Err(err) => match err {
Alonzo(AlonzoError::UnneededRedeemer) => (),
@ -2091,13 +2298,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Redeemer missing"),
Err(err) => match err {
Alonzo(AlonzoError::RedeemerMissing) => (),
@ -2122,13 +2336,20 @@ mod alonzo_tests {
None,
)],
);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 6447038,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Transaction auxiliary data removed"),
Err(err) => match err {
Alonzo(AlonzoError::MetadataHash) => (),
@ -2154,13 +2375,20 @@ mod alonzo_tests {
);
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_334();
alonzo_prot_params.ada_per_utxo_byte = 10000000; // This was 34482 during Alonzo on mainnet.
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Output minimum lovelace is unreached"),
Err(err) => match err {
Alonzo(AlonzoError::MinLovelaceUnreached) => (),
@ -2186,13 +2414,20 @@ mod alonzo_tests {
);
let mut alonzo_prot_params: AlonzoProtParams = mk_params_epoch_334();
alonzo_prot_params.max_value_size = 0; // This was 5000 during Alonzo on mainnet
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(alonzo_prot_params),
prot_magic: 764824073,
block_slot: 44237276,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Max value size exceeded"),
Err(err) => match err {
Alonzo(AlonzoError::MaxValSizeExceeded) => (),
@ -2299,13 +2534,20 @@ mod alonzo_tests {
mtx.transaction_witness_set =
Decode::decode(&mut Decoder::new(tx_witness_set_buf.as_slice()), &mut ()).unwrap();
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let acnt = AccountState {
treasury: 261_254_564_000_000,
reserves: 0,
};
let env: Environment = Environment {
prot_params: MultiEraProtocolParameters::Alonzo(mk_params_epoch_300()),
prot_magic: 764824073,
block_slot: 58924928,
network_id: 1,
acnt: Some(acnt),
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Wrong script integrity hash"),
Err(err) => match err {
Alonzo(AlonzoError::ScriptIntegrityHash) => (),

File diff suppressed because one or more lines are too long

View file

@ -3,9 +3,10 @@ pub mod common;
use common::{cbor_to_bytes, minted_tx_payload_from_cbor, mk_utxo_for_byron_tx};
use pallas_applying::{
utils::{
ByronError, ByronProtParams, Environment, MultiEraProtocolParameters, ValidationError::*,
ByronError, ByronProtParams, CertState, Environment, MultiEraProtocolParameters,
ValidationError::*,
},
validate, UTxOs,
validate_txs, UTxOs,
};
use pallas_codec::{
@ -59,8 +60,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 6341,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => (),
Err(err) => panic!("Unexpected error ({:?})", err),
}
@ -102,8 +105,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => (),
Err(err) => panic!("Unexpected error ({:?})", err),
}
@ -153,8 +158,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Inputs set should not be empty"),
Err(err) => match err {
Byron(ByronError::TxInsEmpty) => (),
@ -207,8 +214,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Outputs set should not be empty"),
Err(err) => match err {
Byron(ByronError::TxOutsEmpty) => (),
@ -246,8 +255,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("All inputs must be within the UTxO set"),
Err(err) => match err {
Byron(ByronError::InputNotInUTxO) => (),
@ -306,8 +317,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("All outputs must contain lovelace"),
Err(err) => match err {
Byron(ByronError::OutputWithoutLovelace) => (),
@ -351,8 +364,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Fees should not be below minimum"),
Err(err) => match err {
Byron(ByronError::FeesBelowMin) => (),
@ -396,8 +411,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Transaction size cannot exceed protocol limit"),
Err(err) => match err {
Byron(ByronError::MaxTxSizeExceeded) => (),
@ -449,8 +466,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("All inputs must have a witness signature"),
Err(err) => match err {
Byron(ByronError::MissingWitness) => (),
@ -511,8 +530,10 @@ mod byron_tests {
prot_magic: 764824073,
block_slot: 3241381,
network_id: 1,
acnt: None,
};
match validate(&metx, &utxos, &env) {
let mut cert_state: CertState = CertState::default();
match validate_txs(&[metx], &env, &utxos, &mut cert_state) {
Ok(()) => panic!("Witness signature should verify the transaction"),
Err(err) => match err {
Byron(ByronError::WrongSignature) => (),

File diff suppressed because it is too large Load diff