From 7814d898c480a679aedbbd489dc7b95fbdce9ae4 Mon Sep 17 00:00:00 2001 From: David Edey Date: Tue, 17 Sep 2024 00:10:45 +0100 Subject: [PATCH 1/6] feature: Add support for .bin schemas in Sbor assertions --- radix-sbor-derive/src/lib.rs | 16 +++--- sbor-derive-common/src/sbor_assert.rs | 53 +++++++++++++++--- sbor-tests/tests/sbor_assert.rs | 7 +++ sbor-tests/tests/test_enum_v1_schema.bin | Bin 0 -> 97 bytes .../schema_comparison/comparable_schema.rs | 8 +++ 5 files changed, 67 insertions(+), 17 deletions(-) create mode 100644 sbor-tests/tests/test_enum_v1_schema.bin diff --git a/radix-sbor-derive/src/lib.rs b/radix-sbor-derive/src/lib.rs index 1f598351b72..bcc69a6527c 100644 --- a/radix-sbor-derive/src/lib.rs +++ b/radix-sbor-derive/src/lib.rs @@ -234,7 +234,7 @@ pub fn scrypto_sbor(input: TokenStream) -> TokenStream { /// # use radix_sbor_derive::*; /// # /// #[derive(ScryptoSbor, ScryptoSborAssertion)] -/// #[sbor_assert(fixed("FILE:MyType-schema-v1.txt"), generate)] +/// #[sbor_assert(fixed("FILE:MyType-schema-v1.bin"), generate)] /// struct MyType { /// // ... /// } @@ -250,7 +250,7 @@ pub fn scrypto_sbor(input: TokenStream) -> TokenStream { /// # use radix_sbor_derive::*; /// # /// #[derive(ScryptoSbor, ScryptoSborAssertion)] -/// #[sbor_assert(fixed("FILE:MyType-schema-v1.txt"))] +/// #[sbor_assert(fixed("FILE:MyType-schema-v1.bin"))] /// struct MyType { /// // ... /// } @@ -270,15 +270,15 @@ pub fn scrypto_sbor(input: TokenStream) -> TokenStream { /// # /// #[derive(ScryptoSbor, ScryptoSborAssertion)] /// #[sbor_assert(backwards_compatible( -/// version1 = "FILE:MyType-schema-v1.txt", -/// version2 = "FILE:MyType-schema-v2.txt", +/// version1 = "FILE:MyType-schema-v1.bin", +/// version2 = "FILE:MyType-schema-v2.bin", /// ))] /// struct MyType { /// // ... /// } /// ``` /// -/// Instead of `"FILE:X"`, you can also use `"INLINE:"`, `"CONST:"` or `"EXPR:"` +/// Instead of `"FILE:X.bin"`, you can also use `"FILE:X.txt"`, `"INLINE:"`, `"CONST:"` or `"EXPR:"` /// where the expression (such as `generate_schema()`) has to generate a `SingleTypeSchema`. /// /// If you wish to configure exactly which schemas are used for comparison of the current schema with @@ -323,7 +323,7 @@ pub fn scrypto_sbor(input: TokenStream) -> TokenStream { /// # /// #[derive(ScryptoSbor, ScryptoSborAssertion)] /// #[sbor_assert( -/// fixed("FILE:MyType-schema-v1.txt"), +/// fixed("FILE:MyType-schema-v1.bin"), /// settings(allow_name_changes), /// )] /// struct MyType { @@ -333,8 +333,8 @@ pub fn scrypto_sbor(input: TokenStream) -> TokenStream { /// #[derive(ScryptoSbor, ScryptoSborAssertion)] /// #[sbor_assert( /// backwards_compatible( -/// v1 = "FILE:MyType-schema-v1.txt", -/// v2 = "FILE:MyType-schema-v2.txt", +/// v1 = "FILE:MyType-schema-v1.bin", +/// v2 = "FILE:MyType-schema-v2.bin", /// ), /// settings( /// // We allow name changes between versions, but require the current schema to exactly match diff --git a/sbor-derive-common/src/sbor_assert.rs b/sbor-derive-common/src/sbor_assert.rs index f31a7efff2f..90bacfe697a 100644 --- a/sbor-derive-common/src/sbor_assert.rs +++ b/sbor-derive-common/src/sbor_assert.rs @@ -45,7 +45,7 @@ pub fn handle_sbor_assert_derive( Ok(output) } -const GENERAL_PARSE_ERROR_MESSAGE: &'static str = "Expected `#[sbor_assert(fixed(..))]` OR `#[sbor_assert(backwards_compatible(..))]`, with optional additional parameters `generate`, `regenerate`, and `settings(..)`. A command such as `#[sbor_assert(fixed(\"FILE:my_schema.txt\"), generate)]` can be used to generate the schema initially."; +const GENERAL_PARSE_ERROR_MESSAGE: &'static str = "Expected `#[sbor_assert(fixed(..))]` OR `#[sbor_assert(backwards_compatible(..))]`, with optional additional parameters `generate`, `regenerate`, and `settings(..)`. A command such as `#[sbor_assert(fixed(\"FILE:my_schema.bin\"), generate)]` can be used to generate the schema initially."; fn extract_settings(attributes: &[Attribute]) -> Result<(AssertionMode, AdvancedSettings)> { // When we come to extract fixed named types, @@ -118,7 +118,7 @@ fn extract_settings(attributes: &[Attribute]) -> Result<(AssertionMode, Advanced const GENERATE_PARSE_ERROR_MESSAGE: &'static str = "Expected just `generate` or `regenerate` without any value, for example: `#[sbor_assert(fixed(..), generate)]` OR `#[sbor_assert(backwards_compatible(..), settings(..), regenerate)]`"; -const FIXED_PARSE_ERROR_MESSAGE: &'static str = "Expected `#[sbor_assert(fixed(X))]` where `X` is one of:\n* `\"INLINE:\"`\n* `\"FILE:\"`\n* Either `NAMED_CONSTANT` or `\"CONST:\"` where `` is the name of a defined constant string literal or some other type implementing `IntoSchema`\n* `\"EXPR:Y\"` where `Y` is some expression generating `SingleTypeSchema`, for `C` the custom schema. For example,\n calling `generate_schema()` where `fn generate_schema() -> SingleTypeSchema { .. }"; +const FIXED_PARSE_ERROR_MESSAGE: &'static str = "Expected `#[sbor_assert(fixed(X))]` where `X` is one of:\n* `\"INLINE:\"`\n* `\"FILE:\"`\n* Either `NAMED_CONSTANT` or `\"CONST:\"` where `` is the name of a defined constant string literal or some other type implementing `IntoSchema`\n* `\"EXPR:Y\"` where `Y` is some expression generating `SingleTypeSchema`, for `C` the custom schema. For example,\n calling `generate_schema()` where `fn generate_schema() -> SingleTypeSchema { .. }"; fn extract_fixed_schema_parameters( attribute_value: Option<&Vec<&NestedMeta>>, @@ -145,7 +145,7 @@ fn extract_fixed_schema_parameters( return Err(Error::new(error_span, FIXED_PARSE_ERROR_MESSAGE)); } -const BACKWARDS_COMPATIBLE_PARSE_ERROR_MESSAGE: &'static str = "Expected EITHER `#[sbor_assert(backwards_compatible(version1 = X, version2 = X))]` where `X` is one of:\n* `\"INLINE:\"`\n* `\"FILE:\"`\n* `\"CONST:\"` where `` is the name of a defined constant string literal or some other type implementing `IntoSchema`\n* `\"EXPR:Y\"` where `Y` is some expression generating `SingleTypeSchema`, for `C` the custom schema. For example,\n calling `generate_schema()` where `fn generate_schema() -> SingleTypeSchema { .. }\nOR `#[sbor_assert(backwards_compatible(\"EXPR:Y\"))]` where `Y` is some expression such as `params_builder()` generating a `SingleTypeSchemaCompatibilityParameters` for `S` the custom schema."; +const BACKWARDS_COMPATIBLE_PARSE_ERROR_MESSAGE: &'static str = "Expected EITHER `#[sbor_assert(backwards_compatible(version1 = X, version2 = X))]` where `X` is one of:\n* `\"INLINE:\"`\n* `\"FILE:\"`\n* `\"CONST:\"` where `` is the name of a defined constant string literal or some other type implementing `IntoSchema`\n* `\"EXPR:Y\"` where `Y` is some expression generating `SingleTypeSchema`, for `C` the custom schema. For example,\n calling `generate_schema()` where `fn generate_schema() -> SingleTypeSchema { .. }\nOR `#[sbor_assert(backwards_compatible(\"EXPR:Y\"))]` where `Y` is some expression such as `params_builder()` generating a `SingleTypeSchemaCompatibilityParameters` for `S` the custom schema."; fn extract_backwards_compatible_schema_parameters( attribute_value: Option<&Vec<&NestedMeta>>, @@ -453,7 +453,18 @@ fn handle_generate( } }; + let contents = match FileFormat::derive(&file_path) { + FileFormat::Hex => quote! { + type_schema.encode_to_hex() + }, + FileFormat::Bytes => quote! { + type_schema.encode_to_bytes() + }, + }; + quote! { + let contents = #contents; + use std::path::{Path, PathBuf}; use std::fs::OpenOptions; use std::io::Write; @@ -509,7 +520,7 @@ fn handle_generate( let mut file = #file_open_code; - file.write_all(hex.as_ref()) + file.write_all(contents.as_ref()) .unwrap_or_else(|err| panic!( "Schema could not be written to {} - Error: {}", full_file_path.display(), @@ -530,7 +541,6 @@ fn handle_generate( #[allow(non_snake_case)] pub fn #test_ident() { let type_schema = sbor::schema::SingleTypeSchema::<#custom_schema>::for_type::<#ident>(); - let hex = type_schema.encode_to_hex(); #output_content } }; @@ -626,15 +636,40 @@ fn schema_location_to_single_type_schema_code(params: &SchemaLocation) -> TokenS } => { quote! { sbor::schema::SingleTypeSchema::from(#fixed_schema) } } - SchemaLocation::StringFromFile { file_path } => { - quote! { sbor::schema::SingleTypeSchema::from(include_str!(#file_path)) } - } + SchemaLocation::StringFromFile { file_path } => match FileFormat::derive(file_path) { + FileFormat::Hex => quote! { + sbor::schema::SingleTypeSchema::from(include_str!(#file_path)) + }, + FileFormat::Bytes => quote! { + sbor::schema::SingleTypeSchema::from(include_bytes!(#file_path)) + }, + }, SchemaLocation::FromExpression { expression } => { quote! { #expression } } } } +enum FileFormat { + Hex, + Bytes, +} + +impl FileFormat { + fn derive(file_path_suffix: &LitStr) -> Self { + let is_hex = file_path_suffix + .value() + .split(".") + .last() + .is_some_and(|extension| extension.to_ascii_lowercase().as_str() == "txt"); + if is_hex { + Self::Hex + } else { + Self::Bytes + } + } +} + fn handle_backwards_compatible( context_custom_schema: &str, parsed: DeriveInput, @@ -651,7 +686,7 @@ fn handle_backwards_compatible( BackwardsCompatibleSchemaParameters::FromExpression { .. } => GenerationTarget::Inline, BackwardsCompatibleSchemaParameters::NamedSchemas { mut named_schemas } => { let Some(latest_named_schema) = named_schemas.pop() else { - return Err(Error::new(ident.span(), "At least one named schema placeholder needs adding in order for generation to work, e.g. `#[sbor_assert(backwards_compatible(latest = \"FILE:my_schema.txt\"), generate)]")); + return Err(Error::new(ident.span(), "At least one named schema placeholder needs adding in order for generation to work, e.g. `#[sbor_assert(backwards_compatible(latest = \"FILE:my_schema.bin\"), generate)]")); }; latest_named_schema.schema.generation_target(is_regenerate) } diff --git a/sbor-tests/tests/sbor_assert.rs b/sbor-tests/tests/sbor_assert.rs index 531cb36a64f..9d3832f7689 100644 --- a/sbor-tests/tests/sbor_assert.rs +++ b/sbor-tests/tests/sbor_assert.rs @@ -33,6 +33,13 @@ pub enum MyTestEnum_FixedSchema_Test4 { Hello { state: u32 }, } +#[derive(BasicSborAssertion, BasicSbor)] +#[sbor_assert(fixed("FILE:test_enum_v1_schema.bin"))] +#[sbor(type_name = "MyTestEnum")] +pub enum MyTestEnum_FixedSchema_Test5 { + Hello { state: u32 }, +} + const TEST_ENUM_V2_SCHEMA: &'static str = "5b210222000121032022010f012307200200220100010709012200202101022201010c0a4d7954657374456e756d2201012201012307210200022201010c0548656c6c6f220101220001200c0105737461746501022201010c05576f726c6422000020220100002201010a0000000000000000"; #[derive(BasicSborAssertion, BasicSbor)] diff --git a/sbor-tests/tests/test_enum_v1_schema.bin b/sbor-tests/tests/test_enum_v1_schema.bin new file mode 100644 index 0000000000000000000000000000000000000000..7d6067f4f7893a917e97d85097bfec37cfba257a GIT binary patch literal 97 zcma!6WKv>aRAg3AV&rF3W>;WjP-0|YWam^+WMooeWaQ!Utqe&mE^*B(%>{CSNSR%c kkpV2l>XDk0lMfPQU{v5?WGya9EJ+2L!vHjbk&6Ke07VuH+W-In literal 0 HcmV?d00001 diff --git a/sbor/src/schema/schema_comparison/comparable_schema.rs b/sbor/src/schema/schema_comparison/comparable_schema.rs index 618091b1022..edbee1e7746 100644 --- a/sbor/src/schema/schema_comparison/comparable_schema.rs +++ b/sbor/src/schema/schema_comparison/comparable_schema.rs @@ -146,6 +146,14 @@ impl, S: CustomSchema> IntoComparableSchema for [u8 } } +impl, S: CustomSchema, const N: usize> IntoComparableSchema + for [u8; N] +{ + fn into_schema(&self) -> C { + C::decode_from_bytes(self.as_slice()) + } +} + impl, S: CustomSchema> IntoComparableSchema for Vec { fn into_schema(&self) -> C { C::decode_from_bytes(self) From 897a68da5e3b253ba42805a77a0127797e6cdd97 Mon Sep 17 00:00:00 2001 From: David Edey Date: Tue, 17 Sep 2024 00:11:33 +0100 Subject: [PATCH 2/6] fix: Allow transaction receipts to be changed --- .../tests/blueprints/account_locker.rs | 4 +- .../tests/system/crypto_utils.rs | 12 +- radix-engine-tests/tests/system/proxy.rs | 6 +- .../tests/system/toolkit_receipt.rs | 2 +- .../src/receipt/receipt/runtime.rs | 24 +--- radix-engine/src/system/bootstrap.rs | 2 +- radix-engine/src/system/system_callback.rs | 22 ++- ...al_transaction_execution_v1_bottlenose.txt | 1 - ...al_transaction_execution_v1_cuttlefish.txt | 1 - ...local_transaction_execution_bottlenose.bin | Bin 0 -> 33241 bytes ...local_transaction_execution_cuttlefish.bin | Bin 0 -> 33241 bytes .../src/transaction/transaction_receipt.rs | 131 ++++++++++-------- radix-transaction-scenarios/src/executor.rs | 2 +- 13 files changed, 106 insertions(+), 101 deletions(-) delete mode 100644 radix-engine/src/transaction/node_local_transaction_execution_v1_bottlenose.txt delete mode 100644 radix-engine/src/transaction/node_local_transaction_execution_v1_cuttlefish.txt create mode 100644 radix-engine/src/transaction/node_versioned_local_transaction_execution_bottlenose.bin create mode 100644 radix-engine/src/transaction/node_versioned_local_transaction_execution_cuttlefish.bin diff --git a/radix-engine-tests/tests/blueprints/account_locker.rs b/radix-engine-tests/tests/blueprints/account_locker.rs index 91959debdb8..37d6e01c5b8 100644 --- a/radix-engine-tests/tests/blueprints/account_locker.rs +++ b/radix-engine-tests/tests/blueprints/account_locker.rs @@ -3040,7 +3040,7 @@ pub impl DefaultLedgerSimulator { fn execute_manifest_without_auth( &mut self, manifest: TransactionManifestV1, - ) -> TransactionReceiptV1 { + ) -> TransactionReceipt { self.execute_manifest_with_enabled_modules(manifest, true, false) } @@ -3049,7 +3049,7 @@ pub impl DefaultLedgerSimulator { manifest: TransactionManifestV1, disable_auth: bool, disable_costing: bool, - ) -> TransactionReceiptV1 { + ) -> TransactionReceipt { let mut execution_config = ExecutionConfig::for_notarized_transaction(NetworkDefinition::mainnet()); execution_config.system_overrides = Some(SystemOverrides { diff --git a/radix-engine-tests/tests/system/crypto_utils.rs b/radix-engine-tests/tests/system/crypto_utils.rs index 0c191e99721..0fc65ed7722 100644 --- a/radix-engine-tests/tests/system/crypto_utils.rs +++ b/radix-engine-tests/tests/system/crypto_utils.rs @@ -1,5 +1,5 @@ use radix_common::prelude::*; -use radix_engine::transaction::TransactionReceiptV1; +use radix_engine::transaction::TransactionReceipt; use radix_engine::vm::NoExtension; use radix_engine_tests::common::*; use radix_substate_store_impls::memory_db::InMemorySubstateDatabase; @@ -60,7 +60,7 @@ fn crypto_scrypto_bls12381_v1_verify( msg: Vec, pub_key: Bls12381G1PublicKey, signature: Bls12381G2Signature, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { runner.execute_manifest( ManifestBuilder::new() .lock_fee(runner.faucet_component(), 500u32) @@ -81,7 +81,7 @@ fn crypto_scrypto_bls12381_v1_aggregate_verify( msgs: Vec>, pub_keys: Vec, signature: Bls12381G2Signature, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { let pub_keys_msgs: Vec<(Bls12381G1PublicKey, Vec)> = pub_keys .iter() .zip(msgs) @@ -108,7 +108,7 @@ fn crypto_scrypto_bls12381_v1_fast_aggregate_verify( msg: Vec, pub_keys: Vec, signature: Bls12381G2Signature, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { runner.execute_manifest( ManifestBuilder::new() .lock_fee(runner.faucet_component(), 500u32) @@ -127,7 +127,7 @@ fn crypto_scrypto_bls12381_g2_signature_aggregate( runner: &mut LedgerSimulator, package_address: PackageAddress, signatures: Vec, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { runner.execute_manifest( ManifestBuilder::new() .lock_fee(runner.faucet_component(), 500u32) @@ -146,7 +146,7 @@ fn crypto_scrypto_keccak256_hash( runner: &mut LedgerSimulator, package_address: PackageAddress, data: Vec, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { runner.execute_manifest( ManifestBuilder::new() .lock_fee(runner.faucet_component(), 500u32) diff --git a/radix-engine-tests/tests/system/proxy.rs b/radix-engine-tests/tests/system/proxy.rs index 779a8412a07..e468fdd7e96 100644 --- a/radix-engine-tests/tests/system/proxy.rs +++ b/radix-engine-tests/tests/system/proxy.rs @@ -110,7 +110,7 @@ fn get_price_in_oracle_directly( ledger: &mut DefaultLedgerSimulator, oracle_address: ComponentAddress, resources: &IndexMap, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { let manifest = ManifestBuilder::new() .lock_fee_from_faucet() .call_method( @@ -131,7 +131,7 @@ fn get_price_in_oracle_via_oracle_proxy( ledger: &mut DefaultLedgerSimulator, proxy_address: ComponentAddress, resources: &IndexMap, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { let manifest = ManifestBuilder::new() .lock_fee_from_faucet() .call_method( @@ -259,7 +259,7 @@ fn get_price_in_oracle_via_generic_proxy( ledger: &mut DefaultLedgerSimulator, proxy_address: ComponentAddress, resources: &IndexMap, -) -> TransactionReceiptV1 { +) -> TransactionReceipt { let manifest = ManifestBuilder::new() .lock_fee_from_faucet() .call_method( diff --git a/radix-engine-tests/tests/system/toolkit_receipt.rs b/radix-engine-tests/tests/system/toolkit_receipt.rs index 2889dbd7edf..d3a22095d62 100644 --- a/radix-engine-tests/tests/system/toolkit_receipt.rs +++ b/radix-engine-tests/tests/system/toolkit_receipt.rs @@ -727,7 +727,7 @@ fn locked_fees_are_mapped_correctly_in_receipt() { /// * Checks that the runtime receipt obtained from deserialization equals the runtime receipt /// obtained from direct conversion (roundtrip property) fn check_and_convert_receipt_to_runtime_receipt( - receipt: TransactionReceiptV1, + receipt: TransactionReceipt, ) -> RuntimeToolkitTransactionReceipt { // Convert to a runtime receipt. let runtime_toolkit_receipt = RuntimeToolkitTransactionReceipt::try_from(receipt).unwrap(); diff --git a/radix-engine-toolkit-common/src/receipt/receipt/runtime.rs b/radix-engine-toolkit-common/src/receipt/receipt/runtime.rs index da8404f6642..f3e8e54504b 100644 --- a/radix-engine-toolkit-common/src/receipt/receipt/runtime.rs +++ b/radix-engine-toolkit-common/src/receipt/receipt/runtime.rs @@ -35,22 +35,12 @@ impl RuntimeToolkitTransactionReceipt { } } -impl TryFrom for RuntimeToolkitTransactionReceipt { +impl TryFrom for RuntimeToolkitTransactionReceipt { type Error = ToolkitReceiptError; - fn try_from(value: VersionedTransactionReceipt) -> Result { - match TransactionReceiptVersions::from(value) { - TransactionReceiptVersions::V1(receipt) => receipt.try_into(), - } - } -} - -impl TryFrom for RuntimeToolkitTransactionReceipt { - type Error = ToolkitReceiptError; - - fn try_from(value: TransactionReceiptV1) -> Result { + fn try_from(value: TransactionReceipt) -> Result { match value { - TransactionReceiptV1 { + TransactionReceipt { result: TransactionResult::Commit(CommitResult { outcome: TransactionOutcome::Success(..), @@ -224,7 +214,7 @@ impl TryFrom for RuntimeToolkitTransactionReceipt { non_contingent: execution_trace.fee_locks.lock, }, }), - TransactionReceiptV1 { + TransactionReceipt { result: TransactionResult::Commit(CommitResult { outcome: TransactionOutcome::Success(..), @@ -233,7 +223,7 @@ impl TryFrom for RuntimeToolkitTransactionReceipt { }), .. } => Err(ToolkitReceiptError::ReceiptLacksExecutionTrace), - TransactionReceiptV1 { + TransactionReceipt { result: TransactionResult::Commit(CommitResult { outcome: TransactionOutcome::Failure(error), @@ -243,13 +233,13 @@ impl TryFrom for RuntimeToolkitTransactionReceipt { } => Ok(Self::CommitFailure { reason: format!("{error:?}"), }), - TransactionReceiptV1 { + TransactionReceipt { result: TransactionResult::Reject(error), .. } => Ok(Self::Reject { reason: format!("{error:?}"), }), - TransactionReceiptV1 { + TransactionReceipt { result: TransactionResult::Abort(error), .. } => Ok(Self::Abort { diff --git a/radix-engine/src/system/bootstrap.rs b/radix-engine/src/system/bootstrap.rs index 5d44622dd7d..166cdd34870 100644 --- a/radix-engine/src/system/bootstrap.rs +++ b/radix-engine/src/system/bootstrap.rs @@ -147,7 +147,7 @@ pub struct ManifestGenesisResource { // Various helper utilities for constructing and executing genesis //========================================================================================== -#[derive(Debug, Clone, ScryptoSbor)] +#[derive(Debug, Clone)] pub struct GenesisReceipts { pub system_flash_receipt: TransactionReceipt, pub system_bootstrap_receipt: TransactionReceipt, diff --git a/radix-engine/src/system/system_callback.rs b/radix-engine/src/system/system_callback.rs index da36b1537c0..49aaf187eae 100644 --- a/radix-engine/src/system/system_callback.rs +++ b/radix-engine/src/system/system_callback.rs @@ -1053,7 +1053,7 @@ impl System { result: TransactionResult, print_execution_summary: bool, costing_module: CostingModule, - ) -> TransactionReceiptV1 { + ) -> TransactionReceipt { let (fee_reserve, cost_breakdown, detailed_cost_breakdown) = costing_module.unpack_for_receipt(); let (finalization_summary, costing_parameters, transaction_costing_parameters) = @@ -1074,7 +1074,7 @@ impl System { fn create_rejection_receipt( reason: impl Into, modules: SystemModuleMixer, - ) -> TransactionReceiptV1 { + ) -> TransactionReceipt { Self::create_non_commit_receipt( TransactionResult::Reject(RejectResult { reason: reason.into(), @@ -1087,7 +1087,7 @@ impl System { fn create_abort_receipt( reason: impl Into, modules: SystemModuleMixer, - ) -> TransactionReceiptV1 { + ) -> TransactionReceipt { Self::create_non_commit_receipt( TransactionResult::Abort(AbortResult { reason: reason.into(), @@ -1102,7 +1102,7 @@ impl System { mut track: Track, modules: SystemModuleMixer, system_finalization: SystemFinalization, - ) -> TransactionReceiptV1 { + ) -> TransactionReceipt { let print_execution_summary = modules.is_kernel_trace_enabled(); let execution_trace_enabled = modules.is_execution_trace_enabled(); let (costing_module, runtime_module, execution_trace_module) = modules.unpack(); @@ -1218,13 +1218,9 @@ impl System { transaction_costing_parameters: TransactionCostingParameters, fee_summary: TransactionFeeSummary, result: TransactionResult, - ) -> TransactionReceiptV1 { - // TODO - change to TransactionCostingParametersReceiptV1 when we have a plan regarding how - // to break TransactionReceipt compatibility - let transaction_costing_parameters = TransactionCostingParametersReceiptV1 { - tip_percentage: transaction_costing_parameters - .tip - .truncate_to_percentage_u16(), + ) -> TransactionReceipt { + let transaction_costing_parameters = TransactionCostingParametersReceiptV2 { + tip_proportion: transaction_costing_parameters.tip.proportion(), free_credit_in_xrd: transaction_costing_parameters.free_credit_in_xrd, }; @@ -1260,7 +1256,7 @@ impl System { store: &mut impl BootStore, executable: &ExecutableTransaction, init_input: SystemSelfInit, - ) -> Result<(VersionedSystemLogic, SystemModuleMixer), TransactionReceiptV1> { + ) -> Result<(VersionedSystemLogic, SystemModuleMixer), TransactionReceipt> { let system_boot = store .read_boot_substate( TRANSACTION_TRACKER.as_node_id(), @@ -1381,7 +1377,7 @@ impl KernelTransactionCallbackObject for System { type Init = SystemInit; type Executable = ExecutableTransaction; type ExecutionOutput = Vec; - type Receipt = TransactionReceiptV1; + type Receipt = TransactionReceipt; fn init( store: &mut S, diff --git a/radix-engine/src/transaction/node_local_transaction_execution_v1_bottlenose.txt b/radix-engine/src/transaction/node_local_transaction_execution_v1_bottlenose.txt deleted file mode 100644 index dfbacf161c0..00000000000 --- a/radix-engine/src/transaction/node_local_transaction_execution_v1_bottlenose.txt +++ /dev/null @@ -1 +0,0 @@ -5c210222000121032022a5010e0120220c01010a010000000000000001010a780000000000000001010a790000000000000001010a7b0000000000000001010a7e0000000000000001010a7f0000000000000001010a800000000000000001010a830000000000000001010a8b0000000000000001010a8d0000000000000001010a9b0000000000000001010a9f000000000000000f01230720020022010001074201220101010a02000000000000000f012307200700220101010a030000000000000001220101010a230000000000000002220101010a3c0000000000000003220101010a490000000000000004220101010a4b0000000000000005220101010a4f0000000000000006220101010a44000000000000000f012307200400220101010a040000000000000001220101010a21000000000000000222010001070903220101010a22000000000000000f012307201000220101010a050000000000000001220101010a060000000000000002220101010a090000000000000003220101010a0f0000000000000004220101010a100000000000000005220101010a110000000000000006220101010a140000000000000007220101010a150000000000000008220101010a190000000000000009220101010a1a000000000000000a220101010a1b000000000000000b220101010a1c000000000000000c220101010a1d000000000000000d220101010a1e000000000000000e220101010a1f000000000000000f220101010a20000000000000000f012307200100220101010a06000000000000000f012307200400220101010a070000000000000001220101010a080000000000000002220101010a080000000000000003220101010a08000000000000000f012307200200220101010a080000000000000001220101010a08000000000000000d0122000107070f012307200300220101010a0a0000000000000001220101010a0c0000000000000002220101010a0e000000000000000f012307200600220101010a070000000000000001220101010a080000000000000002220101010a080000000000000003220101010a080000000000000004220101010a080000000000000005220101010a0b000000000000000f012307200300220101010a080000000000000001220101010a080000000000000002220101010a08000000000000000f012307200400220101010a080000000000000001220101010a0d000000000000000222000322000f012307200f0022010001070a0122020001070a0001070a02220200010707000107070322020001070700010707042201000107070522020001070a0001070a06220200010707000107070722010001070708220100010707092201000107070a22000b22000c22010001070a0d22000e22000f01230720010022000f012307200400220101010a070000000000000001220101010a080000000000000002220101010a080000000000000003220101010a0a000000000000000f012307200100220101010a08000000000000000f012307200600220101010a080000000000000001220101010a120000000000000002220101010a080000000000000003220101010a0b0000000000000004220101010a08000000000000000522000f012307200200220101010a080000000000000001220101010a130000000000000007000f012307200100220101010a08000000000000000f012307200800220101010a080000000000000001220002220003220101010a0c0000000000000004220301010a080000000000000001010a130000000000000001010a160000000000000005220006220301010a080000000000000001010a130000000000000001010a160000000000000007220301010a080000000000000001010a130000000000000001010a16000000000000000f0123072003002201000107070122010001074102220101010a17000000000000000e0120220201010a1800000000000000000107410d0122000107070f01230720020022010001070901220101010a08000000000000000f0123072001002201000107090f01230720040022010001070901220101010a0a0000000000000002220003220101010a0e000000000000000f012307200200220101010a080000000000000001220101010a0c000000000000000f012307200300220101010a080000000000000001220101010a080000000000000002220101010a0c000000000000000f012307200300220101010a080000000000000001220101010a080000000000000002220101010a0c000000000000000f012307200300220101010a080000000000000001220301010a080000000000000001010a130000000000000001010a160000000000000002220101010a0c000000000000000f012307200300220101010a080000000000000001220301010a080000000000000001010a130000000000000001010a160000000000000002220101010a0c000000000000000f01230720010022000d012201010a08000000000000000f012307202f0022000122000222000322000422000522000622000722000822000922000a22000b22000c22000d22000e22000f220010220101010a240000000000000011220201010a29000000000000000001070712220201010a29000000000000000001070713220401010a29000000000000000001070701010a340000000000000001010a34000000000000001422001522020001070900010707162201000107f11722001822001922001a220101010a35000000000000001b2201000107f01c22001d22001e220101010a36000000000000001f220101010a37000000000000002022002122010001070c22220023220101010a380000000000000024220101010a380000000000000025220101010a390000000000000026220101010a3b000000000000002722002822002922002a22002b22010001070c2c22010001070c2d22002e22010001070c0f01230720090022020001070a0001070a01220101010a250000000000000002220101010a270000000000000003220201010a28000000000000000001070704220201010a280000000000000001010a310000000000000005220301010a280000000000000001010a31000000000000000001070c06220201010a33000000000000000001070c0722000822000f012307200200220101010a26000000000000000122010001070a07000e01202203000107830001070c0001070c0e0120220501010a290000000000000001010a2a0000000000000001010a2b0000000000000001010a2c0000000000000001010a2d000000000000000e01202202000107830001070c0e012022030001070900010709000107090f0123072002002201000107810122000d01220001070c0d012201010a2e000000000000000f012307200200220101010a2f0000000000000001220101010a27000000000000000e0120220201010a300000000000000001010a25000000000000000d0122000107070f01230720060022020001070c01010a32000000000000000122010001070c022201000107070322020001070701010a33000000000000000422020001070701010a33000000000000000522020001070701010a33000000000000000f01230720020022000122000f01230720020022000122000f01230720030022000122000222000f01230720030022000122000222000e0120220201010a290000000000000001010a29000000000000000f01230720060022010001070c01220201010a29000000000000000001070702220201010a29000000000000000001070703220201010a29000000000000000001070704220201010a29000000000000000001070c0522010001070c0e01202203000107830001070c01010a2a000000000000000e01202203000107830001070c01010a3a000000000000000f0123072002002200012201000107830e0120220401010a0800000000000000000107830001070c01010a3a000000000000000f012307200400220101010a3d0000000000000001220101010a440000000000000002220101010a470000000000000003220101010a48000000000000000f012307200600220101010a3e0000000000000001220101010a3e0000000000000002220101010a080000000000000003220101010a3f000000000000000422010001070c0522000e0120220201010a29000000000000000001070c0e0120220201010a400000000000000001010a3e000000000000000f012307200200220101010a410000000000000001220101010a43000000000000000d012201010a42000000000000000e01202202000107e701010a43000000000000000d0122000107e00f012307200100220101010a45000000000000000f0123072005002202000107c0000107c0012200022203000107090001070900010709032201000107c004220101010a46000000000000000f01230720010022000f012307200b0022010001070a0122010001070a0222010001070a0322000422020001070a0001070a0522020001070a0001070a0622020001070a0001070a0722020001070a0001070a0822020001070a0001070a0922000a22000f012307200400220201010a29000000000000000001070c0122010001070c0222000322000f01230720080022000122010001070c0222010001070c03220101010a4a0000000000000004220101010a0d000000000000000522020001070c0001070c06220101010a0d000000000000000722020001070c0001070c0f01230720030022000122000222000f012307200300220101010a4c0000000000000001220101010a4d0000000000000002220101010a4e000000000000000f01230720020022000122030001070c000107400001070c0f012307201b0022010001070c0122000222000322010001070c0422000522010001070906220101010a0d000000000000000722000822000922000a2201000107090b2201000107090c220101010a0d000000000000000d220101010a0d000000000000000e220101010a0d000000000000000f220101010a0d0000000000000010220101010a0d0000000000000011220012220101010a0d0000000000000013220101010a45000000000000001422010001070915220016220017220101010a0d0000000000000018220101010a0d0000000000000019220101010a0d000000000000001a22000f01230720010022010001070a0f01230720170022010001070c01220101010a0d000000000000000222010001070c03220101010a500000000000000004220101010a520000000000000005220101010a540000000000000006220101010a550000000000000007220101010a580000000000000008220101010a5f0000000000000009220101010a61000000000000000a220101010a62000000000000000b220101010a63000000000000000c220101010a66000000000000000d220101010a68000000000000000e220101010a69000000000000000f220101010a6a0000000000000010220101010a6b0000000000000011220101010a6c0000000000000012220101010a6e0000000000000013220101010a6f0000000000000014220101010a740000000000000015220101010a750000000000000016220101010a76000000000000000f01230720080022010001070c0122000222020001070a0001070a03220004220005220101010a51000000000000000622000722000f01230720020022000122030001070c0001070c0001070a0f01230720040022020001070a0001070a0122020001070a0001070a02220101010a0d0000000000000003220101010a53000000000000000f01230720020022010001070c0122010001070c0f0123072003002202000107f2000107f2012200022201000107f20f012307200d0022010001070901220100010709022201000107090322010001070904220101010a560000000000000005220101010a0d0000000000000006220101010a0d0000000000000007220101010a080000000000000008220101010a08000000000000000922000a220101010a0d000000000000000b220101010a57000000000000000c22000d0122000107070f01230720050022010001070a0122020001070a0001070a0222020001070700010707032202000107070001070704220200010707000107070f012307202900220101010a590000000000000001220101010a5d000000000000000222000322010001070c04220005220006220101010a25000000000000000722020001070c01010a5e000000000000000822020001070c01010a5e000000000000000922000a22000b22000c220101010a51000000000000000d22000e22010001070c0f220101010a2500000000000000102201000107071122001222020001070c0001070c13220101010a50000000000000001422001522020001070c000107e71622020001070a0001070a1722020001070a0001070a1822020001070a0001070a1922020001070a0001070a1a22020001070a0001070a1b22020001070a0001070a1c22020001070a0001070a1d2201000107e71e22030001070c0001070a0001070a1f22020001070c0001070c2022030001070c0001070a0001070a2122020001070c0001070c2222030001070c0001070a0001070a2322020001070c0001070c242202000107f2000107f22522010001070c262200272201000107f22822010001070c0f01230720180022000122010001070c02220003220004220101010a5a0000000000000005220101010a5b0000000000000006220101010a5c000000000000000722010001070c0822000922000a22000b220200010709000107090c220200010709000107090d22000e22010001070c0f22001022001122010001070c1222010001070c1322010001070c1422001522010001070c1622010001070c1722000f01230720030022010001070c0122030001070c0001070a0001070a0222010001070c0f01230720050022000122000222000322000422000f01230720020022000122000f01230720160022000122000222010001070a0322010001070a0422000522000622000722000822000922000a22000b22000c22000d22000e22000f22001022001122010001070c1222001322001422001522000f01230720020022000122010001070c0f012307200a00220201010a600000000000000001010a600000000000000001220200010705000107050222020001070a0001070a032202000107070001070a0422000522000622000722000822010001070509220200010709000107090a000f01230720090022000122000222000322000422000522000622000722020001070a0001070a0822000f0123072007002202000107c000010707012200022201000107070322000422000522000622000f012307200b002201000107c3012201000107c30222010001070c03220201010a640000000000000001010a640000000000000004220005220101010a65000000000000000622000722000822000922000a22000f01230720040022000122000222000322000f012307200500220101010a5d000000000000000122000222000322000422010001070c0f012307200500220101010a670000000000000001220101010a680000000000000002220101010a0800000000000000032201000107c00422000f0123072004002202000107c0000107c0012200022201000107c20322000f01230720010022000f0123072003002201000107c20122000222000f012307200900220101010a670000000000000001220101010a6800000000000000022201000107c0032200042200052200062200072202000107c0000107c00822000f01230720020022000122000f012307200100220101010a6d000000000000000f01230720040022000122000222000322000f01230720040022010001078501220100010785022200032201000107e40f012307200a00220001220002220101010a700000000000000003220101010a700000000000000004220101010a700000000000000005220101010a700000000000000006220007220008220201010a710000000000000001010a71000000000000000922000f01230720020022000122000e0120220201010a720000000000000001010a73000000000000000e01202203000107e0000107e0000107e00f0123072002002200012201000107090f0123072009002201000107850122000222020001078500010785032200042200052200062200072200082201000107850f012307200a002201000107850122000222020001078500010785032201000107850422000522000622000722000822000922000f012307200d0022010001078501220002220200010785000107850322010001078504220101010a77000000000000000522000622000722000822000922000a22000b22000c22000d0122000107850e012022070001070900010709000107c0000107c0000107c0000107c0000107c00e0120220101010a7a0000000000000010022201010a080000000000000022000107c00e01202204000107c0000107c0000107c001010a7c0000000000000010022201010a7d0000000000000022000107c00f01230720020022020001078301010a08000000000000000122020001078401010a08000000000000000e01202208000107c00001070900010709000107c000010709000107c0000107c0000107c00e0120220200010708000107c00d012201010a81000000000000000e0120220201010a82000000000000000001070c0f01230720050022000122000222000322000422000e0120220501010a840000000000000001010a850000000000000001010a770000000000000001010a860000000000000001010a87000000000000000d0122000107830d0122000107840d01220001078210022201010a08000000000000002201010a88000000000000000e012022020001078501010a89000000000000000f0123072002002201000107c001220201010a8a0000000000000001010a8a000000000000000d0122000107c2100222000107812201010a8c00000000000000100222000107852201010a89000000000000000d012201010a8e000000000000000f012307200700220101010a8f0000000000000001220002220101010a910000000000000003220101010a930000000000000004220101010a980000000000000005220101010a990000000000000006220101010a9a000000000000000e0120220101010a90000000000000000f01230720040022000122000222000322000e0120220201010a920000000000000001010a92000000000000000e0120220301010a080000000000000001010a300000000000000001010a25000000000000000e0120220101010a94000000000000000f012307200200220101010a950000000000000001220101010a97000000000000000e0120220101010a96000000000000000e012022030001078301010a300000000000000001010a25000000000000000e012022020001070701010a92000000000000000e0120220201010a940000000000000001010a94000000000000000e0120220201010a940000000000000001010a94000000000000000e0120220201010a940000000000000001010a940000000000000010022201010a9c000000000000002201010a9e000000000000000e0120220201010a9d000000000000000001070c0f012307200200220101010a290000000000000001220201010a0800000000000000000107f00e0120220101010a95000000000000000f012307200200220001220101010aa0000000000000000e0120220301010aa10000000000000001010aa20000000000000001010aa4000000000000000a00100222000107842201010aa3000000000000000e01202202000107d1000107c01002220001070c22000107c02021a501022201010c1b4c6f63616c5472616e73616374696f6e457865637574696f6e5631220101220001200c0c076f7574636f6d650b6665655f73756d6d6172790a6665655f736f757263650f6665655f64657374696e6174696f6e19656e67696e655f636f7374696e675f706172616d65746572731e7472616e73616374696f6e5f636f7374696e675f706172616d6574657273106170706c69636174696f6e5f6c6f67731473746174655f7570646174655f73756d6d61727916676c6f62616c5f62616c616e63655f73756d6d6172791a7375627374617465735f73797374656d5f737472756374757265176576656e74735f73797374656d5f7374727563747572650a6e6578745f65706f6368022201010c06526573756c742201012201012307210200022201010c024f6b22000001022201010c03457272220000022201010c0c52756e74696d654572726f722201012201012307210700022201010c0b4b65726e656c4572726f7222000001022201010c0b53797374656d4572726f7222000002022201010c1153797374656d4d6f64756c654572726f7222000003022201010c1353797374656d557073747265616d4572726f7222000004022201010c07566d4572726f7222000005022201010c104170706c69636174696f6e4572726f7222000006022201010c1846696e616c697a6174696f6e436f7374696e674572726f72220000022201010c0b4b65726e656c4572726f722201012201012307210400022201010c0e43616c6c4672616d654572726f7222000001022201010c114964416c6c6f636174696f6e4572726f7222000002022201010c1a537562737461746548616e646c65446f65734e6f74457869737422000003022201010c0d4f727068616e65644e6f646573220000022201010c0e43616c6c4672616d654572726f722201012201012307211000022201010c104372656174654672616d654572726f7222000001022201010c10506173734d6573736167654572726f7222000002022201010c0f4372656174654e6f64654572726f7222000003022201010c0d44726f704e6f64654572726f7222000004022201010c0c50696e4e6f64654572726f7222000005022201010c124d6f7665506172746974696f6e4572726f7222000006022201010c1a4d61726b5472616e7369656e7453756273746174654572726f7222000007022201010c114f70656e53756273746174654572726f7222000008022201010c12436c6f736553756273746174654572726f7222000009022201010c115265616453756273746174654572726f722200000a022201010c12577269746553756273746174654572726f722200000b022201010c125363616e5375627374617465734572726f722200000c022201010c13447261696e5375627374617465734572726f722200000d022201010c185363616e536f727465645375627374617465734572726f722200000e022201010c115365745375627374617465734572726f722200000f022201010c1452656d6f76655375627374617465734572726f72220000022201010c104372656174654672616d654572726f722201012201012307210100022201010c10506173734d6573736167654572726f72220000022201010c10506173734d6573736167654572726f722201012201012307210400022201010c0d54616b654e6f64654572726f7222000001022201010c11476c6f62616c5265664e6f74466f756e6422000002022201010c114469726563745265664e6f74466f756e6422000003022201010c145472616e7369656e745265664e6f74466f756e64220000022201010c0d54616b654e6f64654572726f722201012201012307210200022201010c0b4f776e4e6f74466f756e6422000001022201010c105375627374617465426f72726f776564220000022201010c064e6f64654964220000022201010c0f4372656174654e6f64654572726f722201012201012307210300022201010c1450726f6365737353756273746174654572726f7222000001022201010c1750726f6365737353756273746174654b65794572726f7222000002022201010c115375627374617465446966664572726f72220000022201010c1450726f6365737353756273746174654572726f722201012201012307210600022201010c0d54616b654e6f64654572726f7222000001022201010c1343616e7444726f704e6f6465496e53746f726522000002022201010c0b5265664e6f74466f756e6422000003022201010c1852656643616e7442654164646564546f537562737461746522000004022201010c164e6f6e476c6f62616c5265664e6f74416c6c6f77656422000005022201010c10506572736973744e6f64654572726f72220000022201010c10506572736973744e6f64654572726f722201012201012307210300022201010c14436f6e7461696e734e6f6e476c6f62616c52656622000001022201010c0c4e6f6465426f72726f77656422000002022201010c1743616e6e6f745065727369737450696e6e65644e6f6465220000022201010c1750726f6365737353756273746174654b65794572726f722201012201012307210400022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0b4465636f64654572726f7222000002022201010c154f776e65644e6f64654e6f74537570706f7274656422000003022201010c184e6f6e476c6f62616c5265664e6f74537570706f72746564220000022201010c0b4465636f64654572726f722201012201012307210f00022201010c124578747261547261696c696e67427974657322000001022201010c0f427566666572556e646572666c6f77220101220001200c020872657175697265640972656d61696e696e6702022201010c17556e65787065637465645061796c6f6164507265666978220101220001200c020865787065637465640661637475616c03022201010c13556e657870656374656456616c75654b696e64220101220001200c020865787065637465640661637475616c04022201010c19556e6578706563746564437573746f6d56616c75654b696e64220101220001200c010661637475616c05022201010c0e556e657870656374656453697a65220101220001200c020865787065637465640661637475616c06022201010c17556e65787065637465644469736372696d696e61746f72220101220001200c020865787065637465640661637475616c07022201010c10556e6b6e6f776e56616c75654b696e6422000008022201010c14556e6b6e6f776e4469736372696d696e61746f7222000009022201010c0b496e76616c6964426f6f6c2200000a022201010c0b496e76616c6964557466382200000b022201010c0b496e76616c696453697a652200000c022201010c104d6178446570746845786365656465642200000d022201010c0c4475706c69636174654b65792200000e022201010c12496e76616c6964437573746f6d56616c7565220000022201010c115375627374617465446966664572726f722201012201012307210100022201010c15436f6e7461696e734475706c69636174654f776e73220000022201010c0d44726f704e6f64654572726f722201012201012307210400022201010c0d54616b654e6f64654572726f7222000001022201010c0c4e6f6465426f72726f77656422000002022201010c105375627374617465426f72726f77656422000003022201010c1450726f6365737353756273746174654572726f72220000022201010c0c50696e4e6f64654572726f722201012201012307210100022201010c0e4e6f64654e6f7456697369626c65220000022201010c124d6f7665506172746974696f6e4572726f722201012201012307210600022201010c104e6f64654e6f74417661696c61626c6522000001022201010c184865617052656d6f7665506172746974696f6e4572726f7222000002022201010c164e6f6e476c6f62616c5265664e6f74416c6c6f77656422000003022201010c10506572736973744e6f64654572726f7222000004022201010c105375627374617465426f72726f77656422000005022201010c194d6f766546726f6d53746f72654e6f745065726d6974746564220000022201010c184865617052656d6f7665506172746974696f6e4572726f722201012201012307210200022201010c0c4e6f64654e6f74466f756e6422000001022201010c0e4d6f64756c654e6f74466f756e64220000022201010c0f506172746974696f6e4e756d626572220000022201010c1a4d61726b5472616e7369656e7453756273746174654572726f722201012201012307210100022201010c0e4e6f64654e6f7456697369626c65220000022201010c114f70656e53756273746174654572726f722201012201012307210800022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0d53756273746174654661756c7422000002022201010c13496e76616c696444656661756c7456616c756522000003022201010c1750726f6365737353756273746174654b65794572726f7222000004022201010c0e53756273746174654c6f636b656422000005022201010c1c4c6f636b556e6d6f646966696564426173654f6e486561704e6f646522000006022201010c1f4c6f636b556e6d6f646966696564426173654f6e4e6577537562737461746522000007022201010c254c6f636b556e6d6f646966696564426173654f6e4f6e557064617465645375627374617465220000022201010c0b53756273746174654b65792201012201012307210300022201010c054669656c6422000001022201010c034d617022000002022201010c06536f727465642200000222000022000002220000220000022201010c12436c6f736553756273746174654572726f722201012201012307210200022201010c0e48616e646c654e6f74466f756e6422000001022201010c105375627374617465426f72726f776564220000022201010c115265616453756273746174654572726f722201012201012307210100022201010c0e48616e646c654e6f74466f756e64220000022201010c12577269746553756273746174654572726f722201012201012307210400022201010c0e48616e646c654e6f74466f756e6422000001022201010c1450726f6365737353756273746174654572726f7222000002022201010c114e6f57726974655065726d697373696f6e22000003022201010c115375627374617465446966664572726f72220000022201010c1643616c6c4672616d655363616e4b6579734572726f722201012201012307210200022201010c0e4e6f64654e6f7456697369626c6522000001022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c1c43616c6c4672616d65447261696e5375627374617465734572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c184e6f6e476c6f62616c5265664e6f74537570706f7274656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c2143616c6c4672616d655363616e536f727465645375627374617465734572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c154f776e65644e6f64654e6f74537570706f7274656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c1943616c6c4672616d6553657453756273746174654572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0e53756273746174654c6f636b656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c1c43616c6c4672616d6552656d6f766553756273746174654572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0e53756273746174654c6f636b656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c114964416c6c6f636174696f6e4572726f722201012201012307210100022201010c074f75744f66494422000002220000220000022201010c0b53797374656d4572726f722201012201012307212f00022201010c0d4e6f426c75657072696e74496422000001022201010c104e6f5061636b6167654164647265737322000002022201010c17496e76616c69644163746f72537461746548616e646c6522000003022201010c15496e76616c69644163746f7252656648616e646c6522000004022201010c1d476c6f62616c697a696e675472616e7369656e74426c75657072696e7422000005022201010c19476c6f62616c41646472657373446f65734e6f74457869737422000006022201010c174e6f74416e416464726573735265736572766174696f6e22000007022201010c0b4e6f74416e4f626a65637422000008022201010c114e6f74414b657956616c756553746f726522000009022201010c1b4d6f64756c6573446f6e74486176654f757465724f626a656374732200000a022201010c174163746f724e6f64654964446f65734e6f7445786973742200000b022201010c174f757465724f626a656374446f65734e6f7445786973742200000c022201010c0f4e6f74414669656c6448616e646c652200000d022201010c144e6f74414669656c64577269746548616e646c652200000e022201010c0d526f6f744861734e6f547970652200000f022201010c1841646472657373426563683332456e636f64654572726f7222000010022201010c0e54797065436865636b4572726f7222000011022201010c114669656c64446f65734e6f74457869737422000012022201010c1b436f6c6c656374696f6e496e646578446f65734e6f74457869737422000013022201010c1c436f6c6c656374696f6e496e64657849734f6657726f6e675479706522000014022201010c134b657956616c7565456e7472794c6f636b656422000015022201010c0b4669656c644c6f636b656422000016022201010c184f626a6563744d6f64756c65446f65734e6f74457869737422000017022201010c174e6f74414b657956616c7565456e74727948616e646c6522000018022201010c1c4e6f74414b657956616c7565456e747279577269746548616e646c6522000019022201010c10496e76616c69644c6f636b466c6167732200001a022201010c0f43616e6e6f74476c6f62616c697a652200001b022201010c0d4d697373696e674d6f64756c652200001c022201010c1f496e76616c6964476c6f62616c416464726573735265736572766174696f6e2200001d022201010c1a496e76616c69644368696c644f626a6563744372656174696f6e2200001e022201010c11496e76616c69644d6f64756c65547970652200001f022201010c114372656174654f626a6563744572726f7222000020022201010c12496e76616c696447656e657269634172677322000021022201010c0e496e76616c69644665617475726522000022022201010c1641737365727441636365737352756c654661696c656422000023022201010c15426c75657072696e74446f65734e6f74457869737422000024022201010c184175746854656d706c617465446f65734e6f74457869737422000025022201010c16496e76616c6964476c6f62616c697a6541636365737322000026022201010c11496e76616c696444726f7041636365737322000027022201010c17436f7374696e674d6f64756c654e6f74456e61626c656422000028022201010c14417574684d6f64756c654e6f74456e61626c656422000029022201010c225472616e73616374696f6e52756e74696d654d6f64756c654e6f74456e61626c65642200002a022201010c1e466f72636557726974654576656e74466c6167734e6f74416c6c6f7765642200002b022201010c15426c75657072696e74547970654e6f74466f756e642200002c022201010c08426c734572726f722200002d022201010c0e496e70757444617461456d7074792200002e022201010c0b53797374656d50616e6963220000022201010c0e54797065436865636b4572726f722201012201012307210900022201010c1a496e76616c69644e756d6265724f6647656e6572696341726773220101220001200c020865787065637465640661637475616c01022201010c12496e76616c69644c6f63616c54797065496422000002022201010c1e496e76616c6964426c75657072696e74547970654964656e74696669657222000003022201010c16496e76616c6964436f6c6c656374696f6e496e64657822000004022201010c1c426c75657072696e745061796c6f6164446f65734e6f74457869737422000005022201010c1f426c75657072696e745061796c6f616456616c69646174696f6e4572726f7222000006022201010c234b657956616c756553746f72655061796c6f616456616c69646174696f6e4572726f7222000007022201010c16496e7374616e6365536368656d614e6f74466f756e6422000008022201010c0d4d697373696e67536368656d61220000022201010c0b4c6f63616c5479706549642201012201012307210200022201010c0957656c6c4b6e6f776e22000001022201010c10536368656d614c6f63616c496e646578220000022201010c0f57656c6c4b6e6f776e547970654964220000022201010c17426c75657072696e74547970654964656e746966696572220101220001200c030f7061636b6167655f616464726573730e626c75657072696e745f6e616d6509747970655f6e616d65022201010c0d426c75657072696e74496e666f220101220001200c050c626c75657072696e745f696411626c75657072696e745f76657273696f6e0e6f757465725f6f626a5f696e666f0866656174757265731567656e657269635f737562737469747574696f6e73022201010c0b426c75657072696e744964220101220001200c020f7061636b6167655f616464726573730e626c75657072696e745f6e616d65022201010c10426c75657072696e7456657273696f6e220101220001200c03056d616a6f72056d696e6f72057061746368022201010c0f4f757465724f626a656374496e666f2201012201012307210200022201010c04536f6d65220101220001200c010c6f757465725f6f626a65637401022201010c044e6f6e652200000222000022000002220000220000022201010c1347656e65726963537562737469747574696f6e2201012201012307210200022201010c054c6f63616c22000001022201010c0652656d6f7465220000022201010c0c53636f706564547970654964220000022201010c0a536368656d6148617368220000022201010c1a426c75657072696e745061796c6f61644964656e7469666965722201012201012307210600022201010c0846756e6374696f6e22000001022201010c054576656e7422000002022201010c054669656c6422000003022201010c0d4b657956616c7565456e74727922000004022201010c0a496e646578456e74727922000005022201010c10536f72746564496e646578456e747279220000022201010c0d496e7075744f724f75747075742201012201012307210200022201010c05496e70757422000001022201010c064f7574707574220000022201010c0a4b65794f7256616c75652201012201012307210200022201010c034b657922000001022201010c0556616c7565220000022201010c16426c75657072696e74506172746974696f6e547970652201012201012307210300022201010c124b657956616c7565436f6c6c656374696f6e22000001022201010c0f496e646578436f6c6c656374696f6e22000002022201010c15536f72746564496e646578436f6c6c656374696f6e220000022201010c1443616e6e6f74476c6f62616c697a654572726f722201012201012307210300022201010c0b4e6f74416e4f626a65637422000001022201010c11416c7265616479476c6f62616c697a656422000002022201010c12496e76616c6964426c75657072696e744964220000022201010c11496e76616c69644d6f64756c6554797065220101220001200c021265787065637465645f626c75657072696e741061637475616c5f626c75657072696e74022201010c114372656174654f626a6563744572726f722201012201012307210600022201010c11426c75657072696e744e6f74466f756e6422000001022201010c18496e76616c69644669656c64447565546f4665617475726522000002022201010c0c4d697373696e674669656c6422000003022201010c11496e76616c69644669656c64496e64657822000004022201010c15536368656d6156616c69646174696f6e4572726f7222000005022201010c14496e76616c696453756273746174655772697465220000022201010c1443616e6f6e6963616c426c75657072696e744964220101220001200c03076164647265737309626c75657072696e740776657273696f6e022201010c16496e76616c6964476c6f62616c697a65416363657373220101220001200c030f7061636b6167655f616464726573730e626c75657072696e745f6e616d650d6163746f725f7061636b616765022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c11496e76616c696444726f70416363657373220101220001200c04076e6f64655f69640f7061636b6167655f616464726573730e626c75657072696e745f6e616d650d6163746f725f7061636b616765022201010c1153797374656d4d6f64756c654572726f722201012201012307210400022201010c09417574684572726f7222000001022201010c0c436f7374696e674572726f7222000002022201010c165472616e73616374696f6e4c696d6974734572726f7222000003022201010c0a4576656e744572726f72220000022201010c09417574684572726f722201012201012307210600022201010c0a4e6f46756e6374696f6e22000001022201010c0f4e6f4d6574686f644d617070696e6722000002022201010c0f5669736962696c6974794572726f7222000003022201010c0c556e617574686f72697a656422000004022201010c1a496e6e6572426c75657072696e74446f65734e6f74457869737422000005022201010c19496e76616c69644f757465724f626a6563744d617070696e67220000022201010c0c466e4964656e746966696572220101220001200c020c626c75657072696e745f6964056964656e74022201010c0c556e617574686f72697a6564220101220001200c02136661696c65645f6163636573735f72756c65730d666e5f6964656e746966696572022201010c114661696c656441636365737352756c65732201012201012307210200022201010c08526f6c654c69737422000001022201010c0a41636365737352756c65220000022200002200000222000022000002220000220000022201010c0c436f7374696e674572726f722201012201012307210100022201010c0f466565526573657276654572726f72220000022201010c0f466565526573657276654572726f722201012201012307210500022201010c13496e73756666696369656e7442616c616e6365220101220001200c020872657175697265640972656d61696e696e6701022201010c084f766572666c6f7722000002022201010c0d4c696d69744578636565646564220101220001200c03056c696d697409636f6d6d6974746564036e657703022201010c134c6f616e52657061796d656e744661696c6564220101220001200c01087872645f6f77656404022201010c0541626f7274220000022201010c0b41626f7274526561736f6e2201012201012307210100022201010c2a436f6e6669677572656441626f72745472696767657265644f6e4665654c6f616e52657061796d656e74220000022201010c165472616e73616374696f6e4c696d6974734572726f722201012201012307210b00022201010c1a4d617853756273746174654b657953697a65457863656564656422000001022201010c174d6178537562737461746553697a65457863656564656422000002022201010c1c4d6178496e766f6b655061796c6f616453697a65457863656564656422000003022201010c184d617843616c6c44657074684c696d69745265616368656422000004022201010c19547261636b537562737461746553697a654578636565646564220101220001200c020661637475616c036d617805022201010c1848656170537562737461746553697a654578636565646564220101220001200c020661637475616c036d617806022201010c0f4c6f6753697a65546f6f4c61726765220101220001200c020661637475616c036d617807022201010c114576656e7453697a65546f6f4c61726765220101220001200c020661637475616c036d617808022201010c1850616e69634d65737361676553697a65546f6f4c61726765220101220001200c020661637475616c036d617809022201010c0b546f6f4d616e794c6f67732200000a022201010c0d546f6f4d616e794576656e7473220000022201010c0a4576656e744572726f722201012201012307210400022201010c13536368656d614e6f74466f756e644572726f72220101220001200c0209626c75657072696e740a6576656e745f6e616d6501022201010c134576656e74536368656d614e6f744d6174636822000002022201010c134e6f4173736f6369617465645061636b61676522000003022201010c0c496e76616c69644163746f72220000022201010c1353797374656d557073747265616d4572726f722201012201012307210800022201010c1c53797374656d46756e6374696f6e43616c6c4e6f74416c6c6f77656422000001022201010c0a466e4e6f74466f756e6422000002022201010c1052656365697665724e6f744d6174636822000003022201010c0c486f6f6b4e6f74466f756e6422000004022201010c10496e7075744465636f64654572726f7222000005022201010c13496e707574536368656d614e6f744d6174636822000006022201010c114f75747075744465636f64654572726f7222000007022201010c144f7574707574536368656d614e6f744d61746368220000022201010c0d426c75657072696e74486f6f6b2201012201012307210300022201010c0c4f6e5669727475616c697a6522000001022201010c064f6e4d6f766522000002022201010c064f6e44726f70220000022201010c07566d4572726f722201012201012307210300022201010c064e617469766522000001022201010c045761736d22000002022201010c105363727970746f566d56657273696f6e220000022201010c124e617469766552756e74696d654572726f722201012201012307210200022201010c0d496e76616c6964436f6465496422000001022201010c0454726170220101220001200c030b6578706f72745f6e616d6505696e707574056572726f72022201010c105761736d52756e74696d654572726f722201012201012307211b00022201010c0d556e6b6e6f776e4578706f727422000001022201010c114d656d6f72794163636573734572726f7222000002022201010c12496e76616c69645761736d506f696e74657222000003022201010c0e457865637574696f6e4572726f7222000004022201010c0e4e6f74496d706c656d656e74656422000005022201010c0e4275666665724e6f74466f756e6422000006022201010c0e496e76616c69644164647265737322000007022201010c0d496e76616c6964537472696e6722000008022201010c0d496e76616c69644e6f6465496422000009022201010c1f496e76616c6964476c6f62616c416464726573735265736572766174696f6e2200000a022201010c14496e76616c69645265666572656e6365547970652200000b022201010c17496e76616c696441747461636865644d6f64756c6549642200000c022201010c13496e76616c69644f626a6563745374617465732200000d022201010c11496e76616c696441636365737352756c652200000e022201010c0e496e76616c69644d6f64756c65732200000f022201010c13496e76616c696454656d706c6174654172677322000010022201010c1a496e76616c69644b657956616c756553746f7265536368656d6122000011022201010c10496e76616c69644c6f636b466c61677322000012022201010c0f496e76616c69644c6f674c6576656c22000013022201010c0f466565526573657276654572726f7222000014022201010c11496e76616c69644576656e74466c61677322000015022201010c15496e76616c69645061636b6167654164647265737322000016022201010c0e546f6f4d616e794275666665727322000017022201010c13496e76616c6964426c735075626c69634b657922000018022201010c13496e76616c6964426c735369676e617475726522000019022201010c1c496e76616c6964426c735075626c69634b65794f724d6573736167652200001a022201010c0e496e70757444617461456d707479220000022201010c155363727970746f566d56657273696f6e4572726f722201012201012307210100022201010c0c46726f6d496e744572726f72220000022201010c104170706c69636174696f6e4572726f722201012201012307211700022201010c124578706f7274446f65734e6f74457869737422000001022201010c10496e7075744465636f64654572726f7222000002022201010c0c50616e69634d65737361676522000003022201010c13526f6c6541737369676e6d656e744572726f7222000004022201010c0d4d657461646174614572726f7222000005022201010c15436f6d706f6e656e74526f79616c74794572726f7222000006022201010c195472616e73616374696f6e50726f636573736f724572726f7222000007022201010c0c5061636b6167654572726f7222000008022201010c15436f6e73656e7375734d616e616765724572726f7222000009022201010c0e56616c696461746f724572726f722200000a022201010c1c46756e6769626c655265736f757263654d616e616765724572726f722200000b022201010c1f4e6f6e46756e6769626c655265736f757263654d616e616765724572726f722200000c022201010c0b4275636b65744572726f722200000d022201010c0a50726f6f664572726f722200000e022201010c154e6f6e46756e6769626c655661756c744572726f722200000f022201010c0a5661756c744572726f7222000010022201010c0c576f726b746f704572726f7222000011022201010c0d417574685a6f6e654572726f7222000012022201010c0c4163636f756e744572726f7222000013022201010c15416363657373436f6e74726f6c6c65724572726f7222000014022201010c144f6e655265736f75726365506f6f6c4572726f7222000015022201010c1454776f5265736f75726365506f6f6c4572726f7222000016022201010c164d756c74695265736f75726365506f6f6c4572726f72220000022201010c13526f6c6541737369676e6d656e744572726f722201012201012307210800022201010c10557365645265736572766564526f6c6522000001022201010c11557365645265736572766564537061636522000002022201010c1645786365656465644d6178526f6c654e616d654c656e220101220001200c02056c696d69740661637475616c03022201010c1a45786365656465644d617841636365737352756c65446570746822000004022201010c1a45786365656465644d617841636365737352756c654e6f64657322000005022201010c0b496e76616c69644e616d6522000006022201010c1045786365656465644d6178526f6c657322000007022201010c1a43616e6e6f74536574526f6c6549664e6f744174746163686564220000022201010c10496e76616c69644e616d654572726f722201012201012307210200022201010c0b456d707479537472696e6722000001022201010c0b496e76616c696443686172220101220001200c03046e616d650e76696f6c6174696e675f6368617205696e646578022201010c0d4d657461646174614572726f722201012201012307210400022201010c194b6579537472696e67457863656564734d61784c656e677468220101220001200c02036d61780661637475616c01022201010c1956616c756553626f72457863656564734d61784c656e677468220101220001200c02036d61780661637475616c02022201010c1056616c75654465636f64654572726f7222000003022201010c174d6574616461746156616c69646174696f6e4572726f72220000022201010c174d6574616461746156616c69646174696f6e4572726f722201012201012307210200022201010c0a496e76616c696455524c22000001022201010c0d496e76616c69644f726967696e220000022201010c15436f6d706f6e656e74526f79616c74794572726f722201012201012307210300022201010c21526f79616c7479416d6f756e744973477265617465725468616e416c6c6f776564220101220001200c02036d61780661637475616c01022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f7222000002022201010c17526f79616c7479416d6f756e7449734e65676174697665220000022201010c195472616e73616374696f6e50726f636573736f724572726f722201012201012307210d00022201010c0e4275636b65744e6f74466f756e6422000001022201010c0d50726f6f664e6f74466f756e6422000002022201010c1a416464726573735265736572766174696f6e4e6f74466f756e6422000003022201010c0f416464726573734e6f74466f756e6422000004022201010c0c426c6f624e6f74466f756e6422000005022201010c0f496e76616c696443616c6c4461746122000006022201010c14496e76616c69645061636b616765536368656d6122000007022201010c114e6f745061636b6167654164647265737322000008022201010c104e6f74476c6f62616c4164647265737322000009022201010c0f417574685a6f6e654973456d7074792200000a022201010c1b496e766f636174696f6e4f75747075744465636f64654572726f722200000b022201010c0f41726773456e636f64654572726f722200000c022201010c1a546f74616c426c6f6253697a654c696d69744578636565646564220000022201010c0448617368220000022201010c0b456e636f64654572726f722201012201012307210500022201010c104d61784465707468457863656564656422000001022201010c0c53697a65546f6f4c61726765220101220001200c020661637475616c0b6d61785f616c6c6f77656402022201010c204d69736d61746368696e674172726179456c656d656e7456616c75654b696e64220101220001200c0212656c656d656e745f76616c75655f6b696e641161637475616c5f76616c75655f6b696e6403022201010c1a4d69736d61746368696e674d61704b657956616c75654b696e64220101220001200c020e6b65795f76616c75655f6b696e641161637475616c5f76616c75655f6b696e6404022201010c1c4d69736d61746368696e674d617056616c756556616c75654b696e64220101220001200c021076616c75655f76616c75655f6b696e641161637475616c5f76616c75655f6b696e64022201010c0c5061636b6167654572726f722201012201012307212900022201010c0b496e76616c69645761736d22000001022201010c16496e76616c6964426c75657072696e74536368656d6122000002022201010c16546f6f4d616e795375627374617465536368656d617322000003022201010c1346656174757265446f65734e6f74457869737422000004022201010c15496e76616c69645472616e7369656e744669656c6422000005022201010c1e53797374656d496e737472756374696f6e734e6f74537570706f7274656422000006022201010c1a4661696c6564546f5265736f6c76654c6f63616c536368656d61220101220001200c010d6c6f63616c5f747970655f696407022201010c114576656e744e616d654d69736d61746368220101220001200c020865787065637465640661637475616c08022201010c10547970654e616d654d69736d61746368220101220001200c020865787065637465640661637475616c09022201010c12496e76616c69644576656e74536368656d612200000a022201010c15496e76616c696453797374656d46756e6374696f6e2200000b022201010c11496e76616c696454797065506172656e742200000c022201010c0b496e76616c69644e616d652200000d022201010c154d697373696e674f75746572426c75657072696e742200000e022201010c0f5761736d556e737570706f727465642200000f022201010c12496e76616c69644c6f63616c54797065496422000010022201010c10496e76616c696447656e65726963496422000011022201010c1c4576656e7447656e65726963547970654e6f74537570706f7274656422000012022201010c244f75746572426c75657072696e7443616e744265416e496e6e6572426c75657072696e74220101220001200c0205696e6e65720f76696f6c6174696e675f6f7574657213022201010c13526f6c6541737369676e6d656e744572726f7222000014022201010c10496e76616c696441757468536574757022000015022201010c17446566696e696e675265736572766564526f6c654b657922000016022201010c1045786365656465644d6178526f6c6573220101220001200c02056c696d69740661637475616c17022201010c1645786365656465644d6178526f6c654e616d654c656e220101220001200c02056c696d69740661637475616c18022201010c1b45786365656465644d6178426c75657072696e744e616d654c656e220101220001200c02056c696d69740661637475616c19022201010c1745786365656465644d61784576656e744e616d654c656e220101220001200c02056c696d69740661637475616c1a022201010c1645786365656465644d6178547970654e616d654c656e220101220001200c02056c696d69740661637475616c1b022201010c1a45786365656465644d617846756e6374696f6e4e616d654c656e220101220001200c02056c696d69740661637475616c1c022201010c1945786365656465644d6178466561747572654e616d654c656e220101220001200c02056c696d69740661637475616c1d022201010c0b4d697373696e67526f6c652200001e022201010c1c556e65787065637465644e756d6265724f664d6574686f6441757468220101220001200c0309626c75657072696e740865787065637465640661637475616c1f022201010c174d697373696e674d6574686f645065726d697373696f6e220101220001200c0209626c75657072696e74056964656e7420022201010c1e556e65787065637465644e756d6265724f6646756e6374696f6e41757468220101220001200c0309626c75657072696e740865787065637465640661637475616c21022201010c194d697373696e6746756e6374696f6e5065726d697373696f6e220101220001200c0209626c75657072696e74056964656e7422022201010c23556e65787065637465644e756d6265724f6646756e6374696f6e526f79616c74696573220101220001200c0309626c75657072696e740865787065637465640661637475616c23022201010c164d697373696e6746756e6374696f6e526f79616c7479220101220001200c0209626c75657072696e74056964656e7424022201010c21526f79616c7479416d6f756e744973477265617465725468616e416c6c6f776564220101220001200c02036d61780661637475616c25022201010c12496e76616c69644d657461646174614b657922000026022201010c13526f79616c746965734e6f74456e61626c656422000027022201010c17526f79616c7479416d6f756e7449734e6567617469766522000028022201010c1b5265736572766564526f6c654b657949734e6f74446566696e6564220000022201010c0c507265706172654572726f722201012201012307211800022201010c14446573657269616c697a6174696f6e4572726f7222000001022201010c0f56616c69646174696f6e4572726f7222000002022201010c1253657269616c697a6174696f6e4572726f7222000003022201010c17537461727446756e6374696f6e4e6f74416c6c6f77656422000004022201010c0d496e76616c6964496d706f727422000005022201010c0d496e76616c69644d656d6f727922000006022201010c0c496e76616c69645461626c6522000007022201010c11496e76616c69644578706f72744e616d6522000008022201010c17546f6f4d616e7954617267657473496e42725461626c6522000009022201010c10546f6f4d616e7946756e6374696f6e732200000a022201010c15546f6f4d616e7946756e6374696f6e506172616d732200000b022201010c15546f6f4d616e7946756e6374696f6e4c6f63616c73220101220001200c02036d61780661637475616c0c022201010c0e546f6f4d616e79476c6f62616c73220101220001200c02036d61780763757272656e740d022201010c0f4e6f4578706f727453656374696f6e2200000e022201010c0d4d697373696e674578706f7274220101220001200c010b6578706f72745f6e616d650f022201010c144e6f5363727970746f416c6c6f634578706f727422000010022201010c134e6f5363727970746f467265654578706f727422000011022201010c1d52656a65637465644279496e737472756374696f6e4d65746572696e67220101220001200c0106726561736f6e12022201010c1752656a65637465644279537461636b4d65746572696e67220101220001200c0106726561736f6e13022201010c114e6f74496e7374616e7469617461626c65220101220001200c0106726561736f6e14022201010c0d4e6f74436f6d70696c61626c6522000015022201010c0f4d6f64756c65496e666f4572726f7222000016022201010c0f5761736d5061727365724572726f7222000017022201010c084f766572666c6f77220000022201010c0d496e76616c6964496d706f72742201012201012307210300022201010c10496d706f72744e6f74416c6c6f77656422000001022201010c1750726f746f636f6c56657273696f6e4d69736d61746368220101220001200c03046e616d650f63757272656e745f76657273696f6e1065787065637465645f76657273696f6e02022201010c13496e76616c696446756e6374696f6e54797065220000022201010c0d496e76616c69644d656d6f72792201012201012307210500022201010c144d697373696e674d656d6f727953656374696f6e22000001022201010c124e6f4d656d6f7279446566696e6974696f6e22000002022201010c17546f6f4d616e794d656d6f7279446566696e6974696f6e22000003022201010c174d656d6f727953697a654c696d6974457863656564656422000004022201010c114d656d6f72794e6f744578706f72746564220000022201010c0c496e76616c69645461626c652201012201012307210200022201010c104d6f72655468616e4f6e655461626c6522000001022201010c1d496e697469616c5461626c6553697a654c696d69744578636565646564220000022201010c15536368656d6156616c69646174696f6e4572726f722201012201012307211600022201010c164d657461646174614c656e6774684d69736d6174636822000001022201010c1956616c69646174696f6e734c656e6774684d69736d6174636822000002022201010c14547970654b696e645475706c65546f6f4c6f6e67220101220001200c01086d61785f73697a6503022201010c1a547970654b696e64456e756d56617269616e74546f6f4c6f6e67220101220001200c01086d61785f73697a6504022201010c1f547970654b696e64496e76616c6964536368656d614c6f63616c496e64657822000005022201010c1d547970654b696e64496e76616c696457656c6c4b6e6f776e496e64657822000006022201010c29547970654d65746164617461436f6e7461696e6564556e65787065637465644368696c644e616d657322000007022201010c28547970654d65746164617461436f6e7461696e65644475706c69636174654669656c644e616d657322000008022201010c30547970654d657461646174614669656c644e616d65436f756e74446f65734e6f744d617463684669656c64436f756e7422000009022201010c2b547970654d65746164617461436f6e7461696e6564556e6578706563746564456e756d56617269616e74732200000a022201010c2a547970654d65746164617461436f6e7461696e6564556e65787065637465644e616d65644669656c64732200000b022201010c2a547970654d65746164617461436f6e7461696e656457726f6e674e756d6265724f6656617269616e74732200000c022201010c1e547970654d65746164617461456e756d4e616d65497352657175697265642200000d022201010c25547970654d65746164617461456e756d56617269616e744e616d65497352657175697265642200000e022201010c2d547970654d65746164617461466f72456e756d49734e6f74456e756d56617269616e744368696c644e616d65732200000f022201010c2b547970654d657461646174614861734d69736d61746368696e67456e756d4469736372696d696e61746f7222000010022201010c2e547970654d65746164617461436f6e7461696e65644475706c6963617465456e756d56617269616e744e616d657322000011022201010c10496e76616c69644964656e744e616d65220101220001200c01076d65737361676512022201010c165479706556616c69646174696f6e4d69736d6174636822000013022201010c265479706556616c69646174696f6e4e756d6572696356616c69646174696f6e496e76616c696422000014022201010c255479706556616c69646174696f6e4c656e67746856616c69646174696f6e496e76616c696422000015022201010c225479706556616c69646174696f6e4174746163686564546f437573746f6d54797065220000022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c15436f6e73656e7375734d616e616765724572726f722201012201012307210a00022201010c12496e76616c6964526f756e64557064617465220101220001200c020466726f6d02746f01022201010c1e496e76616c696450726f706f73657254696d657374616d70557064617465220101220001200c020b66726f6d5f6d696c6c697309746f5f6d696c6c697302022201010c15496e636f6e73697374656e74476170526f756e6473220101220001200c020a6761705f726f756e64731170726f677265737365645f726f756e647303022201010c15496e76616c696456616c696461746f72496e646578220101220001200c0205696e64657805636f756e7404022201010c0e416c72656164795374617274656422000005022201010c064e6f7458726422000006022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f7222000007022201010c1145706f63684d6174684f766572666c6f7722000008022201010c14496e76616c6964436f6e73656e73757354696d6522000009022201010c16457863656564656456616c696461746f72436f756e74220101220001200c020763757272656e74036d6178022201010c05526f756e64220000022201010c0e56616c696461746f724572726f722201012201012307210900022201010c14496e76616c6964436c61696d5265736f7572636522000001022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e7422000002022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f7222000003022201010c1c45706f6368556e6c6f636b4861734e6f744f6363757272656459657422000004022201010c2750656e64696e674f776e65725374616b655769746864726177616c4c696d69745265616368656422000005022201010c19496e76616c696456616c696461746f72466565466163746f7222000006022201010c2556616c696461746f7249734e6f74416363657074696e6744656c6567617465645374616b6522000007022201010c20496e76616c696450726f746f636f6c56657273696f6e4e616d654c656e677468220101220001200c020865787065637465640661637475616c08022201010c1145706f63684d6174684f766572666c6f77220000022201010c1c46756e6769626c655265736f757263654d616e616765724572726f722201012201012307210700022201010c0d496e76616c6964416d6f756e7422000001022201010c154d61784d696e74416d6f756e74457863656564656422000002022201010c13496e76616c696444697669736962696c69747922000003022201010c1244726f704e6f6e456d7074794275636b657422000004022201010c0b4e6f744d696e7461626c6522000005022201010c0b4e6f744275726e61626c6522000006022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f72220000022201010c1f4e6f6e46756e6769626c655265736f757263654d616e616765724572726f722201012201012307210b00022201010c184e6f6e46756e6769626c65416c726561647945786973747322000001022201010c134e6f6e46756e6769626c654e6f74466f756e6422000002022201010c17556e6b6e6f776e4d757461626c654669656c644e616d6522000003022201010c1d4e6f6e46756e6769626c65496454797065446f65734e6f744d6174636822000004022201010c18496e76616c69644e6f6e46756e6769626c6549645479706522000005022201010c18496e76616c69644e6f6e46756e6769626c65536368656d6122000006022201010c254e6f6e46756e6769626c654c6f63616c496450726f7669646564466f72525549445479706522000007022201010c1244726f704e6f6e456d7074794275636b657422000008022201010c0b4e6f744d696e7461626c6522000009022201010c0b4e6f744275726e61626c652200000a022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f72220000022201010c114e6f6e46756e6769626c654964547970652201012201012307210400022201010c06537472696e6722000001022201010c07496e746567657222000002022201010c05427974657322000003022201010c0452554944220000022201010c18496e76616c69644e6f6e46756e6769626c65536368656d612201012201012307210500022201010c15536368656d6156616c69646174696f6e4572726f7222000001022201010c12496e76616c69644c6f63616c54797065496422000002022201010c094e6f74415475706c6522000003022201010c114d697373696e674669656c644e616d657322000004022201010c184d757461626c654669656c64446f65734e6f744578697374220000022201010c0b4275636b65744572726f722201012201012307210500022201010c0d5265736f757263654572726f7222000001022201010c0a50726f6f664572726f7222000002022201010c064c6f636b656422000003022201010c0d496e76616c6964416d6f756e7422000004022201010c0f446563696d616c4f766572666c6f77220000022201010c0d5265736f757263654572726f722201012201012307210400022201010c13496e73756666696369656e7442616c616e6365220101220001200c02097265717565737465640661637475616c01022201010c11496e76616c696454616b65416d6f756e7422000002022201010c194d697373696e674e6f6e46756e6769626c654c6f63616c496422000003022201010c0f446563696d616c4f766572666c6f77220000022201010c0a50726f6f664572726f722201012201012307210100022201010c14456d70747950726f6f664e6f74416c6c6f776564220000022201010c154e6f6e46756e6769626c655661756c744572726f722201012201012307210300022201010c094d697373696e67496422000001022201010c0f4e6f74456e6f756768416d6f756e7422000002022201010c0f446563696d616c4f766572666c6f77220000022201010c0a5661756c744572726f722201012201012307210900022201010c0d5265736f757263654572726f7222000001022201010c0a50726f6f664572726f7222000002022201010c0d496e76616c6964416d6f756e7422000003022201010c0c4e6f74467265657a61626c6522000004022201010c0d4e6f74526563616c6c61626c6522000005022201010c0d5661756c74497346726f7a656e22000006022201010c144c6f636b4665654e6f745261646978546f6b656e22000007022201010c1a4c6f636b466565496e73756666696369656e7442616c616e6365220101220001200c02097265717565737465640661637475616c08022201010c0f446563696d616c4f766572666c6f77220000022201010c0c576f726b746f704572726f722201012201012307210200022201010c0f417373657274696f6e4661696c656422000001022201010c13496e73756666696369656e7442616c616e6365220000022201010c0d417574685a6f6e654572726f722201012201012307210100022201010c11436f6d706f736550726f6f664572726f72220000022201010c11436f6d706f736550726f6f664572726f722201012201012307210400022201010c204e6f6e46756e6769626c654f7065726174696f6e4e6f74537570706f7274656422000001022201010c16496e73756666696369656e744261736550726f6f667322000002022201010c0d496e76616c6964416d6f756e7422000003022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f72220000022201010c0c4163636f756e744572726f722201012201012307210400022201010c115661756c74446f65734e6f744578697374220101220001200c01107265736f757263655f6164647265737301022201010c134465706f7369744973446973616c6c6f776564220101220001200c01107265736f757263655f6164647265737302022201010c1d4e6f74416c6c4275636b657473436f756c6442654465706f736974656422000003022201010c184e6f74416e417574686f72697a65644465706f7369746f72220101220001200c01096465706f7369746f72022201010c15416363657373436f6e74726f6c6c65724572726f722201012201012307210a00022201010c244f7065726174696f6e5265717569726573556e6c6f636b65645072696d617279526f6c6522000001022201010c0c54696d654f766572666c6f7722000002022201010c205265636f76657279416c7265616479457869737473466f7250726f706f736572220101220001200c010870726f706f73657203022201010c1b4e6f5265636f76657279457869737473466f7250726f706f736572220101220001200c010870726f706f73657204022201010c2c42616467655769746864726177417474656d7074416c7265616479457869737473466f7250726f706f736572220101220001200c010870726f706f73657205022201010c274e6f42616467655769746864726177417474656d7074457869737473466f7250726f706f736572220101220001200c010870726f706f73657206022201010c164e6f54696d65645265636f766572696573466f756e6422000007022201010c1f54696d65645265636f7665727944656c61794861734e6f74456c617073656422000008022201010c185265636f7665727950726f706f73616c4d69736d61746368220101220001200c0208657870656374656405666f756e6409022201010c0d4e6f5872644665655661756c74220000022201010c0850726f706f7365722201012201012307210200022201010c075072696d61727922000001022201010c085265636f76657279220000022201010c105265636f7665727950726f706f73616c220101220001200c020872756c655f7365741f74696d65645f7265636f766572795f64656c61795f696e5f6d696e75746573022201010c0752756c65536574220101220001200c030c7072696d6172795f726f6c650d7265636f766572795f726f6c6511636f6e6669726d6174696f6e5f726f6c65022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c054572726f722201012201012307210900022201010c224e6f6e46756e6769626c655265736f75726365734172654e6f744163636570746564220101220001200c01107265736f757263655f6164647265737301022201010c244e6f6e5a65726f506f6f6c556e6974537570706c794275745a65726f526573657276657322000002022201010c17496e76616c6964506f6f6c556e69745265736f75726365220101220001200c020865787065637465640661637475616c03022201010c1e436f6e747269627574696f6e4f66456d7074794275636b65744572726f7222000004022201010c14446563696d616c4f766572666c6f774572726f7222000005022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e7422000006022201010c135a65726f506f6f6c556e6974734d696e74656422000007022201010c1252656465656d65645a65726f546f6b656e7322000008022201010c1b5265736f75726365446f65734e6f7442656c6f6e67546f506f6f6c220101220001200c01107265736f757263655f61646472657373022201010c054572726f722201012201012307210a00022201010c224e6f6e46756e6769626c655265736f75726365734172654e6f744163636570746564220101220001200c01107265736f757263655f6164647265737301022201010c244e6f6e5a65726f506f6f6c556e6974537570706c794275745a65726f526573657276657322000002022201010c17496e76616c6964506f6f6c556e69745265736f75726365220101220001200c020865787065637465640661637475616c03022201010c1b5265736f75726365446f65734e6f7442656c6f6e67546f506f6f6c220101220001200c01107265736f757263655f6164647265737304022201010c1c506f6f6c4372656174696f6e5769746853616d655265736f7572636522000005022201010c1e436f6e747269627574696f6e4f66456d7074794275636b65744572726f7222000006022201010c14446563696d616c4f766572666c6f774572726f7222000007022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e7422000008022201010c135a65726f506f6f6c556e6974734d696e74656422000009022201010c254c6172676572436f6e747269627574696f6e5265717569726564546f4d656574526174696f220000022201010c054572726f722201012201012307210d00022201010c224e6f6e46756e6769626c655265736f75726365734172654e6f744163636570746564220101220001200c01107265736f757263655f6164647265737301022201010c244e6f6e5a65726f506f6f6c556e6974537570706c794275745a65726f526573657276657322000002022201010c17496e76616c6964506f6f6c556e69745265736f75726365220101220001200c020865787065637465640661637475616c03022201010c1b5265736f75726365446f65734e6f7442656c6f6e67546f506f6f6c220101220001200c01107265736f757263655f6164647265737304022201010c154d697373696e674f72456d7074794275636b657473220101220001200c01127265736f757263655f61646472657373657305022201010c1c506f6f6c4372656174696f6e5769746853616d655265736f7572636522000006022201010c1e436f6e747269627574696f6e4f66456d7074794275636b65744572726f7222000007022201010c2543616e74437265617465506f6f6c576974684c6573735468616e4f6e655265736f7572636522000008022201010c14446563696d616c4f766572666c6f774572726f7222000009022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e742200000a022201010c0e4e6f4d696e696d756d526174696f2200000b022201010c135a65726f506f6f6c556e6974734d696e7465642200000c022201010c254c6172676572436f6e747269627574696f6e5265717569726564546f4d656574526174696f22000002220000220000022201010c155472616e73616374696f6e46656553756d6d617279220101220001200c0723746f74616c5f657865637574696f6e5f636f73745f756e6974735f636f6e73756d656426746f74616c5f66696e616c697a6174696f6e5f636f73745f756e6974735f636f6e73756d65641b746f74616c5f657865637574696f6e5f636f73745f696e5f7872641e746f74616c5f66696e616c697a6174696f6e5f636f73745f696e5f78726419746f74616c5f74697070696e675f636f73745f696e5f78726419746f74616c5f73746f726167655f636f73745f696e5f78726419746f74616c5f726f79616c74795f636f73745f696e5f787264022201010c09466565536f75726365220101220001200c010d706179696e675f7661756c747302220000220000022201010c0e46656544657374696e6174696f6e220101220001200c040b746f5f70726f706f73657210746f5f76616c696461746f725f73657407746f5f6275726e15746f5f726f79616c74795f726563697069656e747302220000220000022201010c10526f79616c7479526563697069656e742201012201012307210200022201010c075061636b61676522000001022201010c09436f6d706f6e656e74220000022201010c11436f7374696e67506172616d6574657273220101220001200c0819657865637574696f6e5f636f73745f756e69745f707269636519657865637574696f6e5f636f73745f756e69745f6c696d697418657865637574696f6e5f636f73745f756e69745f6c6f616e1c66696e616c697a6174696f6e5f636f73745f756e69745f70726963651c66696e616c697a6174696f6e5f636f73745f756e69745f6c696d6974097573645f70726963651373746174655f73746f726167655f707269636515617263686976655f73746f726167655f7072696365022201010c235472616e73616374696f6e436f7374696e67506172616d657465727352656365697074220101220001200c020e7469705f70657263656e7461676512667265655f6372656469745f696e5f7872640222000022000002220000220000022201010c054c6576656c2201012201012307210500022201010c054572726f7222000001022201010c045761726e22000002022201010c04496e666f22000003022201010c05446562756722000004022201010c055472616365220000022201010c12537461746555706461746553756d6d617279220101220001200c050c6e65775f7061636b616765730e6e65775f636f6d706f6e656e74730d6e65775f7265736f75726365730a6e65775f7661756c7473157661756c745f62616c616e63655f6368616e6765730222000022000002220000220000022200002200000222000022000002220000220000022201010c0d42616c616e63654368616e67652201012201012307210200022201010c0846756e6769626c6522000001022201010c0b4e6f6e46756e6769626c65220101220001200c020561646465640772656d6f76656402220000220000022200002200000222000022000002220000220000022201010c17537562737461746553797374656d5374727563747572652201012201012307210700022201010c0b53797374656d4669656c6422000001022201010c0c53797374656d536368656d6122000002022201010c124b657956616c756553746f7265456e74727922000003022201010c0b4f626a6563744669656c6422000004022201010c1c4f626a6563744b657956616c7565506172746974696f6e456e74727922000005022201010c194f626a656374496e646578506172746974696f6e456e74727922000006022201010c1f4f626a656374536f72746564496e646578506172746974696f6e456e747279220000022201010c1453797374656d4669656c64537472756374757265220101220001200c010a6669656c645f6b696e64022201010c0f53797374656d4669656c644b696e642201012201012307210400022201010c0854797065496e666f22000001022201010c06566d426f6f7422000002022201010c0a53797374656d426f6f7422000003022201010c0a4b65726e656c426f6f74220000022201010c1b4b657956616c756553746f7265456e747279537472756374757265220101220001200c02106b65795f66756c6c5f747970655f69641276616c75655f66756c6c5f747970655f6964022201010c1146756c6c7953636f706564547970654964220000022201010c0e4669656c64537472756374757265220101220001200c010c76616c75655f736368656d61022201010c1b4f626a6563745375627374617465547970655265666572656e63652201012201012307210200022201010c075061636b61676522000001022201010c0e4f626a656374496e7374616e6365220000022201010c145061636b616765547970655265666572656e6365220101220001200c010c66756c6c5f747970655f6964022201010c1146756c6c7953636f706564547970654964220000022201010c1b4f626a656374496e7374616e6365547970655265666572656e6365220101220001200c0210696e7374616e63655f747970655f6964157265736f6c7665645f66756c6c5f747970655f6964022201010c1f4b657956616c7565506172746974696f6e456e747279537472756374757265220101220001200c020a6b65795f736368656d610c76616c75655f736368656d61022201010c1c496e646578506172746974696f6e456e747279537472756374757265220101220001200c020a6b65795f736368656d610c76616c75655f736368656d61022201010c22536f72746564496e646578506172746974696f6e456e747279537472756374757265220101220001200c020a6b65795f736368656d610c76616c75655f736368656d6102220000220000022201010c134576656e74547970654964656e746966696572220000022201010c07456d69747465722201012201012307210200022201010c0846756e6374696f6e22000001022201010c064d6574686f64220000022201010c144576656e7453797374656d537472756374757265220101220001200c01167061636b6167655f747970655f7265666572656e6365022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c1045706f63684368616e67654576656e74220101220001200c030565706f63680d76616c696461746f725f736574257369676e69666963616e745f70726f746f636f6c5f7570646174655f72656164696e657373022201010c0545706f6368220000022201010c1241637469766556616c696461746f72536574220000022201010c0956616c696461746f72220101220001200c02036b6579057374616b65022200002200002022a501000000000000000000000000000000000c012102220101091e000000220101091e0000000000000000000000000000000000000000000000000000000000000000000c01210222010109020000002201010902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0121022201010920000000220101092000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c012102220101092000000022010109200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002201010a0000000000000000 \ No newline at end of file diff --git a/radix-engine/src/transaction/node_local_transaction_execution_v1_cuttlefish.txt b/radix-engine/src/transaction/node_local_transaction_execution_v1_cuttlefish.txt deleted file mode 100644 index e6a5f13e12c..00000000000 --- a/radix-engine/src/transaction/node_local_transaction_execution_v1_cuttlefish.txt +++ /dev/null @@ -1 +0,0 @@ -5c210222000121032022a5010e0120220c01010a010000000000000001010a780000000000000001010a790000000000000001010a7b0000000000000001010a7e0000000000000001010a7f0000000000000001010a800000000000000001010a830000000000000001010a8b0000000000000001010a8d0000000000000001010a9b0000000000000001010a9f000000000000000f01230720020022010001074201220101010a02000000000000000f012307200700220101010a030000000000000001220101010a230000000000000002220101010a3c0000000000000003220101010a490000000000000004220101010a4b0000000000000005220101010a4f0000000000000006220101010a44000000000000000f012307200400220101010a040000000000000001220101010a21000000000000000222010001070903220101010a22000000000000000f012307201000220101010a050000000000000001220101010a060000000000000002220101010a090000000000000003220101010a0f0000000000000004220101010a100000000000000005220101010a110000000000000006220101010a140000000000000007220101010a150000000000000008220101010a190000000000000009220101010a1a000000000000000a220101010a1b000000000000000b220101010a1c000000000000000c220101010a1d000000000000000d220101010a1e000000000000000e220101010a1f000000000000000f220101010a20000000000000000f012307200100220101010a06000000000000000f012307200400220101010a070000000000000001220101010a080000000000000002220101010a080000000000000003220101010a08000000000000000f012307200200220101010a080000000000000001220101010a08000000000000000d0122000107070f012307200300220101010a0a0000000000000001220101010a0c0000000000000002220101010a0e000000000000000f012307200600220101010a070000000000000001220101010a080000000000000002220101010a080000000000000003220101010a080000000000000004220101010a080000000000000005220101010a0b000000000000000f012307200300220101010a080000000000000001220101010a080000000000000002220101010a08000000000000000f012307200400220101010a080000000000000001220101010a0d000000000000000222000322000f012307200f0022010001070a0122020001070a0001070a02220200010707000107070322020001070700010707042201000107070522020001070a0001070a06220200010707000107070722010001070708220100010707092201000107070a22000b22000c22010001070a0d22000e22000f01230720010022000f012307200400220101010a070000000000000001220101010a080000000000000002220101010a080000000000000003220101010a0a000000000000000f012307200100220101010a08000000000000000f012307200600220101010a080000000000000001220101010a120000000000000002220101010a080000000000000003220101010a0b0000000000000004220101010a08000000000000000522000f012307200200220101010a080000000000000001220101010a130000000000000007000f012307200100220101010a08000000000000000f012307200800220101010a080000000000000001220002220003220101010a0c0000000000000004220301010a080000000000000001010a130000000000000001010a160000000000000005220006220301010a080000000000000001010a130000000000000001010a160000000000000007220301010a080000000000000001010a130000000000000001010a16000000000000000f0123072003002201000107070122010001074102220101010a17000000000000000e0120220201010a1800000000000000000107410d0122000107070f01230720020022010001070901220101010a08000000000000000f0123072001002201000107090f01230720040022010001070901220101010a0a0000000000000002220003220101010a0e000000000000000f012307200200220101010a080000000000000001220101010a0c000000000000000f012307200300220101010a080000000000000001220101010a080000000000000002220101010a0c000000000000000f012307200300220101010a080000000000000001220101010a080000000000000002220101010a0c000000000000000f012307200300220101010a080000000000000001220301010a080000000000000001010a130000000000000001010a160000000000000002220101010a0c000000000000000f012307200300220101010a080000000000000001220301010a080000000000000001010a130000000000000001010a160000000000000002220101010a0c000000000000000f01230720010022000d012201010a08000000000000000f01230720300022000122000222000322000422000522000622000722000822000922000a22000b22000c22000d22000e22000f220010220101010a240000000000000011220201010a29000000000000000001070712220201010a29000000000000000001070713220401010a29000000000000000001070701010a340000000000000001010a34000000000000001422001522020001070900010707162201000107f11722001822001922001a220101010a35000000000000001b2201000107f01c22001d22001e220101010a36000000000000001f220101010a37000000000000002022002122010001070c22220023220101010a380000000000000024220101010a380000000000000025220101010a390000000000000026220101010a3b000000000000002722002822002922002a22002b22010001070c2c22010001070c2d22002e22010001070c2f22010001070a0f01230720090022020001070a0001070a01220101010a250000000000000002220101010a270000000000000003220201010a28000000000000000001070704220201010a280000000000000001010a310000000000000005220301010a280000000000000001010a31000000000000000001070c06220201010a33000000000000000001070c0722000822000f012307200200220101010a26000000000000000122010001070a07000e01202203000107830001070c0001070c0e0120220501010a290000000000000001010a2a0000000000000001010a2b0000000000000001010a2c0000000000000001010a2d000000000000000e01202202000107830001070c0e012022030001070900010709000107090f0123072002002201000107810122000d01220001070c0d012201010a2e000000000000000f012307200200220101010a2f0000000000000001220101010a27000000000000000e0120220201010a300000000000000001010a25000000000000000d0122000107070f01230720060022020001070c01010a32000000000000000122010001070c022201000107070322020001070701010a33000000000000000422020001070701010a33000000000000000522020001070701010a33000000000000000f01230720020022000122000f01230720020022000122000f01230720030022000122000222000f01230720030022000122000222000e0120220201010a290000000000000001010a29000000000000000f01230720060022010001070c01220201010a29000000000000000001070702220201010a29000000000000000001070703220201010a29000000000000000001070704220201010a29000000000000000001070c0522010001070c0e01202203000107830001070c01010a2a000000000000000e01202203000107830001070c01010a3a000000000000000f0123072002002200012201000107830e0120220401010a0800000000000000000107830001070c01010a3a000000000000000f012307200400220101010a3d0000000000000001220101010a440000000000000002220101010a470000000000000003220101010a48000000000000000f012307200600220101010a3e0000000000000001220101010a3e0000000000000002220101010a080000000000000003220101010a3f000000000000000422010001070c0522000e0120220201010a29000000000000000001070c0e0120220201010a400000000000000001010a3e000000000000000f012307200200220101010a410000000000000001220101010a43000000000000000d012201010a42000000000000000e01202202000107e701010a43000000000000000d0122000107e00f012307200100220101010a45000000000000000f0123072005002202000107c0000107c0012200022203000107090001070900010709032201000107c004220101010a46000000000000000f01230720010022000f012307200b0022010001070a0122010001070a0222010001070a0322000422020001070a0001070a0522020001070a0001070a0622020001070a0001070a0722020001070a0001070a0822020001070a0001070a0922000a22000f012307200400220201010a29000000000000000001070c0122010001070c0222000322000f01230720080022000122010001070c0222010001070c03220101010a4a0000000000000004220101010a0d000000000000000522020001070c0001070c06220101010a0d000000000000000722020001070c0001070c0f01230720030022000122000222000f012307200300220101010a4c0000000000000001220101010a4d0000000000000002220101010a4e000000000000000f01230720020022000122030001070c000107400001070c0f012307201b0022010001070c0122000222000322010001070c0422000522010001070906220101010a0d000000000000000722000822000922000a2201000107090b2201000107090c220101010a0d000000000000000d220101010a0d000000000000000e220101010a0d000000000000000f220101010a0d0000000000000010220101010a0d0000000000000011220012220101010a0d0000000000000013220101010a45000000000000001422010001070915220016220017220101010a0d0000000000000018220101010a0d0000000000000019220101010a0d000000000000001a22000f01230720010022010001070a0f01230720170022010001070c01220101010a0d000000000000000222010001070c03220101010a500000000000000004220101010a520000000000000005220101010a540000000000000006220101010a550000000000000007220101010a580000000000000008220101010a5f0000000000000009220101010a61000000000000000a220101010a62000000000000000b220101010a63000000000000000c220101010a66000000000000000d220101010a68000000000000000e220101010a69000000000000000f220101010a6a0000000000000010220101010a6b0000000000000011220101010a6c0000000000000012220101010a6e0000000000000013220101010a6f0000000000000014220101010a740000000000000015220101010a750000000000000016220101010a76000000000000000f01230720080022010001070c0122000222020001070a0001070a03220004220005220101010a51000000000000000622000722000f01230720020022000122030001070c0001070c0001070a0f01230720040022020001070a0001070a0122020001070a0001070a02220101010a0d0000000000000003220101010a53000000000000000f01230720020022010001070c0122010001070c0f0123072003002202000107f2000107f2012200022201000107f20f012307200d0022010001070901220100010709022201000107090322010001070904220101010a560000000000000005220101010a0d0000000000000006220101010a0d0000000000000007220101010a080000000000000008220101010a08000000000000000922000a220101010a0d000000000000000b220101010a57000000000000000c22000d0122000107070f01230720050022010001070a0122020001070a0001070a0222020001070700010707032202000107070001070704220200010707000107070f012307202900220101010a590000000000000001220101010a5d000000000000000222000322010001070c04220005220006220101010a25000000000000000722020001070c01010a5e000000000000000822020001070c01010a5e000000000000000922000a22000b22000c220101010a51000000000000000d22000e22010001070c0f220101010a2500000000000000102201000107071122001222020001070c0001070c13220101010a50000000000000001422001522020001070c000107e71622020001070a0001070a1722020001070a0001070a1822020001070a0001070a1922020001070a0001070a1a22020001070a0001070a1b22020001070a0001070a1c22020001070a0001070a1d2201000107e71e22030001070c0001070a0001070a1f22020001070c0001070c2022030001070c0001070a0001070a2122020001070c0001070c2222030001070c0001070a0001070a2322020001070c0001070c242202000107f2000107f22522010001070c262200272201000107f22822010001070c0f01230720180022000122010001070c02220003220004220101010a5a0000000000000005220101010a5b0000000000000006220101010a5c000000000000000722010001070c0822000922000a22000b220200010709000107090c220200010709000107090d22000e22010001070c0f22001022001122010001070c1222010001070c1322010001070c1422001522010001070c1622010001070c1722000f01230720030022010001070c0122030001070c0001070a0001070a0222010001070c0f01230720050022000122000222000322000422000f01230720020022000122000f01230720160022000122000222010001070a0322010001070a0422000522000622000722000822000922000a22000b22000c22000d22000e22000f22001022001122010001070c1222001322001422001522000f01230720020022000122010001070c0f012307200a00220201010a600000000000000001010a600000000000000001220200010705000107050222020001070a0001070a032202000107070001070a0422000522000622000722000822010001070509220200010709000107090a000f01230720090022000122000222000322000422000522000622000722020001070a0001070a0822000f0123072007002202000107c000010707012200022201000107070322000422000522000622000f012307200b002201000107c3012201000107c30222010001070c03220201010a640000000000000001010a640000000000000004220005220101010a65000000000000000622000722000822000922000a22000f01230720040022000122000222000322000f012307200500220101010a5d000000000000000122000222000322000422010001070c0f012307200500220101010a670000000000000001220101010a680000000000000002220101010a0800000000000000032201000107c00422000f0123072004002202000107c0000107c0012200022201000107c20322000f01230720010022000f0123072003002201000107c20122000222000f012307200900220101010a670000000000000001220101010a6800000000000000022201000107c0032200042200052200062200072202000107c0000107c00822000f01230720020022000122000f012307200100220101010a6d000000000000000f01230720040022000122000222000322000f01230720040022010001078501220100010785022200032201000107e40f012307200a00220001220002220101010a700000000000000003220101010a700000000000000004220101010a700000000000000005220101010a700000000000000006220007220008220201010a710000000000000001010a71000000000000000922000f01230720020022000122000e0120220201010a720000000000000001010a73000000000000000e01202203000107e0000107e0000107e00f0123072002002200012201000107090f0123072009002201000107850122000222020001078500010785032200042200052200062200072200082201000107850f012307200a002201000107850122000222020001078500010785032201000107850422000522000622000722000822000922000f012307200d0022010001078501220002220200010785000107850322010001078504220101010a77000000000000000522000622000722000822000922000a22000b22000c22000d0122000107850e012022070001070900010709000107c0000107c0000107c0000107c0000107c00e0120220101010a7a0000000000000010022201010a080000000000000022000107c00e01202204000107c0000107c0000107c001010a7c0000000000000010022201010a7d0000000000000022000107c00f01230720020022020001078301010a08000000000000000122020001078401010a08000000000000000e01202208000107c00001070900010709000107c000010709000107c0000107c0000107c00e0120220200010708000107c00d012201010a81000000000000000e0120220201010a82000000000000000001070c0f01230720050022000122000222000322000422000e0120220501010a840000000000000001010a850000000000000001010a770000000000000001010a860000000000000001010a87000000000000000d0122000107830d0122000107840d01220001078210022201010a08000000000000002201010a88000000000000000e012022020001078501010a89000000000000000f0123072002002201000107c001220201010a8a0000000000000001010a8a000000000000000d0122000107c2100222000107812201010a8c00000000000000100222000107852201010a89000000000000000d012201010a8e000000000000000f012307200700220101010a8f0000000000000001220002220101010a910000000000000003220101010a930000000000000004220101010a980000000000000005220101010a990000000000000006220101010a9a000000000000000e0120220101010a90000000000000000f01230720040022000122000222000322000e0120220201010a920000000000000001010a92000000000000000e0120220301010a080000000000000001010a300000000000000001010a25000000000000000e0120220101010a94000000000000000f012307200200220101010a950000000000000001220101010a97000000000000000e0120220101010a96000000000000000e012022030001078301010a300000000000000001010a25000000000000000e012022020001070701010a92000000000000000e0120220201010a940000000000000001010a94000000000000000e0120220201010a940000000000000001010a94000000000000000e0120220201010a940000000000000001010a940000000000000010022201010a9c000000000000002201010a9e000000000000000e0120220201010a9d000000000000000001070c0f012307200200220101010a290000000000000001220201010a0800000000000000000107f00e0120220101010a95000000000000000f012307200200220001220101010aa0000000000000000e0120220301010aa10000000000000001010aa20000000000000001010aa4000000000000000a00100222000107842201010aa3000000000000000e01202202000107d1000107c01002220001070c22000107c02021a501022201010c1b4c6f63616c5472616e73616374696f6e457865637574696f6e5631220101220001200c0c076f7574636f6d650b6665655f73756d6d6172790a6665655f736f757263650f6665655f64657374696e6174696f6e19656e67696e655f636f7374696e675f706172616d65746572731e7472616e73616374696f6e5f636f7374696e675f706172616d6574657273106170706c69636174696f6e5f6c6f67731473746174655f7570646174655f73756d6d61727916676c6f62616c5f62616c616e63655f73756d6d6172791a7375627374617465735f73797374656d5f737472756374757265176576656e74735f73797374656d5f7374727563747572650a6e6578745f65706f6368022201010c06526573756c742201012201012307210200022201010c024f6b22000001022201010c03457272220000022201010c0c52756e74696d654572726f722201012201012307210700022201010c0b4b65726e656c4572726f7222000001022201010c0b53797374656d4572726f7222000002022201010c1153797374656d4d6f64756c654572726f7222000003022201010c1353797374656d557073747265616d4572726f7222000004022201010c07566d4572726f7222000005022201010c104170706c69636174696f6e4572726f7222000006022201010c1846696e616c697a6174696f6e436f7374696e674572726f72220000022201010c0b4b65726e656c4572726f722201012201012307210400022201010c0e43616c6c4672616d654572726f7222000001022201010c114964416c6c6f636174696f6e4572726f7222000002022201010c1a537562737461746548616e646c65446f65734e6f74457869737422000003022201010c0d4f727068616e65644e6f646573220000022201010c0e43616c6c4672616d654572726f722201012201012307211000022201010c104372656174654672616d654572726f7222000001022201010c10506173734d6573736167654572726f7222000002022201010c0f4372656174654e6f64654572726f7222000003022201010c0d44726f704e6f64654572726f7222000004022201010c0c50696e4e6f64654572726f7222000005022201010c124d6f7665506172746974696f6e4572726f7222000006022201010c1a4d61726b5472616e7369656e7453756273746174654572726f7222000007022201010c114f70656e53756273746174654572726f7222000008022201010c12436c6f736553756273746174654572726f7222000009022201010c115265616453756273746174654572726f722200000a022201010c12577269746553756273746174654572726f722200000b022201010c125363616e5375627374617465734572726f722200000c022201010c13447261696e5375627374617465734572726f722200000d022201010c185363616e536f727465645375627374617465734572726f722200000e022201010c115365745375627374617465734572726f722200000f022201010c1452656d6f76655375627374617465734572726f72220000022201010c104372656174654672616d654572726f722201012201012307210100022201010c10506173734d6573736167654572726f72220000022201010c10506173734d6573736167654572726f722201012201012307210400022201010c0d54616b654e6f64654572726f7222000001022201010c11476c6f62616c5265664e6f74466f756e6422000002022201010c114469726563745265664e6f74466f756e6422000003022201010c145472616e7369656e745265664e6f74466f756e64220000022201010c0d54616b654e6f64654572726f722201012201012307210200022201010c0b4f776e4e6f74466f756e6422000001022201010c105375627374617465426f72726f776564220000022201010c064e6f64654964220000022201010c0f4372656174654e6f64654572726f722201012201012307210300022201010c1450726f6365737353756273746174654572726f7222000001022201010c1750726f6365737353756273746174654b65794572726f7222000002022201010c115375627374617465446966664572726f72220000022201010c1450726f6365737353756273746174654572726f722201012201012307210600022201010c0d54616b654e6f64654572726f7222000001022201010c1343616e7444726f704e6f6465496e53746f726522000002022201010c0b5265664e6f74466f756e6422000003022201010c1852656643616e7442654164646564546f537562737461746522000004022201010c164e6f6e476c6f62616c5265664e6f74416c6c6f77656422000005022201010c10506572736973744e6f64654572726f72220000022201010c10506572736973744e6f64654572726f722201012201012307210300022201010c14436f6e7461696e734e6f6e476c6f62616c52656622000001022201010c0c4e6f6465426f72726f77656422000002022201010c1743616e6e6f745065727369737450696e6e65644e6f6465220000022201010c1750726f6365737353756273746174654b65794572726f722201012201012307210400022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0b4465636f64654572726f7222000002022201010c154f776e65644e6f64654e6f74537570706f7274656422000003022201010c184e6f6e476c6f62616c5265664e6f74537570706f72746564220000022201010c0b4465636f64654572726f722201012201012307210f00022201010c124578747261547261696c696e67427974657322000001022201010c0f427566666572556e646572666c6f77220101220001200c020872657175697265640972656d61696e696e6702022201010c17556e65787065637465645061796c6f6164507265666978220101220001200c020865787065637465640661637475616c03022201010c13556e657870656374656456616c75654b696e64220101220001200c020865787065637465640661637475616c04022201010c19556e6578706563746564437573746f6d56616c75654b696e64220101220001200c010661637475616c05022201010c0e556e657870656374656453697a65220101220001200c020865787065637465640661637475616c06022201010c17556e65787065637465644469736372696d696e61746f72220101220001200c020865787065637465640661637475616c07022201010c10556e6b6e6f776e56616c75654b696e6422000008022201010c14556e6b6e6f776e4469736372696d696e61746f7222000009022201010c0b496e76616c6964426f6f6c2200000a022201010c0b496e76616c6964557466382200000b022201010c0b496e76616c696453697a652200000c022201010c104d6178446570746845786365656465642200000d022201010c0c4475706c69636174654b65792200000e022201010c12496e76616c6964437573746f6d56616c7565220000022201010c115375627374617465446966664572726f722201012201012307210100022201010c15436f6e7461696e734475706c69636174654f776e73220000022201010c0d44726f704e6f64654572726f722201012201012307210400022201010c0d54616b654e6f64654572726f7222000001022201010c0c4e6f6465426f72726f77656422000002022201010c105375627374617465426f72726f77656422000003022201010c1450726f6365737353756273746174654572726f72220000022201010c0c50696e4e6f64654572726f722201012201012307210100022201010c0e4e6f64654e6f7456697369626c65220000022201010c124d6f7665506172746974696f6e4572726f722201012201012307210600022201010c104e6f64654e6f74417661696c61626c6522000001022201010c184865617052656d6f7665506172746974696f6e4572726f7222000002022201010c164e6f6e476c6f62616c5265664e6f74416c6c6f77656422000003022201010c10506572736973744e6f64654572726f7222000004022201010c105375627374617465426f72726f77656422000005022201010c194d6f766546726f6d53746f72654e6f745065726d6974746564220000022201010c184865617052656d6f7665506172746974696f6e4572726f722201012201012307210200022201010c0c4e6f64654e6f74466f756e6422000001022201010c0e4d6f64756c654e6f74466f756e64220000022201010c0f506172746974696f6e4e756d626572220000022201010c1a4d61726b5472616e7369656e7453756273746174654572726f722201012201012307210100022201010c0e4e6f64654e6f7456697369626c65220000022201010c114f70656e53756273746174654572726f722201012201012307210800022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0d53756273746174654661756c7422000002022201010c13496e76616c696444656661756c7456616c756522000003022201010c1750726f6365737353756273746174654b65794572726f7222000004022201010c0e53756273746174654c6f636b656422000005022201010c1c4c6f636b556e6d6f646966696564426173654f6e486561704e6f646522000006022201010c1f4c6f636b556e6d6f646966696564426173654f6e4e6577537562737461746522000007022201010c254c6f636b556e6d6f646966696564426173654f6e4f6e557064617465645375627374617465220000022201010c0b53756273746174654b65792201012201012307210300022201010c054669656c6422000001022201010c034d617022000002022201010c06536f727465642200000222000022000002220000220000022201010c12436c6f736553756273746174654572726f722201012201012307210200022201010c0e48616e646c654e6f74466f756e6422000001022201010c105375627374617465426f72726f776564220000022201010c115265616453756273746174654572726f722201012201012307210100022201010c0e48616e646c654e6f74466f756e64220000022201010c12577269746553756273746174654572726f722201012201012307210400022201010c0e48616e646c654e6f74466f756e6422000001022201010c1450726f6365737353756273746174654572726f7222000002022201010c114e6f57726974655065726d697373696f6e22000003022201010c115375627374617465446966664572726f72220000022201010c1643616c6c4672616d655363616e4b6579734572726f722201012201012307210200022201010c0e4e6f64654e6f7456697369626c6522000001022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c1c43616c6c4672616d65447261696e5375627374617465734572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c184e6f6e476c6f62616c5265664e6f74537570706f7274656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c2143616c6c4672616d655363616e536f727465645375627374617465734572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c154f776e65644e6f64654e6f74537570706f7274656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c1943616c6c4672616d6553657453756273746174654572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0e53756273746174654c6f636b656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c1c43616c6c4672616d6552656d6f766553756273746174654572726f722201012201012307210300022201010c0e4e6f64654e6f7456697369626c6522000001022201010c0e53756273746174654c6f636b656422000002022201010c1750726f6365737353756273746174654b65794572726f72220000022201010c114964416c6c6f636174696f6e4572726f722201012201012307210100022201010c074f75744f66494422000002220000220000022201010c0b53797374656d4572726f722201012201012307213000022201010c0d4e6f426c75657072696e74496422000001022201010c104e6f5061636b6167654164647265737322000002022201010c17496e76616c69644163746f72537461746548616e646c6522000003022201010c15496e76616c69644163746f7252656648616e646c6522000004022201010c1d476c6f62616c697a696e675472616e7369656e74426c75657072696e7422000005022201010c19476c6f62616c41646472657373446f65734e6f74457869737422000006022201010c174e6f74416e416464726573735265736572766174696f6e22000007022201010c0b4e6f74416e4f626a65637422000008022201010c114e6f74414b657956616c756553746f726522000009022201010c1b4d6f64756c6573446f6e74486176654f757465724f626a656374732200000a022201010c174163746f724e6f64654964446f65734e6f7445786973742200000b022201010c174f757465724f626a656374446f65734e6f7445786973742200000c022201010c0f4e6f74414669656c6448616e646c652200000d022201010c144e6f74414669656c64577269746548616e646c652200000e022201010c0d526f6f744861734e6f547970652200000f022201010c1841646472657373426563683332456e636f64654572726f7222000010022201010c0e54797065436865636b4572726f7222000011022201010c114669656c64446f65734e6f74457869737422000012022201010c1b436f6c6c656374696f6e496e646578446f65734e6f74457869737422000013022201010c1c436f6c6c656374696f6e496e64657849734f6657726f6e675479706522000014022201010c134b657956616c7565456e7472794c6f636b656422000015022201010c0b4669656c644c6f636b656422000016022201010c184f626a6563744d6f64756c65446f65734e6f74457869737422000017022201010c174e6f74414b657956616c7565456e74727948616e646c6522000018022201010c1c4e6f74414b657956616c7565456e747279577269746548616e646c6522000019022201010c10496e76616c69644c6f636b466c6167732200001a022201010c0f43616e6e6f74476c6f62616c697a652200001b022201010c0d4d697373696e674d6f64756c652200001c022201010c1f496e76616c6964476c6f62616c416464726573735265736572766174696f6e2200001d022201010c1a496e76616c69644368696c644f626a6563744372656174696f6e2200001e022201010c11496e76616c69644d6f64756c65547970652200001f022201010c114372656174654f626a6563744572726f7222000020022201010c12496e76616c696447656e657269634172677322000021022201010c0e496e76616c69644665617475726522000022022201010c1641737365727441636365737352756c654661696c656422000023022201010c15426c75657072696e74446f65734e6f74457869737422000024022201010c184175746854656d706c617465446f65734e6f74457869737422000025022201010c16496e76616c6964476c6f62616c697a6541636365737322000026022201010c11496e76616c696444726f7041636365737322000027022201010c17436f7374696e674d6f64756c654e6f74456e61626c656422000028022201010c14417574684d6f64756c654e6f74456e61626c656422000029022201010c225472616e73616374696f6e52756e74696d654d6f64756c654e6f74456e61626c65642200002a022201010c1e466f72636557726974654576656e74466c6167734e6f74416c6c6f7765642200002b022201010c15426c75657072696e74547970654e6f74466f756e642200002c022201010c08426c734572726f722200002d022201010c0e496e70757444617461456d7074792200002e022201010c0b53797374656d50616e69632200002f022201010c1d43616e6e6f744c6f636b466565496e4368696c64537562696e74656e74220000022201010c0e54797065436865636b4572726f722201012201012307210900022201010c1a496e76616c69644e756d6265724f6647656e6572696341726773220101220001200c020865787065637465640661637475616c01022201010c12496e76616c69644c6f63616c54797065496422000002022201010c1e496e76616c6964426c75657072696e74547970654964656e74696669657222000003022201010c16496e76616c6964436f6c6c656374696f6e496e64657822000004022201010c1c426c75657072696e745061796c6f6164446f65734e6f74457869737422000005022201010c1f426c75657072696e745061796c6f616456616c69646174696f6e4572726f7222000006022201010c234b657956616c756553746f72655061796c6f616456616c69646174696f6e4572726f7222000007022201010c16496e7374616e6365536368656d614e6f74466f756e6422000008022201010c0d4d697373696e67536368656d61220000022201010c0b4c6f63616c5479706549642201012201012307210200022201010c0957656c6c4b6e6f776e22000001022201010c10536368656d614c6f63616c496e646578220000022201010c0f57656c6c4b6e6f776e547970654964220000022201010c17426c75657072696e74547970654964656e746966696572220101220001200c030f7061636b6167655f616464726573730e626c75657072696e745f6e616d6509747970655f6e616d65022201010c0d426c75657072696e74496e666f220101220001200c050c626c75657072696e745f696411626c75657072696e745f76657273696f6e0e6f757465725f6f626a5f696e666f0866656174757265731567656e657269635f737562737469747574696f6e73022201010c0b426c75657072696e744964220101220001200c020f7061636b6167655f616464726573730e626c75657072696e745f6e616d65022201010c10426c75657072696e7456657273696f6e220101220001200c03056d616a6f72056d696e6f72057061746368022201010c0f4f757465724f626a656374496e666f2201012201012307210200022201010c04536f6d65220101220001200c010c6f757465725f6f626a65637401022201010c044e6f6e652200000222000022000002220000220000022201010c1347656e65726963537562737469747574696f6e2201012201012307210200022201010c054c6f63616c22000001022201010c0652656d6f7465220000022201010c0c53636f706564547970654964220000022201010c0a536368656d6148617368220000022201010c1a426c75657072696e745061796c6f61644964656e7469666965722201012201012307210600022201010c0846756e6374696f6e22000001022201010c054576656e7422000002022201010c054669656c6422000003022201010c0d4b657956616c7565456e74727922000004022201010c0a496e646578456e74727922000005022201010c10536f72746564496e646578456e747279220000022201010c0d496e7075744f724f75747075742201012201012307210200022201010c05496e70757422000001022201010c064f7574707574220000022201010c0a4b65794f7256616c75652201012201012307210200022201010c034b657922000001022201010c0556616c7565220000022201010c16426c75657072696e74506172746974696f6e547970652201012201012307210300022201010c124b657956616c7565436f6c6c656374696f6e22000001022201010c0f496e646578436f6c6c656374696f6e22000002022201010c15536f72746564496e646578436f6c6c656374696f6e220000022201010c1443616e6e6f74476c6f62616c697a654572726f722201012201012307210300022201010c0b4e6f74416e4f626a65637422000001022201010c11416c7265616479476c6f62616c697a656422000002022201010c12496e76616c6964426c75657072696e744964220000022201010c11496e76616c69644d6f64756c6554797065220101220001200c021265787065637465645f626c75657072696e741061637475616c5f626c75657072696e74022201010c114372656174654f626a6563744572726f722201012201012307210600022201010c11426c75657072696e744e6f74466f756e6422000001022201010c18496e76616c69644669656c64447565546f4665617475726522000002022201010c0c4d697373696e674669656c6422000003022201010c11496e76616c69644669656c64496e64657822000004022201010c15536368656d6156616c69646174696f6e4572726f7222000005022201010c14496e76616c696453756273746174655772697465220000022201010c1443616e6f6e6963616c426c75657072696e744964220101220001200c03076164647265737309626c75657072696e740776657273696f6e022201010c16496e76616c6964476c6f62616c697a65416363657373220101220001200c030f7061636b6167655f616464726573730e626c75657072696e745f6e616d650d6163746f725f7061636b616765022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c11496e76616c696444726f70416363657373220101220001200c04076e6f64655f69640f7061636b6167655f616464726573730e626c75657072696e745f6e616d650d6163746f725f7061636b616765022201010c1153797374656d4d6f64756c654572726f722201012201012307210400022201010c09417574684572726f7222000001022201010c0c436f7374696e674572726f7222000002022201010c165472616e73616374696f6e4c696d6974734572726f7222000003022201010c0a4576656e744572726f72220000022201010c09417574684572726f722201012201012307210600022201010c0a4e6f46756e6374696f6e22000001022201010c0f4e6f4d6574686f644d617070696e6722000002022201010c0f5669736962696c6974794572726f7222000003022201010c0c556e617574686f72697a656422000004022201010c1a496e6e6572426c75657072696e74446f65734e6f74457869737422000005022201010c19496e76616c69644f757465724f626a6563744d617070696e67220000022201010c0c466e4964656e746966696572220101220001200c020c626c75657072696e745f6964056964656e74022201010c0c556e617574686f72697a6564220101220001200c02136661696c65645f6163636573735f72756c65730d666e5f6964656e746966696572022201010c114661696c656441636365737352756c65732201012201012307210200022201010c08526f6c654c69737422000001022201010c0a41636365737352756c65220000022200002200000222000022000002220000220000022201010c0c436f7374696e674572726f722201012201012307210100022201010c0f466565526573657276654572726f72220000022201010c0f466565526573657276654572726f722201012201012307210500022201010c13496e73756666696369656e7442616c616e6365220101220001200c020872657175697265640972656d61696e696e6701022201010c084f766572666c6f7722000002022201010c0d4c696d69744578636565646564220101220001200c03056c696d697409636f6d6d6974746564036e657703022201010c134c6f616e52657061796d656e744661696c6564220101220001200c01087872645f6f77656404022201010c0541626f7274220000022201010c0b41626f7274526561736f6e2201012201012307210100022201010c2a436f6e6669677572656441626f72745472696767657265644f6e4665654c6f616e52657061796d656e74220000022201010c165472616e73616374696f6e4c696d6974734572726f722201012201012307210b00022201010c1a4d617853756273746174654b657953697a65457863656564656422000001022201010c174d6178537562737461746553697a65457863656564656422000002022201010c1c4d6178496e766f6b655061796c6f616453697a65457863656564656422000003022201010c184d617843616c6c44657074684c696d69745265616368656422000004022201010c19547261636b537562737461746553697a654578636565646564220101220001200c020661637475616c036d617805022201010c1848656170537562737461746553697a654578636565646564220101220001200c020661637475616c036d617806022201010c0f4c6f6753697a65546f6f4c61726765220101220001200c020661637475616c036d617807022201010c114576656e7453697a65546f6f4c61726765220101220001200c020661637475616c036d617808022201010c1850616e69634d65737361676553697a65546f6f4c61726765220101220001200c020661637475616c036d617809022201010c0b546f6f4d616e794c6f67732200000a022201010c0d546f6f4d616e794576656e7473220000022201010c0a4576656e744572726f722201012201012307210400022201010c13536368656d614e6f74466f756e644572726f72220101220001200c0209626c75657072696e740a6576656e745f6e616d6501022201010c134576656e74536368656d614e6f744d6174636822000002022201010c134e6f4173736f6369617465645061636b61676522000003022201010c0c496e76616c69644163746f72220000022201010c1353797374656d557073747265616d4572726f722201012201012307210800022201010c1c53797374656d46756e6374696f6e43616c6c4e6f74416c6c6f77656422000001022201010c0a466e4e6f74466f756e6422000002022201010c1052656365697665724e6f744d6174636822000003022201010c0c486f6f6b4e6f74466f756e6422000004022201010c10496e7075744465636f64654572726f7222000005022201010c13496e707574536368656d614e6f744d6174636822000006022201010c114f75747075744465636f64654572726f7222000007022201010c144f7574707574536368656d614e6f744d61746368220000022201010c0d426c75657072696e74486f6f6b2201012201012307210300022201010c0c4f6e5669727475616c697a6522000001022201010c064f6e4d6f766522000002022201010c064f6e44726f70220000022201010c07566d4572726f722201012201012307210300022201010c064e617469766522000001022201010c045761736d22000002022201010c105363727970746f566d56657273696f6e220000022201010c124e617469766552756e74696d654572726f722201012201012307210200022201010c0d496e76616c6964436f6465496422000001022201010c0454726170220101220001200c030b6578706f72745f6e616d6505696e707574056572726f72022201010c105761736d52756e74696d654572726f722201012201012307211b00022201010c0d556e6b6e6f776e4578706f727422000001022201010c114d656d6f72794163636573734572726f7222000002022201010c12496e76616c69645761736d506f696e74657222000003022201010c0e457865637574696f6e4572726f7222000004022201010c0e4e6f74496d706c656d656e74656422000005022201010c0e4275666665724e6f74466f756e6422000006022201010c0e496e76616c69644164647265737322000007022201010c0d496e76616c6964537472696e6722000008022201010c0d496e76616c69644e6f6465496422000009022201010c1f496e76616c6964476c6f62616c416464726573735265736572766174696f6e2200000a022201010c14496e76616c69645265666572656e6365547970652200000b022201010c17496e76616c696441747461636865644d6f64756c6549642200000c022201010c13496e76616c69644f626a6563745374617465732200000d022201010c11496e76616c696441636365737352756c652200000e022201010c0e496e76616c69644d6f64756c65732200000f022201010c13496e76616c696454656d706c6174654172677322000010022201010c1a496e76616c69644b657956616c756553746f7265536368656d6122000011022201010c10496e76616c69644c6f636b466c61677322000012022201010c0f496e76616c69644c6f674c6576656c22000013022201010c0f466565526573657276654572726f7222000014022201010c11496e76616c69644576656e74466c61677322000015022201010c15496e76616c69645061636b6167654164647265737322000016022201010c0e546f6f4d616e794275666665727322000017022201010c13496e76616c6964426c735075626c69634b657922000018022201010c13496e76616c6964426c735369676e617475726522000019022201010c1c496e76616c6964426c735075626c69634b65794f724d6573736167652200001a022201010c0e496e70757444617461456d707479220000022201010c155363727970746f566d56657273696f6e4572726f722201012201012307210100022201010c0c46726f6d496e744572726f72220000022201010c104170706c69636174696f6e4572726f722201012201012307211700022201010c124578706f7274446f65734e6f74457869737422000001022201010c10496e7075744465636f64654572726f7222000002022201010c0c50616e69634d65737361676522000003022201010c13526f6c6541737369676e6d656e744572726f7222000004022201010c0d4d657461646174614572726f7222000005022201010c15436f6d706f6e656e74526f79616c74794572726f7222000006022201010c195472616e73616374696f6e50726f636573736f724572726f7222000007022201010c0c5061636b6167654572726f7222000008022201010c15436f6e73656e7375734d616e616765724572726f7222000009022201010c0e56616c696461746f724572726f722200000a022201010c1c46756e6769626c655265736f757263654d616e616765724572726f722200000b022201010c1f4e6f6e46756e6769626c655265736f757263654d616e616765724572726f722200000c022201010c0b4275636b65744572726f722200000d022201010c0a50726f6f664572726f722200000e022201010c154e6f6e46756e6769626c655661756c744572726f722200000f022201010c0a5661756c744572726f7222000010022201010c0c576f726b746f704572726f7222000011022201010c0d417574685a6f6e654572726f7222000012022201010c0c4163636f756e744572726f7222000013022201010c15416363657373436f6e74726f6c6c65724572726f7222000014022201010c144f6e655265736f75726365506f6f6c4572726f7222000015022201010c1454776f5265736f75726365506f6f6c4572726f7222000016022201010c164d756c74695265736f75726365506f6f6c4572726f72220000022201010c13526f6c6541737369676e6d656e744572726f722201012201012307210800022201010c10557365645265736572766564526f6c6522000001022201010c11557365645265736572766564537061636522000002022201010c1645786365656465644d6178526f6c654e616d654c656e220101220001200c02056c696d69740661637475616c03022201010c1a45786365656465644d617841636365737352756c65446570746822000004022201010c1a45786365656465644d617841636365737352756c654e6f64657322000005022201010c0b496e76616c69644e616d6522000006022201010c1045786365656465644d6178526f6c657322000007022201010c1a43616e6e6f74536574526f6c6549664e6f744174746163686564220000022201010c10496e76616c69644e616d654572726f722201012201012307210200022201010c0b456d707479537472696e6722000001022201010c0b496e76616c696443686172220101220001200c03046e616d650e76696f6c6174696e675f6368617205696e646578022201010c0d4d657461646174614572726f722201012201012307210400022201010c194b6579537472696e67457863656564734d61784c656e677468220101220001200c02036d61780661637475616c01022201010c1956616c756553626f72457863656564734d61784c656e677468220101220001200c02036d61780661637475616c02022201010c1056616c75654465636f64654572726f7222000003022201010c174d6574616461746156616c69646174696f6e4572726f72220000022201010c174d6574616461746156616c69646174696f6e4572726f722201012201012307210200022201010c0a496e76616c696455524c22000001022201010c0d496e76616c69644f726967696e220000022201010c15436f6d706f6e656e74526f79616c74794572726f722201012201012307210300022201010c21526f79616c7479416d6f756e744973477265617465725468616e416c6c6f776564220101220001200c02036d61780661637475616c01022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f7222000002022201010c17526f79616c7479416d6f756e7449734e65676174697665220000022201010c195472616e73616374696f6e50726f636573736f724572726f722201012201012307210d00022201010c0e4275636b65744e6f74466f756e6422000001022201010c0d50726f6f664e6f74466f756e6422000002022201010c1a416464726573735265736572766174696f6e4e6f74466f756e6422000003022201010c0f416464726573734e6f74466f756e6422000004022201010c0c426c6f624e6f74466f756e6422000005022201010c0f496e76616c696443616c6c4461746122000006022201010c14496e76616c69645061636b616765536368656d6122000007022201010c114e6f745061636b6167654164647265737322000008022201010c104e6f74476c6f62616c4164647265737322000009022201010c0f417574685a6f6e654973456d7074792200000a022201010c1b496e766f636174696f6e4f75747075744465636f64654572726f722200000b022201010c0f41726773456e636f64654572726f722200000c022201010c1a546f74616c426c6f6253697a654c696d69744578636565646564220000022201010c0448617368220000022201010c0b456e636f64654572726f722201012201012307210500022201010c104d61784465707468457863656564656422000001022201010c0c53697a65546f6f4c61726765220101220001200c020661637475616c0b6d61785f616c6c6f77656402022201010c204d69736d61746368696e674172726179456c656d656e7456616c75654b696e64220101220001200c0212656c656d656e745f76616c75655f6b696e641161637475616c5f76616c75655f6b696e6403022201010c1a4d69736d61746368696e674d61704b657956616c75654b696e64220101220001200c020e6b65795f76616c75655f6b696e641161637475616c5f76616c75655f6b696e6404022201010c1c4d69736d61746368696e674d617056616c756556616c75654b696e64220101220001200c021076616c75655f76616c75655f6b696e641161637475616c5f76616c75655f6b696e64022201010c0c5061636b6167654572726f722201012201012307212900022201010c0b496e76616c69645761736d22000001022201010c16496e76616c6964426c75657072696e74536368656d6122000002022201010c16546f6f4d616e795375627374617465536368656d617322000003022201010c1346656174757265446f65734e6f74457869737422000004022201010c15496e76616c69645472616e7369656e744669656c6422000005022201010c1e53797374656d496e737472756374696f6e734e6f74537570706f7274656422000006022201010c1a4661696c6564546f5265736f6c76654c6f63616c536368656d61220101220001200c010d6c6f63616c5f747970655f696407022201010c114576656e744e616d654d69736d61746368220101220001200c020865787065637465640661637475616c08022201010c10547970654e616d654d69736d61746368220101220001200c020865787065637465640661637475616c09022201010c12496e76616c69644576656e74536368656d612200000a022201010c15496e76616c696453797374656d46756e6374696f6e2200000b022201010c11496e76616c696454797065506172656e742200000c022201010c0b496e76616c69644e616d652200000d022201010c154d697373696e674f75746572426c75657072696e742200000e022201010c0f5761736d556e737570706f727465642200000f022201010c12496e76616c69644c6f63616c54797065496422000010022201010c10496e76616c696447656e65726963496422000011022201010c1c4576656e7447656e65726963547970654e6f74537570706f7274656422000012022201010c244f75746572426c75657072696e7443616e744265416e496e6e6572426c75657072696e74220101220001200c0205696e6e65720f76696f6c6174696e675f6f7574657213022201010c13526f6c6541737369676e6d656e744572726f7222000014022201010c10496e76616c696441757468536574757022000015022201010c17446566696e696e675265736572766564526f6c654b657922000016022201010c1045786365656465644d6178526f6c6573220101220001200c02056c696d69740661637475616c17022201010c1645786365656465644d6178526f6c654e616d654c656e220101220001200c02056c696d69740661637475616c18022201010c1b45786365656465644d6178426c75657072696e744e616d654c656e220101220001200c02056c696d69740661637475616c19022201010c1745786365656465644d61784576656e744e616d654c656e220101220001200c02056c696d69740661637475616c1a022201010c1645786365656465644d6178547970654e616d654c656e220101220001200c02056c696d69740661637475616c1b022201010c1a45786365656465644d617846756e6374696f6e4e616d654c656e220101220001200c02056c696d69740661637475616c1c022201010c1945786365656465644d6178466561747572654e616d654c656e220101220001200c02056c696d69740661637475616c1d022201010c0b4d697373696e67526f6c652200001e022201010c1c556e65787065637465644e756d6265724f664d6574686f6441757468220101220001200c0309626c75657072696e740865787065637465640661637475616c1f022201010c174d697373696e674d6574686f645065726d697373696f6e220101220001200c0209626c75657072696e74056964656e7420022201010c1e556e65787065637465644e756d6265724f6646756e6374696f6e41757468220101220001200c0309626c75657072696e740865787065637465640661637475616c21022201010c194d697373696e6746756e6374696f6e5065726d697373696f6e220101220001200c0209626c75657072696e74056964656e7422022201010c23556e65787065637465644e756d6265724f6646756e6374696f6e526f79616c74696573220101220001200c0309626c75657072696e740865787065637465640661637475616c23022201010c164d697373696e6746756e6374696f6e526f79616c7479220101220001200c0209626c75657072696e74056964656e7424022201010c21526f79616c7479416d6f756e744973477265617465725468616e416c6c6f776564220101220001200c02036d61780661637475616c25022201010c12496e76616c69644d657461646174614b657922000026022201010c13526f79616c746965734e6f74456e61626c656422000027022201010c17526f79616c7479416d6f756e7449734e6567617469766522000028022201010c1b5265736572766564526f6c654b657949734e6f74446566696e6564220000022201010c0c507265706172654572726f722201012201012307211800022201010c14446573657269616c697a6174696f6e4572726f7222000001022201010c0f56616c69646174696f6e4572726f7222000002022201010c1253657269616c697a6174696f6e4572726f7222000003022201010c17537461727446756e6374696f6e4e6f74416c6c6f77656422000004022201010c0d496e76616c6964496d706f727422000005022201010c0d496e76616c69644d656d6f727922000006022201010c0c496e76616c69645461626c6522000007022201010c11496e76616c69644578706f72744e616d6522000008022201010c17546f6f4d616e7954617267657473496e42725461626c6522000009022201010c10546f6f4d616e7946756e6374696f6e732200000a022201010c15546f6f4d616e7946756e6374696f6e506172616d732200000b022201010c15546f6f4d616e7946756e6374696f6e4c6f63616c73220101220001200c02036d61780661637475616c0c022201010c0e546f6f4d616e79476c6f62616c73220101220001200c02036d61780763757272656e740d022201010c0f4e6f4578706f727453656374696f6e2200000e022201010c0d4d697373696e674578706f7274220101220001200c010b6578706f72745f6e616d650f022201010c144e6f5363727970746f416c6c6f634578706f727422000010022201010c134e6f5363727970746f467265654578706f727422000011022201010c1d52656a65637465644279496e737472756374696f6e4d65746572696e67220101220001200c0106726561736f6e12022201010c1752656a65637465644279537461636b4d65746572696e67220101220001200c0106726561736f6e13022201010c114e6f74496e7374616e7469617461626c65220101220001200c0106726561736f6e14022201010c0d4e6f74436f6d70696c61626c6522000015022201010c0f4d6f64756c65496e666f4572726f7222000016022201010c0f5761736d5061727365724572726f7222000017022201010c084f766572666c6f77220000022201010c0d496e76616c6964496d706f72742201012201012307210300022201010c10496d706f72744e6f74416c6c6f77656422000001022201010c1750726f746f636f6c56657273696f6e4d69736d61746368220101220001200c03046e616d650f63757272656e745f76657273696f6e1065787065637465645f76657273696f6e02022201010c13496e76616c696446756e6374696f6e54797065220000022201010c0d496e76616c69644d656d6f72792201012201012307210500022201010c144d697373696e674d656d6f727953656374696f6e22000001022201010c124e6f4d656d6f7279446566696e6974696f6e22000002022201010c17546f6f4d616e794d656d6f7279446566696e6974696f6e22000003022201010c174d656d6f727953697a654c696d6974457863656564656422000004022201010c114d656d6f72794e6f744578706f72746564220000022201010c0c496e76616c69645461626c652201012201012307210200022201010c104d6f72655468616e4f6e655461626c6522000001022201010c1d496e697469616c5461626c6553697a654c696d69744578636565646564220000022201010c15536368656d6156616c69646174696f6e4572726f722201012201012307211600022201010c164d657461646174614c656e6774684d69736d6174636822000001022201010c1956616c69646174696f6e734c656e6774684d69736d6174636822000002022201010c14547970654b696e645475706c65546f6f4c6f6e67220101220001200c01086d61785f73697a6503022201010c1a547970654b696e64456e756d56617269616e74546f6f4c6f6e67220101220001200c01086d61785f73697a6504022201010c1f547970654b696e64496e76616c6964536368656d614c6f63616c496e64657822000005022201010c1d547970654b696e64496e76616c696457656c6c4b6e6f776e496e64657822000006022201010c29547970654d65746164617461436f6e7461696e6564556e65787065637465644368696c644e616d657322000007022201010c28547970654d65746164617461436f6e7461696e65644475706c69636174654669656c644e616d657322000008022201010c30547970654d657461646174614669656c644e616d65436f756e74446f65734e6f744d617463684669656c64436f756e7422000009022201010c2b547970654d65746164617461436f6e7461696e6564556e6578706563746564456e756d56617269616e74732200000a022201010c2a547970654d65746164617461436f6e7461696e6564556e65787065637465644e616d65644669656c64732200000b022201010c2a547970654d65746164617461436f6e7461696e656457726f6e674e756d6265724f6656617269616e74732200000c022201010c1e547970654d65746164617461456e756d4e616d65497352657175697265642200000d022201010c25547970654d65746164617461456e756d56617269616e744e616d65497352657175697265642200000e022201010c2d547970654d65746164617461466f72456e756d49734e6f74456e756d56617269616e744368696c644e616d65732200000f022201010c2b547970654d657461646174614861734d69736d61746368696e67456e756d4469736372696d696e61746f7222000010022201010c2e547970654d65746164617461436f6e7461696e65644475706c6963617465456e756d56617269616e744e616d657322000011022201010c10496e76616c69644964656e744e616d65220101220001200c01076d65737361676512022201010c165479706556616c69646174696f6e4d69736d6174636822000013022201010c265479706556616c69646174696f6e4e756d6572696356616c69646174696f6e496e76616c696422000014022201010c255479706556616c69646174696f6e4c656e67746856616c69646174696f6e496e76616c696422000015022201010c225479706556616c69646174696f6e4174746163686564546f437573746f6d54797065220000022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c15436f6e73656e7375734d616e616765724572726f722201012201012307210a00022201010c12496e76616c6964526f756e64557064617465220101220001200c020466726f6d02746f01022201010c1e496e76616c696450726f706f73657254696d657374616d70557064617465220101220001200c020b66726f6d5f6d696c6c697309746f5f6d696c6c697302022201010c15496e636f6e73697374656e74476170526f756e6473220101220001200c020a6761705f726f756e64731170726f677265737365645f726f756e647303022201010c15496e76616c696456616c696461746f72496e646578220101220001200c0205696e64657805636f756e7404022201010c0e416c72656164795374617274656422000005022201010c064e6f7458726422000006022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f7222000007022201010c1145706f63684d6174684f766572666c6f7722000008022201010c14496e76616c6964436f6e73656e73757354696d6522000009022201010c16457863656564656456616c696461746f72436f756e74220101220001200c020763757272656e74036d6178022201010c05526f756e64220000022201010c0e56616c696461746f724572726f722201012201012307210900022201010c14496e76616c6964436c61696d5265736f7572636522000001022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e7422000002022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f7222000003022201010c1c45706f6368556e6c6f636b4861734e6f744f6363757272656459657422000004022201010c2750656e64696e674f776e65725374616b655769746864726177616c4c696d69745265616368656422000005022201010c19496e76616c696456616c696461746f72466565466163746f7222000006022201010c2556616c696461746f7249734e6f74416363657074696e6744656c6567617465645374616b6522000007022201010c20496e76616c696450726f746f636f6c56657273696f6e4e616d654c656e677468220101220001200c020865787065637465640661637475616c08022201010c1145706f63684d6174684f766572666c6f77220000022201010c1c46756e6769626c655265736f757263654d616e616765724572726f722201012201012307210700022201010c0d496e76616c6964416d6f756e7422000001022201010c154d61784d696e74416d6f756e74457863656564656422000002022201010c13496e76616c696444697669736962696c69747922000003022201010c1244726f704e6f6e456d7074794275636b657422000004022201010c0b4e6f744d696e7461626c6522000005022201010c0b4e6f744275726e61626c6522000006022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f72220000022201010c1f4e6f6e46756e6769626c655265736f757263654d616e616765724572726f722201012201012307210b00022201010c184e6f6e46756e6769626c65416c726561647945786973747322000001022201010c134e6f6e46756e6769626c654e6f74466f756e6422000002022201010c17556e6b6e6f776e4d757461626c654669656c644e616d6522000003022201010c1d4e6f6e46756e6769626c65496454797065446f65734e6f744d6174636822000004022201010c18496e76616c69644e6f6e46756e6769626c6549645479706522000005022201010c18496e76616c69644e6f6e46756e6769626c65536368656d6122000006022201010c254e6f6e46756e6769626c654c6f63616c496450726f7669646564466f72525549445479706522000007022201010c1244726f704e6f6e456d7074794275636b657422000008022201010c0b4e6f744d696e7461626c6522000009022201010c0b4e6f744275726e61626c652200000a022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f72220000022201010c114e6f6e46756e6769626c654964547970652201012201012307210400022201010c06537472696e6722000001022201010c07496e746567657222000002022201010c05427974657322000003022201010c0452554944220000022201010c18496e76616c69644e6f6e46756e6769626c65536368656d612201012201012307210500022201010c15536368656d6156616c69646174696f6e4572726f7222000001022201010c12496e76616c69644c6f63616c54797065496422000002022201010c094e6f74415475706c6522000003022201010c114d697373696e674669656c644e616d657322000004022201010c184d757461626c654669656c64446f65734e6f744578697374220000022201010c0b4275636b65744572726f722201012201012307210500022201010c0d5265736f757263654572726f7222000001022201010c0a50726f6f664572726f7222000002022201010c064c6f636b656422000003022201010c0d496e76616c6964416d6f756e7422000004022201010c0f446563696d616c4f766572666c6f77220000022201010c0d5265736f757263654572726f722201012201012307210400022201010c13496e73756666696369656e7442616c616e6365220101220001200c02097265717565737465640661637475616c01022201010c11496e76616c696454616b65416d6f756e7422000002022201010c194d697373696e674e6f6e46756e6769626c654c6f63616c496422000003022201010c0f446563696d616c4f766572666c6f77220000022201010c0a50726f6f664572726f722201012201012307210100022201010c14456d70747950726f6f664e6f74416c6c6f776564220000022201010c154e6f6e46756e6769626c655661756c744572726f722201012201012307210300022201010c094d697373696e67496422000001022201010c0f4e6f74456e6f756768416d6f756e7422000002022201010c0f446563696d616c4f766572666c6f77220000022201010c0a5661756c744572726f722201012201012307210900022201010c0d5265736f757263654572726f7222000001022201010c0a50726f6f664572726f7222000002022201010c0d496e76616c6964416d6f756e7422000003022201010c0c4e6f74467265657a61626c6522000004022201010c0d4e6f74526563616c6c61626c6522000005022201010c0d5661756c74497346726f7a656e22000006022201010c144c6f636b4665654e6f745261646978546f6b656e22000007022201010c1a4c6f636b466565496e73756666696369656e7442616c616e6365220101220001200c02097265717565737465640661637475616c08022201010c0f446563696d616c4f766572666c6f77220000022201010c0c576f726b746f704572726f722201012201012307210200022201010c0f417373657274696f6e4661696c656422000001022201010c13496e73756666696369656e7442616c616e6365220000022201010c0d417574685a6f6e654572726f722201012201012307210100022201010c11436f6d706f736550726f6f664572726f72220000022201010c11436f6d706f736550726f6f664572726f722201012201012307210400022201010c204e6f6e46756e6769626c654f7065726174696f6e4e6f74537570706f7274656422000001022201010c16496e73756666696369656e744261736550726f6f667322000002022201010c0d496e76616c6964416d6f756e7422000003022201010c21556e6578706563746564446563696d616c436f6d7075746174696f6e4572726f72220000022201010c0c4163636f756e744572726f722201012201012307210400022201010c115661756c74446f65734e6f744578697374220101220001200c01107265736f757263655f6164647265737301022201010c134465706f7369744973446973616c6c6f776564220101220001200c01107265736f757263655f6164647265737302022201010c1d4e6f74416c6c4275636b657473436f756c6442654465706f736974656422000003022201010c184e6f74416e417574686f72697a65644465706f7369746f72220101220001200c01096465706f7369746f72022201010c15416363657373436f6e74726f6c6c65724572726f722201012201012307210a00022201010c244f7065726174696f6e5265717569726573556e6c6f636b65645072696d617279526f6c6522000001022201010c0c54696d654f766572666c6f7722000002022201010c205265636f76657279416c7265616479457869737473466f7250726f706f736572220101220001200c010870726f706f73657203022201010c1b4e6f5265636f76657279457869737473466f7250726f706f736572220101220001200c010870726f706f73657204022201010c2c42616467655769746864726177417474656d7074416c7265616479457869737473466f7250726f706f736572220101220001200c010870726f706f73657205022201010c274e6f42616467655769746864726177417474656d7074457869737473466f7250726f706f736572220101220001200c010870726f706f73657206022201010c164e6f54696d65645265636f766572696573466f756e6422000007022201010c1f54696d65645265636f7665727944656c61794861734e6f74456c617073656422000008022201010c185265636f7665727950726f706f73616c4d69736d61746368220101220001200c0208657870656374656405666f756e6409022201010c0d4e6f5872644665655661756c74220000022201010c0850726f706f7365722201012201012307210200022201010c075072696d61727922000001022201010c085265636f76657279220000022201010c105265636f7665727950726f706f73616c220101220001200c020872756c655f7365741f74696d65645f7265636f766572795f64656c61795f696e5f6d696e75746573022201010c0752756c65536574220101220001200c030c7072696d6172795f726f6c650d7265636f766572795f726f6c6511636f6e6669726d6174696f6e5f726f6c65022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c054572726f722201012201012307210900022201010c224e6f6e46756e6769626c655265736f75726365734172654e6f744163636570746564220101220001200c01107265736f757263655f6164647265737301022201010c244e6f6e5a65726f506f6f6c556e6974537570706c794275745a65726f526573657276657322000002022201010c17496e76616c6964506f6f6c556e69745265736f75726365220101220001200c020865787065637465640661637475616c03022201010c1e436f6e747269627574696f6e4f66456d7074794275636b65744572726f7222000004022201010c14446563696d616c4f766572666c6f774572726f7222000005022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e7422000006022201010c135a65726f506f6f6c556e6974734d696e74656422000007022201010c1252656465656d65645a65726f546f6b656e7322000008022201010c1b5265736f75726365446f65734e6f7442656c6f6e67546f506f6f6c220101220001200c01107265736f757263655f61646472657373022201010c054572726f722201012201012307210a00022201010c224e6f6e46756e6769626c655265736f75726365734172654e6f744163636570746564220101220001200c01107265736f757263655f6164647265737301022201010c244e6f6e5a65726f506f6f6c556e6974537570706c794275745a65726f526573657276657322000002022201010c17496e76616c6964506f6f6c556e69745265736f75726365220101220001200c020865787065637465640661637475616c03022201010c1b5265736f75726365446f65734e6f7442656c6f6e67546f506f6f6c220101220001200c01107265736f757263655f6164647265737304022201010c1c506f6f6c4372656174696f6e5769746853616d655265736f7572636522000005022201010c1e436f6e747269627574696f6e4f66456d7074794275636b65744572726f7222000006022201010c14446563696d616c4f766572666c6f774572726f7222000007022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e7422000008022201010c135a65726f506f6f6c556e6974734d696e74656422000009022201010c254c6172676572436f6e747269627574696f6e5265717569726564546f4d656574526174696f220000022201010c054572726f722201012201012307210d00022201010c224e6f6e46756e6769626c655265736f75726365734172654e6f744163636570746564220101220001200c01107265736f757263655f6164647265737301022201010c244e6f6e5a65726f506f6f6c556e6974537570706c794275745a65726f526573657276657322000002022201010c17496e76616c6964506f6f6c556e69745265736f75726365220101220001200c020865787065637465640661637475616c03022201010c1b5265736f75726365446f65734e6f7442656c6f6e67546f506f6f6c220101220001200c01107265736f757263655f6164647265737304022201010c154d697373696e674f72456d7074794275636b657473220101220001200c01127265736f757263655f61646472657373657305022201010c1c506f6f6c4372656174696f6e5769746853616d655265736f7572636522000006022201010c1e436f6e747269627574696f6e4f66456d7074794275636b65744572726f7222000007022201010c2543616e74437265617465506f6f6c576974684c6573735468616e4f6e655265736f7572636522000008022201010c14446563696d616c4f766572666c6f774572726f7222000009022201010c1a496e76616c6964476574526564656d7074696f6e416d6f756e742200000a022201010c0e4e6f4d696e696d756d526174696f2200000b022201010c135a65726f506f6f6c556e6974734d696e7465642200000c022201010c254c6172676572436f6e747269627574696f6e5265717569726564546f4d656574526174696f22000002220000220000022201010c155472616e73616374696f6e46656553756d6d617279220101220001200c0723746f74616c5f657865637574696f6e5f636f73745f756e6974735f636f6e73756d656426746f74616c5f66696e616c697a6174696f6e5f636f73745f756e6974735f636f6e73756d65641b746f74616c5f657865637574696f6e5f636f73745f696e5f7872641e746f74616c5f66696e616c697a6174696f6e5f636f73745f696e5f78726419746f74616c5f74697070696e675f636f73745f696e5f78726419746f74616c5f73746f726167655f636f73745f696e5f78726419746f74616c5f726f79616c74795f636f73745f696e5f787264022201010c09466565536f75726365220101220001200c010d706179696e675f7661756c747302220000220000022201010c0e46656544657374696e6174696f6e220101220001200c040b746f5f70726f706f73657210746f5f76616c696461746f725f73657407746f5f6275726e15746f5f726f79616c74795f726563697069656e747302220000220000022201010c10526f79616c7479526563697069656e742201012201012307210200022201010c075061636b61676522000001022201010c09436f6d706f6e656e74220000022201010c11436f7374696e67506172616d6574657273220101220001200c0819657865637574696f6e5f636f73745f756e69745f707269636519657865637574696f6e5f636f73745f756e69745f6c696d697418657865637574696f6e5f636f73745f756e69745f6c6f616e1c66696e616c697a6174696f6e5f636f73745f756e69745f70726963651c66696e616c697a6174696f6e5f636f73745f756e69745f6c696d6974097573645f70726963651373746174655f73746f726167655f707269636515617263686976655f73746f726167655f7072696365022201010c255472616e73616374696f6e436f7374696e67506172616d6574657273526563656970745631220101220001200c020e7469705f70657263656e7461676512667265655f6372656469745f696e5f7872640222000022000002220000220000022201010c054c6576656c2201012201012307210500022201010c054572726f7222000001022201010c045761726e22000002022201010c04496e666f22000003022201010c05446562756722000004022201010c055472616365220000022201010c12537461746555706461746553756d6d617279220101220001200c050c6e65775f7061636b616765730e6e65775f636f6d706f6e656e74730d6e65775f7265736f75726365730a6e65775f7661756c7473157661756c745f62616c616e63655f6368616e6765730222000022000002220000220000022200002200000222000022000002220000220000022201010c0d42616c616e63654368616e67652201012201012307210200022201010c0846756e6769626c6522000001022201010c0b4e6f6e46756e6769626c65220101220001200c020561646465640772656d6f76656402220000220000022200002200000222000022000002220000220000022201010c17537562737461746553797374656d5374727563747572652201012201012307210700022201010c0b53797374656d4669656c6422000001022201010c0c53797374656d536368656d6122000002022201010c124b657956616c756553746f7265456e74727922000003022201010c0b4f626a6563744669656c6422000004022201010c1c4f626a6563744b657956616c7565506172746974696f6e456e74727922000005022201010c194f626a656374496e646578506172746974696f6e456e74727922000006022201010c1f4f626a656374536f72746564496e646578506172746974696f6e456e747279220000022201010c1453797374656d4669656c64537472756374757265220101220001200c010a6669656c645f6b696e64022201010c0f53797374656d4669656c644b696e642201012201012307210400022201010c0854797065496e666f22000001022201010c06566d426f6f7422000002022201010c0a53797374656d426f6f7422000003022201010c0a4b65726e656c426f6f74220000022201010c1b4b657956616c756553746f7265456e747279537472756374757265220101220001200c02106b65795f66756c6c5f747970655f69641276616c75655f66756c6c5f747970655f6964022201010c1146756c6c7953636f706564547970654964220000022201010c0e4669656c64537472756374757265220101220001200c010c76616c75655f736368656d61022201010c1b4f626a6563745375627374617465547970655265666572656e63652201012201012307210200022201010c075061636b61676522000001022201010c0e4f626a656374496e7374616e6365220000022201010c145061636b616765547970655265666572656e6365220101220001200c010c66756c6c5f747970655f6964022201010c1146756c6c7953636f706564547970654964220000022201010c1b4f626a656374496e7374616e6365547970655265666572656e6365220101220001200c0210696e7374616e63655f747970655f6964157265736f6c7665645f66756c6c5f747970655f6964022201010c1f4b657956616c7565506172746974696f6e456e747279537472756374757265220101220001200c020a6b65795f736368656d610c76616c75655f736368656d61022201010c1c496e646578506172746974696f6e456e747279537472756374757265220101220001200c020a6b65795f736368656d610c76616c75655f736368656d61022201010c22536f72746564496e646578506172746974696f6e456e747279537472756374757265220101220001200c020a6b65795f736368656d610c76616c75655f736368656d6102220000220000022201010c134576656e74547970654964656e746966696572220000022201010c07456d69747465722201012201012307210200022201010c0846756e6374696f6e22000001022201010c064d6574686f64220000022201010c144576656e7453797374656d537472756374757265220101220001200c01167061636b6167655f747970655f7265666572656e6365022201010c064f7074696f6e2201012201012307210200022201010c044e6f6e6522000001022201010c04536f6d65220000022201010c1045706f63684368616e67654576656e74220101220001200c030565706f63680d76616c696461746f725f736574257369676e69666963616e745f70726f746f636f6c5f7570646174655f72656164696e657373022201010c0545706f6368220000022201010c1241637469766556616c696461746f72536574220000022201010c0956616c696461746f72220101220001200c02036b6579057374616b65022200002200002022a501000000000000000000000000000000000c012102220101091e000000220101091e0000000000000000000000000000000000000000000000000000000000000000000c01210222010109020000002201010902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0121022201010920000000220101092000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c012102220101092000000022010109200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002201010a0000000000000000 \ No newline at end of file diff --git a/radix-engine/src/transaction/node_versioned_local_transaction_execution_bottlenose.bin b/radix-engine/src/transaction/node_versioned_local_transaction_execution_bottlenose.bin new file mode 100644 index 0000000000000000000000000000000000000000..73770fd94e5937797c129e335f0261b45725d3e4 GIT binary patch literal 33241 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 E16}v3!~g&Q literal 0 HcmV?d00001 diff --git a/radix-engine/src/transaction/node_versioned_local_transaction_execution_cuttlefish.bin b/radix-engine/src/transaction/node_versioned_local_transaction_execution_cuttlefish.bin new file mode 100644 index 0000000000000000000000000000000000000000..73770fd94e5937797c129e335f0261b45725d3e4 GIT binary patch literal 33241 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 E16}v3!~g&Q literal 0 HcmV?d00001 diff --git a/radix-engine/src/transaction/transaction_receipt.rs b/radix-engine/src/transaction/transaction_receipt.rs index bb1c73c1309..d039a80afe1 100644 --- a/radix-engine/src/transaction/transaction_receipt.rs +++ b/radix-engine/src/transaction/transaction_receipt.rs @@ -10,37 +10,17 @@ use crate::system::system_substate_schemas::*; use crate::transaction::SystemStructure; use colored::*; use radix_engine_interface::blueprints::transaction_processor::InstructionOutput; -use radix_transactions::prelude::TransactionCostingParametersReceiptV1; +use radix_transactions::prelude::*; use sbor::representations::*; -define_single_versioned! { - /// We define a versioned transaction receipt for encoding in the preview API. - /// This allows a new toolkit build to be able to handle both current and future - /// receipt versions, allowing us to release a wallet ahead-of-time which is forward - /// compatible with a new version of the engine (and so a new transaction receipt). - #[derive(Clone, ScryptoSbor)] - pub VersionedTransactionReceipt(TransactionReceiptVersions) => TransactionReceipt = TransactionReceiptV1, - outer_attributes: [ - // VersionedTransactionReceipt is currently encoded in the node's preview API. - // It is then decoded in lots of different mobile wallets as part of Transaction Review. - // We therefore can't make any changes/additions, without breaking this. - // - // In the interim, we are planning to: - // * Temporarily, serialize a PreviewTransactionReceipt which is fixed as just a single v1 versioned - // VersionedTransactionReceipt, and have `impl From for PreviewTransactionReceipt`. - // This will allow us to add new receipt versions, but ensuring they can still map to the preview model. - // * Change the API to return some kind of explicit extensible preview DTO. - #[derive(ScryptoSborAssertion)] - #[sbor_assert(fixed("FILE:receipt_schema_cuttlefish.txt"), settings(allow_name_changes))] - ], -} - -#[derive(Clone, ScryptoSbor, PartialEq, Eq)] -pub struct TransactionReceiptV1 { +/// This type is not intended to be encoded or have a consistent scrypto encoding. +/// Some of the parts of it are encoded in the node, but not the receipt itself. +#[derive(Clone, PartialEq, Eq)] +pub struct TransactionReceipt { /// Costing parameters pub costing_parameters: CostingParameters, /// Transaction costing parameters - pub transaction_costing_parameters: TransactionCostingParametersReceiptV1, + pub transaction_costing_parameters: TransactionCostingParametersReceiptV2, /// Transaction fee summary pub fee_summary: TransactionFeeSummary, /// Transaction fee detail @@ -53,17 +33,11 @@ pub struct TransactionReceiptV1 { pub resources_usage: Option, /// This field contains debug information about the transaction which is extracted during the /// transaction execution. - /// - /// To maintain backward compatibility this field is skipped in the SBOR encoding, decoding and - /// the schema generation. Meaning, the only way to get this field is to execute transactions - /// locally (through a ledger simulator) with the appropriate execution config for this field - /// to be populated. - #[sbor(skip)] pub debug_information: Option, } #[cfg(feature = "std")] -impl TransactionReceiptV1 { +impl TransactionReceipt { pub fn generate_execution_breakdown_flamegraph_svg_bytes( &self, title: impl AsRef, @@ -205,7 +179,7 @@ impl TransactionReceiptV1 { } } -impl ExecutionReceipt for TransactionReceiptV1 { +impl ExecutionReceipt for TransactionReceipt { fn set_resource_usage(&mut self, resources_usage: ResourcesUsage) { self.resources_usage = Some(resources_usage); } @@ -709,18 +683,12 @@ impl TransactionReceipt { } pub fn effective_execution_cost_unit_price(&self) -> Decimal { - let one_percent = Decimal::ONE_HUNDREDTH; - // Below unwraps are safe, no chance to overflow considering current costing parameters self.costing_parameters .execution_cost_unit_price .checked_mul( Decimal::ONE - .checked_add( - one_percent - .checked_mul(self.transaction_costing_parameters.tip_percentage) - .unwrap(), - ) + .checked_add(self.transaction_costing_parameters.tip_proportion) .unwrap(), ) .unwrap() @@ -736,7 +704,7 @@ impl TransactionReceipt { Decimal::ONE .checked_add( one_percent - .checked_mul(self.transaction_costing_parameters.tip_percentage) + .checked_mul(self.transaction_costing_parameters.tip_proportion) .unwrap(), ) .unwrap(), @@ -1669,21 +1637,39 @@ pub enum FlamegraphError { #[cfg(test)] mod tests { + use radix_transactions::model::TransactionCostingParametersReceiptV2; + use super::*; - // This is an effective copy of the V1 contents of the local transaction execution store in the node. - // This needs to be decodable! - // By all means introduce _new versions_ of the included types, with conversions between them, - // and we can introduce a higher LocalTransactionExecutionVX in the node. - // But this schema can't change, else we won't be able to decode existing executions in the node. - // NOTE: This is just copied here to catch issues / changes earlier; an identical test exists in the node. - #[derive(ScryptoSbor, ScryptoSborAssertion)] - #[sbor_assert( - backwards_compatible( - bottlenose = "FILE:node_local_transaction_execution_v1_cuttlefish.txt" - ), - settings(allow_name_changes) - )] + define_versioned!( + #[derive(ScryptoSbor)] + VersionedLocalTransactionExecution(LocalTransactionExecutionVersions) { + previous_versions: [ + 1 => LocalTransactionExecutionV1: { updates_to: 2 }, + ], + latest_version: { + 2 => LocalTransactionExecution = LocalTransactionExecutionV2, + }, + }, + outer_attributes: [ + // This is an effective copy of the contents of the local transaction execution store in the node. + // This needs to be decodable! + // By all means introduce _new versions_, with conversions between them, + // and we can do the same in the node. + // But this schema can't change, else we won't be able to decode existing executions in the node. + // NOTE: This is just copied here to catch issues / changes earlier; an identical test exists in the node. + #[derive(ScryptoSborAssertion)] + #[sbor_assert( + backwards_compatible( + bottlenose = "FILE:node_versioned_local_transaction_execution_bottlenose.bin", + cuttlefish = "FILE:node_versioned_local_transaction_execution_cuttlefish.bin" + ), + settings(allow_name_changes) + )] + ], + ); + + #[derive(ScryptoSbor)] struct LocalTransactionExecutionV1 { outcome: Result<(), RuntimeError>, fee_summary: TransactionFeeSummary, @@ -1698,4 +1684,39 @@ mod tests { events_system_structure: IndexMap, next_epoch: Option, } + + #[derive(ScryptoSbor)] + struct LocalTransactionExecutionV2 { + outcome: Result<(), RuntimeError>, + fee_summary: TransactionFeeSummary, + fee_source: FeeSource, + fee_destination: FeeDestination, + engine_costing_parameters: CostingParameters, + transaction_costing_parameters: TransactionCostingParametersReceiptV2, + application_logs: Vec<(Level, String)>, + state_update_summary: StateUpdateSummary, + global_balance_summary: IndexMap>, + substates_system_structure: Vec, + events_system_structure: IndexMap, + next_epoch: Option, + } + + impl From for LocalTransactionExecutionV2 { + fn from(value: LocalTransactionExecutionV1) -> Self { + Self { + outcome: value.outcome, + fee_summary: value.fee_summary, + fee_source: value.fee_source, + fee_destination: value.fee_destination, + engine_costing_parameters: value.engine_costing_parameters, + transaction_costing_parameters: value.transaction_costing_parameters.into(), + application_logs: value.application_logs, + state_update_summary: value.state_update_summary, + global_balance_summary: value.global_balance_summary, + substates_system_structure: value.substates_system_structure, + events_system_structure: value.events_system_structure, + next_epoch: value.next_epoch, + } + } + } } diff --git a/radix-transaction-scenarios/src/executor.rs b/radix-transaction-scenarios/src/executor.rs index a4abcd2313c..a4151bb2d28 100644 --- a/radix-transaction-scenarios/src/executor.rs +++ b/radix-transaction-scenarios/src/executor.rs @@ -308,7 +308,7 @@ where transaction: &RawNotarizedTransaction, execution_config: &ExecutionConfig, modules: &impl VmInitialize, - ) -> Result { + ) -> Result { let validated = transaction .validate(&self.validator) .map_err(ScenarioExecutorError::TransactionValidationError)?; From 4424cc4226d6371f08a1576bab3e3d8d8c96ed8b Mon Sep 17 00:00:00 2001 From: David Edey Date: Tue, 17 Sep 2024 13:57:02 +0100 Subject: [PATCH 3/6] tweak: Ledger simulator accepts both manifest types --- .../src/constants/system_execution.rs | 8 +- .../src/manifest/manifest_traits.rs | 15 ++ .../src/model/v1/manifest_v1.rs | 15 ++ .../src/model/v1/system_manifest_v1.rs | 17 ++ .../src/model/v1/test_transaction.rs | 24 +++ .../src/model/v2/subintent_manifest_v2.rs | 13 ++ .../src/model/v2/transaction_manifest_v2.rs | 16 ++ .../src/ledger_simulator/ledger_simulator.rs | 149 +++++++++--------- 8 files changed, 179 insertions(+), 78 deletions(-) diff --git a/radix-common/src/constants/system_execution.rs b/radix-common/src/constants/system_execution.rs index 6cbb2e56892..5e11c924b59 100644 --- a/radix-common/src/constants/system_execution.rs +++ b/radix-common/src/constants/system_execution.rs @@ -3,12 +3,18 @@ use crate::data::scrypto::model::NonFungibleLocalId; use crate::types::*; /// For definition @see SYSTEM_EXECUTION_RESOURCE -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] pub enum SystemExecution { Protocol = 0, Validator = 1, } +impl SystemExecution { + pub fn proof(self) -> NonFungibleGlobalId { + self.into() + } +} + impl Into for SystemExecution { fn into(self) -> NonFungibleGlobalId { NonFungibleGlobalId::new( diff --git a/radix-transactions/src/manifest/manifest_traits.rs b/radix-transactions/src/manifest/manifest_traits.rs index 056614409f0..880f113fb5a 100644 --- a/radix-transactions/src/manifest/manifest_traits.rs +++ b/radix-transactions/src/manifest/manifest_traits.rs @@ -16,6 +16,21 @@ pub trait BuildableManifest: ReadableManifest + ManifestEncode + Default + Eq + fn preallocation_count(&self) -> usize { 0 } + + fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType; + fn into_executable_with_proofs( + self, + nonce: u32, + initial_proofs: BTreeSet, + validator: &TransactionValidator, + ) -> Result; +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum SuggestedExecutionConfigType { + Notarized, + System, + Test, } #[derive(Debug, Copy, Clone, PartialEq, Eq)] diff --git a/radix-transactions/src/model/v1/manifest_v1.rs b/radix-transactions/src/model/v1/manifest_v1.rs index 0df4067b4d7..79c71b32145 100644 --- a/radix-transactions/src/model/v1/manifest_v1.rs +++ b/radix-transactions/src/model/v1/manifest_v1.rs @@ -48,6 +48,21 @@ impl BuildableManifest for TransactionManifestV1 { fn set_names(&mut self, names: KnownManifestObjectNames) { self.object_names = names.into() } + + fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { + SuggestedExecutionConfigType::Test + } + + fn into_executable_with_proofs( + self, + nonce: u32, + initial_proofs: BTreeSet, + validator: &TransactionValidator, + ) -> Result { + TestTransaction::new_v1_from_nonce(self, nonce, initial_proofs) + .into_executable(&validator) + .map_err(|err| format!("Could not prepare: {err:?}")) + } } impl TransactionManifestV1 { diff --git a/radix-transactions/src/model/v1/system_manifest_v1.rs b/radix-transactions/src/model/v1/system_manifest_v1.rs index 70aafd5d233..86e3d3c6d5d 100644 --- a/radix-transactions/src/model/v1/system_manifest_v1.rs +++ b/radix-transactions/src/model/v1/system_manifest_v1.rs @@ -64,6 +64,23 @@ impl BuildableManifest for SystemTransactionManifestV1 { fn preallocation_count(&self) -> usize { self.preallocated_addresses.len() } + + fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { + SuggestedExecutionConfigType::System + } + + fn into_executable_with_proofs( + self, + nonce: u32, + initial_proofs: BTreeSet, + validator: &TransactionValidator, + ) -> Result { + let unique_hash = hash(format!("System txn: {}", nonce)); + self.into_transaction(unique_hash) + .with_proofs_ref(initial_proofs) + .into_executable(&validator) + .map_err(|err| format!("Could not prepare: {err:?}")) + } } impl BuildableManifestSupportingPreallocatedAddresses for SystemTransactionManifestV1 {} diff --git a/radix-transactions/src/model/v1/test_transaction.rs b/radix-transactions/src/model/v1/test_transaction.rs index 7e4ebf40324..6018743fdbb 100644 --- a/radix-transactions/src/model/v1/test_transaction.rs +++ b/radix-transactions/src/model/v1/test_transaction.rs @@ -181,6 +181,30 @@ impl TestTransaction { }) } + /// ## Example usage + /// ```ignore + /// # // Ignored as it depends on scrypto_test which isn't a dev dependency + /// let mut ledger = LedgerSimulatorBuilder::new().build(); + /// let mut builder = TestTransaction::new_v2_builder(ledger.next_transaction_nonce()); + /// + /// let child = builder.add_subintent( + /// ManifestBuilder::new_subintent_v2() + /// .yield_to_parent(()) + /// .build(), + /// [child_public_key.signature_proof()], + /// ); + /// + /// let transaction = builder.finish_with_root_intent( + /// ManifestBuilder::new_v2() + /// .use_child("child", child) + /// .lock_standard_test_fee(account) + /// .yield_to_child("child", ()) + /// .build(), + /// [public_key.signature_proof()], + /// ); + /// + /// let receipt = ledger.execute_test_transaction(transaction); + /// ``` pub fn new_v2_builder(nonce: u32) -> TestTransactionV2Builder { TestTransactionV2Builder::new(nonce) } diff --git a/radix-transactions/src/model/v2/subintent_manifest_v2.rs b/radix-transactions/src/model/v2/subintent_manifest_v2.rs index 057b21f5482..76d1ddfa356 100644 --- a/radix-transactions/src/model/v2/subintent_manifest_v2.rs +++ b/radix-transactions/src/model/v2/subintent_manifest_v2.rs @@ -65,6 +65,19 @@ impl BuildableManifest for SubintentManifestV2 { self.children.push(ChildSubintent { hash }); Ok(()) } + + fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { + SuggestedExecutionConfigType::Test + } + + fn into_executable_with_proofs( + self, + _nonce: u32, + _initial_proofs: BTreeSet, + _validator: &TransactionValidator, + ) -> Result { + Err("A subintent manifest is not executable by itself. See the docs on `TestTransaction::new_v2_builder` for an alternative approach, to wrap the manifest in a parent test transaction.".to_string()) + } } impl SubintentManifestV2 { diff --git a/radix-transactions/src/model/v2/transaction_manifest_v2.rs b/radix-transactions/src/model/v2/transaction_manifest_v2.rs index 2a2c2bcb4ce..e1f6103c0d4 100644 --- a/radix-transactions/src/model/v2/transaction_manifest_v2.rs +++ b/radix-transactions/src/model/v2/transaction_manifest_v2.rs @@ -61,6 +61,22 @@ impl BuildableManifest for TransactionManifestV2 { self.children.push(ChildSubintent { hash }); Ok(()) } + + fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { + SuggestedExecutionConfigType::Test + } + + fn into_executable_with_proofs( + self, + nonce: u32, + initial_proofs: BTreeSet, + validator: &TransactionValidator, + ) -> Result { + TestTransaction::new_v2_builder(nonce) + .finish_with_root_intent(self, initial_proofs) + .into_executable(validator) + .map_err(|err| format!("Could not prepare: {err:?}")) + } } impl BuildableManifestSupportingChildren for TransactionManifestV2 {} diff --git a/scrypto-test/src/ledger_simulator/ledger_simulator.rs b/scrypto-test/src/ledger_simulator/ledger_simulator.rs index 7714289076d..7199479d8e6 100644 --- a/scrypto-test/src/ledger_simulator/ledger_simulator.rs +++ b/scrypto-test/src/ledger_simulator/ledger_simulator.rs @@ -27,6 +27,7 @@ use radix_substate_store_interface::interface::*; use radix_substate_store_queries::query::{ResourceAccounter, StateTreeTraverser, VaultFinder}; use radix_substate_store_queries::typed_native_events::to_typed_native_event; use radix_substate_store_queries::typed_substate_layout::*; +use radix_transactions::manifest::*; use radix_transactions::validation::*; use std::path::{Path, PathBuf}; @@ -1017,10 +1018,8 @@ impl LedgerSimulator { ) .build(); - let receipt = self.execute_system_transaction( - manifest, - btreeset!(system_execution(SystemExecution::Protocol)), - ); + let receipt = + self.execute_system_transaction(manifest, [SystemExecution::Protocol.proof()]); receipt.expect_commit_success(); } @@ -1126,89 +1125,88 @@ impl LedgerSimulator { self.publish_package_with_owner(package_dir.as_ref(), owner_badge) } - pub fn execute_manifest( + fn resolve_suggested_config(&self, manifest: &impl BuildableManifest) -> ExecutionConfig { + match manifest.suggested_execution_config_type() { + SuggestedExecutionConfigType::Notarized => { + ExecutionConfig::for_notarized_transaction(NetworkDefinition::simulator()) + } + SuggestedExecutionConfigType::System => { + ExecutionConfig::for_system_transaction(NetworkDefinition::simulator()) + } + SuggestedExecutionConfigType::Test => ExecutionConfig::for_test_transaction(), + } + .with_kernel_trace(self.with_kernel_trace) + } + + pub fn execute_manifest( &mut self, - manifest: TransactionManifestV1, - initial_proofs: T, - ) -> TransactionReceipt - where - T: IntoIterator, - { - let nonce = self.next_transaction_nonce(); - self.execute_test_transaction(TestTransaction::new_v1_from_nonce( - manifest, - nonce, - initial_proofs.into_iter().collect(), - )) + manifest: impl BuildableManifest, + initial_proofs: impl IntoIterator, + ) -> TransactionReceipt { + let config = self.resolve_suggested_config(&manifest); + self.execute_manifest_with_execution_config(manifest, initial_proofs, config) } - pub fn execute_manifest_with_execution_config( + pub fn execute_manifest_with_execution_config( &mut self, - manifest: TransactionManifestV1, - initial_proofs: T, + manifest: impl BuildableManifest, + initial_proofs: impl IntoIterator, execution_config: ExecutionConfig, - ) -> TransactionReceipt - where - T: IntoIterator, - { - let nonce = self.next_transaction_nonce(); - self.execute_transaction( - TestTransaction::new_v1_from_nonce( - manifest, - nonce, + ) -> TransactionReceipt { + let executable = manifest + .into_executable_with_proofs( + self.next_transaction_nonce(), initial_proofs.into_iter().collect(), - ), - execution_config, - ) + &self.transaction_validator, + ) + .unwrap_or_else(|err| { + panic!( + "Could not convert manifest into executable transaction: {}", + err + ) + }); + self.execute_transaction(executable, execution_config) } - pub fn execute_manifest_with_costing_params( + pub fn execute_manifest_with_costing_params( &mut self, - manifest: TransactionManifestV1, - initial_proofs: T, + manifest: impl BuildableManifest, + initial_proofs: impl IntoIterator, costing_parameters: CostingParameters, - ) -> TransactionReceipt - where - T: IntoIterator, - { - let nonce = self.next_transaction_nonce(); - let mut config = ExecutionConfig::for_test_transaction(); + ) -> TransactionReceipt { + let mut config = self.resolve_suggested_config(&manifest); config.system_overrides = Some(SystemOverrides { costing_parameters: Some(costing_parameters), - ..Default::default() + ..config.system_overrides.unwrap_or_default() }); - self.execute_transaction( - TestTransaction::new_v1_from_nonce( - manifest, - nonce, - initial_proofs.into_iter().collect(), - ), - config, - ) + self.execute_manifest_with_execution_config(manifest, initial_proofs, config) } - pub fn execute_manifest_with_injected_error<'a, T>( - &'a mut self, - manifest: TransactionManifestV1, - initial_proofs: T, + pub fn execute_manifest_with_injected_error( + &mut self, + manifest: impl BuildableManifest, + initial_proofs: impl IntoIterator, error_after_count: u64, - ) -> TransactionReceipt - where - T: IntoIterator, - { - let nonce = self.next_transaction_nonce(); - let executable = TestTransaction::new_v1_from_nonce( - manifest, - nonce, - initial_proofs.into_iter().collect(), - ) - .into_executable(&self.transaction_validator) - .expect("expected transaction to be preparable"); + ) -> TransactionReceipt { + let mut execution_config = self.resolve_suggested_config(&manifest); + + let executable = manifest + .into_executable_with_proofs( + self.next_transaction_nonce(), + initial_proofs.into_iter().collect(), + &self.transaction_validator, + ) + .unwrap_or_else(|err| { + panic!( + "Could not convert manifest into executable transaction: {}", + err + ) + }); let vm_init = self.vm_modules.create_vm_init(); - let execution_config = - ExecutionConfig::for_test_transaction().with_kernel_trace(self.with_kernel_trace); + // Override the kernel trace config + execution_config = execution_config.with_kernel_trace(self.with_kernel_trace); let executor = TransactionExecutor::<_, InjectSystemCostingError<'_, E>>::new( &self.database, @@ -1242,6 +1240,10 @@ impl LedgerSimulator { transaction_receipt } + /// If you have a non-raw notarized tranasaction, you will need to do: + /// ```ignore + /// simulator.execute_notarized_transaction(¬arized_transaction.to_raw().unwrap()); + /// ``` pub fn execute_notarized_transaction( &mut self, raw_transaction: &RawNotarizedTransaction, @@ -1261,16 +1263,9 @@ impl LedgerSimulator { pub fn execute_system_transaction( &mut self, manifest: SystemTransactionManifestV1, - proofs: BTreeSet, + initial_proofs: impl IntoIterator, ) -> TransactionReceipt { - let nonce = self.next_transaction_nonce(); - let unique_hash = hash(format!("Test runner txn: {}", nonce)); - self.execute_transaction( - manifest - .into_transaction(unique_hash) - .with_proofs_ref(proofs), - ExecutionConfig::for_system_transaction(NetworkDefinition::simulator()), - ) + self.execute_manifest(manifest, initial_proofs) } pub fn execute_test_transaction( From 7b40715beafc5f7cf56617941572c44f31ccb414 Mon Sep 17 00:00:00 2001 From: David Edey Date: Tue, 17 Sep 2024 17:07:03 +0100 Subject: [PATCH 4/6] feature: Scenarios now work with v2 transactions --- .../utils/native_blueprint_call_validator.rs | 1 + .../src/runners/dumper.rs | 79 ++++++-- radix-transaction-scenarios/src/scenario.rs | 178 ++++++++++++++---- .../src/scenarios/access_controller_v2.rs | 2 +- .../src/builder/transaction_builder.rs | 123 +++++++++--- .../src/manifest/any_manifest.rs | 8 + radix-transactions/src/manifest/decompiler.rs | 1 + .../src/manifest/manifest_naming.rs | 17 ++ .../src/manifest/manifest_traits.rs | 10 +- .../src/model/preparation/traits.rs | 9 +- .../src/model/user_transaction.rs | 139 +++++++++++++- .../src/model/v1/notarized_transaction_v1.rs | 11 ++ .../src/model/v2/notarized_transaction_v2.rs | 36 ++++ .../model/v2/signed_partial_transaction_v2.rs | 9 + .../src/model/v2/transaction_manifest_v2.rs | 13 ++ sbor/src/enum_variant.rs | 12 ++ 16 files changed, 561 insertions(+), 87 deletions(-) diff --git a/radix-engine/src/utils/native_blueprint_call_validator.rs b/radix-engine/src/utils/native_blueprint_call_validator.rs index c7d13969ff9..a7814b882f8 100644 --- a/radix-engine/src/utils/native_blueprint_call_validator.rs +++ b/radix-engine/src/utils/native_blueprint_call_validator.rs @@ -24,6 +24,7 @@ pub fn validate_call_arguments_to_native_components_any( AnyTransactionManifest::V1(m) => validate_call_arguments_to_native_components(m), AnyTransactionManifest::SystemV1(m) => validate_call_arguments_to_native_components(m), AnyTransactionManifest::V2(m) => validate_call_arguments_to_native_components(m), + AnyTransactionManifest::SubintentV2(m) => validate_call_arguments_to_native_components(m), } } diff --git a/radix-transaction-scenarios/src/runners/dumper.rs b/radix-transaction-scenarios/src/runners/dumper.rs index f31d78e6173..14011844bde 100644 --- a/radix-transaction-scenarios/src/runners/dumper.rs +++ b/radix-transaction-scenarios/src/runners/dumper.rs @@ -239,20 +239,71 @@ mod test { &transaction.raw_transaction.0, ); - // Write manifest - // NB: We purposefully don't write the blobs as they're contained in the raw transactions - let manifest_string = decompile(&transaction.manifest, network_definition).unwrap(); - // Whilst we're here, let's validate that the manifest can be recompiled - compile_manifest_v1( - &manifest_string, - network_definition, - BlobProvider::new_with_blobs( - transaction.manifest.blobs.values().cloned().collect(), - ), - ) - .unwrap(); - self.manifests_folder - .put_file(format!("{transaction_file_prefix}.rtm"), &manifest_string); + // Check tranasction manifest + { + // NB: We purposefully don't write the blobs as they're contained in the raw transactions + let manifest_string = match &transaction.transaction_manifest { + UserTransactionManifest::V1(m) => decompile(m, network_definition), + UserTransactionManifest::V2(m) => decompile(m, network_definition), + } + .expect("Manifest should be decompilable to a string representation"); + + // Whilst we're here, let's validate that the manifest can be recompiled + let blob_provider = BlobProvider::new_with_blobs( + transaction + .transaction_manifest + .get_blobs() + .values() + .cloned() + .collect(), + ); + match &transaction.transaction_manifest { + UserTransactionManifest::V1(_) => { + compile_manifest_v1(&manifest_string, network_definition, blob_provider) + .map(|_| ()) + } + UserTransactionManifest::V2(_) => compile_manifest::( + &manifest_string, + network_definition, + blob_provider, + ) + .map(|_| ()), + } + .expect("Decompiled manifest should be recompilable"); + + self.manifests_folder + .put_file(format!("{transaction_file_prefix}.rtm"), &manifest_string); + } + + // Check subintent manifests + for (subintent_index, subintent_manifest) in + transaction.subintent_manifests.iter().enumerate() + { + // NB: We purposefully don't write the blobs as they're contained in the raw transactions + let manifest_string = match &subintent_manifest { + UserSubintentManifest::V2(m) => decompile(m, network_definition), + } + .expect("Subintent manifest should be decompilable to a string representation"); + + // Whilst we're here, let's validate that the manifest can be recompiled + let blob_provider = BlobProvider::new_with_blobs( + subintent_manifest.get_blobs().values().cloned().collect(), + ); + match subintent_manifest { + UserSubintentManifest::V2(_) => compile_manifest::( + &manifest_string, + network_definition, + blob_provider, + ) + .map(|_| ()), + } + .expect("Decompiled manifest should be recompilable"); + + self.manifests_folder.put_file( + format!("{transaction_file_prefix}_subintent_{subintent_index}.rtm"), + &manifest_string, + ); + } // Write receipt let address_encoder = AddressBech32Encoder::new(network_definition); diff --git a/radix-transaction-scenarios/src/scenario.rs b/radix-transaction-scenarios/src/scenario.rs index 4296f5a2e94..8291ac407e2 100644 --- a/radix-transaction-scenarios/src/scenario.rs +++ b/radix-transaction-scenarios/src/scenario.rs @@ -1,35 +1,16 @@ use crate::internal_prelude::*; use crate::accounts::*; - #[derive(Clone, Debug)] pub struct NextTransaction { pub logical_name: String, pub stage_counter: usize, - pub manifest: TransactionManifestV1, + pub transaction_manifest: UserTransactionManifest, + pub subintent_manifests: Vec, pub raw_transaction: RawNotarizedTransaction, } impl NextTransaction { - pub fn of( - logical_name: String, - stage_counter: usize, - names: ManifestObjectNames, - transaction: NotarizedTransactionV1, - ) -> Self { - let mut manifest = TransactionManifestV1::from_intent(&transaction.signed_intent.intent); - match names { - ManifestObjectNames::Unknown => {} - ManifestObjectNames::Known(known_names) => manifest.set_names(known_names), - } - Self { - logical_name, - stage_counter, - manifest, - raw_transaction: transaction.to_raw().expect("Transaction could be encoded"), - } - } - pub fn validate( &self, validator: &TransactionValidator, @@ -40,6 +21,42 @@ impl NextTransaction { } } +pub(crate) trait FinalizableSubintentBuilder { + type SignedPartialTransaction: Sized; + fn finalize( + self, + core: &mut ScenarioCore, + ) -> (Self::SignedPartialTransaction, TransactionObjectNames); +} + +impl FinalizableSubintentBuilder for PartialTransactionV2Builder { + type SignedPartialTransaction = SignedPartialTransactionV2; + fn finalize( + self, + core: &mut ScenarioCore, + ) -> (Self::SignedPartialTransaction, TransactionObjectNames) { + core.finalize_partial_transaction_v2(self) + } +} + +pub(crate) trait FinalizableTransactionBuilder { + fn finalize( + self, + logical_name: &str, + core: &mut ScenarioCore, + ) -> Result; +} + +impl FinalizableTransactionBuilder for TransactionV2Builder { + fn finalize( + self, + logical_name: &str, + core: &mut ScenarioCore, + ) -> Result { + core.finalize_v2(logical_name, self) + } +} + pub(crate) trait Completeable: Sized { fn done(self) -> Result; } @@ -80,24 +97,26 @@ impl ScenarioCore { pub fn next_transaction_with_faucet_lock_fee( &mut self, logical_name: &str, - create_manifest: impl FnOnce(ManifestBuilder) -> ManifestBuilder, + create_manifest: impl FnOnce(TransactionManifestV1Builder) -> TransactionManifestV1Builder, signers: Vec<&PrivateKey>, ) -> Result { - let builder = ManifestBuilder::new() + let builder = ManifestBuilder::new_v1() .lock_fee_from_faucet() .then(create_manifest); - self.next_transaction(logical_name, builder.build(), signers) + self.next_transaction_from_manifest_v1(logical_name, builder.build(), signers) } pub fn next_transaction_with_faucet_lock_fee_fallible( &mut self, logical_name: &str, - create_manifest: impl FnOnce(ManifestBuilder) -> Result, + create_manifest: impl FnOnce( + TransactionManifestV1Builder, + ) -> Result, signers: Vec<&PrivateKey>, ) -> Result { - let mut builder = ManifestBuilder::new().lock_fee_from_faucet(); + let mut builder = ManifestBuilder::new_v1().lock_fee_from_faucet(); builder = create_manifest(builder)?; - self.next_transaction(logical_name, builder.build(), signers) + self.next_transaction_from_manifest_v1(logical_name, builder.build(), signers) } pub fn next_transaction_free_xrd_from_faucet( @@ -120,7 +139,94 @@ impl ScenarioCore { self.nonce } - pub fn next_transaction( + /// A builder with headers configured. + /// + /// It's expected that the caller will: + /// * Optionally add children + /// * Add a manifest + /// * Add any signatures + /// + /// The transaction will then be notarized at finalization time. + /// + /// ```ignore + /// let child = core.v2_subintent() + /// .manifest(|manifest_builder| manifest_builder + /// .yield_to_parent(()) + /// ) + /// .finalize(core); + /// core.v2_transaction() + /// .add_signed_child("child_1", signed_child) + /// .manifest(|manifest_builder| { + /// manifest_builder + /// .lock_fee_from_faucet() + /// .yield_to_child("child_1", ()) + /// }) + /// .sign(key) + /// .finalize(core) + /// }); + /// ``` + pub fn v2_transaction(&mut self) -> TransactionV2Builder { + let nonce = self.nonce; + self.nonce += 1; + TransactionV2Builder::new() + .intent_header(IntentHeaderV2 { + network_id: self.network.id, + start_epoch_inclusive: self.epoch, + end_epoch_exclusive: self.epoch.next().unwrap(), + min_proposer_timestamp_inclusive: None, + max_proposer_timestamp_exclusive: None, + intent_discriminator: nonce as u64, + }) + .transaction_header(TransactionHeaderV2 { + notary_public_key: self.default_notary.public_key(), + notary_is_signatory: false, + tip_basis_points: 0, + }) + } + + /// For recommended usage, see the docs on [`v2_transaction`][`Self::v2_transaction`]. + pub fn v2_subintent(&mut self) -> PartialTransactionV2Builder { + let nonce = self.nonce; + self.nonce += 1; + PartialTransactionV2Builder::new().intent_header(IntentHeaderV2 { + network_id: self.network.id, + start_epoch_inclusive: self.epoch, + end_epoch_exclusive: self.epoch.next().unwrap(), + min_proposer_timestamp_inclusive: None, + max_proposer_timestamp_exclusive: None, + intent_discriminator: nonce as u64, + }) + } + + pub fn finalize_v2( + &mut self, + logical_name: &str, + mut builder: TransactionV2Builder, + ) -> Result { + builder = builder.notarize(&self.default_notary); + self.last_transaction_name = Some(logical_name.to_owned()); + let (transaction, object_names) = builder.build_with_names(); + + let raw_transaction = transaction.to_raw().expect("Transaction could be encoded"); + let (transaction_manifest, subintent_manifests) = + transaction.extract_manifests_with_names(object_names); + Ok(NextTransaction { + logical_name: logical_name.to_owned(), + stage_counter: self.stage_counter, + transaction_manifest, + subintent_manifests, + raw_transaction, + }) + } + + pub fn finalize_partial_transaction_v2( + &mut self, + builder: PartialTransactionV2Builder, + ) -> (SignedPartialTransactionV2, TransactionObjectNames) { + builder.build_with_names() + } + + pub fn next_transaction_from_manifest_v1( &mut self, logical_name: &str, manifest: TransactionManifestV1, @@ -145,13 +251,15 @@ impl ScenarioCore { builder = builder.notarize(&self.default_notary); self.last_transaction_name = Some(logical_name.to_owned()); let transaction = builder.build(); - let names = builder.into_manifest().object_names; - Ok(NextTransaction::of( - logical_name.to_owned(), - self.stage_counter, - names, - transaction, - )) + let raw_transaction = transaction.to_raw().expect("Transaction could be encoded"); + let transaction_manifest = builder.into_manifest().into(); + Ok(NextTransaction { + logical_name: logical_name.to_owned(), + stage_counter: self.stage_counter, + transaction_manifest, + subintent_manifests: vec![], + raw_transaction, + }) } pub fn finish_scenario(&self, output: ScenarioOutput) -> EndState { diff --git a/radix-transaction-scenarios/src/scenarios/access_controller_v2.rs b/radix-transaction-scenarios/src/scenarios/access_controller_v2.rs index 800a5aab28d..4e0d9718633 100644 --- a/radix-transaction-scenarios/src/scenarios/access_controller_v2.rs +++ b/radix-transaction-scenarios/src/scenarios/access_controller_v2.rs @@ -110,7 +110,7 @@ impl ScenarioCreator for AccessControllerV2ScenarioCreator { ) }) .successful_transaction(|core, config, state| { - core.next_transaction( + core.next_transaction_from_manifest_v1( "access-controller-v2-lock-fee-and-recover", ManifestBuilder::new() .call_method( diff --git a/radix-transactions/src/builder/transaction_builder.rs b/radix-transactions/src/builder/transaction_builder.rs index a7607b7fe30..f0bf57b6e76 100644 --- a/radix-transactions/src/builder/transaction_builder.rs +++ b/radix-transactions/src/builder/transaction_builder.rs @@ -140,8 +140,16 @@ impl TransactionV1Builder { } } +#[derive(Default)] pub struct PartialTransactionV2Builder { - children: IndexMap, + children: IndexMap< + String, + ( + SubintentHash, + SignedPartialTransactionV2, + TransactionObjectNames, + ), + >, intent_header: Option, message: Option, manifest: Option, @@ -152,23 +160,29 @@ pub struct PartialTransactionV2Builder { } impl PartialTransactionV2Builder { + pub fn new() -> Self { + Default::default() + } + pub fn add_signed_child( mut self, name: impl AsRef, - signed_partial_transaction: SignedPartialTransactionV2, + signed_partial_transaction: impl Into<(SignedPartialTransactionV2, TransactionObjectNames)>, ) -> Self { if self.manifest.is_some() { panic!("Call add_signed_child before calling manifest or manifest_builder"); } + let (signed_partial_transaction, object_names) = signed_partial_transaction.into(); let prepared = signed_partial_transaction .prepare(PreparationSettings::latest_ref()) .expect("Child signed partial transation could not be prepared"); let hash = prepared.subintent_hash(); let name = name.as_ref(); - let replaced = self - .children - .insert(name.to_string(), (hash, signed_partial_transaction)); + let replaced = self.children.insert( + name.to_string(), + (hash, signed_partial_transaction, object_names), + ); if replaced.is_some() { panic!("Child with name {name} already exists"); } @@ -181,7 +195,7 @@ impl PartialTransactionV2Builder { build_manifest: impl FnOnce(SubintentManifestV2Builder) -> SubintentManifestV2Builder, ) -> Self { let mut manifest_builder = SubintentManifestV2Builder::new_typed(); - for (child_name, (hash, _)) in self.children.iter() { + for (child_name, (hash, _, _)) in self.children.iter() { manifest_builder = manifest_builder.use_child(child_name, *hash); } self.manifest(build_manifest(manifest_builder).build()) @@ -262,25 +276,32 @@ impl PartialTransactionV2Builder { self } - pub fn build(mut self) -> SignedPartialTransactionV2 { + pub fn build_with_names(mut self) -> (SignedPartialTransactionV2, TransactionObjectNames) { // Ensure subintent has been created self.create_subintent(); // Now assemble the signed partial transaction let mut aggregated_subintents = vec![]; let mut aggregated_subintent_signatures = vec![]; - for (_name, (_hash, child_partial_transaction)) in self.children { + let mut aggregated_subintent_object_names = vec![]; + for (_name, (_hash, child_partial_transaction, object_names)) in self.children { let SignedPartialTransactionV2 { partial_transaction, root_intent_signatures, subintent_signatures, } = child_partial_transaction; + let TransactionObjectNames { + root_intent: root_intent_names, + subintents: subintent_names, + } = object_names; aggregated_subintents.push(partial_transaction.root_intent); aggregated_subintents.extend(partial_transaction.subintents.0); aggregated_subintent_signatures.push(root_intent_signatures); aggregated_subintent_signatures.extend(subintent_signatures.by_subintent); + aggregated_subintent_object_names.push(root_intent_names); + aggregated_subintent_object_names.extend(subintent_names); } - SignedPartialTransactionV2 { + let signed_partial_transaction = SignedPartialTransactionV2 { partial_transaction: PartialTransactionV2 { root_intent: self .intent @@ -293,20 +314,38 @@ impl PartialTransactionV2Builder { subintent_signatures: MultipleIntentSignaturesV2 { by_subintent: aggregated_subintent_signatures, }, - } + }; + let object_names = TransactionObjectNames { + root_intent: self.manifest.unwrap().object_names, + subintents: aggregated_subintent_object_names, + }; + (signed_partial_transaction, object_names) + } + + pub fn build(self) -> SignedPartialTransactionV2 { + self.build_with_names().0 } } /// A builder for building a NotarizedTransactionV2. /// In future, we may make this into a state-machine style builder. +#[derive(Default)] pub struct TransactionV2Builder { - children: IndexMap, + children: IndexMap< + String, + ( + SubintentHash, + SignedPartialTransactionV2, + TransactionObjectNames, + ), + >, transaction_header: Option, intent_header: Option, message: Option, manifest: Option, // Temporarily cached once created intent_and_subintent_signatures: Option<(TransactionIntentV2, MultipleIntentSignaturesV2)>, + object_names: Option, prepared_intent: Option, intent_signatures: Vec, signed_intent: Option, @@ -315,23 +354,30 @@ pub struct TransactionV2Builder { } impl TransactionV2Builder { + pub fn new() -> Self { + Default::default() + } + pub fn add_signed_child( mut self, name: impl AsRef, - signed_partial_transaction: SignedPartialTransactionV2, + signed_partial_transaction: impl Into<(SignedPartialTransactionV2, TransactionObjectNames)>, ) -> Self { if self.manifest.is_some() { panic!("Call add_signed_child before calling manifest or manifest_builder"); } + let (signed_partial_transaction, object_names) = signed_partial_transaction.into(); + let prepared = signed_partial_transaction .prepare(PreparationSettings::latest_ref()) .expect("Child signed partial transation could not be prepared"); let hash = prepared.subintent_hash(); let name = name.as_ref(); - let replaced = self - .children - .insert(name.to_string(), (hash, signed_partial_transaction)); + let replaced = self.children.insert( + name.to_string(), + (hash, signed_partial_transaction, object_names), + ); if replaced.is_some() { panic!("Child with name {name} already exists"); } @@ -344,7 +390,7 @@ impl TransactionV2Builder { build_manifest: impl FnOnce(TransactionManifestV2Builder) -> TransactionManifestV2Builder, ) -> Self { let mut manifest_builder = TransactionManifestV2Builder::new_typed(); - for (child_name, (hash, _)) in self.children.iter() { + for (child_name, (hash, _, _)) in self.children.iter() { manifest_builder = manifest_builder.use_child(child_name, *hash); } self.manifest(build_manifest(manifest_builder).build()) @@ -365,28 +411,38 @@ impl TransactionV2Builder { self } - pub fn create_intent_and_subintent_signatures(&mut self) -> &TransactionIntentV2 { + pub fn transaction_header(mut self, transaction_header: TransactionHeaderV2) -> Self { + self.transaction_header = Some(transaction_header); + self + } + + pub fn create_intent_and_subintent_info(&mut self) -> &TransactionIntentV2 { if self.intent_and_subintent_signatures.is_none() { - let (instructions, blobs, child_hashes) = self - .manifest - .as_ref() - .expect("Manifest must be provided") - .clone() - .for_intent(); + let manifest = mem::take(&mut self.manifest) + .expect("Manifest must be provided before this action is performed"); + let (instructions, blobs, child_hashes, root_object_names) = + manifest.for_intent_with_names(); let subintents = core::mem::take(&mut self.children); let mut aggregated_subintents = vec![]; let mut aggregated_subintent_signatures = vec![]; - for (_name, (_hash, child_partial_transaction)) in subintents { + let mut aggregated_subintent_object_names = vec![]; + for (_name, (_hash, child_partial_transaction, object_names)) in subintents { let SignedPartialTransactionV2 { partial_transaction, root_intent_signatures, subintent_signatures, } = child_partial_transaction; + let TransactionObjectNames { + root_intent: root_intent_names, + subintents: subintent_names, + } = object_names; aggregated_subintents.push(partial_transaction.root_intent); aggregated_subintents.extend(partial_transaction.subintents.0); aggregated_subintent_signatures.push(root_intent_signatures); aggregated_subintent_signatures.extend(subintent_signatures.by_subintent); + aggregated_subintent_object_names.push(root_intent_names); + aggregated_subintent_object_names.extend(subintent_names); } let intent = TransactionIntentV2 { root_header: self @@ -415,6 +471,10 @@ impl TransactionV2Builder { by_subintent: aggregated_subintent_signatures, }; self.intent_and_subintent_signatures = Some((intent, subintent_signatures)); + self.object_names = Some(TransactionObjectNames { + root_intent: root_object_names, + subintents: aggregated_subintent_object_names, + }); } &self.intent_and_subintent_signatures.as_ref().unwrap().0 } @@ -422,7 +482,7 @@ impl TransactionV2Builder { pub fn create_prepared_intent(&mut self) -> &PreparedTransactionIntentV2 { if self.prepared_intent.is_none() { let prepared = self - .create_intent_and_subintent_signatures() + .create_intent_and_subintent_info() .prepare(PreparationSettings::latest_ref()) .expect("Expected that the intent could be prepared"); self.prepared_intent = Some(prepared); @@ -457,7 +517,7 @@ impl TransactionV2Builder { pub fn create_signed_transaction_intent(&mut self) -> &SignedTransactionIntentV2 { if self.signed_intent.is_none() { - self.create_intent_and_subintent_signatures(); + self.create_intent_and_subintent_info(); let (root_intent, subintent_signatures) = mem::take(&mut self.intent_and_subintent_signatures).unwrap(); let signatures = mem::take(&mut self.intent_signatures); @@ -499,13 +559,18 @@ impl TransactionV2Builder { self } - pub fn build(self) -> NotarizedTransactionV2 { - NotarizedTransactionV2 { + pub fn build_with_names(self) -> (NotarizedTransactionV2, TransactionObjectNames) { + let transaction = NotarizedTransactionV2 { signed_intent: self.signed_intent.expect("Expected signed intent to exist"), notary_signature: self .notary_signature .expect("Expected notary signature to exist"), - } + }; + (transaction, self.object_names.unwrap()) + } + + pub fn build(self) -> NotarizedTransactionV2 { + self.build_with_names().0 } } diff --git a/radix-transactions/src/manifest/any_manifest.rs b/radix-transactions/src/manifest/any_manifest.rs index d2ddd31258c..7090398e687 100644 --- a/radix-transactions/src/manifest/any_manifest.rs +++ b/radix-transactions/src/manifest/any_manifest.rs @@ -12,6 +12,7 @@ pub enum AnyTransactionManifest { V1(TransactionManifestV1), SystemV1(SystemTransactionManifestV1), V2(TransactionManifestV2), + SubintentV2(SubintentManifestV2), } impl From for AnyTransactionManifest { @@ -32,12 +33,19 @@ impl From for AnyTransactionManifest { } } +impl From for AnyTransactionManifest { + fn from(value: SubintentManifestV2) -> Self { + Self::SubintentV2(value) + } +} + impl AnyTransactionManifest { pub fn get_blobs(&self) -> &IndexMap> { match self { AnyTransactionManifest::V1(m) => m.get_blobs(), AnyTransactionManifest::SystemV1(m) => m.get_blobs(), AnyTransactionManifest::V2(m) => m.get_blobs(), + AnyTransactionManifest::SubintentV2(m) => m.get_blobs(), } } } diff --git a/radix-transactions/src/manifest/decompiler.rs b/radix-transactions/src/manifest/decompiler.rs index ee8a94b8ec1..ccad86a4cfe 100644 --- a/radix-transactions/src/manifest/decompiler.rs +++ b/radix-transactions/src/manifest/decompiler.rs @@ -112,6 +112,7 @@ pub fn decompile_any( AnyTransactionManifest::V1(m) => decompile(m, network), AnyTransactionManifest::SystemV1(m) => decompile(m, network), AnyTransactionManifest::V2(m) => decompile(m, network), + AnyTransactionManifest::SubintentV2(m) => decompile(m, network), } } diff --git a/radix-transactions/src/manifest/manifest_naming.rs b/radix-transactions/src/manifest/manifest_naming.rs index 773d59ee7f6..3cfbadfe2c7 100644 --- a/radix-transactions/src/manifest/manifest_naming.rs +++ b/radix-transactions/src/manifest/manifest_naming.rs @@ -1,5 +1,22 @@ use crate::internal_prelude::*; +#[derive(Default, Clone, Debug, ManifestSbor, ScryptoDescribe, PartialEq, Eq)] +pub struct TransactionObjectNames { + pub root_intent: ManifestObjectNames, + pub subintents: Vec, +} + +impl TransactionObjectNames { + pub fn unknown_with_subintent_count(subintents: usize) -> Self { + Self { + root_intent: ManifestObjectNames::Unknown, + subintents: (0..subintents) + .map(|_| ManifestObjectNames::Unknown) + .collect(), + } + } +} + #[derive(Default, Clone, Debug, ManifestSbor, ScryptoDescribe, PartialEq, Eq)] pub enum ManifestObjectNames { #[default] diff --git a/radix-transactions/src/manifest/manifest_traits.rs b/radix-transactions/src/manifest/manifest_traits.rs index 880f113fb5a..1246e551a52 100644 --- a/radix-transactions/src/manifest/manifest_traits.rs +++ b/radix-transactions/src/manifest/manifest_traits.rs @@ -1,9 +1,17 @@ use crate::internal_prelude::*; -pub trait BuildableManifest: ReadableManifest + ManifestEncode + Default + Eq + Debug { +pub trait BuildableManifest: + ReadableManifest + Into + ManifestEncode + Default + Eq + Debug +{ fn add_instruction(&mut self, instruction: Self::Instruction); fn add_blob(&mut self, hash: Hash, content: Vec); fn set_names(&mut self, names: KnownManifestObjectNames); + fn set_names_if_known(&mut self, names: impl Into) { + match names.into() { + ManifestObjectNames::Unknown => {} + ManifestObjectNames::Known(known_names) => self.set_names(known_names), + }; + } fn add_child_subintent(&mut self, _hash: SubintentHash) -> Result<(), ManifestBuildError> { Err(ManifestBuildError::ChildSubintentsUnsupportedByManifestType) } diff --git a/radix-transactions/src/model/preparation/traits.rs b/radix-transactions/src/model/preparation/traits.rs index 9b9b921e5d9..6e878bd5f42 100644 --- a/radix-transactions/src/model/preparation/traits.rs +++ b/radix-transactions/src/model/preparation/traits.rs @@ -6,10 +6,11 @@ pub trait TransactionPayload: ManifestEncode + ManifestDecode + ManifestCategorize - + ManifestSborEnumVariantFor -where - Self::OwnedVariant: ManifestDecode, - for<'a> Self::BorrowedVariant<'a>: ManifestEncode, + + for<'a> ManifestSborEnumVariantFor< + VersionedTransactionPayload, + OwnedVariant: ManifestDecode, + BorrowedVariant<'a>: ManifestEncode, + > { type Prepared: PreparedTransaction; type Raw: RawTransactionPayload; diff --git a/radix-transactions/src/model/user_transaction.rs b/radix-transactions/src/model/user_transaction.rs index 08574c8d5f1..0afd46ace20 100644 --- a/radix-transactions/src/model/user_transaction.rs +++ b/radix-transactions/src/model/user_transaction.rs @@ -1,8 +1,141 @@ use crate::internal_prelude::*; -// NOTE: Unlike LedgerTransaction, there isn't a distinct concept of a UserTransaction payload -// so we only have `PreparedUserTransaction` and `ValidatedUserTransaction` which are -// just sum types of the two different encoded payloads. +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum UserTransactionManifest { + V1(TransactionManifestV1), + V2(TransactionManifestV2), +} + +impl From for UserTransactionManifest { + fn from(value: TransactionManifestV1) -> Self { + Self::V1(value) + } +} + +impl From for UserTransactionManifest { + fn from(value: TransactionManifestV2) -> Self { + Self::V2(value) + } +} + +impl UserTransactionManifest { + pub fn set_names(&mut self, names: KnownManifestObjectNames) { + match self { + Self::V1(m) => m.set_names(names), + Self::V2(m) => m.set_names(names), + } + } + + pub fn get_blobs(&self) -> &IndexMap> { + match self { + Self::V1(m) => m.get_blobs(), + Self::V2(m) => m.get_blobs(), + } + } +} + +pub trait UserTransactionPayload: + Into + TransactionPayload +{ +} + +impl + TransactionPayload> + UserTransactionPayload for T +{ +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum UserSubintentManifest { + V2(SubintentManifestV2), +} + +impl From for UserSubintentManifest { + fn from(value: SubintentManifestV2) -> Self { + Self::V2(value) + } +} + +impl UserSubintentManifest { + pub fn set_names(&mut self, names: KnownManifestObjectNames) { + match self { + Self::V2(m) => m.set_names(names), + } + } + + pub fn get_blobs(&self) -> &IndexMap> { + match self { + Self::V2(m) => m.get_blobs(), + } + } +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum UserTransaction { + V1(NotarizedTransactionV1), + V2(NotarizedTransactionV2), +} + +impl From for UserTransaction { + fn from(value: NotarizedTransactionV1) -> Self { + Self::V1(value) + } +} + +impl From for UserTransaction { + fn from(value: NotarizedTransactionV2) -> Self { + Self::V2(value) + } +} + +impl UserTransaction { + pub fn prepare( + self, + settings: &PreparationSettings, + ) -> Result { + Ok(match self { + Self::V1(t) => PreparedUserTransaction::V1(t.prepare(settings)?), + Self::V2(t) => PreparedUserTransaction::V2(t.prepare(settings)?), + }) + } + + pub fn extract_manifests_with_names( + &self, + names: TransactionObjectNames, + ) -> (UserTransactionManifest, Vec) { + match self { + UserTransaction::V1(t) => t.extract_manifests_with_names(names).into(), + UserTransaction::V2(t) => t.extract_manifests_with_names(names).into(), + } + } +} + +impl UserTransaction { + pub fn prepare_and_validate( + &self, + validator: &TransactionValidator, + ) -> Result { + Ok(match self { + UserTransaction::V1(t) => { + ValidatedUserTransaction::V1(t.prepare_and_validate(validator)?) + } + UserTransaction::V2(t) => { + ValidatedUserTransaction::V2(t.prepare_and_validate(validator)?) + } + }) + } +} + +impl IntoExecutable for UserTransaction { + type Error = TransactionValidationError; + + fn into_executable( + self, + validator: &TransactionValidator, + ) -> Result { + let executable = self.prepare_and_validate(validator)?.get_executable(); + Ok(executable) + } +} #[derive(Debug, Clone, Eq, PartialEq)] pub enum PreparedUserTransaction { diff --git a/radix-transactions/src/model/v1/notarized_transaction_v1.rs b/radix-transactions/src/model/v1/notarized_transaction_v1.rs index 11b9f52a7c6..3154a060784 100644 --- a/radix-transactions/src/model/v1/notarized_transaction_v1.rs +++ b/radix-transactions/src/model/v1/notarized_transaction_v1.rs @@ -24,6 +24,17 @@ impl NotarizedTransactionV1 { self.prepare(validator.preparation_settings())? .validate(validator) } + + pub fn extract_manifests_with_names( + &self, + names: TransactionObjectNames, + ) -> (UserTransactionManifest, Vec) { + let mut transaction_manifest = + TransactionManifestV1::from_intent(&self.signed_intent.intent); + transaction_manifest.set_names_if_known(names.root_intent); + let subintent_manifests = vec![]; + (transaction_manifest.into(), subintent_manifests) + } } impl IntoExecutable for NotarizedTransactionV1 { diff --git a/radix-transactions/src/model/v2/notarized_transaction_v2.rs b/radix-transactions/src/model/v2/notarized_transaction_v2.rs index aed266e8b86..2cd228bc83e 100644 --- a/radix-transactions/src/model/v2/notarized_transaction_v2.rs +++ b/radix-transactions/src/model/v2/notarized_transaction_v2.rs @@ -24,6 +24,42 @@ impl NotarizedTransactionV2 { self.prepare(validator.preparation_settings())? .validate(validator) } + + pub fn extract_manifest(&self) -> TransactionManifestV2 { + TransactionManifestV2::from_intent_core(&self.signed_intent.root_intent.root_intent_core) + } + + pub fn extract_manifests_with_names( + &self, + names: TransactionObjectNames, + ) -> (UserTransactionManifest, Vec) { + let mut transaction_manifest = TransactionManifestV2::from_intent_core( + &self.signed_intent.root_intent.root_intent_core, + ); + transaction_manifest.set_names_if_known(names.root_intent); + let subintents = &self.signed_intent.root_intent.subintents.0; + if subintents.len() != names.subintents.len() { + panic!( + "The transaction object names have names for {} subintents but the transaction has {} subintents", + names.subintents.len(), + subintents.len(), + ) + } + let subintent_manifests = self + .signed_intent + .root_intent + .subintents + .0 + .iter() + .zip(names.subintents.into_iter()) + .map(|(subintent, names)| { + let mut manifest = SubintentManifestV2::from_intent_core(&subintent.intent_core); + manifest.set_names_if_known(names); + manifest.into() + }) + .collect(); + (transaction_manifest.into(), subintent_manifests) + } } define_transaction_payload!( diff --git a/radix-transactions/src/model/v2/signed_partial_transaction_v2.rs b/radix-transactions/src/model/v2/signed_partial_transaction_v2.rs index c076137bf65..8dcc31682a4 100644 --- a/radix-transactions/src/model/v2/signed_partial_transaction_v2.rs +++ b/radix-transactions/src/model/v2/signed_partial_transaction_v2.rs @@ -16,6 +16,15 @@ pub struct SignedPartialTransactionV2 { pub subintent_signatures: MultipleIntentSignaturesV2, } +impl From for (SignedPartialTransactionV2, TransactionObjectNames) { + fn from(value: SignedPartialTransactionV2) -> Self { + let object_names = TransactionObjectNames::unknown_with_subintent_count( + value.subintent_signatures.by_subintent.len(), + ); + (value, object_names) + } +} + define_transaction_payload!( SignedPartialTransactionV2, RawSignedPartialTransaction, diff --git a/radix-transactions/src/model/v2/transaction_manifest_v2.rs b/radix-transactions/src/model/v2/transaction_manifest_v2.rs index e1f6103c0d4..e0bd125e816 100644 --- a/radix-transactions/src/model/v2/transaction_manifest_v2.rs +++ b/radix-transactions/src/model/v2/transaction_manifest_v2.rs @@ -100,4 +100,17 @@ impl TransactionManifestV2 { }, ) } + + pub fn for_intent_with_names( + self, + ) -> (InstructionsV2, BlobsV1, ChildIntentsV2, ManifestObjectNames) { + ( + InstructionsV2(Rc::new(self.instructions)), + self.blobs.into(), + ChildIntentsV2 { + children: self.children, + }, + self.object_names, + ) + } } diff --git a/sbor/src/enum_variant.rs b/sbor/src/enum_variant.rs index c7768b98821..2ac58af77f8 100644 --- a/sbor/src/enum_variant.rs +++ b/sbor/src/enum_variant.rs @@ -175,6 +175,18 @@ pub trait SborEnumVariantFor, X: CustomValueKind> { /// but not Encode. Really I'd like to say `BorrowedVariant<'a>: VecEncode if Self: VecEncode` /// but Rust doesn't support that. Instead, users will need to add the bound on the associated /// type themselves. + /// + /// Instead, you can express a trait bound as such: + /// ```ignore + /// pub trait MyNewSuperTrait: + /// for<'a> SborEnumVariantFor< + /// TEnum, + /// X, + /// OwnedVariant: ManifestDecode, + /// BorrowedVariant<'a>: ManifestEncode, + /// > + /// {} + /// ``` type BorrowedVariant<'a>: IsSborFixedEnumVariant> where Self: 'a, From 55dc995b631036c3081383d9542eff64f3055069 Mon Sep 17 00:00:00 2001 From: David Edey Date: Tue, 17 Sep 2024 17:10:59 +0100 Subject: [PATCH 5/6] fix: Add TransactionReceiptV1 alias to avoid breaking dApp builder tests unnecessarily --- radix-engine/src/transaction/transaction_receipt.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radix-engine/src/transaction/transaction_receipt.rs b/radix-engine/src/transaction/transaction_receipt.rs index d039a80afe1..e910dd574ac 100644 --- a/radix-engine/src/transaction/transaction_receipt.rs +++ b/radix-engine/src/transaction/transaction_receipt.rs @@ -36,6 +36,10 @@ pub struct TransactionReceipt { pub debug_information: Option, } +// Type for backwards compatibility to avoid integrator compile errors +// when they update. +pub type TransactionReceiptV1 = TransactionReceipt; + #[cfg(feature = "std")] impl TransactionReceipt { pub fn generate_execution_breakdown_flamegraph_svg_bytes( From 0a39c138e206e7c3c17a16aec41e5943b2aea829 Mon Sep 17 00:00:00 2001 From: David Edey Date: Thu, 19 Sep 2024 20:26:49 +0100 Subject: [PATCH 6/6] markups: Fix markups --- .../src/builder/transaction_builder.rs | 12 ++++++++---- radix-transactions/src/manifest/manifest_traits.rs | 4 ++-- radix-transactions/src/model/mod.rs | 2 ++ .../src/model/{v1 => }/test_transaction.rs | 8 +------- radix-transactions/src/model/v1/manifest_v1.rs | 4 ++-- radix-transactions/src/model/v1/mod.rs | 2 -- .../src/model/v1/system_manifest_v1.rs | 4 ++-- .../src/model/v2/subintent_manifest_v2.rs | 4 ++-- .../src/model/v2/transaction_manifest_v2.rs | 4 ++-- .../src/ledger_simulator/ledger_simulator.rs | 8 ++++---- 10 files changed, 25 insertions(+), 27 deletions(-) rename radix-transactions/src/model/{v1 => }/test_transaction.rs (97%) diff --git a/radix-transactions/src/builder/transaction_builder.rs b/radix-transactions/src/builder/transaction_builder.rs index f0bf57b6e76..0f0dc56759f 100644 --- a/radix-transactions/src/builder/transaction_builder.rs +++ b/radix-transactions/src/builder/transaction_builder.rs @@ -418,11 +418,13 @@ impl TransactionV2Builder { pub fn create_intent_and_subintent_info(&mut self) -> &TransactionIntentV2 { if self.intent_and_subintent_signatures.is_none() { - let manifest = mem::take(&mut self.manifest) + let manifest = self + .manifest + .take() .expect("Manifest must be provided before this action is performed"); let (instructions, blobs, child_hashes, root_object_names) = manifest.for_intent_with_names(); - let subintents = core::mem::take(&mut self.children); + let subintents = mem::take(&mut self.children); let mut aggregated_subintents = vec![]; let mut aggregated_subintent_signatures = vec![]; @@ -518,8 +520,10 @@ impl TransactionV2Builder { pub fn create_signed_transaction_intent(&mut self) -> &SignedTransactionIntentV2 { if self.signed_intent.is_none() { self.create_intent_and_subintent_info(); - let (root_intent, subintent_signatures) = - mem::take(&mut self.intent_and_subintent_signatures).unwrap(); + let (root_intent, subintent_signatures) = self + .intent_and_subintent_signatures + .take() + .expect("Intent was created in create_intent_and_subintent_info()"); let signatures = mem::take(&mut self.intent_signatures); let signed_intent = SignedTransactionIntentV2 { root_intent, diff --git a/radix-transactions/src/manifest/manifest_traits.rs b/radix-transactions/src/manifest/manifest_traits.rs index 1246e551a52..e20d9727250 100644 --- a/radix-transactions/src/manifest/manifest_traits.rs +++ b/radix-transactions/src/manifest/manifest_traits.rs @@ -25,7 +25,7 @@ pub trait BuildableManifest: 0 } - fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType; + fn default_test_execution_config_type(&self) -> DefaultTestExecutionConfigType; fn into_executable_with_proofs( self, nonce: u32, @@ -35,7 +35,7 @@ pub trait BuildableManifest: } #[derive(Debug, Copy, Clone, PartialEq, Eq)] -pub enum SuggestedExecutionConfigType { +pub enum DefaultTestExecutionConfigType { Notarized, System, Test, diff --git a/radix-transactions/src/model/mod.rs b/radix-transactions/src/model/mod.rs index 1d20eb6679c..28282373f50 100644 --- a/radix-transactions/src/model/mod.rs +++ b/radix-transactions/src/model/mod.rs @@ -3,6 +3,7 @@ mod execution; mod hash; mod ledger_transaction; mod preparation; +mod test_transaction; mod user_transaction; mod v1; mod v2; @@ -13,6 +14,7 @@ pub use execution::*; pub use hash::*; pub use ledger_transaction::*; pub use preparation::*; +pub use test_transaction::*; pub use user_transaction::*; pub use v1::*; pub use v2::*; diff --git a/radix-transactions/src/model/v1/test_transaction.rs b/radix-transactions/src/model/test_transaction.rs similarity index 97% rename from radix-transactions/src/model/v1/test_transaction.rs rename to radix-transactions/src/model/test_transaction.rs index 6018743fdbb..ddf808f3407 100644 --- a/radix-transactions/src/model/v1/test_transaction.rs +++ b/radix-transactions/src/model/test_transaction.rs @@ -1,10 +1,4 @@ use crate::internal_prelude::*; -use crate::model::*; -use radix_common::crypto::hash; -use radix_common::data::manifest::*; -use radix_common::types::NonFungibleGlobalId; -use std::collections::BTreeSet; -use std::ops::Deref; #[derive(ManifestSbor)] pub enum TestTransaction { @@ -144,7 +138,7 @@ impl PreparedTestIntent { let prepared_instructions = intent.instructions.prepare_partial(settings)?; Ok(PreparedTestIntent { encoded_instructions: Rc::new(manifest_encode(&prepared_instructions.inner.0)?), - references: prepared_instructions.references.deref().clone(), + references: prepared_instructions.references.as_ref().clone(), blobs: intent.blobs.prepare_partial(settings)?.blobs_by_hash, hash: intent.hash, children_intent_indices: intent.children_intent_indices, diff --git a/radix-transactions/src/model/v1/manifest_v1.rs b/radix-transactions/src/model/v1/manifest_v1.rs index 79c71b32145..c2ade74a729 100644 --- a/radix-transactions/src/model/v1/manifest_v1.rs +++ b/radix-transactions/src/model/v1/manifest_v1.rs @@ -49,8 +49,8 @@ impl BuildableManifest for TransactionManifestV1 { self.object_names = names.into() } - fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { - SuggestedExecutionConfigType::Test + fn default_test_execution_config_type(&self) -> DefaultTestExecutionConfigType { + DefaultTestExecutionConfigType::Test } fn into_executable_with_proofs( diff --git a/radix-transactions/src/model/v1/mod.rs b/radix-transactions/src/model/v1/mod.rs index 41862e8a006..47ae33ac25e 100644 --- a/radix-transactions/src/model/v1/mod.rs +++ b/radix-transactions/src/model/v1/mod.rs @@ -17,7 +17,6 @@ mod round_update_transaction; mod signed_intent; mod system_manifest_v1; mod system_transaction; -mod test_transaction; mod validated_notarized_transaction; pub use blobs::*; @@ -37,5 +36,4 @@ pub use round_update_transaction::*; pub use signed_intent::*; pub use system_manifest_v1::*; pub use system_transaction::*; -pub use test_transaction::*; pub use validated_notarized_transaction::*; diff --git a/radix-transactions/src/model/v1/system_manifest_v1.rs b/radix-transactions/src/model/v1/system_manifest_v1.rs index 86e3d3c6d5d..e3b9d571d67 100644 --- a/radix-transactions/src/model/v1/system_manifest_v1.rs +++ b/radix-transactions/src/model/v1/system_manifest_v1.rs @@ -65,8 +65,8 @@ impl BuildableManifest for SystemTransactionManifestV1 { self.preallocated_addresses.len() } - fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { - SuggestedExecutionConfigType::System + fn default_test_execution_config_type(&self) -> DefaultTestExecutionConfigType { + DefaultTestExecutionConfigType::System } fn into_executable_with_proofs( diff --git a/radix-transactions/src/model/v2/subintent_manifest_v2.rs b/radix-transactions/src/model/v2/subintent_manifest_v2.rs index 76d1ddfa356..2459db86daa 100644 --- a/radix-transactions/src/model/v2/subintent_manifest_v2.rs +++ b/radix-transactions/src/model/v2/subintent_manifest_v2.rs @@ -66,8 +66,8 @@ impl BuildableManifest for SubintentManifestV2 { Ok(()) } - fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { - SuggestedExecutionConfigType::Test + fn default_test_execution_config_type(&self) -> DefaultTestExecutionConfigType { + DefaultTestExecutionConfigType::Test } fn into_executable_with_proofs( diff --git a/radix-transactions/src/model/v2/transaction_manifest_v2.rs b/radix-transactions/src/model/v2/transaction_manifest_v2.rs index e0bd125e816..8ddd568996d 100644 --- a/radix-transactions/src/model/v2/transaction_manifest_v2.rs +++ b/radix-transactions/src/model/v2/transaction_manifest_v2.rs @@ -62,8 +62,8 @@ impl BuildableManifest for TransactionManifestV2 { Ok(()) } - fn suggested_execution_config_type(&self) -> SuggestedExecutionConfigType { - SuggestedExecutionConfigType::Test + fn default_test_execution_config_type(&self) -> DefaultTestExecutionConfigType { + DefaultTestExecutionConfigType::Test } fn into_executable_with_proofs( diff --git a/scrypto-test/src/ledger_simulator/ledger_simulator.rs b/scrypto-test/src/ledger_simulator/ledger_simulator.rs index 7199479d8e6..c7f2d32909d 100644 --- a/scrypto-test/src/ledger_simulator/ledger_simulator.rs +++ b/scrypto-test/src/ledger_simulator/ledger_simulator.rs @@ -1126,14 +1126,14 @@ impl LedgerSimulator { } fn resolve_suggested_config(&self, manifest: &impl BuildableManifest) -> ExecutionConfig { - match manifest.suggested_execution_config_type() { - SuggestedExecutionConfigType::Notarized => { + match manifest.default_test_execution_config_type() { + DefaultTestExecutionConfigType::Notarized => { ExecutionConfig::for_notarized_transaction(NetworkDefinition::simulator()) } - SuggestedExecutionConfigType::System => { + DefaultTestExecutionConfigType::System => { ExecutionConfig::for_system_transaction(NetworkDefinition::simulator()) } - SuggestedExecutionConfigType::Test => ExecutionConfig::for_test_transaction(), + DefaultTestExecutionConfigType::Test => ExecutionConfig::for_test_transaction(), } .with_kernel_trace(self.with_kernel_trace) }