From a633e954f3b88697aa797d9792e8a5b5cf310b7e Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 25 Apr 2024 08:26:16 +0300 Subject: [PATCH 001/170] Bridge: make some headers submissions free (#4102) supersedes https://github.com/paritytech/parity-bridges-common/pull/2873 Draft because of couple of TODOs: - [x] fix remaining TODOs; - [x] double check that all changes from https://github.com/paritytech/parity-bridges-common/pull/2873 are correctly ported; - [x] create a separate PR (on top of that one or a follow up?) for https://github.com/paritytech/polkadot-sdk/tree/sv-try-new-bridge-fees; - [x] fix compilation issues (haven't checked, but there should be many). --------- Co-authored-by: Adrian Catangiu --- .gitlab/pipeline/zombienet.yml | 4 +- Cargo.lock | 9 + bridges/bin/runtime-common/Cargo.toml | 2 + .../extensions/check_obsolete_extension.rs | 577 ++++++++++++++-- .../src/extensions/priority_calculator.rs | 433 ++++++++---- .../extensions/refund_relayer_extension.rs | 627 +++++++++++++----- bridges/bin/runtime-common/src/mock.rs | 4 +- .../chain-bridge-hub-cumulus/src/lib.rs | 3 + .../chains/chain-bridge-hub-kusama/src/lib.rs | 1 + .../chain-bridge-hub-polkadot/src/lib.rs | 1 + .../chains/chain-bridge-hub-rococo/src/lib.rs | 5 +- .../chain-bridge-hub-westend/src/lib.rs | 9 +- bridges/modules/grandpa/src/call_ext.rs | 358 +++++++++- bridges/modules/grandpa/src/lib.rs | 249 +++++-- bridges/modules/grandpa/src/mock.rs | 6 +- bridges/modules/grandpa/src/weights_ext.rs | 58 ++ bridges/modules/parachains/src/call_ext.rs | 299 +++++++-- bridges/modules/parachains/src/lib.rs | 344 ++++++++-- bridges/modules/parachains/src/mock.rs | 11 +- bridges/modules/parachains/src/weights_ext.rs | 27 +- bridges/primitives/parachains/src/lib.rs | 19 + bridges/primitives/runtime/src/chain.rs | 20 + .../relays/client-substrate/src/test_chain.rs | 1 + .../bridge_hub_rococo_local_network.toml | 8 +- .../bridge_hub_westend_local_network.toml | 8 +- .../rococo-westend/bridges_rococo_westend.sh | 98 +++ .../environments/rococo-westend/explorers.sh | 11 + .../environments/rococo-westend/helper.sh | 8 +- .../environments/rococo-westend/spawn.sh | 4 +- .../rococo-westend/start_relayer.sh | 26 +- .../js-helpers/native-asset-balance.js | 12 + .../roc-reaches-westend.zndsl | 6 +- .../roc-relayer-balance-does-not-change.zndsl | 11 + .../testing/tests/0001-asset-transfer/run.sh | 6 + .../wnd-reaches-rococo.zndsl | 6 +- .../wnd-relayer-balance-does-not-change.zndsl | 11 + .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 + .../src/bridge_common_config.rs | 6 +- .../src/bridge_to_bulletin_config.rs | 27 +- .../src/bridge_to_westend_config.rs | 34 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 47 +- .../bridge-hub-rococo/src/weights/mod.rs | 20 + .../bridge-hub-rococo/tests/tests.rs | 45 +- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 2 + .../src/bridge_to_rococo_config.rs | 34 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 34 +- .../bridge-hub-westend/src/weights/mod.rs | 20 + .../bridge-hub-westend/tests/tests.rs | 33 +- .../src/test_cases/from_grandpa_chain.rs | 262 +++++++- .../src/test_cases/from_parachain.rs | 298 +++++++++ .../test-utils/src/test_cases/helpers.rs | 28 + .../src/test_data/from_grandpa_chain.rs | 69 +- .../src/test_data/from_parachain.rs | 59 +- prdoc/pr_4102.prdoc | 43 ++ 54 files changed, 3730 insertions(+), 615 deletions(-) create mode 100644 bridges/modules/grandpa/src/weights_ext.rs create mode 100755 bridges/testing/environments/rococo-westend/explorers.sh create mode 100644 bridges/testing/framework/js-helpers/native-asset-balance.js create mode 100644 bridges/testing/tests/0001-asset-transfer/roc-relayer-balance-does-not-change.zndsl create mode 100644 bridges/testing/tests/0001-asset-transfer/wnd-relayer-balance-does-not-change.zndsl create mode 100644 prdoc/pr_4102.prdoc diff --git a/.gitlab/pipeline/zombienet.yml b/.gitlab/pipeline/zombienet.yml index 52948e1eb71..e306cb43c02 100644 --- a/.gitlab/pipeline/zombienet.yml +++ b/.gitlab/pipeline/zombienet.yml @@ -12,4 +12,6 @@ include: # polkadot tests - .gitlab/pipeline/zombienet/polkadot.yml # bridges tests - - .gitlab/pipeline/zombienet/bridges.yml + # TODO: https://github.com/paritytech/parity-bridges-common/pull/2884 + # commenting until we have a new relatye, compatible with updated fees scheme + # - .gitlab/pipeline/zombienet/bridges.yml diff --git a/Cargo.lock b/Cargo.lock index ad7729d4b30..d64800fb085 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2153,6 +2153,7 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "testnet-parachains-constants", + "tuplex", ] [[package]] @@ -2311,6 +2312,7 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "testnet-parachains-constants", + "tuplex", "westend-runtime-constants", ] @@ -2349,6 +2351,7 @@ dependencies = [ "staging-xcm", "staging-xcm-builder", "static_assertions", + "tuplex", ] [[package]] @@ -22046,6 +22049,12 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tuplex" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "676ac81d5454c4dcf37955d34fa8626ede3490f744b86ca14a7b90168d2a08aa" + [[package]] name = "twox-hash" version = "1.6.3" diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 67b91a16a30..74049031afe 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -16,6 +16,7 @@ hash-db = { version = "0.16.0", default-features = false } log = { workspace = true } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } static_assertions = { version = "1.1", optional = true } +tuplex = { version = "0.1", default-features = false } # Bridge dependencies @@ -82,6 +83,7 @@ std = [ "sp-runtime/std", "sp-std/std", "sp-trie/std", + "tuplex/std", "xcm-builder/std", "xcm/std", ] diff --git a/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs b/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs index 4b0c052df80..2c152aef682 100644 --- a/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs +++ b/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs @@ -18,55 +18,229 @@ //! obsolete (duplicated) data or do not pass some additional pallet-specific //! checks. -use crate::messages_call_ext::MessagesCallSubType; -use pallet_bridge_grandpa::CallSubType as GrandpaCallSubType; -use pallet_bridge_parachains::CallSubType as ParachainsCallSubtype; -use sp_runtime::transaction_validity::TransactionValidity; +use crate::{ + extensions::refund_relayer_extension::RefundableParachainId, + messages_call_ext::MessagesCallSubType, +}; +use bp_relayers::ExplicitOrAccountParams; +use bp_runtime::Parachain; +use pallet_bridge_grandpa::{ + BridgedBlockNumber, CallSubType as GrandpaCallSubType, SubmitFinalityProofHelper, +}; +use pallet_bridge_parachains::{ + CallSubType as ParachainsCallSubtype, SubmitParachainHeadsHelper, SubmitParachainHeadsInfo, +}; +use pallet_bridge_relayers::Pallet as RelayersPallet; +use sp_runtime::{ + traits::{Get, PhantomData, UniqueSaturatedInto}, + transaction_validity::{TransactionPriority, TransactionValidity, ValidTransactionBuilder}, +}; /// A duplication of the `FilterCall` trait. /// /// We need this trait in order to be able to implement it for the messages pallet, /// since the implementation is done outside of the pallet crate. -pub trait BridgeRuntimeFilterCall { - /// Checks if a runtime call is valid. - fn validate(call: &Call) -> TransactionValidity; +pub trait BridgeRuntimeFilterCall { + /// Data that may be passed from the validate to `post_dispatch`. + type ToPostDispatch; + /// Called during validation. Needs to checks whether a runtime call, submitted + /// by the `who` is valid. `who` may be `None` if transaction is not signed + /// by a regular account. + fn validate(who: &AccountId, call: &Call) -> (Self::ToPostDispatch, TransactionValidity); + /// Called after transaction is dispatched. + fn post_dispatch(_who: &AccountId, _has_failed: bool, _to_post_dispatch: Self::ToPostDispatch) { + } +} + +/// Wrapper for the bridge GRANDPA pallet that checks calls for obsolete submissions +/// and also boosts transaction priority if it has submitted by registered relayer. +/// The boost is computed as +/// `(BundledHeaderNumber - 1 - BestFinalizedHeaderNumber) * Priority::get()`. +/// The boost is only applied if submitter has active registration in the relayers +/// pallet. +pub struct CheckAndBoostBridgeGrandpaTransactions( + PhantomData<(T, I, Priority, SlashAccount)>, +); + +impl, SlashAccount: Get> + BridgeRuntimeFilterCall + for CheckAndBoostBridgeGrandpaTransactions +where + T: pallet_bridge_relayers::Config + pallet_bridge_grandpa::Config, + T::RuntimeCall: GrandpaCallSubType, +{ + // bridged header number, bundled in transaction + type ToPostDispatch = Option>; + + fn validate( + who: &T::AccountId, + call: &T::RuntimeCall, + ) -> (Self::ToPostDispatch, TransactionValidity) { + match GrandpaCallSubType::::check_obsolete_submit_finality_proof(call) { + Ok(Some(our_tx)) => { + let to_post_dispatch = Some(our_tx.base.block_number); + let total_priority_boost = + compute_priority_boost::(who, our_tx.improved_by); + ( + to_post_dispatch, + ValidTransactionBuilder::default().priority(total_priority_boost).build(), + ) + }, + Ok(None) => (None, ValidTransactionBuilder::default().build()), + Err(e) => (None, Err(e)), + } + } + + fn post_dispatch( + relayer: &T::AccountId, + has_failed: bool, + bundled_block_number: Self::ToPostDispatch, + ) { + // we are only interested in associated pallet submissions + let Some(bundled_block_number) = bundled_block_number else { return }; + // we are only interested in failed or unneeded transactions + let has_failed = + has_failed || !SubmitFinalityProofHelper::::was_successful(bundled_block_number); + + if !has_failed { + return + } + + // let's slash registered relayer + RelayersPallet::::slash_and_deregister( + relayer, + ExplicitOrAccountParams::Explicit(SlashAccount::get()), + ); + } +} + +/// Wrapper for the bridge parachains pallet that checks calls for obsolete submissions +/// and also boosts transaction priority if it has submitted by registered relayer. +/// The boost is computed as +/// `(BundledHeaderNumber - 1 - BestKnownHeaderNumber) * Priority::get()`. +/// The boost is only applied if submitter has active registration in the relayers +/// pallet. +pub struct CheckAndBoostBridgeParachainsTransactions( + PhantomData<(T, RefPara, Priority, SlashAccount)>, +); + +impl, SlashAccount: Get> + BridgeRuntimeFilterCall + for CheckAndBoostBridgeParachainsTransactions +where + T: pallet_bridge_relayers::Config + pallet_bridge_parachains::Config, + RefPara: RefundableParachainId, + T::RuntimeCall: ParachainsCallSubtype, +{ + // bridged header number, bundled in transaction + type ToPostDispatch = Option; + + fn validate( + who: &T::AccountId, + call: &T::RuntimeCall, + ) -> (Self::ToPostDispatch, TransactionValidity) { + match ParachainsCallSubtype::::check_obsolete_submit_parachain_heads( + call, + ) { + Ok(Some(our_tx)) if our_tx.base.para_id.0 == RefPara::BridgedChain::PARACHAIN_ID => { + let to_post_dispatch = Some(our_tx.base); + let total_priority_boost = + compute_priority_boost::(&who, our_tx.improved_by); + ( + to_post_dispatch, + ValidTransactionBuilder::default().priority(total_priority_boost).build(), + ) + }, + Ok(_) => (None, ValidTransactionBuilder::default().build()), + Err(e) => (None, Err(e)), + } + } + + fn post_dispatch(relayer: &T::AccountId, has_failed: bool, maybe_update: Self::ToPostDispatch) { + // we are only interested in associated pallet submissions + let Some(update) = maybe_update else { return }; + // we are only interested in failed or unneeded transactions + let has_failed = has_failed || + !SubmitParachainHeadsHelper::::was_successful(&update); + + if !has_failed { + return + } + + // let's slash registered relayer + RelayersPallet::::slash_and_deregister( + relayer, + ExplicitOrAccountParams::Explicit(SlashAccount::get()), + ); + } } -impl BridgeRuntimeFilterCall for pallet_bridge_grandpa::Pallet +impl BridgeRuntimeFilterCall + for pallet_bridge_grandpa::Pallet where T: pallet_bridge_grandpa::Config, T::RuntimeCall: GrandpaCallSubType, { - fn validate(call: &T::RuntimeCall) -> TransactionValidity { - GrandpaCallSubType::::check_obsolete_submit_finality_proof(call) + type ToPostDispatch = (); + fn validate(_who: &T::AccountId, call: &T::RuntimeCall) -> ((), TransactionValidity) { + ( + (), + GrandpaCallSubType::::check_obsolete_submit_finality_proof(call) + .and_then(|_| ValidTransactionBuilder::default().build()), + ) } } -impl BridgeRuntimeFilterCall +impl BridgeRuntimeFilterCall for pallet_bridge_parachains::Pallet where T: pallet_bridge_parachains::Config, T::RuntimeCall: ParachainsCallSubtype, { - fn validate(call: &T::RuntimeCall) -> TransactionValidity { - ParachainsCallSubtype::::check_obsolete_submit_parachain_heads(call) + type ToPostDispatch = (); + fn validate(_who: &T::AccountId, call: &T::RuntimeCall) -> ((), TransactionValidity) { + ( + (), + ParachainsCallSubtype::::check_obsolete_submit_parachain_heads(call) + .and_then(|_| ValidTransactionBuilder::default().build()), + ) } } -impl, I: 'static> BridgeRuntimeFilterCall - for pallet_bridge_messages::Pallet +impl, I: 'static> + BridgeRuntimeFilterCall for pallet_bridge_messages::Pallet where T::RuntimeCall: MessagesCallSubType, { + type ToPostDispatch = (); /// Validate messages in order to avoid "mining" messages delivery and delivery confirmation /// transactions, that are delivering outdated messages/confirmations. Without this validation, /// even honest relayers may lose their funds if there are multiple relays running and /// submitting the same messages/confirmations. - fn validate(call: &T::RuntimeCall) -> TransactionValidity { - call.check_obsolete_call() + fn validate(_who: &T::AccountId, call: &T::RuntimeCall) -> ((), TransactionValidity) { + ((), call.check_obsolete_call()) } } +/// Computes priority boost that improved known header by `improved_by` +fn compute_priority_boost( + relayer: &T::AccountId, + improved_by: N, +) -> TransactionPriority +where + T: pallet_bridge_relayers::Config, + N: UniqueSaturatedInto, + Priority: Get, +{ + // we only boost priority if relayer has staked required balance + let is_relayer_registration_active = RelayersPallet::::is_registration_active(relayer); + // if tx improves by just one, there's no need to bump its priority + let improved_by: TransactionPriority = improved_by.unique_saturated_into().saturating_sub(1); + // if relayer is registered, for every skipped header we improve by `Priority` + let boost_per_header = if is_relayer_registration_active { Priority::get() } else { 0 }; + improved_by.saturating_mul(boost_per_header) +} + /// Declares a runtime-specific `BridgeRejectObsoleteHeadersAndMessages` signed extension. /// /// ## Example @@ -92,7 +266,15 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages { type AccountId = $account_id; type Call = $call; type AdditionalSigned = (); - type Pre = (); + type Pre = ( + $account_id, + ( $( + <$filter_call as $crate::extensions::check_obsolete_extension::BridgeRuntimeFilterCall< + $account_id, + $call, + >>::ToPostDispatch, + )* ), + ); fn additional_signed(&self) -> sp_std::result::Result< (), @@ -101,29 +283,72 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages { Ok(()) } + #[allow(unused_variables)] fn validate( &self, - _who: &Self::AccountId, + who: &Self::AccountId, call: &Self::Call, _info: &sp_runtime::traits::DispatchInfoOf, _len: usize, ) -> sp_runtime::transaction_validity::TransactionValidity { - let valid = sp_runtime::transaction_validity::ValidTransaction::default(); + let tx_validity = sp_runtime::transaction_validity::ValidTransaction::default(); + let to_prepare = (); $( - let valid = valid - .combine_with(<$filter_call as $crate::extensions::check_obsolete_extension::BridgeRuntimeFilterCall<$call>>::validate(call)?); + let (from_validate, call_filter_validity) = < + $filter_call as + $crate::extensions::check_obsolete_extension::BridgeRuntimeFilterCall< + Self::AccountId, + $call, + >>::validate(&who, call); + let tx_validity = tx_validity.combine_with(call_filter_validity?); )* - Ok(valid) + Ok(tx_validity) } + #[allow(unused_variables)] fn pre_dispatch( self, - who: &Self::AccountId, + relayer: &Self::AccountId, call: &Self::Call, info: &sp_runtime::traits::DispatchInfoOf, len: usize, ) -> Result { - self.validate(who, call, info, len).map(drop) + use tuplex::PushBack; + let to_post_dispatch = (); + $( + let (from_validate, call_filter_validity) = < + $filter_call as + $crate::extensions::check_obsolete_extension::BridgeRuntimeFilterCall< + $account_id, + $call, + >>::validate(&relayer, call); + let _ = call_filter_validity?; + let to_post_dispatch = to_post_dispatch.push_back(from_validate); + )* + Ok((relayer.clone(), to_post_dispatch)) + } + + #[allow(unused_variables)] + fn post_dispatch( + to_post_dispatch: Option, + info: &sp_runtime::traits::DispatchInfoOf, + post_info: &sp_runtime::traits::PostDispatchInfoOf, + len: usize, + result: &sp_runtime::DispatchResult, + ) -> Result<(), sp_runtime::transaction_validity::TransactionValidityError> { + use tuplex::PopFront; + let Some((relayer, to_post_dispatch)) = to_post_dispatch else { return Ok(()) }; + let has_failed = result.is_err(); + $( + let (item, to_post_dispatch) = to_post_dispatch.pop_front(); + < + $filter_call as + $crate::extensions::check_obsolete_extension::BridgeRuntimeFilterCall< + $account_id, + $call, + >>::post_dispatch(&relayer, has_failed, item); + )* + Ok(()) } } }; @@ -132,10 +357,23 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages { #[cfg(test)] mod tests { use super::*; + use crate::{ + extensions::refund_relayer_extension::{ + tests::{ + initialize_environment, relayer_account_at_this_chain, + submit_parachain_head_call_ex, submit_relay_header_call_ex, + }, + RefundableParachain, + }, + mock::*, + }; + use bp_polkadot_core::parachains::ParaId; + use bp_runtime::HeaderId; use frame_support::{assert_err, assert_ok}; use sp_runtime::{ - traits::SignedExtension, + traits::{ConstU64, SignedExtension}, transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + DispatchError, }; pub struct MockCall { @@ -143,7 +381,7 @@ mod tests { } impl sp_runtime::traits::Dispatchable for MockCall { - type RuntimeOrigin = (); + type RuntimeOrigin = u64; type Config = (); type Info = (); type PostInfo = (); @@ -156,50 +394,287 @@ mod tests { } } - struct FirstFilterCall; - impl BridgeRuntimeFilterCall for FirstFilterCall { - fn validate(call: &MockCall) -> TransactionValidity { + pub struct FirstFilterCall; + impl FirstFilterCall { + fn post_dispatch_called_with(success: bool) { + frame_support::storage::unhashed::put(&[1], &success); + } + + fn verify_post_dispatch_called_with(success: bool) { + assert_eq!(frame_support::storage::unhashed::get::(&[1]), Some(success)); + } + } + + impl BridgeRuntimeFilterCall for FirstFilterCall { + type ToPostDispatch = u64; + fn validate(_who: &u64, call: &MockCall) -> (u64, TransactionValidity) { if call.data <= 1 { - return InvalidTransaction::Custom(1).into() + return (1, InvalidTransaction::Custom(1).into()) } - Ok(ValidTransaction { priority: 1, ..Default::default() }) + (1, Ok(ValidTransaction { priority: 1, ..Default::default() })) + } + + fn post_dispatch(_who: &u64, has_failed: bool, to_post_dispatch: Self::ToPostDispatch) { + Self::post_dispatch_called_with(!has_failed); + assert_eq!(to_post_dispatch, 1); + } + } + + pub struct SecondFilterCall; + + impl SecondFilterCall { + fn post_dispatch_called_with(success: bool) { + frame_support::storage::unhashed::put(&[2], &success); + } + + fn verify_post_dispatch_called_with(success: bool) { + assert_eq!(frame_support::storage::unhashed::get::(&[2]), Some(success)); } } - struct SecondFilterCall; - impl BridgeRuntimeFilterCall for SecondFilterCall { - fn validate(call: &MockCall) -> TransactionValidity { + impl BridgeRuntimeFilterCall for SecondFilterCall { + type ToPostDispatch = u64; + fn validate(_who: &u64, call: &MockCall) -> (u64, TransactionValidity) { if call.data <= 2 { - return InvalidTransaction::Custom(2).into() + return (2, InvalidTransaction::Custom(2).into()) } - Ok(ValidTransaction { priority: 2, ..Default::default() }) + (2, Ok(ValidTransaction { priority: 2, ..Default::default() })) + } + + fn post_dispatch(_who: &u64, has_failed: bool, to_post_dispatch: Self::ToPostDispatch) { + Self::post_dispatch_called_with(!has_failed); + assert_eq!(to_post_dispatch, 2); } } #[test] - fn test() { + fn test_generated_obsolete_extension() { generate_bridge_reject_obsolete_headers_and_messages!( MockCall, - (), + u64, FirstFilterCall, SecondFilterCall ); - assert_err!( - BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 1 }, &(), 0), - InvalidTransaction::Custom(1) - ); + run_test(|| { + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.validate(&42, &MockCall { data: 1 }, &(), 0), + InvalidTransaction::Custom(1) + ); + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.pre_dispatch( + &42, + &MockCall { data: 1 }, + &(), + 0 + ), + InvalidTransaction::Custom(1) + ); - assert_err!( - BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 2 }, &(), 0), - InvalidTransaction::Custom(2) - ); + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.validate(&42, &MockCall { data: 2 }, &(), 0), + InvalidTransaction::Custom(2) + ); + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.pre_dispatch( + &42, + &MockCall { data: 2 }, + &(), + 0 + ), + InvalidTransaction::Custom(2) + ); - assert_ok!( - BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 3 }, &(), 0), - ValidTransaction { priority: 3, ..Default::default() } - ) + assert_eq!( + BridgeRejectObsoleteHeadersAndMessages + .validate(&42, &MockCall { data: 3 }, &(), 0) + .unwrap(), + ValidTransaction { priority: 3, ..Default::default() }, + ); + assert_eq!( + BridgeRejectObsoleteHeadersAndMessages + .pre_dispatch(&42, &MockCall { data: 3 }, &(), 0) + .unwrap(), + (42, (1, 2)), + ); + + // when post_dispatch is called with `Ok(())`, it is propagated to all "nested" + // extensions + assert_ok!(BridgeRejectObsoleteHeadersAndMessages::post_dispatch( + Some((0, (1, 2))), + &(), + &(), + 0, + &Ok(()) + )); + FirstFilterCall::verify_post_dispatch_called_with(true); + SecondFilterCall::verify_post_dispatch_called_with(true); + + // when post_dispatch is called with `Err(())`, it is propagated to all "nested" + // extensions + assert_ok!(BridgeRejectObsoleteHeadersAndMessages::post_dispatch( + Some((0, (1, 2))), + &(), + &(), + 0, + &Err(DispatchError::BadOrigin) + )); + FirstFilterCall::verify_post_dispatch_called_with(false); + SecondFilterCall::verify_post_dispatch_called_with(false); + }); + } + + frame_support::parameter_types! { + pub SlashDestination: ThisChainAccountId = 42; + } + + type BridgeGrandpaWrapper = + CheckAndBoostBridgeGrandpaTransactions, SlashDestination>; + + #[test] + fn grandpa_wrapper_does_not_boost_extensions_for_unregistered_relayer() { + run_test(|| { + initialize_environment(100, 100, 100); + + let priority_boost = BridgeGrandpaWrapper::validate( + &relayer_account_at_this_chain(), + &submit_relay_header_call_ex(200), + ) + .1 + .unwrap() + .priority; + assert_eq!(priority_boost, 0); + }) + } + + #[test] + fn grandpa_wrapper_boosts_extensions_for_registered_relayer() { + run_test(|| { + initialize_environment(100, 100, 100); + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + let priority_boost = BridgeGrandpaWrapper::validate( + &relayer_account_at_this_chain(), + &submit_relay_header_call_ex(200), + ) + .1 + .unwrap() + .priority; + assert_eq!(priority_boost, 99_000); + }) + } + + #[test] + fn grandpa_wrapper_slashes_registered_relayer_if_transaction_fails() { + run_test(|| { + initialize_environment(100, 100, 100); + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + assert!(BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + BridgeGrandpaWrapper::post_dispatch(&relayer_account_at_this_chain(), true, Some(150)); + assert!(!BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + }) + } + + #[test] + fn grandpa_wrapper_does_not_slash_registered_relayer_if_transaction_succeeds() { + run_test(|| { + initialize_environment(100, 100, 100); + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + assert!(BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + BridgeGrandpaWrapper::post_dispatch(&relayer_account_at_this_chain(), false, Some(100)); + assert!(BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + }) + } + + type BridgeParachainsWrapper = CheckAndBoostBridgeParachainsTransactions< + TestRuntime, + RefundableParachain<(), BridgedUnderlyingParachain>, + ConstU64<1_000>, + SlashDestination, + >; + + #[test] + fn parachains_wrapper_does_not_boost_extensions_for_unregistered_relayer() { + run_test(|| { + initialize_environment(100, 100, 100); + + let priority_boost = BridgeParachainsWrapper::validate( + &relayer_account_at_this_chain(), + &submit_parachain_head_call_ex(200), + ) + .1 + .unwrap() + .priority; + assert_eq!(priority_boost, 0); + }) + } + + #[test] + fn parachains_wrapper_boosts_extensions_for_registered_relayer() { + run_test(|| { + initialize_environment(100, 100, 100); + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + let priority_boost = BridgeParachainsWrapper::validate( + &relayer_account_at_this_chain(), + &submit_parachain_head_call_ex(200), + ) + .1 + .unwrap() + .priority; + assert_eq!(priority_boost, 99_000); + }) + } + + #[test] + fn parachains_wrapper_slashes_registered_relayer_if_transaction_fails() { + run_test(|| { + initialize_environment(100, 100, 100); + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + assert!(BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + BridgeParachainsWrapper::post_dispatch( + &relayer_account_at_this_chain(), + true, + Some(SubmitParachainHeadsInfo { + at_relay_block: HeaderId(150, Default::default()), + para_id: ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), + para_head_hash: [150u8; 32].into(), + is_free_execution_expected: false, + }), + ); + assert!(!BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + }) + } + + #[test] + fn parachains_wrapper_does_not_slash_registered_relayer_if_transaction_succeeds() { + run_test(|| { + initialize_environment(100, 100, 100); + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + assert!(BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + BridgeParachainsWrapper::post_dispatch( + &relayer_account_at_this_chain(), + false, + Some(SubmitParachainHeadsInfo { + at_relay_block: HeaderId(100, Default::default()), + para_id: ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), + para_head_hash: [100u8; 32].into(), + is_free_execution_expected: false, + }), + ); + assert!(BridgeRelayers::is_registration_active(&relayer_account_at_this_chain())); + }) } } diff --git a/bridges/bin/runtime-common/src/extensions/priority_calculator.rs b/bridges/bin/runtime-common/src/extensions/priority_calculator.rs index 5035553f508..92810290f95 100644 --- a/bridges/bin/runtime-common/src/extensions/priority_calculator.rs +++ b/bridges/bin/runtime-common/src/extensions/priority_calculator.rs @@ -22,7 +22,6 @@ //! single message with nonce `N`, then the transaction with nonces `N..=N+100` will //! be rejected. This can lower bridge throughput down to one message per block. -use bp_messages::MessageNonce; use frame_support::traits::Get; use sp_runtime::transaction_validity::TransactionPriority; @@ -30,16 +29,19 @@ use sp_runtime::transaction_validity::TransactionPriority; #[allow(unused_imports)] pub use integrity_tests::*; -/// Compute priority boost for message delivery transaction that delivers -/// given number of messages. -pub fn compute_priority_boost( - messages: MessageNonce, -) -> TransactionPriority +/// We'll deal with different bridge items here - messages, headers, ... +/// To avoid being too verbose with generic code, let's just define a separate alias. +pub type ItemCount = u64; + +/// Compute priority boost for transaction that brings given number of bridge +/// items (messages, headers, ...), when every additional item adds `PriorityBoostPerItem` +/// to transaction priority. +pub fn compute_priority_boost(n_items: ItemCount) -> TransactionPriority where - PriorityBoostPerMessage: Get, + PriorityBoostPerItem: Get, { - // we don't want any boost for transaction with single message => minus one - PriorityBoostPerMessage::get().saturating_mul(messages.saturating_sub(1)) + // we don't want any boost for transaction with single (additional) item => minus one + PriorityBoostPerItem::get().saturating_mul(n_items.saturating_sub(1)) } #[cfg(not(feature = "integrity-test"))] @@ -47,7 +49,8 @@ mod integrity_tests {} #[cfg(feature = "integrity-test")] mod integrity_tests { - use super::compute_priority_boost; + use super::{compute_priority_boost, ItemCount}; + use crate::extensions::refund_relayer_extension::RefundableParachainId; use bp_messages::MessageNonce; use bp_runtime::PreComputedSize; @@ -55,7 +58,6 @@ mod integrity_tests { dispatch::{DispatchClass, DispatchInfo, Pays, PostDispatchInfo}, traits::Get, }; - use pallet_bridge_messages::WeightInfoExt; use pallet_transaction_payment::OnChargeTransaction; use sp_runtime::{ traits::{Dispatchable, UniqueSaturatedInto, Zero}, @@ -68,37 +70,33 @@ mod integrity_tests { T, >>::Balance; - /// Ensures that the value of `PriorityBoostPerMessage` matches the value of - /// `tip_boost_per_message`. + /// Ensures that the value of `PriorityBoostPerItem` matches the value of + /// `tip_boost_per_item`. /// - /// We want two transactions, `TX1` with `N` messages and `TX2` with `N+1` messages, have almost - /// the same priority if we'll add `tip_boost_per_message` tip to the `TX1`. We want to be sure - /// that if we add plain `PriorityBoostPerMessage` priority to `TX1`, the priority will be close + /// We want two transactions, `TX1` with `N` items and `TX2` with `N+1` items, have almost + /// the same priority if we'll add `tip_boost_per_item` tip to the `TX1`. We want to be sure + /// that if we add plain `PriorityBoostPerItem` priority to `TX1`, the priority will be close /// to `TX2` as well. - pub fn ensure_priority_boost_is_sane( - tip_boost_per_message: BalanceOf, + fn ensure_priority_boost_is_sane( + param_name: &str, + max_items: ItemCount, + tip_boost_per_item: Balance, + estimate_priority: impl Fn(ItemCount, Balance) -> TransactionPriority, ) where - Runtime: - pallet_transaction_payment::Config + pallet_bridge_messages::Config, - MessagesInstance: 'static, - PriorityBoostPerMessage: Get, - Runtime::RuntimeCall: Dispatchable, - BalanceOf: Send + Sync + FixedPointOperand, + PriorityBoostPerItem: Get, + ItemCount: UniqueSaturatedInto, + Balance: FixedPointOperand + Zero, { - let priority_boost_per_message = PriorityBoostPerMessage::get(); - let maximal_messages_in_delivery_transaction = - Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); - for messages in 1..=maximal_messages_in_delivery_transaction { - let base_priority = estimate_message_delivery_transaction_priority::< - Runtime, - MessagesInstance, - >(messages, Zero::zero()); - let priority_boost = compute_priority_boost::(messages); - let priority_with_boost = base_priority + priority_boost; - - let tip = tip_boost_per_message.saturating_mul((messages - 1).unique_saturated_into()); - let priority_with_tip = - estimate_message_delivery_transaction_priority::(1, tip); + let priority_boost_per_item = PriorityBoostPerItem::get(); + for n_items in 1..=max_items { + let base_priority = estimate_priority(n_items, Zero::zero()); + let priority_boost = compute_priority_boost::(n_items); + let priority_with_boost = base_priority + .checked_add(priority_boost) + .expect("priority overflow: try lowering `max_items` or `tip_boost_per_item`?"); + + let tip = tip_boost_per_item.saturating_mul((n_items - 1).unique_saturated_into()); + let priority_with_tip = estimate_priority(1, tip); const ERROR_MARGIN: TransactionPriority = 5; // 5% if priority_with_boost.abs_diff(priority_with_tip).saturating_mul(100) / @@ -106,97 +104,304 @@ mod integrity_tests { ERROR_MARGIN { panic!( - "The PriorityBoostPerMessage value ({}) must be fixed to: {}", - priority_boost_per_message, - compute_priority_boost_per_message::( - tip_boost_per_message + "The {param_name} value ({}) must be fixed to: {}", + priority_boost_per_item, + compute_priority_boost_per_item( + max_items, + tip_boost_per_item, + estimate_priority ), ); } } } - /// Compute priority boost that we give to message delivery transaction for additional message. + /// Compute priority boost that we give to bridge transaction for every + /// additional bridge item. #[cfg(feature = "integrity-test")] - fn compute_priority_boost_per_message( - tip_boost_per_message: BalanceOf, + fn compute_priority_boost_per_item( + max_items: ItemCount, + tip_boost_per_item: Balance, + estimate_priority: impl Fn(ItemCount, Balance) -> TransactionPriority, ) -> TransactionPriority where - Runtime: - pallet_transaction_payment::Config + pallet_bridge_messages::Config, - MessagesInstance: 'static, - Runtime::RuntimeCall: Dispatchable, - BalanceOf: Send + Sync + FixedPointOperand, + ItemCount: UniqueSaturatedInto, + Balance: FixedPointOperand + Zero, { - // estimate priority of transaction that delivers one message and has large tip - let maximal_messages_in_delivery_transaction = - Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); + // estimate priority of transaction that delivers one item and has large tip let small_with_tip_priority = - estimate_message_delivery_transaction_priority::( - 1, - tip_boost_per_message - .saturating_mul(maximal_messages_in_delivery_transaction.saturated_into()), - ); - // estimate priority of transaction that delivers maximal number of messages, but has no tip - let large_without_tip_priority = estimate_message_delivery_transaction_priority::< - Runtime, - MessagesInstance, - >(maximal_messages_in_delivery_transaction, Zero::zero()); + estimate_priority(1, tip_boost_per_item.saturating_mul(max_items.saturated_into())); + // estimate priority of transaction that delivers maximal number of items, but has no tip + let large_without_tip_priority = estimate_priority(max_items, Zero::zero()); small_with_tip_priority .saturating_sub(large_without_tip_priority) - .saturating_div(maximal_messages_in_delivery_transaction - 1) + .saturating_div(max_items - 1) } - /// Estimate message delivery transaction priority. - #[cfg(feature = "integrity-test")] - fn estimate_message_delivery_transaction_priority( - messages: MessageNonce, - tip: BalanceOf, - ) -> TransactionPriority - where - Runtime: - pallet_transaction_payment::Config + pallet_bridge_messages::Config, - MessagesInstance: 'static, - Runtime::RuntimeCall: Dispatchable, - BalanceOf: Send + Sync + FixedPointOperand, - { - // just an estimation of extra transaction bytes that are added to every transaction - // (including signature, signed extensions extra and etc + in our case it includes - // all call arguments except the proof itself) - let base_tx_size = 512; - // let's say we are relaying similar small messages and for every message we add more trie - // nodes to the proof (x0.5 because we expect some nodes to be reused) - let estimated_message_size = 512; - // let's say all our messages have the same dispatch weight - let estimated_message_dispatch_weight = - Runtime::WeightInfo::message_dispatch_weight(estimated_message_size); - // messages proof argument size is (for every message) messages size + some additional - // trie nodes. Some of them are reused by different messages, so let's take 2/3 of default - // "overhead" constant - let messages_proof_size = Runtime::WeightInfo::expected_extra_storage_proof_size() - .saturating_mul(2) - .saturating_div(3) - .saturating_add(estimated_message_size) - .saturating_mul(messages as _); - - // finally we are able to estimate transaction size and weight - let transaction_size = base_tx_size.saturating_add(messages_proof_size); - let transaction_weight = Runtime::WeightInfo::receive_messages_proof_weight( - &PreComputedSize(transaction_size as _), - messages as _, - estimated_message_dispatch_weight.saturating_mul(messages), - ); - - pallet_transaction_payment::ChargeTransactionPayment::::get_priority( - &DispatchInfo { - weight: transaction_weight, - class: DispatchClass::Normal, - pays_fee: Pays::Yes, - }, - transaction_size as _, - tip, - Zero::zero(), - ) + /// Computations, specific to bridge relay chains transactions. + pub mod per_relay_header { + use super::*; + + use bp_header_chain::{ + max_expected_submit_finality_proof_arguments_size, ChainWithGrandpa, + }; + use pallet_bridge_grandpa::WeightInfoExt; + + /// Ensures that the value of `PriorityBoostPerHeader` matches the value of + /// `tip_boost_per_header`. + /// + /// We want two transactions, `TX1` with `N` headers and `TX2` with `N+1` headers, have + /// almost the same priority if we'll add `tip_boost_per_header` tip to the `TX1`. We want + /// to be sure that if we add plain `PriorityBoostPerHeader` priority to `TX1`, the priority + /// will be close to `TX2` as well. + pub fn ensure_priority_boost_is_sane( + tip_boost_per_header: BalanceOf, + ) where + Runtime: + pallet_transaction_payment::Config + pallet_bridge_grandpa::Config, + GrandpaInstance: 'static, + PriorityBoostPerHeader: Get, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // the meaning of `max_items` here is different when comparing with message + // transactions - with messages we have a strict limit on maximal number of + // messages we can fit into a single transaction. With headers, current best + // header may be improved by any "number of items". But this number is only + // used to verify priority boost, so it should be fine to select this arbitrary + // value - it SHALL NOT affect any value, it just adds more tests for the value. + let maximal_improved_by = 4_096; + super::ensure_priority_boost_is_sane::>( + "PriorityBoostPerRelayHeader", + maximal_improved_by, + tip_boost_per_header, + |_n_headers, tip| { + estimate_relay_header_submit_transaction_priority::( + tip, + ) + }, + ); + } + + /// Estimate relay header delivery transaction priority. + #[cfg(feature = "integrity-test")] + fn estimate_relay_header_submit_transaction_priority( + tip: BalanceOf, + ) -> TransactionPriority + where + Runtime: + pallet_transaction_payment::Config + pallet_bridge_grandpa::Config, + GrandpaInstance: 'static, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // just an estimation of extra transaction bytes that are added to every transaction + // (including signature, signed extensions extra and etc + in our case it includes + // all call arguments except the proof itself) + let base_tx_size = 512; + // let's say we are relaying largest relay chain headers + let tx_call_size = max_expected_submit_finality_proof_arguments_size::< + Runtime::BridgedChain, + >(true, Runtime::BridgedChain::MAX_AUTHORITIES_COUNT * 2 / 3 + 1); + + // finally we are able to estimate transaction size and weight + let transaction_size = base_tx_size.saturating_add(tx_call_size); + let transaction_weight = Runtime::WeightInfo::submit_finality_proof_weight( + Runtime::BridgedChain::MAX_AUTHORITIES_COUNT * 2 / 3 + 1, + Runtime::BridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY, + ); + + pallet_transaction_payment::ChargeTransactionPayment::::get_priority( + &DispatchInfo { + weight: transaction_weight, + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + }, + transaction_size as _, + tip, + Zero::zero(), + ) + } + } + + /// Computations, specific to bridge parachains transactions. + pub mod per_parachain_header { + use super::*; + + use bp_runtime::Parachain; + use pallet_bridge_parachains::WeightInfoExt; + + /// Ensures that the value of `PriorityBoostPerHeader` matches the value of + /// `tip_boost_per_header`. + /// + /// We want two transactions, `TX1` with `N` headers and `TX2` with `N+1` headers, have + /// almost the same priority if we'll add `tip_boost_per_header` tip to the `TX1`. We want + /// to be sure that if we add plain `PriorityBoostPerHeader` priority to `TX1`, the priority + /// will be close to `TX2` as well. + pub fn ensure_priority_boost_is_sane( + tip_boost_per_header: BalanceOf, + ) where + Runtime: pallet_transaction_payment::Config + + pallet_bridge_parachains::Config, + RefundableParachain: RefundableParachainId, + PriorityBoostPerHeader: Get, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // the meaning of `max_items` here is different when comparing with message + // transactions - with messages we have a strict limit on maximal number of + // messages we can fit into a single transaction. With headers, current best + // header may be improved by any "number of items". But this number is only + // used to verify priority boost, so it should be fine to select this arbitrary + // value - it SHALL NOT affect any value, it just adds more tests for the value. + let maximal_improved_by = 4_096; + super::ensure_priority_boost_is_sane::>( + "PriorityBoostPerParachainHeader", + maximal_improved_by, + tip_boost_per_header, + |_n_headers, tip| { + estimate_parachain_header_submit_transaction_priority::< + Runtime, + RefundableParachain, + >(tip) + }, + ); + } + + /// Estimate parachain header delivery transaction priority. + #[cfg(feature = "integrity-test")] + fn estimate_parachain_header_submit_transaction_priority( + tip: BalanceOf, + ) -> TransactionPriority + where + Runtime: pallet_transaction_payment::Config + + pallet_bridge_parachains::Config, + RefundableParachain: RefundableParachainId, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // just an estimation of extra transaction bytes that are added to every transaction + // (including signature, signed extensions extra and etc + in our case it includes + // all call arguments except the proof itself) + let base_tx_size = 512; + // let's say we are relaying largest parachain headers and proof takes some more bytes + let tx_call_size = >::WeightInfo::expected_extra_storage_proof_size() + .saturating_add(RefundableParachain::BridgedChain::MAX_HEADER_SIZE); + + // finally we are able to estimate transaction size and weight + let transaction_size = base_tx_size.saturating_add(tx_call_size); + let transaction_weight = >::WeightInfo::submit_parachain_heads_weight( + Runtime::DbWeight::get(), + &PreComputedSize(transaction_size as _), + // just one parachain - all other submissions won't receive any boost + 1, + ); + + pallet_transaction_payment::ChargeTransactionPayment::::get_priority( + &DispatchInfo { + weight: transaction_weight, + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + }, + transaction_size as _, + tip, + Zero::zero(), + ) + } + } + + /// Computations, specific to bridge messages transactions. + pub mod per_message { + use super::*; + + use pallet_bridge_messages::WeightInfoExt; + + /// Ensures that the value of `PriorityBoostPerMessage` matches the value of + /// `tip_boost_per_message`. + /// + /// We want two transactions, `TX1` with `N` messages and `TX2` with `N+1` messages, have + /// almost the same priority if we'll add `tip_boost_per_message` tip to the `TX1`. We want + /// to be sure that if we add plain `PriorityBoostPerMessage` priority to `TX1`, the + /// priority will be close to `TX2` as well. + pub fn ensure_priority_boost_is_sane( + tip_boost_per_message: BalanceOf, + ) where + Runtime: pallet_transaction_payment::Config + + pallet_bridge_messages::Config, + MessagesInstance: 'static, + PriorityBoostPerMessage: Get, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + let maximal_messages_in_delivery_transaction = + Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); + super::ensure_priority_boost_is_sane::>( + "PriorityBoostPerMessage", + maximal_messages_in_delivery_transaction, + tip_boost_per_message, + |n_messages, tip| { + estimate_message_delivery_transaction_priority::( + n_messages, tip, + ) + }, + ); + } + + /// Estimate message delivery transaction priority. + #[cfg(feature = "integrity-test")] + fn estimate_message_delivery_transaction_priority( + messages: MessageNonce, + tip: BalanceOf, + ) -> TransactionPriority + where + Runtime: pallet_transaction_payment::Config + + pallet_bridge_messages::Config, + MessagesInstance: 'static, + Runtime::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + FixedPointOperand, + { + // just an estimation of extra transaction bytes that are added to every transaction + // (including signature, signed extensions extra and etc + in our case it includes + // all call arguments except the proof itself) + let base_tx_size = 512; + // let's say we are relaying similar small messages and for every message we add more + // trie nodes to the proof (x0.5 because we expect some nodes to be reused) + let estimated_message_size = 512; + // let's say all our messages have the same dispatch weight + let estimated_message_dispatch_weight = + Runtime::WeightInfo::message_dispatch_weight(estimated_message_size); + // messages proof argument size is (for every message) messages size + some additional + // trie nodes. Some of them are reused by different messages, so let's take 2/3 of + // default "overhead" constant + let messages_proof_size = Runtime::WeightInfo::expected_extra_storage_proof_size() + .saturating_mul(2) + .saturating_div(3) + .saturating_add(estimated_message_size) + .saturating_mul(messages as _); + + // finally we are able to estimate transaction size and weight + let transaction_size = base_tx_size.saturating_add(messages_proof_size); + let transaction_weight = Runtime::WeightInfo::receive_messages_proof_weight( + &PreComputedSize(transaction_size as _), + messages as _, + estimated_message_dispatch_weight.saturating_mul(messages), + ); + + pallet_transaction_payment::ChargeTransactionPayment::::get_priority( + &DispatchInfo { + weight: transaction_weight, + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + }, + transaction_size as _, + tip, + Zero::zero(), + ) + } } } diff --git a/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs b/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs index 64ae1d0b669..5aa7f1c095d 100644 --- a/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs +++ b/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs @@ -24,7 +24,7 @@ use crate::messages_call_ext::{ }; use bp_messages::{LaneId, MessageNonce}; use bp_relayers::{ExplicitOrAccountParams, RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{Chain, Parachain, ParachainIdOf, RangeInclusiveExt, StaticStrProvider}; +use bp_runtime::{Parachain, RangeInclusiveExt, StaticStrProvider}; use codec::{Codec, Decode, Encode}; use frame_support::{ dispatch::{CallableCallFor, DispatchInfo, PostDispatchInfo}, @@ -33,8 +33,7 @@ use frame_support::{ CloneNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound, }; use pallet_bridge_grandpa::{ - CallSubType as GrandpaCallSubType, Config as GrandpaConfig, SubmitFinalityProofHelper, - SubmitFinalityProofInfo, + CallSubType as GrandpaCallSubType, SubmitFinalityProofHelper, SubmitFinalityProofInfo, }; use pallet_bridge_messages::Config as MessagesConfig; use pallet_bridge_parachains::{ @@ -66,20 +65,9 @@ type CallOf = ::RuntimeCall; /// coming from this parachain. pub trait RefundableParachainId { /// The instance of the bridge parachains pallet. - type Instance; + type Instance: 'static; /// The parachain Id. - type Id: Get; -} - -/// Default implementation of `RefundableParachainId`. -pub struct DefaultRefundableParachainId(PhantomData<(Instance, Id)>); - -impl RefundableParachainId for DefaultRefundableParachainId -where - Id: Get, -{ - type Instance = Instance; - type Id = Id; + type BridgedChain: Parachain; } /// Implementation of `RefundableParachainId` for `trait Parachain`. @@ -87,10 +75,11 @@ pub struct RefundableParachain(PhantomData<(Instance, Para)>); impl RefundableParachainId for RefundableParachain where + Instance: 'static, Para: Parachain, { type Instance = Instance; - type Id = ParachainIdOf; + type BridgedChain = Para; } /// Trait identifying a bridged messages lane. A relayer might be refunded for delivering messages @@ -242,17 +231,10 @@ pub enum RelayerAccountAction { /// Everything common among our refund signed extensions. pub trait RefundSignedExtension: 'static + Clone + Codec + sp_std::fmt::Debug + Default + Eq + PartialEq + Send + Sync + TypeInfo -where - >::BridgedChain: - Chain, { /// This chain runtime. - type Runtime: UtilityConfig> - + GrandpaConfig - + MessagesConfig<::Instance> + type Runtime: MessagesConfig<::Instance> + RelayersConfig; - /// Grandpa pallet reference. - type GrandpaInstance: 'static; /// Messages pallet and lane reference. type Msgs: RefundableMessagesLaneId; /// Refund amount calculator. @@ -276,11 +258,13 @@ where call: &CallOf, ) -> Result<&CallOf, TransactionValidityError>; - /// Called from post-dispatch and shall perform additional checks (apart from relay - /// chain finality and messages transaction finality) of given call result. + /// Called from post-dispatch and shall perform additional checks (apart from messages + /// transaction success) of given call result. fn additional_call_result_check( relayer: &AccountIdOf, call_info: &CallInfo, + extra_weight: &mut Weight, + extra_size: &mut u32, ) -> bool; /// Given post-dispatch information, analyze the outcome of relayer call and return @@ -348,35 +332,6 @@ where return slash_relayer_if_delivery_result } - // check if relay chain state has been updated - if let Some(finality_proof_info) = call_info.submit_finality_proof_info() { - if !SubmitFinalityProofHelper::::was_successful( - finality_proof_info.block_number, - ) { - // we only refund relayer if all calls have updated chain state - log::trace!( - target: "runtime::bridge", - "{} via {:?}: relayer {:?} has submitted invalid relay chain finality proof", - Self::Id::STR, - ::Id::get(), - relayer, - ); - return slash_relayer_if_delivery_result - } - - // there's a conflict between how bridge GRANDPA pallet works and a `utility.batchAll` - // transaction. If relay chain header is mandatory, the GRANDPA pallet returns - // `Pays::No`, because such transaction is mandatory for operating the bridge. But - // `utility.batchAll` transaction always requires payment. But in both cases we'll - // refund relayer - either explicitly here, or using `Pays::No` if he's choosing - // to submit dedicated transaction. - - // submitter has means to include extra weight/bytes in the `submit_finality_proof` - // call, so let's subtract extra weight/size to avoid refunding for this extra stuff - extra_weight = finality_proof_info.extra_weight; - extra_size = finality_proof_info.extra_size; - } - // Check if the `ReceiveMessagesProof` call delivered at least some of the messages that // it contained. If this happens, we consider the transaction "helpful" and refund it. let msgs_call_info = call_info.messages_call_info(); @@ -391,8 +346,13 @@ where return slash_relayer_if_delivery_result } - // do additional check - if !Self::additional_call_result_check(&relayer, &call_info) { + // do additional checks + if !Self::additional_call_result_check( + &relayer, + &call_info, + &mut extra_weight, + &mut extra_size, + ) { return slash_relayer_if_delivery_result } @@ -468,18 +428,11 @@ where RuntimeDebugNoBound, TypeInfo, )] -pub struct RefundSignedExtensionAdapter(T) -where - >::BridgedChain: - Chain; +pub struct RefundSignedExtensionAdapter(T); impl SignedExtension for RefundSignedExtensionAdapter where - >::BridgedChain: - Chain, CallOf: Dispatchable - + IsSubType, T::Runtime>> - + GrandpaCallSubType + MessagesCallSubType::Instance>, { const IDENTIFIER: &'static str = T::Id::STR; @@ -644,6 +597,14 @@ impl RefundSignedExtension for RefundBridgedParachainMessages where Self: 'static + Send + Sync, + RefundBridgedGrandpaMessages< + Runtime, + Runtime::BridgesGrandpaPalletInstance, + Msgs, + Refund, + Priority, + Id, + >: 'static + Send + Sync, Runtime: UtilityConfig> + BoundedBridgeGrandpaConfig + ParachainsConfig @@ -661,7 +622,6 @@ where + MessagesCallSubType, { type Runtime = Runtime; - type GrandpaInstance = Runtime::BridgesGrandpaPalletInstance; type Msgs = Msgs; type Refund = Refund; type Priority = Priority; @@ -687,7 +647,7 @@ where let para_finality_call = calls .next() .transpose()? - .and_then(|c| c.submit_parachain_heads_info_for(Para::Id::get())); + .and_then(|c| c.submit_parachain_heads_info_for(Para::BridgedChain::PARACHAIN_ID)); let relay_finality_call = calls.next().transpose()?.and_then(|c| c.submit_finality_proof_info()); @@ -711,7 +671,26 @@ where Ok(call) } - fn additional_call_result_check(relayer: &Runtime::AccountId, call_info: &CallInfo) -> bool { + fn additional_call_result_check( + relayer: &Runtime::AccountId, + call_info: &CallInfo, + extra_weight: &mut Weight, + extra_size: &mut u32, + ) -> bool { + // check if relay chain state has been updated + let is_grandpa_call_successful = + RefundBridgedGrandpaMessages::< + Runtime, + Runtime::BridgesGrandpaPalletInstance, + Msgs, + Refund, + Priority, + Id, + >::additional_call_result_check(relayer, call_info, extra_weight, extra_size); + if !is_grandpa_call_successful { + return false + } + // check if parachain state has been updated if let Some(para_proof_info) = call_info.submit_parachain_heads_info() { if !SubmitParachainHeadsHelper::::was_successful( @@ -722,7 +701,7 @@ where target: "runtime::bridge", "{} from parachain {} via {:?}: relayer {:?} has submitted invalid parachain finality proof", Id::STR, - Para::Id::get(), + Para::BridgedChain::PARACHAIN_ID, Msgs::Id::get(), relayer, ); @@ -794,7 +773,6 @@ where + MessagesCallSubType, { type Runtime = Runtime; - type GrandpaInstance = GrandpaInstance; type Msgs = Msgs; type Refund = Refund; type Priority = Priority; @@ -836,13 +814,125 @@ where Ok(call) } - fn additional_call_result_check(_relayer: &Runtime::AccountId, _call_info: &CallInfo) -> bool { + fn additional_call_result_check( + relayer: &Runtime::AccountId, + call_info: &CallInfo, + extra_weight: &mut Weight, + extra_size: &mut u32, + ) -> bool { + // check if relay chain state has been updated + if let Some(finality_proof_info) = call_info.submit_finality_proof_info() { + if !SubmitFinalityProofHelper::::was_successful( + finality_proof_info.block_number, + ) { + // we only refund relayer if all calls have updated chain state + log::trace!( + target: "runtime::bridge", + "{} via {:?}: relayer {:?} has submitted invalid relay chain finality proof", + Self::Id::STR, + ::Id::get(), + relayer, + ); + return false + } + + // there's a conflict between how bridge GRANDPA pallet works and a `utility.batchAll` + // transaction. If relay chain header is mandatory, the GRANDPA pallet returns + // `Pays::No`, because such transaction is mandatory for operating the bridge. But + // `utility.batchAll` transaction always requires payment. But in both cases we'll + // refund relayer - either explicitly here, or using `Pays::No` if he's choosing + // to submit dedicated transaction. + + // submitter has means to include extra weight/bytes in the `submit_finality_proof` + // call, so let's subtract extra weight/size to avoid refunding for this extra stuff + *extra_weight = (*extra_weight).saturating_add(finality_proof_info.extra_weight); + *extra_size = (*extra_size).saturating_add(finality_proof_info.extra_size); + } + + true + } +} + +/// Transaction extension that refunds a relayer for standalone messages delivery and confirmation +/// transactions. Finality transactions are not refunded. +#[derive( + DefaultNoBound, + CloneNoBound, + Decode, + Encode, + EqNoBound, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +#[scale_info(skip_type_params(Runtime, GrandpaInstance, Msgs, Refund, Priority, Id))] +pub struct RefundBridgedMessages( + PhantomData<( + // runtime with `pallet-bridge-messages` and `pallet-bridge-relayers` pallets deployed + Runtime, + // implementation of `RefundableMessagesLaneId` trait, which specifies the instance of + // the used `pallet-bridge-messages` pallet and the lane within this pallet + Msgs, + // implementation of the `RefundCalculator` trait, that is used to compute refund that + // we give to relayer for his transaction + Refund, + // getter for per-message `TransactionPriority` boost that we give to message + // delivery transactions + Priority, + // the runtime-unique identifier of this signed extension + Id, + )>, +); + +impl RefundSignedExtension + for RefundBridgedMessages +where + Self: 'static + Send + Sync, + Runtime: MessagesConfig + RelayersConfig, + Msgs: RefundableMessagesLaneId, + Refund: RefundCalculator, + Priority: Get, + Id: StaticStrProvider, + CallOf: Dispatchable + + MessagesCallSubType, +{ + type Runtime = Runtime; + type Msgs = Msgs; + type Refund = Refund; + type Priority = Priority; + type Id = Id; + + fn expand_call(call: &CallOf) -> Vec<&CallOf> { + vec![call] + } + + fn parse_and_check_for_obsolete_call( + call: &CallOf, + ) -> Result, TransactionValidityError> { + let call = Self::check_obsolete_parsed_call(call)?; + Ok(call.call_info_for(Msgs::Id::get()).map(CallInfo::Msgs)) + } + + fn check_obsolete_parsed_call( + call: &CallOf, + ) -> Result<&CallOf, TransactionValidityError> { + call.check_obsolete_call()?; + Ok(call) + } + + fn additional_call_result_check( + _relayer: &Runtime::AccountId, + _call_info: &CallInfo, + _extra_weight: &mut Weight, + _extra_size: &mut u32, + ) -> bool { + // everything is checked by the `RefundTransactionExtension` true } } #[cfg(test)] -mod tests { +pub(crate) mod tests { use super::*; use crate::{ messages::{ @@ -854,6 +944,7 @@ mod tests { }, mock::*, }; + use bp_header_chain::StoredHeaderDataBuilder; use bp_messages::{ DeliveredMessages, InboundLaneData, MessageNonce, MessagesOperatingMode, OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, @@ -879,7 +970,6 @@ mod tests { }; parameter_types! { - TestParachain: u32 = 1000; pub TestLaneId: LaneId = TEST_LANE_ID; pub MsgProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( TEST_LANE_ID, @@ -895,6 +985,14 @@ mod tests { bp_runtime::generate_static_str_provider!(TestExtension); + type TestMessagesExtensionProvider = RefundBridgedMessages< + TestRuntime, + RefundableMessagesLane<(), TestLaneId>, + ActualFeeRefund, + ConstU64<1>, + StrTestExtension, + >; + type TestMessagesExtension = RefundSignedExtensionAdapter; type TestGrandpaExtensionProvider = RefundBridgedGrandpaMessages< TestRuntime, (), @@ -906,7 +1004,7 @@ mod tests { type TestGrandpaExtension = RefundSignedExtensionAdapter; type TestExtensionProvider = RefundBridgedParachainMessages< TestRuntime, - DefaultRefundableParachainId<(), TestParachain>, + RefundableParachain<(), BridgedUnderlyingParachain>, RefundableMessagesLane<(), TestLaneId>, ActualFeeRefund, ConstU64<1>, @@ -930,7 +1028,7 @@ mod tests { TestPaymentProcedure::rewards_account(MsgDeliveryProofsRewardsAccount::get()) } - fn relayer_account_at_this_chain() -> ThisChainAccountId { + pub fn relayer_account_at_this_chain() -> ThisChainAccountId { 0 } @@ -938,7 +1036,7 @@ mod tests { 0 } - fn initialize_environment( + pub fn initialize_environment( best_relay_header_number: RelayBlockNumber, parachain_head_at_relay_header_number: RelayBlockNumber, best_message: MessageNonce, @@ -949,8 +1047,12 @@ mod tests { StoredAuthoritySet::try_new(authorities, TEST_GRANDPA_SET_ID).unwrap(), ); pallet_bridge_grandpa::BestFinalized::::put(best_relay_header); + pallet_bridge_grandpa::ImportedHeaders::::insert( + best_relay_header.hash(), + bp_test_utils::test_header::(0).build(), + ); - let para_id = ParaId(TestParachain::get()); + let para_id = ParaId(BridgedUnderlyingParachain::PARACHAIN_ID); let para_info = ParaInfo { best_head_hash: BestParaHeadHash { at_relay_block_number: parachain_head_at_relay_header_number, @@ -994,7 +1096,7 @@ mod tests { }) } - fn submit_relay_header_call_ex(relay_header_number: RelayBlockNumber) -> RuntimeCall { + pub fn submit_relay_header_call_ex(relay_header_number: RelayBlockNumber) -> RuntimeCall { let relay_header = BridgedChainHeader::new( relay_header_number, Default::default(), @@ -1008,6 +1110,7 @@ mod tests { finality_target: Box::new(relay_header), justification: relay_justification, current_set_id: TEST_GRANDPA_SET_ID, + is_free_execution_expected: false, }) } @@ -1017,10 +1120,24 @@ mod tests { RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { at_relay_block: (parachain_head_at_relay_header_number, RelayBlockHash::default()), parachains: vec![( - ParaId(TestParachain::get()), + ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), + [parachain_head_at_relay_header_number as u8; 32].into(), + )], + parachain_heads_proof: ParaHeadsProof { storage_proof: vec![] }, + }) + } + + pub fn submit_parachain_head_call_ex( + parachain_head_at_relay_header_number: RelayBlockNumber, + ) -> RuntimeCall { + RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads_ex { + at_relay_block: (parachain_head_at_relay_header_number, RelayBlockHash::default()), + parachains: vec![( + ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), [parachain_head_at_relay_header_number as u8; 32].into(), )], parachain_heads_proof: ParaHeadsProof { storage_proof: vec![] }, + is_free_execution_expected: false, }) } @@ -1151,7 +1268,7 @@ mod tests { RuntimeCall::Utility(UtilityCall::batch_all { calls: vec![ submit_relay_header_call_ex(relay_header_number), - submit_parachain_head_call(parachain_head_at_relay_header_number), + submit_parachain_head_call_ex(parachain_head_at_relay_header_number), message_delivery_call(best_message), ], }) @@ -1179,7 +1296,7 @@ mod tests { RuntimeCall::Utility(UtilityCall::batch_all { calls: vec![ submit_relay_header_call_ex(relay_header_number), - submit_parachain_head_call(parachain_head_at_relay_header_number), + submit_parachain_head_call_ex(parachain_head_at_relay_header_number), message_confirmation_call(best_message), ], }) @@ -1194,11 +1311,14 @@ mod tests { current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, + is_mandatory: false, + is_free_execution_expected: false, }, SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), + at_relay_block: HeaderId(200, [0u8; 32].into()), + para_id: ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), para_head_hash: [200u8; 32].into(), + is_free_execution_expected: false, }, MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { base: BaseMessagesProofInfo { @@ -1231,11 +1351,14 @@ mod tests { current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, + is_mandatory: false, + is_free_execution_expected: false, }, SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), + at_relay_block: HeaderId(200, [0u8; 32].into()), + para_id: ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), para_head_hash: [200u8; 32].into(), + is_free_execution_expected: false, }, MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( BaseMessagesProofInfo { @@ -1264,6 +1387,8 @@ mod tests { current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, + is_mandatory: false, + is_free_execution_expected: false, }, MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { base: BaseMessagesProofInfo { @@ -1296,6 +1421,8 @@ mod tests { current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, + is_mandatory: false, + is_free_execution_expected: false, }, MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( BaseMessagesProofInfo { @@ -1320,9 +1447,10 @@ mod tests { relayer: relayer_account_at_this_chain(), call_info: CallInfo::ParachainFinalityAndMsgs( SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), + at_relay_block: HeaderId(200, [0u8; 32].into()), + para_id: ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), para_head_hash: [200u8; 32].into(), + is_free_execution_expected: false, }, MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { base: BaseMessagesProofInfo { @@ -1344,9 +1472,10 @@ mod tests { relayer: relayer_account_at_this_chain(), call_info: CallInfo::ParachainFinalityAndMsgs( SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), + at_relay_block: HeaderId(200, [0u8; 32].into()), + para_id: ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), para_head_hash: [200u8; 32].into(), + is_free_execution_expected: false, }, MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( BaseMessagesProofInfo { @@ -1421,8 +1550,14 @@ mod tests { extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) } - fn run_validate_ignore_priority(call: RuntimeCall) -> TransactionValidity { - run_validate(call).map(|mut tx| { + fn run_messages_validate(call: RuntimeCall) -> TransactionValidity { + let extension: TestMessagesExtension = + RefundSignedExtensionAdapter(RefundBridgedMessages(PhantomData)); + extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn ignore_priority(tx: TransactionValidity) -> TransactionValidity { + tx.map(|mut tx| { tx.priority = 0; tx }) @@ -1444,6 +1579,14 @@ mod tests { extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) } + fn run_messages_pre_dispatch( + call: RuntimeCall, + ) -> Result>, TransactionValidityError> { + let extension: TestMessagesExtension = + RefundSignedExtensionAdapter(RefundBridgedMessages(PhantomData)); + extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + fn dispatch_info() -> DispatchInfo { DispatchInfo { weight: Weight::from_parts( @@ -1502,40 +1645,48 @@ mod tests { Balances::set_balance(&relayer_account_at_this_chain(), ExistentialDeposit::get()); // message delivery is failing - assert_eq!(run_validate(message_delivery_call(200)), Ok(Default::default()),); - assert_eq!( - run_validate(parachain_finality_and_delivery_batch_call(200, 200)), - Ok(Default::default()), - ); - assert_eq!( - run_validate(all_finality_and_delivery_batch_call(200, 200, 200)), - Ok(Default::default()), - ); + let fns = [run_validate, run_grandpa_validate, run_messages_validate]; + for f in fns { + assert_eq!(f(message_delivery_call(200)), Ok(Default::default()),); + assert_eq!( + f(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(Default::default()), + ); + assert_eq!( + f(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(Default::default()), + ); + assert_eq!( + f(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + Ok(Default::default()), + ); + } + + // message confirmation validation is passing assert_eq!( - run_validate(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + ignore_priority(run_validate(message_confirmation_call(200))), Ok(Default::default()), ); - // message confirmation validation is passing assert_eq!( - run_validate_ignore_priority(message_confirmation_call(200)), + ignore_priority(run_messages_validate(message_confirmation_call(200))), Ok(Default::default()), ); assert_eq!( - run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( + ignore_priority(run_validate(parachain_finality_and_confirmation_batch_call( 200, 200 - )), + ))), Ok(Default::default()), ); assert_eq!( - run_validate_ignore_priority(all_finality_and_confirmation_batch_call( + ignore_priority(run_validate(all_finality_and_confirmation_batch_call( 200, 200, 200 - )), + ))), Ok(Default::default()), ); assert_eq!( - run_validate_ignore_priority(all_finality_and_confirmation_batch_call_ex( + ignore_priority(run_validate(all_finality_and_confirmation_batch_call_ex( 200, 200, 200 - )), + ))), Ok(Default::default()), ); }); @@ -1549,25 +1700,28 @@ mod tests { BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) .unwrap(); - let priority_of_100_messages_delivery = - run_validate(message_delivery_call(200)).unwrap().priority; - let priority_of_200_messages_delivery = - run_validate(message_delivery_call(300)).unwrap().priority; - assert!( - priority_of_200_messages_delivery > priority_of_100_messages_delivery, - "Invalid priorities: {} for 200 messages vs {} for 100 messages", - priority_of_200_messages_delivery, - priority_of_100_messages_delivery, - ); + let fns = [run_validate, run_grandpa_validate, run_messages_validate]; + for f in fns { + let priority_of_100_messages_delivery = + f(message_delivery_call(200)).unwrap().priority; + let priority_of_200_messages_delivery = + f(message_delivery_call(300)).unwrap().priority; + assert!( + priority_of_200_messages_delivery > priority_of_100_messages_delivery, + "Invalid priorities: {} for 200 messages vs {} for 100 messages", + priority_of_200_messages_delivery, + priority_of_100_messages_delivery, + ); - let priority_of_100_messages_confirmation = - run_validate(message_confirmation_call(200)).unwrap().priority; - let priority_of_200_messages_confirmation = - run_validate(message_confirmation_call(300)).unwrap().priority; - assert_eq!( - priority_of_100_messages_confirmation, - priority_of_200_messages_confirmation - ); + let priority_of_100_messages_confirmation = + f(message_confirmation_call(200)).unwrap().priority; + let priority_of_200_messages_confirmation = + f(message_confirmation_call(300)).unwrap().priority; + assert_eq!( + priority_of_100_messages_confirmation, + priority_of_200_messages_confirmation + ); + } }); } @@ -1579,23 +1733,24 @@ mod tests { BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) .unwrap(); - let priority_of_max_messages_delivery = run_validate(message_delivery_call( - 100 + MaxUnconfirmedMessagesAtInboundLane::get(), - )) - .unwrap() - .priority; - let priority_of_more_than_max_messages_delivery = run_validate(message_delivery_call( - 100 + MaxUnconfirmedMessagesAtInboundLane::get() + 1, - )) - .unwrap() - .priority; - - assert!( - priority_of_max_messages_delivery > priority_of_more_than_max_messages_delivery, - "Invalid priorities: {} for MAX messages vs {} for MAX+1 messages", - priority_of_max_messages_delivery, - priority_of_more_than_max_messages_delivery, - ); + let fns = [run_validate, run_grandpa_validate, run_messages_validate]; + for f in fns { + let priority_of_max_messages_delivery = + f(message_delivery_call(100 + MaxUnconfirmedMessagesAtInboundLane::get())) + .unwrap() + .priority; + let priority_of_more_than_max_messages_delivery = + f(message_delivery_call(100 + MaxUnconfirmedMessagesAtInboundLane::get() + 1)) + .unwrap() + .priority; + + assert!( + priority_of_max_messages_delivery > priority_of_more_than_max_messages_delivery, + "Invalid priorities: {} for MAX messages vs {} for MAX+1 messages", + priority_of_max_messages_delivery, + priority_of_more_than_max_messages_delivery, + ); + } }); } @@ -1605,45 +1760,54 @@ mod tests { initialize_environment(100, 100, 100); assert_eq!( - run_validate_ignore_priority(message_delivery_call(200)), + ignore_priority(run_validate(message_delivery_call(200))), + Ok(ValidTransaction::default()), + ); + assert_eq!( + ignore_priority(run_validate(message_confirmation_call(200))), + Ok(ValidTransaction::default()), + ); + + assert_eq!( + ignore_priority(run_messages_validate(message_delivery_call(200))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(message_confirmation_call(200)), + ignore_priority(run_messages_validate(message_confirmation_call(200))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(parachain_finality_and_delivery_batch_call(200, 200)), + ignore_priority(run_validate(parachain_finality_and_delivery_batch_call(200, 200))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( + ignore_priority(run_validate(parachain_finality_and_confirmation_batch_call( 200, 200 - )), + ))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(all_finality_and_delivery_batch_call(200, 200, 200)), + ignore_priority(run_validate(all_finality_and_delivery_batch_call(200, 200, 200))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(all_finality_and_delivery_batch_call_ex( + ignore_priority(run_validate(all_finality_and_delivery_batch_call_ex( 200, 200, 200 - )), + ))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(all_finality_and_confirmation_batch_call( + ignore_priority(run_validate(all_finality_and_confirmation_batch_call( 200, 200, 200 - )), + ))), Ok(ValidTransaction::default()), ); assert_eq!( - run_validate_ignore_priority(all_finality_and_confirmation_batch_call_ex( + ignore_priority(run_validate(all_finality_and_confirmation_batch_call_ex( 200, 200, 200 - )), + ))), Ok(ValidTransaction::default()), ); }); @@ -1933,8 +2097,11 @@ mod tests { RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { at_relay_block: (100, RelayBlockHash::default()), parachains: vec![ - (ParaId(TestParachain::get()), [1u8; 32].into()), - (ParaId(TestParachain::get() + 1), [1u8; 32].into()), + (ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), [1u8; 32].into()), + ( + ParaId(BridgedUnderlyingParachain::PARACHAIN_ID + 1), + [1u8; 32].into(), + ), ], parachain_heads_proof: ParaHeadsProof { storage_proof: vec![] }, }), @@ -2318,6 +2485,148 @@ mod tests { }); } + #[test] + fn messages_ext_only_parses_standalone_transactions() { + run_test(|| { + initialize_environment(100, 100, 100); + + // relay + parachain + message delivery calls batch is ignored + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_delivery_batch_call(200, 200, 200) + ), + Ok(None), + ); + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_delivery_batch_call_ex(200, 200, 200) + ), + Ok(None), + ); + + // relay + parachain + message confirmation calls batch is ignored + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_confirmation_batch_call(200, 200, 200) + ), + Ok(None), + ); + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_confirmation_batch_call_ex(200, 200, 200) + ), + Ok(None), + ); + + // parachain + message delivery call batch is ignored + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + ¶chain_finality_and_delivery_batch_call(200, 200) + ), + Ok(None), + ); + + // parachain + message confirmation call batch is ignored + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + ¶chain_finality_and_confirmation_batch_call(200, 200) + ), + Ok(None), + ); + + // relay + message delivery call batch is ignored + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_delivery_batch_call(200, 200) + ), + Ok(None), + ); + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_delivery_batch_call_ex(200, 200) + ), + Ok(None), + ); + + // relay + message confirmation call batch is ignored + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_confirmation_batch_call(200, 200) + ), + Ok(None), + ); + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_confirmation_batch_call_ex(200, 200) + ), + Ok(None), + ); + + // message delivery call batch is accepted + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &message_delivery_call(200) + ), + Ok(Some(delivery_pre_dispatch_data().call_info)), + ); + + // message confirmation call batch is accepted + assert_eq!( + TestMessagesExtensionProvider::parse_and_check_for_obsolete_call( + &message_confirmation_call(200) + ), + Ok(Some(confirmation_pre_dispatch_data().call_info)), + ); + }); + } + + #[test] + fn messages_ext_rejects_calls_with_obsolete_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_messages_pre_dispatch(message_delivery_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_messages_pre_dispatch(message_confirmation_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_messages_validate(message_delivery_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_messages_validate(message_confirmation_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn messages_ext_accepts_calls_with_new_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_messages_pre_dispatch(message_delivery_call(200)), + Ok(Some(delivery_pre_dispatch_data())), + ); + assert_eq!( + run_messages_pre_dispatch(message_confirmation_call(200)), + Ok(Some(confirmation_pre_dispatch_data())), + ); + + assert_eq!(run_messages_validate(message_delivery_call(200)), Ok(Default::default()),); + assert_eq!( + run_messages_validate(message_confirmation_call(200)), + Ok(Default::default()), + ); + }); + } + #[test] fn grandpa_ext_only_parses_valid_batches() { run_test(|| { diff --git a/bridges/bin/runtime-common/src/mock.rs b/bridges/bin/runtime-common/src/mock.rs index ad71cd0d456..e323f1edfc7 100644 --- a/bridges/bin/runtime-common/src/mock.rs +++ b/bridges/bin/runtime-common/src/mock.rs @@ -183,7 +183,8 @@ impl pallet_transaction_payment::Config for TestRuntime { impl pallet_bridge_grandpa::Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgedChain = BridgedUnderlyingChain; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type MaxFreeHeadersPerBlock = ConstU32<4>; + type FreeHeadersInterval = ConstU32<1_024>; type HeadersToKeep = ConstU32<8>; type WeightInfo = pallet_bridge_grandpa::weights::BridgeWeight; } @@ -406,6 +407,7 @@ impl Chain for BridgedUnderlyingParachain { impl Parachain for BridgedUnderlyingParachain { const PARACHAIN_ID: u32 = 42; + const MAX_HEADER_SIZE: u32 = 1_024; } /// The other, bridged chain, used in tests. diff --git a/bridges/chains/chain-bridge-hub-cumulus/src/lib.rs b/bridges/chains/chain-bridge-hub-cumulus/src/lib.rs index c49aa4b8563..a5c90ceba11 100644 --- a/bridges/chains/chain-bridge-hub-cumulus/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-cumulus/src/lib.rs @@ -39,6 +39,9 @@ use frame_support::{ use frame_system::limits; use sp_std::time::Duration; +/// Maximal bridge hub header size. +pub const MAX_BRIDGE_HUB_HEADER_SIZE: u32 = 4_096; + /// Average block interval in Cumulus-based parachains. /// /// Corresponds to the `MILLISECS_PER_BLOCK` from `parachains_common` crate. diff --git a/bridges/chains/chain-bridge-hub-kusama/src/lib.rs b/bridges/chains/chain-bridge-hub-kusama/src/lib.rs index 576e3dbee80..ef3ef4ab7b7 100644 --- a/bridges/chains/chain-bridge-hub-kusama/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-kusama/src/lib.rs @@ -62,6 +62,7 @@ impl Chain for BridgeHubKusama { impl Parachain for BridgeHubKusama { const PARACHAIN_ID: u32 = BRIDGE_HUB_KUSAMA_PARACHAIN_ID; + const MAX_HEADER_SIZE: u32 = MAX_BRIDGE_HUB_HEADER_SIZE; } impl ChainWithMessages for BridgeHubKusama { diff --git a/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs b/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs index 6db389c9299..9db71af928e 100644 --- a/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs @@ -59,6 +59,7 @@ impl Chain for BridgeHubPolkadot { impl Parachain for BridgeHubPolkadot { const PARACHAIN_ID: u32 = BRIDGE_HUB_POLKADOT_PARACHAIN_ID; + const MAX_HEADER_SIZE: u32 = MAX_BRIDGE_HUB_HEADER_SIZE; } impl ChainWithMessages for BridgeHubPolkadot { diff --git a/bridges/chains/chain-bridge-hub-rococo/src/lib.rs b/bridges/chains/chain-bridge-hub-rococo/src/lib.rs index abce872d7ba..d7097f01c53 100644 --- a/bridges/chains/chain-bridge-hub-rococo/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-rococo/src/lib.rs @@ -59,6 +59,7 @@ impl Chain for BridgeHubRococo { impl Parachain for BridgeHubRococo { const PARACHAIN_ID: u32 = BRIDGE_HUB_ROCOCO_PARACHAIN_ID; + const MAX_HEADER_SIZE: u32 = MAX_BRIDGE_HUB_HEADER_SIZE; } impl ChainWithMessages for BridgeHubRococo { @@ -103,9 +104,9 @@ frame_support::parameter_types! { /// Transaction fee that is paid at the Rococo BridgeHub for delivering single inbound message. /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) - pub const BridgeHubRococoBaseDeliveryFeeInRocs: u128 = 5_651_581_649; + pub const BridgeHubRococoBaseDeliveryFeeInRocs: u128 = 314_037_860; /// Transaction fee that is paid at the Rococo BridgeHub for delivering single outbound message confirmation. /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) - pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 5_380_901_781; + pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 57_414_813; } diff --git a/bridges/chains/chain-bridge-hub-westend/src/lib.rs b/bridges/chains/chain-bridge-hub-westend/src/lib.rs index 4af895cc6d3..800f290d7bf 100644 --- a/bridges/chains/chain-bridge-hub-westend/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-westend/src/lib.rs @@ -58,6 +58,7 @@ impl Chain for BridgeHubWestend { impl Parachain for BridgeHubWestend { const PARACHAIN_ID: u32 = BRIDGE_HUB_WESTEND_PARACHAIN_ID; + const MAX_HEADER_SIZE: u32 = MAX_BRIDGE_HUB_HEADER_SIZE; } impl ChainWithMessages for BridgeHubWestend { @@ -93,10 +94,10 @@ frame_support::parameter_types! { pub const BridgeHubWestendBaseXcmFeeInWnds: u128 = 17_756_830_000; /// Transaction fee that is paid at the Westend BridgeHub for delivering single inbound message. - /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) - pub const BridgeHubWestendBaseDeliveryFeeInWnds: u128 = 1_695_489_961_344; + /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_standalone_message_delivery_transaction` + `33%`) + pub const BridgeHubWestendBaseDeliveryFeeInWnds: u128 = 94_211_536_452; /// Transaction fee that is paid at the Westend BridgeHub for delivering single outbound message confirmation. - /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) - pub const BridgeHubWestendBaseConfirmationFeeInWnds: u128 = 1_618_309_961_344; + /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_standalone_message_confirmation_transaction` + `33%`) + pub const BridgeHubWestendBaseConfirmationFeeInWnds: u128 = 17_224_486_452; } diff --git a/bridges/modules/grandpa/src/call_ext.rs b/bridges/modules/grandpa/src/call_ext.rs index 4a7ebb3cc8d..6fa62ec0cff 100644 --- a/bridges/modules/grandpa/src/call_ext.rs +++ b/bridges/modules/grandpa/src/call_ext.rs @@ -15,20 +15,24 @@ // along with Parity Bridges Common. If not, see . use crate::{ - weights::WeightInfo, BridgedBlockNumber, BridgedHeader, Config, CurrentAuthoritySet, Error, - Pallet, + weights::WeightInfo, BestFinalized, BridgedBlockNumber, BridgedHeader, Config, + CurrentAuthoritySet, Error, FreeHeadersRemaining, Pallet, }; use bp_header_chain::{ justification::GrandpaJustification, max_expected_submit_finality_proof_arguments_size, ChainWithGrandpa, GrandpaConsensusLogReader, }; -use bp_runtime::{BlockNumberOf, OwnedBridgeModule}; +use bp_runtime::{BlockNumberOf, Chain, OwnedBridgeModule}; use codec::Encode; -use frame_support::{dispatch::CallableCallFor, traits::IsSubType, weights::Weight}; +use frame_support::{ + dispatch::CallableCallFor, + traits::{Get, IsSubType}, + weights::Weight, +}; use sp_consensus_grandpa::SetId; use sp_runtime::{ - traits::{Header, Zero}, - transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + traits::{CheckedSub, Header, Zero}, + transaction_validity::{InvalidTransaction, TransactionValidityError}, RuntimeDebug, SaturatedConversion, }; @@ -40,6 +44,11 @@ pub struct SubmitFinalityProofInfo { /// An identifier of the validators set that has signed the submitted justification. /// It might be `None` if deprecated version of the `submit_finality_proof` is used. pub current_set_id: Option, + /// If `true`, then the call proves new **mandatory** header. + pub is_mandatory: bool, + /// If `true`, then the call must be free (assuming that everything else is valid) to + /// be treated as valid. + pub is_free_execution_expected: bool, /// Extra weight that we assume is included in the call. /// /// We have some assumptions about headers and justifications of the bridged chain. @@ -54,6 +63,16 @@ pub struct SubmitFinalityProofInfo { pub extra_size: u32, } +/// Verified `SubmitFinalityProofInfo`. +#[derive(Copy, Clone, PartialEq, RuntimeDebug)] +pub struct VerifiedSubmitFinalityProofInfo { + /// Base call information. + pub base: SubmitFinalityProofInfo, + /// A difference between bundled bridged header and best bridged header known to us + /// before the call. + pub improved_by: N, +} + impl SubmitFinalityProofInfo { /// Returns `true` if call size/weight is below our estimations for regular calls. pub fn fits_limits(&self) -> bool { @@ -67,14 +86,86 @@ pub struct SubmitFinalityProofHelper, I: 'static> { } impl, I: 'static> SubmitFinalityProofHelper { + /// Returns `true` if we may fit more free headers into the current block. If `false` is + /// returned, the call will be paid even if `is_free_execution_expected` has been set + /// to `true`. + pub fn has_free_header_slots() -> bool { + // `unwrap_or(u32::MAX)` means that if `FreeHeadersRemaining` is `None`, we may accept + // this header for free. That is a small cheat - it is `None` if executed outside of + // transaction (e.g. during block initialization). Normal relayer would never submit + // such calls, but if he did, that is not our problem. During normal transactions, + // the `FreeHeadersRemaining` is always `Some(_)`. + let free_headers_remaining = FreeHeadersRemaining::::get().unwrap_or(u32::MAX); + free_headers_remaining > 0 + } + + /// Check that the: (1) GRANDPA head provided by the `SubmitFinalityProof` is better than the + /// best one we know (2) if `current_set_id` matches the current authority set id, if specified + /// and (3) whether transaction MAY be free for the submitter if `is_free_execution_expected` + /// is `true`. + /// + /// Returns number of headers between the current best finalized header, known to the pallet + /// and the bundled header. + pub fn check_obsolete_from_extension( + call_info: &SubmitFinalityProofInfo>, + ) -> Result, Error> { + // do basic checks first + let improved_by = Self::check_obsolete(call_info.block_number, call_info.current_set_id)?; + + // if submitter has NOT specified that it wants free execution, then we are done + if !call_info.is_free_execution_expected { + return Ok(improved_by); + } + + // else - if we can not accept more free headers, "reject" the transaction + if !Self::has_free_header_slots() { + log::trace!( + target: crate::LOG_TARGET, + "Cannot accept free {:?} header {:?}. No more free slots remaining", + T::BridgedChain::ID, + call_info.block_number, + ); + + return Err(Error::::FreeHeadersLimitExceded); + } + + // ensure that the `improved_by` is larger than the configured free interval + if !call_info.is_mandatory { + if let Some(free_headers_interval) = T::FreeHeadersInterval::get() { + if improved_by < free_headers_interval.into() { + log::trace!( + target: crate::LOG_TARGET, + "Cannot accept free {:?} header {:?}. Too small difference \ + between submitted headers: {:?} vs {}", + T::BridgedChain::ID, + call_info.block_number, + improved_by, + free_headers_interval, + ); + + return Err(Error::::BelowFreeHeaderInterval); + } + } + } + + // we do not check whether the header matches free submission criteria here - it is the + // relayer responsibility to check that + + Ok(improved_by) + } + /// Check that the GRANDPA head provided by the `SubmitFinalityProof` is better than the best /// one we know. Additionally, checks if `current_set_id` matches the current authority set - /// id, if specified. + /// id, if specified. This method is called by the call code and the transaction extension, + /// so it does not check the free execution. + /// + /// Returns number of headers between the current best finalized header, known to the pallet + /// and the bundled header. pub fn check_obsolete( finality_target: BlockNumberOf, current_set_id: Option, - ) -> Result<(), Error> { - let best_finalized = crate::BestFinalized::::get().ok_or_else(|| { + ) -> Result, Error> { + let best_finalized = BestFinalized::::get().ok_or_else(|| { log::trace!( target: crate::LOG_TARGET, "Cannot finalize header {:?} because pallet is not yet initialized", @@ -83,16 +174,19 @@ impl, I: 'static> SubmitFinalityProofHelper { >::NotInitialized })?; - if best_finalized.number() >= finality_target { - log::trace!( - target: crate::LOG_TARGET, - "Cannot finalize obsolete header: bundled {:?}, best {:?}", - finality_target, - best_finalized, - ); + let improved_by = match finality_target.checked_sub(&best_finalized.number()) { + Some(improved_by) if improved_by > Zero::zero() => improved_by, + _ => { + log::trace!( + target: crate::LOG_TARGET, + "Cannot finalize obsolete header: bundled {:?}, best {:?}", + finality_target, + best_finalized, + ); - return Err(Error::::OldHeader) - } + return Err(Error::::OldHeader) + }, + }; if let Some(current_set_id) = current_set_id { let actual_set_id = >::get().set_id; @@ -108,12 +202,12 @@ impl, I: 'static> SubmitFinalityProofHelper { } } - Ok(()) + Ok(improved_by) } /// Check if the `SubmitFinalityProof` was successfully executed. pub fn was_successful(finality_target: BlockNumberOf) -> bool { - match crate::BestFinalized::::get() { + match BestFinalized::::get() { Some(best_finalized) => best_finalized.number() == finality_target, None => false, } @@ -135,17 +229,20 @@ pub trait CallSubType, I: 'static>: finality_target, justification, None, + false, )) } else if let Some(crate::Call::::submit_finality_proof_ex { finality_target, justification, current_set_id, + is_free_execution_expected, }) = self.is_sub_type() { return Some(submit_finality_proof_info_from_args::( finality_target, justification, Some(*current_set_id), + *is_free_execution_expected, )) } @@ -155,26 +252,36 @@ pub trait CallSubType, I: 'static>: /// Validate Grandpa headers in order to avoid "mining" transactions that provide outdated /// bridged chain headers. Without this validation, even honest relayers may lose their funds /// if there are multiple relays running and submitting the same information. - fn check_obsolete_submit_finality_proof(&self) -> TransactionValidity + /// + /// Returns `Ok(None)` if the call is not the `submit_finality_proof` call of our pallet. + /// Returns `Ok(Some(_))` if the call is the `submit_finality_proof` call of our pallet and + /// we believe the call brings header that improves the pallet state. + /// Returns `Err(_)` if the call is the `submit_finality_proof` call of our pallet and we + /// believe that the call will fail. + fn check_obsolete_submit_finality_proof( + &self, + ) -> Result< + Option>>, + TransactionValidityError, + > where Self: Sized, { - let finality_target = match self.submit_finality_proof_info() { + let call_info = match self.submit_finality_proof_info() { Some(finality_proof) => finality_proof, - _ => return Ok(ValidTransaction::default()), + _ => return Ok(None), }; if Pallet::::ensure_not_halted().is_err() { - return InvalidTransaction::Call.into() + return Err(InvalidTransaction::Call.into()) } - match SubmitFinalityProofHelper::::check_obsolete( - finality_target.block_number, - finality_target.current_set_id, - ) { - Ok(_) => Ok(ValidTransaction::default()), - Err(Error::::OldHeader) => InvalidTransaction::Stale.into(), - Err(_) => InvalidTransaction::Call.into(), + let result = SubmitFinalityProofHelper::::check_obsolete_from_extension(&call_info); + match result { + Ok(improved_by) => + Ok(Some(VerifiedSubmitFinalityProofInfo { base: call_info, improved_by })), + Err(Error::::OldHeader) => Err(InvalidTransaction::Stale.into()), + Err(_) => Err(InvalidTransaction::Call.into()), } } } @@ -189,6 +296,7 @@ pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( finality_target: &BridgedHeader, justification: &GrandpaJustification>, current_set_id: Option, + is_free_execution_expected: bool, ) -> SubmitFinalityProofInfo> { let block_number = *finality_target.number(); @@ -230,16 +338,26 @@ pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( ); let extra_size = actual_call_size.saturating_sub(max_expected_call_size); - SubmitFinalityProofInfo { block_number, current_set_id, extra_weight, extra_size } + SubmitFinalityProofInfo { + block_number, + current_set_id, + is_mandatory: is_mandatory_finality_target, + is_free_execution_expected, + extra_weight, + extra_size, + } } #[cfg(test)] mod tests { use crate::{ call_ext::CallSubType, - mock::{run_test, test_header, RuntimeCall, TestBridgedChain, TestNumber, TestRuntime}, - BestFinalized, Config, CurrentAuthoritySet, PalletOperatingMode, StoredAuthoritySet, - SubmitFinalityProofInfo, WeightInfo, + mock::{ + run_test, test_header, FreeHeadersInterval, RuntimeCall, TestBridgedChain, TestNumber, + TestRuntime, + }, + BestFinalized, Config, CurrentAuthoritySet, FreeHeadersRemaining, PalletOperatingMode, + StoredAuthoritySet, SubmitFinalityProofInfo, WeightInfo, }; use bp_header_chain::ChainWithGrandpa; use bp_runtime::{BasicOperatingMode, HeaderId}; @@ -247,6 +365,7 @@ mod tests { make_default_justification, make_justification_for_header, JustificationGeneratorParams, TEST_GRANDPA_SET_ID, }; + use codec::Encode; use frame_support::weights::Weight; use sp_runtime::{testing::DigestItem, traits::Header as _, SaturatedConversion}; @@ -256,6 +375,7 @@ mod tests { justification: make_default_justification(&test_header(num)), // not initialized => zero current_set_id: 0, + is_free_execution_expected: false, }; RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( bridge_grandpa_call, @@ -311,6 +431,121 @@ mod tests { }); } + #[test] + fn extension_rejects_new_header_if_free_execution_is_requested_and_free_submissions_are_not_accepted( + ) { + run_test(|| { + let bridge_grandpa_call = crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(test_header(10 + FreeHeadersInterval::get() as u64)), + justification: make_default_justification(&test_header( + 10 + FreeHeadersInterval::get() as u64, + )), + current_set_id: 0, + is_free_execution_expected: true, + }; + sync_to_header_10(); + + // when we can accept free headers => Ok + FreeHeadersRemaining::::put(2); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_ok()); + + // when we can NOT accept free headers => Err + FreeHeadersRemaining::::put(0); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_err()); + + // when called outside of transaction => Ok + FreeHeadersRemaining::::kill(); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call, + ),) + .is_ok()); + }) + } + + #[test] + fn extension_rejects_new_header_if_free_execution_is_requested_and_improved_by_is_below_expected( + ) { + run_test(|| { + let bridge_grandpa_call = crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(test_header(100)), + justification: make_default_justification(&test_header(100)), + current_set_id: 0, + is_free_execution_expected: true, + }; + sync_to_header_10(); + + // when `improved_by` is less than the free interval + BestFinalized::::put(HeaderId( + 100 - FreeHeadersInterval::get() as u64 + 1, + sp_core::H256::default(), + )); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_err()); + + // when `improved_by` is equal to the free interval + BestFinalized::::put(HeaderId( + 100 - FreeHeadersInterval::get() as u64, + sp_core::H256::default(), + )); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_ok()); + + // when `improved_by` is larger than the free interval + BestFinalized::::put(HeaderId( + 100 - FreeHeadersInterval::get() as u64 - 1, + sp_core::H256::default(), + )); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_ok()); + + // when `improved_by` is less than the free interval BUT it is a mandatory header + let mut mandatory_header = test_header(100); + let consensus_log = sp_consensus_grandpa::ConsensusLog::::ScheduledChange( + sp_consensus_grandpa::ScheduledChange { + next_authorities: bp_test_utils::authority_list(), + delay: 0, + }, + ); + mandatory_header.digest = sp_runtime::Digest { + logs: vec![DigestItem::Consensus( + sp_consensus_grandpa::GRANDPA_ENGINE_ID, + consensus_log.encode(), + )], + }; + let justification = make_justification_for_header(JustificationGeneratorParams { + header: mandatory_header.clone(), + set_id: 1, + ..Default::default() + }); + let bridge_grandpa_call = crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(mandatory_header), + justification, + current_set_id: 0, + is_free_execution_expected: true, + }; + BestFinalized::::put(HeaderId( + 100 - FreeHeadersInterval::get() as u64 + 1, + sp_core::H256::default(), + )); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_ok()); + }) + } + #[test] fn extension_accepts_new_header() { run_test(|| { @@ -336,6 +571,8 @@ mod tests { current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, + is_mandatory: false, + is_free_execution_expected: false, }) ); @@ -345,6 +582,7 @@ mod tests { finality_target: Box::new(test_header(42)), justification: make_default_justification(&test_header(42)), current_set_id: 777, + is_free_execution_expected: false, }); assert_eq!( deprecated_call.submit_finality_proof_info(), @@ -353,6 +591,8 @@ mod tests { current_set_id: Some(777), extra_weight: Weight::zero(), extra_size: 0, + is_mandatory: false, + is_free_execution_expected: false, }) ); } @@ -370,6 +610,7 @@ mod tests { finality_target: Box::new(small_finality_target), justification: small_justification, current_set_id: TEST_GRANDPA_SET_ID, + is_free_execution_expected: false, }); assert_eq!(small_call.submit_finality_proof_info().unwrap().extra_size, 0); @@ -387,6 +628,7 @@ mod tests { finality_target: Box::new(large_finality_target), justification: large_justification, current_set_id: TEST_GRANDPA_SET_ID, + is_free_execution_expected: false, }); assert_ne!(large_call.submit_finality_proof_info().unwrap().extra_size, 0); } @@ -406,6 +648,7 @@ mod tests { finality_target: Box::new(finality_target.clone()), justification, current_set_id: TEST_GRANDPA_SET_ID, + is_free_execution_expected: false, }); assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, Weight::zero()); @@ -420,7 +663,52 @@ mod tests { finality_target: Box::new(finality_target), justification, current_set_id: TEST_GRANDPA_SET_ID, + is_free_execution_expected: false, }); assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, call_weight); } + + #[test] + fn check_obsolete_submit_finality_proof_returns_correct_improved_by() { + run_test(|| { + fn make_call(number: u64) -> RuntimeCall { + RuntimeCall::Grandpa(crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(test_header(number)), + justification: make_default_justification(&test_header(number)), + current_set_id: 0, + is_free_execution_expected: false, + }) + } + + sync_to_header_10(); + + // when the difference between headers is 1 + assert_eq!( + RuntimeCall::check_obsolete_submit_finality_proof(&make_call(11)) + .unwrap() + .unwrap() + .improved_by, + 1, + ); + + // when the difference between headers is 2 + assert_eq!( + RuntimeCall::check_obsolete_submit_finality_proof(&make_call(12)) + .unwrap() + .unwrap() + .improved_by, + 2, + ); + }) + } + + #[test] + fn check_obsolete_submit_finality_proof_ignores_other_calls() { + run_test(|| { + let call = + RuntimeCall::System(frame_system::Call::::remark { remark: vec![42] }); + + assert_eq!(RuntimeCall::check_obsolete_submit_finality_proof(&call), Ok(None)); + }) + } } diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index 9e095651ef8..cb536eb07ff 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -44,6 +44,7 @@ use bp_header_chain::{ }; use bp_runtime::{BlockNumberOf, HashOf, HasherOf, HeaderId, HeaderOf, OwnedBridgeModule}; use frame_support::{dispatch::PostDispatchInfo, ensure, DefaultNoBound}; +use sp_consensus_grandpa::SetId; use sp_runtime::{ traits::{Header as HeaderT, Zero}, SaturatedConversion, @@ -57,6 +58,7 @@ mod storage_types; /// Module, containing weights for this pallet. pub mod weights; +pub mod weights_ext; #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; @@ -65,6 +67,7 @@ pub mod benchmarking; pub use call_ext::*; pub use pallet::*; pub use weights::WeightInfo; +pub use weights_ext::WeightInfoExt; /// The target that will be used when publishing logs related to this pallet. pub const LOG_TARGET: &str = "runtime::bridge-grandpa"; @@ -101,17 +104,31 @@ pub mod pallet { /// The chain we are bridging to here. type BridgedChain: ChainWithGrandpa; - /// Maximal number of "free" mandatory header transactions per block. + /// Maximal number of "free" header transactions per block. /// /// To be able to track the bridged chain, the pallet requires all headers that are /// changing GRANDPA authorities set at the bridged chain (we call them mandatory). - /// So it is a common good deed to submit mandatory headers to the pallet. However, if the - /// bridged chain gets compromised, its validators may generate as many mandatory headers - /// as they want. And they may fill the whole block (at this chain) for free. This constants - /// limits number of calls that we may refund in a single block. All calls above this - /// limit are accepted, but are not refunded. + /// So it is a common good deed to submit mandatory headers to the pallet. + /// + /// The pallet may be configured (see `[Self::FreeHeadersInterval]`) to import some + /// non-mandatory headers for free as well. It also may be treated as a common good + /// deed, because it may help to reduce bridge fees - this cost may be deducted from + /// bridge fees, paid by message senders. + /// + /// However, if the bridged chain gets compromised, its validators may generate as many + /// "free" headers as they want. And they may fill the whole block (at this chain) for + /// free. This constants limits number of calls that we may refund in a single block. + /// All calls above this limit are accepted, but are not refunded. + #[pallet::constant] + type MaxFreeHeadersPerBlock: Get; + + /// The distance between bridged chain headers, that may be submitted for free. The + /// first free header is header number zero, the next one is header number + /// `FreeHeadersInterval::get()` or any of its descendant if that header has not + /// been submitted. In other words, interval between free headers should be at least + /// `FreeHeadersInterval`. #[pallet::constant] - type MaxFreeMandatoryHeadersPerBlock: Get; + type FreeHeadersInterval: Get>; /// Maximal number of finalized headers to keep in the storage. /// @@ -124,7 +141,7 @@ pub mod pallet { type HeadersToKeep: Get; /// Weights gathered through benchmarking. - type WeightInfo: WeightInfo; + type WeightInfo: WeightInfoExt; } #[pallet::pallet] @@ -133,12 +150,12 @@ pub mod pallet { #[pallet::hooks] impl, I: 'static> Hooks> for Pallet { fn on_initialize(_n: BlockNumberFor) -> Weight { - FreeMandatoryHeadersRemaining::::put(T::MaxFreeMandatoryHeadersPerBlock::get()); + FreeHeadersRemaining::::put(T::MaxFreeHeadersPerBlock::get()); Weight::zero() } fn on_finalize(_n: BlockNumberFor) { - FreeMandatoryHeadersRemaining::::kill(); + FreeHeadersRemaining::::kill(); } } @@ -155,7 +172,7 @@ pub mod pallet { /// `submit_finality_proof_ex` instead. Semantically, this call is an equivalent of the /// `submit_finality_proof_ex` call without current authority set id check. #[pallet::call_index(0)] - #[pallet::weight(::submit_finality_proof( + #[pallet::weight(T::WeightInfo::submit_finality_proof_weight( justification.commit.precommits.len().saturated_into(), justification.votes_ancestries.len().saturated_into(), ))] @@ -175,6 +192,8 @@ pub mod pallet { // the `submit_finality_proof_ex` also reads this value, but it is done from the // cache, so we don't treat it as an additional db access >::get().set_id, + // cannot enforce free execution using this call + false, ) } @@ -250,8 +269,14 @@ pub mod pallet { /// - verification is not optimized or invalid; /// /// - header contains forced authorities set change or change with non-zero delay. + /// + /// The `is_free_execution_expected` parameter is not really used inside the call. It is + /// used by the transaction extension, which should be registered at the runtime level. If + /// this parameter is `true`, the transaction will be treated as invalid, if the call won't + /// be executed for free. If transaction extension is not used by the runtime, this + /// parameter is not used at all. #[pallet::call_index(4)] - #[pallet::weight(::submit_finality_proof( + #[pallet::weight(T::WeightInfo::submit_finality_proof_weight( justification.commit.precommits.len().saturated_into(), justification.votes_ancestries.len().saturated_into(), ))] @@ -260,6 +285,7 @@ pub mod pallet { finality_target: Box>, justification: GrandpaJustification>, current_set_id: sp_consensus_grandpa::SetId, + _is_free_execution_expected: bool, ) -> DispatchResultWithPostInfo { Self::ensure_not_halted().map_err(Error::::BridgeModule)?; ensure_signed(origin)?; @@ -273,7 +299,8 @@ pub mod pallet { // it checks whether the `number` is better than the current best block number // and whether the `current_set_id` matches the best known set id - SubmitFinalityProofHelper::::check_obsolete(number, Some(current_set_id))?; + let improved_by = + SubmitFinalityProofHelper::::check_obsolete(number, Some(current_set_id))?; let authority_set = >::get(); let unused_proof_size = authority_set.unused_proof_size(); @@ -283,23 +310,16 @@ pub mod pallet { let maybe_new_authority_set = try_enact_authority_change::(&finality_target, set_id)?; - let may_refund_call_fee = maybe_new_authority_set.is_some() && - // if we have seen too many mandatory headers in this block, we don't want to refund - Self::free_mandatory_headers_remaining() > 0 && - // if arguments out of expected bounds, we don't want to refund - submit_finality_proof_info_from_args::(&finality_target, &justification, Some(current_set_id)) - .fits_limits(); + let may_refund_call_fee = may_refund_call_fee::( + &finality_target, + &justification, + current_set_id, + improved_by, + ); if may_refund_call_fee { - FreeMandatoryHeadersRemaining::::mutate(|count| { - *count = count.saturating_sub(1) - }); + on_free_header_imported::(); } insert_header::(*finality_target, hash); - log::info!( - target: LOG_TARGET, - "Successfully imported finalized header with hash {:?}!", - hash - ); // mandatory header is a header that changes authorities set. The pallet can't go // further without importing this header. So every bridge MUST import mandatory headers. @@ -311,6 +331,13 @@ pub mod pallet { // to pay for the transaction. let pays_fee = if may_refund_call_fee { Pays::No } else { Pays::Yes }; + log::info!( + target: LOG_TARGET, + "Successfully imported finalized header with hash {:?}! Free: {}", + hash, + if may_refund_call_fee { "Yes" } else { "No" }, + ); + // the proof size component of the call weight assumes that there are // `MaxBridgedAuthorities` in the `CurrentAuthoritySet` (we use `MaxEncodedLen` // estimation). But if their number is lower, then we may "refund" some `proof_size`, @@ -335,20 +362,18 @@ pub mod pallet { } } - /// Number mandatory headers that we may accept in the current block for free (returning - /// `Pays::No`). + /// Number of free header submissions that we may yet accept in the current block. /// - /// If the `FreeMandatoryHeadersRemaining` hits zero, all following mandatory headers in the + /// If the `FreeHeadersRemaining` hits zero, all following mandatory headers in the /// current block are accepted with fee (`Pays::Yes` is returned). /// - /// The `FreeMandatoryHeadersRemaining` is an ephemeral value that is set to - /// `MaxFreeMandatoryHeadersPerBlock` at each block initialization and is killed on block + /// The `FreeHeadersRemaining` is an ephemeral value that is set to + /// `MaxFreeHeadersPerBlock` at each block initialization and is killed on block /// finalization. So it never ends up in the storage trie. #[pallet::storage] #[pallet::whitelist_storage] - #[pallet::getter(fn free_mandatory_headers_remaining)] - pub(super) type FreeMandatoryHeadersRemaining, I: 'static = ()> = - StorageValue<_, u32, ValueQuery>; + pub type FreeHeadersRemaining, I: 'static = ()> = + StorageValue<_, u32, OptionQuery>; /// Hash of the header used to bootstrap the pallet. #[pallet::storage] @@ -473,6 +498,68 @@ pub mod pallet { /// The `current_set_id` argument of the `submit_finality_proof_ex` doesn't match /// the id of the current set, known to the pallet. InvalidAuthoritySetId, + /// The submitter wanted free execution, but we can't fit more free transactions + /// to the block. + FreeHeadersLimitExceded, + /// The submitter wanted free execution, but the difference between best known and + /// bundled header numbers is below the `FreeHeadersInterval`. + BelowFreeHeaderInterval, + } + + /// Called when new free header is imported. + pub fn on_free_header_imported, I: 'static>() { + FreeHeadersRemaining::::mutate(|count| { + *count = match *count { + None => None, + // the signed extension expects that `None` means outside of block + // execution - i.e. when transaction is validated from the transaction pool, + // so use `saturating_sub` and don't go from `Some(0)`->`None` + Some(count) => Some(count.saturating_sub(1)), + } + }); + } + + /// Return true if we may refund transaction cost to the submitter. In other words, + /// this transaction is considered as common good deed w.r.t to pallet configuration. + fn may_refund_call_fee, I: 'static>( + finality_target: &BridgedHeader, + justification: &GrandpaJustification>, + current_set_id: SetId, + improved_by: BridgedBlockNumber, + ) -> bool { + // if we have refunded too much at this block => not refunding + if FreeHeadersRemaining::::get().unwrap_or(0) == 0 { + return false; + } + + // if size/weight of call is larger than expected => not refunding + let call_info = submit_finality_proof_info_from_args::( + &finality_target, + &justification, + Some(current_set_id), + // this function is called from the transaction body and we do not want + // to do MAY-be-free-executed checks here - they had to be done in the + // transaction extension before + false, + ); + if !call_info.fits_limits() { + return false; + } + + // if that's a mandatory header => refund + if call_info.is_mandatory { + return true; + } + + // if configuration allows free non-mandatory headers and the header + // matches criteria => refund + if let Some(free_headers_interval) = T::FreeHeadersInterval::get() { + if improved_by >= free_headers_interval.into() { + return true; + } + } + + false } /// Check the given header for a GRANDPA scheduled authority set change. If a change @@ -692,8 +779,8 @@ pub fn initialize_for_benchmarks, I: 'static>(header: BridgedHeader mod tests { use super::*; use crate::mock::{ - run_test, test_header, RuntimeEvent as TestEvent, RuntimeOrigin, System, TestBridgedChain, - TestHeader, TestNumber, TestRuntime, MAX_BRIDGED_AUTHORITIES, + run_test, test_header, FreeHeadersInterval, RuntimeEvent as TestEvent, RuntimeOrigin, + System, TestBridgedChain, TestHeader, TestNumber, TestRuntime, MAX_BRIDGED_AUTHORITIES, }; use bp_header_chain::BridgeGrandpaCall; use bp_runtime::BasicOperatingMode; @@ -747,6 +834,7 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ) } @@ -766,6 +854,7 @@ mod tests { Box::new(header), justification, set_id, + false, ) } @@ -794,6 +883,7 @@ mod tests { Box::new(header), justification, set_id, + false, ) } @@ -1009,6 +1099,7 @@ mod tests { Box::new(header.clone()), justification.clone(), TEST_GRANDPA_SET_ID, + false, ), >::InvalidJustification ); @@ -1018,6 +1109,7 @@ mod tests { Box::new(header), justification, next_set_id, + false, ), >::InvalidAuthoritySetId ); @@ -1039,6 +1131,7 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ), >::InvalidJustification ); @@ -1069,6 +1162,7 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ), >::InvalidAuthoritySet ); @@ -1108,6 +1202,7 @@ mod tests { Box::new(header.clone()), justification.clone(), TEST_GRANDPA_SET_ID, + false, ); assert_ok!(result); assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::No); @@ -1171,6 +1266,7 @@ mod tests { Box::new(header.clone()), justification, TEST_GRANDPA_SET_ID, + false, ); assert_ok!(result); assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); @@ -1203,6 +1299,7 @@ mod tests { Box::new(header.clone()), justification, TEST_GRANDPA_SET_ID, + false, ); assert_ok!(result); assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); @@ -1233,6 +1330,7 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ), >::UnsupportedScheduledChange ); @@ -1259,6 +1357,7 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ), >::UnsupportedScheduledChange ); @@ -1285,6 +1384,7 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ), >::TooManyAuthoritiesInSet ); @@ -1350,12 +1450,13 @@ mod tests { Box::new(header), invalid_justification, TEST_GRANDPA_SET_ID, + false, ) }; initialize_substrate_bridge(); - for _ in 0..::MaxFreeMandatoryHeadersPerBlock::get() + 1 { + for _ in 0..::MaxFreeHeadersPerBlock::get() + 1 { assert_err!(submit_invalid_request(), >::InvalidJustification); } @@ -1423,6 +1524,64 @@ mod tests { }) } + #[test] + fn may_import_non_mandatory_header_for_free() { + run_test(|| { + initialize_substrate_bridge(); + + // set best finalized to `100` + const BEST: u8 = 12; + fn reset_best() { + BestFinalized::::set(Some(HeaderId( + BEST as _, + Default::default(), + ))); + } + + // non-mandatory header is imported with fee + reset_best(); + let non_free_header_number = BEST + FreeHeadersInterval::get() as u8 - 1; + let result = submit_finality_proof(non_free_header_number); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + + // non-mandatory free header is imported without fee + reset_best(); + let free_header_number = BEST + FreeHeadersInterval::get() as u8; + let result = submit_finality_proof(free_header_number); + assert_eq!(result.unwrap().pays_fee, Pays::No); + + // another non-mandatory free header is imported without fee + let free_header_number = BEST + FreeHeadersInterval::get() as u8 * 2; + let result = submit_finality_proof(free_header_number); + assert_eq!(result.unwrap().pays_fee, Pays::No); + + // now the rate limiter starts charging fees even for free headers + let free_header_number = BEST + FreeHeadersInterval::get() as u8 * 3; + let result = submit_finality_proof(free_header_number); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + + // check that we can import for free if `improved_by` is larger + // than the free interval + next_block(); + reset_best(); + let free_header_number = FreeHeadersInterval::get() as u8 + 42; + let result = submit_finality_proof(free_header_number); + assert_eq!(result.unwrap().pays_fee, Pays::No); + + // check that the rate limiter shares the counter between mandatory + // and free non-mandatory headers + next_block(); + reset_best(); + let free_header_number = BEST + FreeHeadersInterval::get() as u8 * 4; + let result = submit_finality_proof(free_header_number); + assert_eq!(result.unwrap().pays_fee, Pays::No); + let result = submit_mandatory_finality_proof(free_header_number + 1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + let result = submit_mandatory_finality_proof(free_header_number + 2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }); + } + #[test] fn should_prune_headers_over_headers_to_keep_parameter() { run_test(|| { @@ -1519,9 +1678,23 @@ mod tests { Box::new(header), justification, TEST_GRANDPA_SET_ID, + false, ), DispatchError::BadOrigin, ); }) } + + #[test] + fn on_free_header_imported_never_sets_to_none() { + run_test(|| { + FreeHeadersRemaining::::set(Some(2)); + on_free_header_imported::(); + assert_eq!(FreeHeadersRemaining::::get(), Some(1)); + on_free_header_imported::(); + assert_eq!(FreeHeadersRemaining::::get(), Some(0)); + on_free_header_imported::(); + assert_eq!(FreeHeadersRemaining::::get(), Some(0)); + }) + } } diff --git a/bridges/modules/grandpa/src/mock.rs b/bridges/modules/grandpa/src/mock.rs index e689e520c92..27df9d9c78f 100644 --- a/bridges/modules/grandpa/src/mock.rs +++ b/bridges/modules/grandpa/src/mock.rs @@ -48,14 +48,16 @@ impl frame_system::Config for TestRuntime { } parameter_types! { - pub const MaxFreeMandatoryHeadersPerBlock: u32 = 2; + pub const MaxFreeHeadersPerBlock: u32 = 2; + pub const FreeHeadersInterval: u32 = 32; pub const HeadersToKeep: u32 = 5; } impl grandpa::Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgedChain = TestBridgedChain; - type MaxFreeMandatoryHeadersPerBlock = MaxFreeMandatoryHeadersPerBlock; + type MaxFreeHeadersPerBlock = MaxFreeHeadersPerBlock; + type FreeHeadersInterval = FreeHeadersInterval; type HeadersToKeep = HeadersToKeep; type WeightInfo = (); } diff --git a/bridges/modules/grandpa/src/weights_ext.rs b/bridges/modules/grandpa/src/weights_ext.rs new file mode 100644 index 00000000000..66edea6fb6a --- /dev/null +++ b/bridges/modules/grandpa/src/weights_ext.rs @@ -0,0 +1,58 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::{BridgeWeight, WeightInfo}; + +use frame_support::weights::Weight; + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + // Our configuration assumes that the runtime has special signed extensions used to: + // + // 1) boost priority of `submit_finality_proof` transactions; + // + // 2) slash relayer if he submits an invalid transaction. + // + // We read and update storage values of other pallets (`pallet-bridge-relayers` and + // balances/assets pallet). So we need to add this weight to the weight of our call. + // Hence two following methods. + + /// Extra weight that is added to the `submit_finality_proof` call weight by signed extensions + /// that are declared at runtime level. + fn submit_finality_proof_overhead_from_runtime() -> Weight; + + // Functions that are directly mapped to extrinsics weights. + + /// Weight of message delivery extrinsic. + fn submit_finality_proof_weight(precommits_len: u32, votes_ancestries_len: u32) -> Weight { + let base_weight = Self::submit_finality_proof(precommits_len, votes_ancestries_len); + base_weight.saturating_add(Self::submit_finality_proof_overhead_from_runtime()) + } +} + +impl WeightInfoExt for BridgeWeight { + fn submit_finality_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} + +impl WeightInfoExt for () { + fn submit_finality_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} diff --git a/bridges/modules/parachains/src/call_ext.rs b/bridges/modules/parachains/src/call_ext.rs index da91a40a232..fe6b319205d 100644 --- a/bridges/modules/parachains/src/call_ext.rs +++ b/bridges/modules/parachains/src/call_ext.rs @@ -14,25 +14,45 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -use crate::{Config, Pallet, RelayBlockNumber}; +use crate::{Config, GrandpaPalletOf, Pallet, RelayBlockHash, RelayBlockNumber}; +use bp_header_chain::HeaderChain; use bp_parachains::BestParaHeadHash; use bp_polkadot_core::parachains::{ParaHash, ParaId}; -use bp_runtime::OwnedBridgeModule; -use frame_support::{dispatch::CallableCallFor, traits::IsSubType}; +use bp_runtime::{HeaderId, OwnedBridgeModule}; +use frame_support::{ + dispatch::CallableCallFor, + traits::{Get, IsSubType}, +}; +use pallet_bridge_grandpa::SubmitFinalityProofHelper; use sp_runtime::{ - transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + traits::Zero, + transaction_validity::{InvalidTransaction, TransactionValidityError}, RuntimeDebug, }; /// Info about a `SubmitParachainHeads` call which tries to update a single parachain. #[derive(PartialEq, RuntimeDebug)] pub struct SubmitParachainHeadsInfo { - /// Number of the finalized relay block that has been used to prove parachain finality. - pub at_relay_block_number: RelayBlockNumber, + /// Number and hash of the finalized relay block that has been used to prove parachain + /// finality. + pub at_relay_block: HeaderId, /// Parachain identifier. pub para_id: ParaId, /// Hash of the bundled parachain head. pub para_head_hash: ParaHash, + /// If `true`, then the call must be free (assuming that everything else is valid) to + /// be treated as valid. + pub is_free_execution_expected: bool, +} + +/// Verified `SubmitParachainHeadsInfo`. +#[derive(PartialEq, RuntimeDebug)] +pub struct VerifiedSubmitParachainHeadsInfo { + /// Base call information. + pub base: SubmitParachainHeadsInfo, + /// A difference between bundled bridged relay chain header and relay chain header number + /// used to prove best bridged parachain header, known to us before the call. + pub improved_by: RelayBlockNumber, } /// Helper struct that provides methods for working with the `SubmitParachainHeads` call. @@ -41,40 +61,117 @@ pub struct SubmitParachainHeadsHelper, I: 'static> { } impl, I: 'static> SubmitParachainHeadsHelper { - /// Check if the para head provided by the `SubmitParachainHeads` is better than the best one - /// we know. - pub fn is_obsolete(update: &SubmitParachainHeadsInfo) -> bool { - let stored_best_head = match crate::ParasInfo::::get(update.para_id) { - Some(stored_best_head) => stored_best_head, - None => return false, + /// Check that is called from signed extension and takes the `is_free_execution_expected` + /// into account. + pub fn check_obsolete_from_extension( + update: &SubmitParachainHeadsInfo, + ) -> Result { + // first do all base checks + let improved_by = Self::check_obsolete(update)?; + + // if we don't expect free execution - no more checks + if !update.is_free_execution_expected { + return Ok(improved_by); + } + + // reject if no more free slots remaining in the block + if !SubmitFinalityProofHelper::::has_free_header_slots() + { + log::trace!( + target: crate::LOG_TARGET, + "The free parachain {:?} head can't be updated: no more free slots \ + left in the block.", + update.para_id, + ); + + return Err(InvalidTransaction::Call.into()); + } + + // if free headers interval is not configured and call is expected to execute + // for free => it is a relayer error, it should've been able to detect that. + let free_headers_interval = match T::FreeHeadersInterval::get() { + Some(free_headers_interval) => free_headers_interval, + None => return Ok(improved_by), }; - if stored_best_head.best_head_hash.at_relay_block_number >= update.at_relay_block_number { + // reject if we are importing parachain headers too often + if improved_by < free_headers_interval { log::trace!( target: crate::LOG_TARGET, - "The parachain head can't be updated. The parachain head for {:?} \ - was already updated at better relay chain block {} >= {}.", + "The free parachain {:?} head can't be updated: it improves previous + best head by {} while at least {} is expected.", update.para_id, - stored_best_head.best_head_hash.at_relay_block_number, - update.at_relay_block_number + improved_by, + free_headers_interval, ); - return true + + return Err(InvalidTransaction::Stale.into()); } - if stored_best_head.best_head_hash.head_hash == update.para_head_hash { + Ok(improved_by) + } + + /// Check if the para head provided by the `SubmitParachainHeads` is better than the best one + /// we know. + pub fn check_obsolete( + update: &SubmitParachainHeadsInfo, + ) -> Result { + // check if we know better parachain head already + let improved_by = match crate::ParasInfo::::get(update.para_id) { + Some(stored_best_head) => { + let improved_by = match update + .at_relay_block + .0 + .checked_sub(stored_best_head.best_head_hash.at_relay_block_number) + { + Some(improved_by) if improved_by > Zero::zero() => improved_by, + _ => { + log::trace!( + target: crate::LOG_TARGET, + "The parachain head can't be updated. The parachain head for {:?} \ + was already updated at better relay chain block {} >= {}.", + update.para_id, + stored_best_head.best_head_hash.at_relay_block_number, + update.at_relay_block.0 + ); + return Err(InvalidTransaction::Stale.into()) + }, + }; + + if stored_best_head.best_head_hash.head_hash == update.para_head_hash { + log::trace!( + target: crate::LOG_TARGET, + "The parachain head can't be updated. The parachain head hash for {:?} \ + was already updated to {} at block {} < {}.", + update.para_id, + update.para_head_hash, + stored_best_head.best_head_hash.at_relay_block_number, + update.at_relay_block.0 + ); + return Err(InvalidTransaction::Stale.into()) + } + + improved_by + }, + None => RelayBlockNumber::MAX, + }; + + // let's check if our chain had no reorgs and we still know the relay chain header + // used to craft the proof + if GrandpaPalletOf::::finalized_header_state_root(update.at_relay_block.1).is_none() { log::trace!( target: crate::LOG_TARGET, - "The parachain head can't be updated. The parachain head hash for {:?} \ - was already updated to {} at block {} < {}.", + "The parachain {:?} head can't be updated. Relay chain header {}/{} used to create \ + parachain proof is missing from the storage.", update.para_id, - update.para_head_hash, - stored_best_head.best_head_hash.at_relay_block_number, - update.at_relay_block_number + update.at_relay_block.0, + update.at_relay_block.1, ); - return true + + return Err(InvalidTransaction::Call.into()) } - false + Ok(improved_by) } /// Check if the `SubmitParachainHeads` was successfully executed. @@ -83,7 +180,7 @@ impl, I: 'static> SubmitParachainHeadsHelper { Some(stored_best_head) => stored_best_head.best_head_hash == BestParaHeadHash { - at_relay_block_number: update.at_relay_block_number, + at_relay_block_number: update.at_relay_block.0, head_hash: update.para_head_hash, }, None => false, @@ -98,22 +195,36 @@ pub trait CallSubType, I: 'static>: /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with /// one single parachain entry. fn one_entry_submit_parachain_heads_info(&self) -> Option { - if let Some(crate::Call::::submit_parachain_heads { - ref at_relay_block, - ref parachains, - .. - }) = self.is_sub_type() - { - if let &[(para_id, para_head_hash)] = parachains.as_slice() { - return Some(SubmitParachainHeadsInfo { - at_relay_block_number: at_relay_block.0, + match self.is_sub_type() { + Some(crate::Call::::submit_parachain_heads { + ref at_relay_block, + ref parachains, + .. + }) => match ¶chains[..] { + &[(para_id, para_head_hash)] => Some(SubmitParachainHeadsInfo { + at_relay_block: HeaderId(at_relay_block.0, at_relay_block.1), para_id, para_head_hash, - }) - } + is_free_execution_expected: false, + }), + _ => None, + }, + Some(crate::Call::::submit_parachain_heads_ex { + ref at_relay_block, + ref parachains, + is_free_execution_expected, + .. + }) => match ¶chains[..] { + &[(para_id, para_head_hash)] => Some(SubmitParachainHeadsInfo { + at_relay_block: HeaderId(at_relay_block.0, at_relay_block.1), + para_id, + para_head_hash, + is_free_execution_expected: *is_free_execution_expected, + }), + _ => None, + }, + _ => None, } - - None } /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with @@ -133,24 +244,23 @@ pub trait CallSubType, I: 'static>: /// block production, or "eat" significant portion of block production time literally /// for nothing. In addition, the single-parachain-head-per-transaction is how the /// pallet will be used in our environment. - fn check_obsolete_submit_parachain_heads(&self) -> TransactionValidity + fn check_obsolete_submit_parachain_heads( + &self, + ) -> Result, TransactionValidityError> where Self: Sized, { let update = match self.one_entry_submit_parachain_heads_info() { Some(update) => update, - None => return Ok(ValidTransaction::default()), + None => return Ok(None), }; if Pallet::::ensure_not_halted().is_err() { - return InvalidTransaction::Call.into() + return Err(InvalidTransaction::Call.into()) } - if SubmitParachainHeadsHelper::::is_obsolete(&update) { - return InvalidTransaction::Stale.into() - } - - Ok(ValidTransaction::default()) + SubmitParachainHeadsHelper::::check_obsolete_from_extension(&update) + .map(|improved_by| Some(VerifiedSubmitParachainHeadsInfo { base: update, improved_by })) } } @@ -164,9 +274,10 @@ where #[cfg(test)] mod tests { use crate::{ - mock::{run_test, RuntimeCall, TestRuntime}, - CallSubType, PalletOperatingMode, ParaInfo, ParasInfo, RelayBlockNumber, + mock::{run_test, FreeHeadersInterval, RuntimeCall, TestRuntime}, + CallSubType, PalletOperatingMode, ParaInfo, ParasInfo, RelayBlockHash, RelayBlockNumber, }; + use bp_header_chain::StoredHeaderData; use bp_parachains::BestParaHeadHash; use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; use bp_runtime::BasicOperatingMode; @@ -175,15 +286,37 @@ mod tests { num: RelayBlockNumber, parachains: Vec<(ParaId, ParaHash)>, ) -> bool { - RuntimeCall::Parachains(crate::Call::::submit_parachain_heads { - at_relay_block: (num, Default::default()), + RuntimeCall::Parachains(crate::Call::::submit_parachain_heads_ex { + at_relay_block: (num, [num as u8; 32].into()), + parachains, + parachain_heads_proof: ParaHeadsProof { storage_proof: Vec::new() }, + is_free_execution_expected: false, + }) + .check_obsolete_submit_parachain_heads() + .is_ok() + } + + fn validate_free_submit_parachain_heads( + num: RelayBlockNumber, + parachains: Vec<(ParaId, ParaHash)>, + ) -> bool { + RuntimeCall::Parachains(crate::Call::::submit_parachain_heads_ex { + at_relay_block: (num, [num as u8; 32].into()), parachains, parachain_heads_proof: ParaHeadsProof { storage_proof: Vec::new() }, + is_free_execution_expected: true, }) .check_obsolete_submit_parachain_heads() .is_ok() } + fn insert_relay_block(num: RelayBlockNumber) { + pallet_bridge_grandpa::ImportedHeaders::::insert( + RelayBlockHash::from([num as u8; 32]), + StoredHeaderData { number: num, state_root: RelayBlockHash::from([10u8; 32]) }, + ); + } + fn sync_to_relay_header_10() { ParasInfo::::insert( ParaId(1), @@ -244,6 +377,7 @@ mod tests { // when current best finalized is #10 and we're trying to import header#15 => tx is // accepted sync_to_relay_header_10(); + insert_relay_block(15); assert!(validate_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); }); } @@ -260,4 +394,65 @@ mod tests { )); }); } + + #[test] + fn extension_rejects_initial_parachain_head_if_missing_relay_chain_header() { + run_test(|| { + // when relay chain header is unknown => "obsolete" + assert!(!validate_submit_parachain_heads(10, vec![(ParaId(1), [1u8; 32].into())])); + // when relay chain header is unknown => "ok" + insert_relay_block(10); + assert!(validate_submit_parachain_heads(10, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_free_parachain_head_if_missing_relay_chain_header() { + run_test(|| { + sync_to_relay_header_10(); + // when relay chain header is unknown => "obsolete" + assert!(!validate_submit_parachain_heads(15, vec![(ParaId(2), [15u8; 32].into())])); + // when relay chain header is unknown => "ok" + insert_relay_block(15); + assert!(validate_submit_parachain_heads(15, vec![(ParaId(2), [15u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_free_parachain_head_if_no_free_slots_remaining() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#15 => tx should + // be accepted + sync_to_relay_header_10(); + insert_relay_block(15); + // ... but since we have specified `is_free_execution_expected = true`, it'll be + // rejected + assert!(!validate_free_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); + // ... if we have specify `is_free_execution_expected = false`, it'll be accepted + assert!(validate_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_free_parachain_head_if_improves_by_is_below_expected() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#15 => tx should + // be accepted + sync_to_relay_header_10(); + insert_relay_block(10 + FreeHeadersInterval::get() - 1); + insert_relay_block(10 + FreeHeadersInterval::get()); + // try to submit at 10 + FreeHeadersInterval::get() - 1 => failure + let relay_header = 10 + FreeHeadersInterval::get() - 1; + assert!(!validate_free_submit_parachain_heads( + relay_header, + vec![(ParaId(1), [2u8; 32].into())] + )); + // try to submit at 10 + FreeHeadersInterval::get() => ok + let relay_header = 10 + FreeHeadersInterval::get(); + assert!(validate_free_submit_parachain_heads( + relay_header, + vec![(ParaId(1), [2u8; 32].into())] + )); + }); + } } diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index 1363a637604..61e04aed377 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -32,6 +32,7 @@ use bp_parachains::{parachain_head_storage_key_at_source, ParaInfo, ParaStoredHe use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofError}; use frame_support::{dispatch::PostDispatchInfo, DefaultNoBound}; +use pallet_bridge_grandpa::SubmitFinalityProofHelper; use sp_std::{marker::PhantomData, vec::Vec}; #[cfg(feature = "runtime-benchmarks")] @@ -92,7 +93,8 @@ pub mod pallet { BoundedStorageValue<>::MaxParaHeadDataSize, ParaStoredHeaderData>; /// Weight info of the given parachains pallet. pub type WeightInfoOf = >::WeightInfo; - type GrandpaPalletOf = + /// Bridge GRANDPA pallet that is used to verify parachain proofs. + pub type GrandpaPalletOf = pallet_bridge_grandpa::Pallet>::BridgesGrandpaPalletInstance>; #[pallet::event] @@ -192,6 +194,21 @@ pub mod pallet { /// /// The GRANDPA pallet instance must be configured to import headers of relay chain that /// we're interested in. + /// + /// The associated GRANDPA pallet is also used to configure free parachain heads + /// submissions. The parachain head submission will be free if: + /// + /// 1) the submission contains exactly one parachain head update that succeeds; + /// + /// 2) the difference between relay chain block numbers, used to prove new parachain head + /// and previous best parachain head is larger than the `FreeHeadersInterval`, configured + /// at the associated GRANDPA pallet; + /// + /// 3) there are slots for free submissions, remaining at the block. This is also configured + /// at the associated GRANDPA pallet using `MaxFreeHeadersPerBlock` parameter. + /// + /// First parachain head submission is also free for the submitted, if free submissions + /// are yet accepted to this block. type BridgesGrandpaPalletInstance: 'static; /// Name of the original `paras` pallet in the `construct_runtime!()` call at the bridged @@ -335,10 +352,83 @@ pub mod pallet { at_relay_block: (RelayBlockNumber, RelayBlockHash), parachains: Vec<(ParaId, ParaHash)>, parachain_heads_proof: ParaHeadsProof, + ) -> DispatchResultWithPostInfo { + Self::submit_parachain_heads_ex( + origin, + at_relay_block, + parachains, + parachain_heads_proof, + false, + ) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + + /// Submit proof of one or several parachain heads. + /// + /// The proof is supposed to be proof of some `Heads` entries from the + /// `polkadot-runtime-parachains::paras` pallet instance, deployed at the bridged chain. + /// The proof is supposed to be crafted at the `relay_header_hash` that must already be + /// imported by corresponding GRANDPA pallet at this chain. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the relay chain block `at_relay_block` is not imported by the associated bridge + /// GRANDPA pallet. + /// + /// The call may succeed, but some heads may not be updated e.g. because pallet knows + /// better head or it isn't tracked by the pallet. + /// + /// The `is_free_execution_expected` parameter is not really used inside the call. It is + /// used by the transaction extension, which should be registered at the runtime level. If + /// this parameter is `true`, the transaction will be treated as invalid, if the call won't + /// be executed for free. If transaction extension is not used by the runtime, this + /// parameter is not used at all. + #[pallet::call_index(3)] + #[pallet::weight(WeightInfoOf::::submit_parachain_heads_weight( + T::DbWeight::get(), + parachain_heads_proof, + parachains.len() as _, + ))] + pub fn submit_parachain_heads_ex( + origin: OriginFor, + at_relay_block: (RelayBlockNumber, RelayBlockHash), + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + _is_free_execution_expected: bool, ) -> DispatchResultWithPostInfo { Self::ensure_not_halted().map_err(Error::::BridgeModule)?; ensure_signed(origin)?; + let total_parachains = parachains.len(); + let free_headers_interval = + T::FreeHeadersInterval::get().unwrap_or(RelayBlockNumber::MAX); + // the pallet allows two kind of free submissions + // 1) if distance between all parachain heads is gte than the [`T::FreeHeadersInterval`] + // 2) if all heads are the first heads of their parachains + let mut free_parachain_heads = 0; + // we'll need relay chain header to verify that parachains heads are always increasing. let (relay_block_number, relay_block_hash) = at_relay_block; let relay_block = pallet_bridge_grandpa::ImportedHeaders::< @@ -358,6 +448,7 @@ pub mod pallet { parachains.len() as _, ); + let mut is_updated_something = false; let mut storage = GrandpaPalletOf::::storage_proof_checker( relay_block_hash, parachain_heads_proof.storage_proof, @@ -414,6 +505,7 @@ pub mod pallet { } // convert from parachain head into stored parachain head data + let parachain_head_size = parachain_head.0.len(); let parachain_head_data = match T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) { Some(parachain_head_data) => parachain_head_data, @@ -430,13 +522,30 @@ pub mod pallet { let update_result: Result<_, ()> = ParasInfo::::try_mutate(parachain, |stored_best_head| { + let is_free = parachain_head_size < + T::ParaStoredHeaderDataBuilder::max_free_head_size() as usize && + match stored_best_head { + Some(ref best_head) + if at_relay_block.0.saturating_sub( + best_head.best_head_hash.at_relay_block_number, + ) >= free_headers_interval => + true, + Some(_) => false, + None => true, + }; let artifacts = Pallet::::update_parachain_head( parachain, stored_best_head.take(), - relay_block_number, + HeaderId(relay_block_number, relay_block_hash), parachain_head_data, parachain_head_hash, )?; + + is_updated_something = true; + if is_free { + free_parachain_heads = free_parachain_heads + 1; + } + *stored_best_head = Some(artifacts.best_head); Ok(artifacts.prune_happened) }); @@ -467,28 +576,21 @@ pub mod pallet { Error::::HeaderChainStorageProof(HeaderChainError::StorageProof(e)) })?; - Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) - } - - /// Change `PalletOwner`. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(1)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { - >::set_owner(origin, new_owner) - } + // check if we allow this submission for free + let is_free = total_parachains == 1 + && free_parachain_heads == total_parachains + && SubmitFinalityProofHelper::::has_free_header_slots(); + let pays_fee = if is_free { + log::trace!(target: LOG_TARGET, "Parachain heads update transaction is free"); + pallet_bridge_grandpa::on_free_header_imported::( + ); + Pays::No + } else { + log::trace!(target: LOG_TARGET, "Parachain heads update transaction is paid"); + Pays::Yes + }; - /// Halt or resume all pallet operations. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(2)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_operating_mode( - origin: OriginFor, - operating_mode: BasicOperatingMode, - ) -> DispatchResult { - >::set_operating_mode(origin, operating_mode) + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee }) } } @@ -545,18 +647,20 @@ pub mod pallet { pub(super) fn update_parachain_head( parachain: ParaId, stored_best_head: Option, - new_at_relay_block_number: RelayBlockNumber, + new_at_relay_block: HeaderId, new_head_data: ParaStoredHeaderData, new_head_hash: ParaHash, ) -> Result { // check if head has been already updated at better relay chain block. Without this // check, we may import heads in random order let update = SubmitParachainHeadsInfo { - at_relay_block_number: new_at_relay_block_number, + at_relay_block: new_at_relay_block, para_id: parachain, para_head_hash: new_head_hash, + // doesn't actually matter here + is_free_execution_expected: false, }; - if SubmitParachainHeadsHelper::::is_obsolete(&update) { + if SubmitParachainHeadsHelper::::check_obsolete(&update).is_err() { Self::deposit_event(Event::RejectedObsoleteParachainHead { parachain, parachain_head_hash: new_head_hash, @@ -596,7 +700,7 @@ pub mod pallet { ImportedParaHashes::::try_get(parachain, next_imported_hash_position); let updated_best_para_head = ParaInfo { best_head_hash: BestParaHeadHash { - at_relay_block_number: new_at_relay_block_number, + at_relay_block_number: new_at_relay_block.0, head_hash: new_head_hash, }, next_imported_hash_position: (next_imported_hash_position + 1) % @@ -610,9 +714,10 @@ pub mod pallet { ImportedParaHeads::::insert(parachain, new_head_hash, updated_head_data); log::trace!( target: LOG_TARGET, - "Updated head of parachain {:?} to {}", + "Updated head of parachain {:?} to {} at relay block {}", parachain, new_head_hash, + new_at_relay_block.0, ); // remove old head @@ -696,14 +801,28 @@ impl, I: 'static, C: Parachain> HeaderChain pub fn initialize_for_benchmarks, I: 'static, PC: Parachain>( header: HeaderOf, ) { + use bp_runtime::HeaderIdProvider; + use sp_runtime::traits::Header; + + let relay_head = + pallet_bridge_grandpa::BridgedHeader::::new( + 0, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); let parachain = ParaId(PC::PARACHAIN_ID); let parachain_head = ParaHead(header.encode()); let updated_head_data = T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) .expect("failed to build stored parachain head in benchmarks"); + pallet_bridge_grandpa::initialize_for_benchmarks::( + relay_head.clone(), + ); Pallet::::update_parachain_head( parachain, None, - 0, + relay_head.id(), updated_head_data, parachain_head.hash(), ) @@ -714,9 +833,9 @@ pub fn initialize_for_benchmarks, I: 'static, PC: Parachain::DbWeight; pub(crate) fn initialize(state_root: RelayBlockHash) -> RelayBlockHash { + pallet_bridge_grandpa::FreeHeadersRemaining::::set(Some(100)); pallet_bridge_grandpa::Pallet::::initialize( RuntimeOrigin::root(), bp_header_chain::InitializationData { @@ -770,10 +891,6 @@ pub(crate) mod tests { num: RelayBlockNumber, state_root: RelayBlockHash, ) -> (ParaHash, GrandpaJustification) { - pallet_bridge_grandpa::Pallet::::on_initialize( - 0, - ); - let header = test_relay_header(num, state_root); let hash = header.hash(); let justification = make_default_justification(&header); @@ -783,6 +900,7 @@ pub(crate) mod tests { Box::new(header), justification.clone(), TEST_GRANDPA_SET_ID, + false, ) ); @@ -908,7 +1026,7 @@ pub(crate) mod tests { run_test(|| { initialize(state_root); - // we're trying to update heads of parachains 1, 2 and 3 + // we're trying to update heads of parachains 1 and 3 let expected_weight = WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 2); let result = Pallet::::submit_parachain_heads( @@ -918,9 +1036,10 @@ pub(crate) mod tests { proof, ); assert_ok!(result); + assert_eq!(result.expect("checked above").pays_fee, Pays::Yes); assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); - // but only 1 and 2 are updated, because proof is missing head of parachain#2 + // 1 and 3 are updated, because proof is missing head of parachain#2 assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); assert_eq!(ParasInfo::::get(ParaId(2)), None); assert_eq!( @@ -989,7 +1108,9 @@ pub(crate) mod tests { run_test(|| { // start with relay block #0 and import head#5 of parachain#1 initialize(state_root_5); - assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); + let result = import_parachain_1_head(0, state_root_5, parachains_5, proof_5); + // first parachain head is imported for free + assert_eq!(result.unwrap().pays_fee, Pays::No); assert_eq!( ParasInfo::::get(ParaId(1)), Some(ParaInfo { @@ -1024,7 +1145,9 @@ pub(crate) mod tests { // import head#10 of parachain#1 at relay block #1 let (relay_1_hash, justification) = proceed(1, state_root_10); - assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); + let result = import_parachain_1_head(1, state_root_10, parachains_10, proof_10); + // second parachain head is imported for fee + assert_eq!(result.unwrap().pays_fee, Pays::Yes); assert_eq!( ParasInfo::::get(ParaId(1)), Some(ParaInfo { @@ -1647,4 +1770,143 @@ pub(crate) mod tests { ); }) } + + #[test] + fn may_be_free_for_submitting_filtered_heads() { + run_test(|| { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(2, head_data(2, 5))]); + // start with relay block #0 and import head#5 of parachain#2 + initialize(state_root); + // first submission is free + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains.clone(), + proof.clone(), + ); + assert_eq!(result.unwrap().pays_fee, Pays::No); + // next submission is NOT free, because we haven't updated anything + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + // then we submit new head, proved at relay block `FreeHeadersInterval - 1` => Pays::Yes + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(2, head_data(2, 50))]); + let relay_block_number = FreeHeadersInterval::get() - 1; + proceed(relay_block_number, state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_block_number, test_relay_header(relay_block_number, state_root).hash()), + parachains, + proof, + ); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + // then we submit new head, proved after `FreeHeadersInterval` => Pays::No + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(2, head_data(2, 100))]); + let relay_block_number = relay_block_number + FreeHeadersInterval::get(); + proceed(relay_block_number, state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_block_number, test_relay_header(relay_block_number, state_root).hash()), + parachains, + proof, + ); + assert_eq!(result.unwrap().pays_fee, Pays::No); + // then we submit new BIG head, proved after `FreeHeadersInterval` => Pays::Yes + // then we submit new head, proved after `FreeHeadersInterval` => Pays::No + let mut large_head = head_data(2, 100); + large_head.0.extend(&[42u8; BigParachain::MAX_HEADER_SIZE as _]); + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(2, large_head)]); + let relay_block_number = relay_block_number + FreeHeadersInterval::get(); + proceed(relay_block_number, state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_block_number, test_relay_header(relay_block_number, state_root).hash()), + parachains, + proof, + ); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + }) + } + + #[test] + fn grandpa_and_parachain_pallets_share_free_headers_counter() { + run_test(|| { + initialize(Default::default()); + // set free headers limit to `4` + let mut free_headers_remaining = 4; + pallet_bridge_grandpa::FreeHeadersRemaining::::set( + Some(free_headers_remaining), + ); + // import free GRANDPA and parachain headers + let mut relay_block_number = 0; + for i in 0..2 { + // import free GRANDPA header + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(2, head_data(2, 5 + i))]); + relay_block_number = relay_block_number + FreeHeadersInterval::get(); + proceed(relay_block_number, state_root); + assert_eq!( + pallet_bridge_grandpa::FreeHeadersRemaining::< + TestRuntime, + BridgesGrandpaPalletInstance, + >::get(), + Some(free_headers_remaining - 1), + ); + free_headers_remaining = free_headers_remaining - 1; + // import free parachain header + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_block_number, test_relay_header(relay_block_number, state_root).hash()), + parachains, + proof, + ),); + assert_eq!( + pallet_bridge_grandpa::FreeHeadersRemaining::< + TestRuntime, + BridgesGrandpaPalletInstance, + >::get(), + Some(free_headers_remaining - 1), + ); + free_headers_remaining = free_headers_remaining - 1; + } + // try to import free GRANDPA header => non-free execution + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(2, head_data(2, 7))]); + relay_block_number = relay_block_number + FreeHeadersInterval::get(); + let result = pallet_bridge_grandpa::Pallet::::submit_finality_proof_ex( + RuntimeOrigin::signed(1), + Box::new(test_relay_header(relay_block_number, state_root)), + make_default_justification(&test_relay_header(relay_block_number, state_root)), + TEST_GRANDPA_SET_ID, + false, + ); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + // try to import free parachain header => non-free execution + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_block_number, test_relay_header(relay_block_number, state_root).hash()), + parachains, + proof, + ); + assert_eq!(result.unwrap().pays_fee, Pays::Yes); + assert_eq!( + pallet_bridge_grandpa::FreeHeadersRemaining::< + TestRuntime, + BridgesGrandpaPalletInstance, + >::get(), + Some(0), + ); + }); + } } diff --git a/bridges/modules/parachains/src/mock.rs b/bridges/modules/parachains/src/mock.rs index d9cbabf850e..dbb62845392 100644 --- a/bridges/modules/parachains/src/mock.rs +++ b/bridges/modules/parachains/src/mock.rs @@ -70,6 +70,7 @@ impl Chain for Parachain1 { impl Parachain for Parachain1 { const PARACHAIN_ID: u32 = 1; + const MAX_HEADER_SIZE: u32 = 1_024; } pub struct Parachain2; @@ -96,6 +97,7 @@ impl Chain for Parachain2 { impl Parachain for Parachain2 { const PARACHAIN_ID: u32 = 2; + const MAX_HEADER_SIZE: u32 = 1_024; } pub struct Parachain3; @@ -122,6 +124,7 @@ impl Chain for Parachain3 { impl Parachain for Parachain3 { const PARACHAIN_ID: u32 = 3; + const MAX_HEADER_SIZE: u32 = 1_024; } // this parachain is using u128 as block number and stored head data size exceeds limit @@ -149,6 +152,7 @@ impl Chain for BigParachain { impl Parachain for BigParachain { const PARACHAIN_ID: u32 = 4; + const MAX_HEADER_SIZE: u32 = 2_048; } construct_runtime! { @@ -168,12 +172,14 @@ impl frame_system::Config for TestRuntime { parameter_types! { pub const HeadersToKeep: u32 = 5; + pub const FreeHeadersInterval: u32 = 15; } impl pallet_bridge_grandpa::Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgedChain = TestBridgedChain; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; + type MaxFreeHeadersPerBlock = ConstU32<2>; + type FreeHeadersInterval = FreeHeadersInterval; type HeadersToKeep = HeadersToKeep; type WeightInfo = (); } @@ -181,7 +187,8 @@ impl pallet_bridge_grandpa::Config for TestRun impl pallet_bridge_grandpa::Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type BridgedChain = TestBridgedChain; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; + type MaxFreeHeadersPerBlock = ConstU32<2>; + type FreeHeadersInterval = FreeHeadersInterval; type HeadersToKeep = HeadersToKeep; type WeightInfo = (); } diff --git a/bridges/modules/parachains/src/weights_ext.rs b/bridges/modules/parachains/src/weights_ext.rs index 393086a8569..64dad625de0 100644 --- a/bridges/modules/parachains/src/weights_ext.rs +++ b/bridges/modules/parachains/src/weights_ext.rs @@ -36,6 +36,20 @@ pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; /// Extended weight info. pub trait WeightInfoExt: WeightInfo { + // Our configuration assumes that the runtime has special signed extensions used to: + // + // 1) boost priority of `submit_parachain_heads` transactions; + // + // 2) slash relayer if he submits an invalid transaction. + // + // We read and update storage values of other pallets (`pallet-bridge-relayers` and + // balances/assets pallet). So we need to add this weight to the weight of our call. + // Hence two following methods. + + /// Extra weight that is added to the `submit_finality_proof` call weight by signed extensions + /// that are declared at runtime level. + fn submit_parachain_heads_overhead_from_runtime() -> Weight; + /// Storage proof overhead, that is included in every storage proof. /// /// The relayer would pay some extra fee for additional proof bytes, since they mean @@ -65,7 +79,10 @@ pub trait WeightInfoExt: WeightInfo { let pruning_weight = Self::parachain_head_pruning_weight(db_weight).saturating_mul(parachains_count as u64); - base_weight.saturating_add(proof_size_overhead).saturating_add(pruning_weight) + base_weight + .saturating_add(proof_size_overhead) + .saturating_add(pruning_weight) + .saturating_add(Self::submit_parachain_heads_overhead_from_runtime()) } /// Returns weight of single parachain head storage update. @@ -95,12 +112,20 @@ pub trait WeightInfoExt: WeightInfo { } impl WeightInfoExt for () { + fn submit_parachain_heads_overhead_from_runtime() -> Weight { + Weight::zero() + } + fn expected_extra_storage_proof_size() -> u32 { EXTRA_STORAGE_PROOF_SIZE } } impl WeightInfoExt for BridgeWeight { + fn submit_parachain_heads_overhead_from_runtime() -> Weight { + Weight::zero() + } + fn expected_extra_storage_proof_size() -> u32 { EXTRA_STORAGE_PROOF_SIZE } diff --git a/bridges/primitives/parachains/src/lib.rs b/bridges/primitives/parachains/src/lib.rs index 692bbd99ece..142c6e9b089 100644 --- a/bridges/primitives/parachains/src/lib.rs +++ b/bridges/primitives/parachains/src/lib.rs @@ -116,6 +116,10 @@ impl ParaStoredHeaderData { /// Stored parachain head data builder. pub trait ParaStoredHeaderDataBuilder { + /// Maximal parachain head size that we may accept for free. All heads above + /// this limit are submitted for a regular fee. + fn max_free_head_size() -> u32; + /// Return number of parachains that are supported by this builder. fn supported_parachains() -> u32; @@ -127,6 +131,10 @@ pub trait ParaStoredHeaderDataBuilder { pub struct SingleParaStoredHeaderDataBuilder(PhantomData); impl ParaStoredHeaderDataBuilder for SingleParaStoredHeaderDataBuilder { + fn max_free_head_size() -> u32 { + C::MAX_HEADER_SIZE + } + fn supported_parachains() -> u32 { 1 } @@ -147,6 +155,17 @@ impl ParaStoredHeaderDataBuilder for SingleParaStoredHeaderDataBui #[impl_trait_for_tuples::impl_for_tuples(1, 30)] #[tuple_types_custom_trait_bound(Parachain)] impl ParaStoredHeaderDataBuilder for C { + fn max_free_head_size() -> u32 { + let mut result = 0_u32; + for_tuples!( #( + result = sp_std::cmp::max( + result, + SingleParaStoredHeaderDataBuilder::::max_free_head_size(), + ); + )* ); + result + } + fn supported_parachains() -> u32 { let mut result = 0; for_tuples!( #( diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index 4ec5a001a99..1b1c623104f 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -236,6 +236,12 @@ where pub trait Parachain: Chain { /// Parachain identifier. const PARACHAIN_ID: u32; + /// Maximal size of the parachain header. + /// + /// This isn't a strict limit. The relayer may submit larger headers and the + /// pallet will accept the call. The limit is only used to compute whether + /// the refund can be made. + const MAX_HEADER_SIZE: u32; } impl Parachain for T @@ -244,6 +250,8 @@ where ::Chain: Parachain, { const PARACHAIN_ID: u32 = <::Chain as Parachain>::PARACHAIN_ID; + const MAX_HEADER_SIZE: u32 = + <::Chain as Parachain>::MAX_HEADER_SIZE; } /// Adapter for `Get` to access `PARACHAIN_ID` from `trait Parachain` @@ -306,6 +314,11 @@ macro_rules! decl_bridge_finality_runtime_apis { pub const []: &str = stringify!([<$chain:camel FinalityApi_best_finalized>]); + /// Name of the `FinalityApi::free_headers_interval` runtime method. + pub const []: &str = + stringify!([<$chain:camel FinalityApi_free_headers_interval>]); + + $( /// Name of the `FinalityApi::accepted__finality_proofs` /// runtime method. @@ -322,6 +335,13 @@ macro_rules! decl_bridge_finality_runtime_apis { /// Returns number and hash of the best finalized header known to the bridge module. fn best_finalized() -> Option>; + /// Returns free headers interval, if it is configured in the runtime. + /// The caller expects that if his transaction improves best known header + /// at least by the free_headers_interval`, it will be fee-free. + /// + /// See [`pallet_bridge_grandpa::Config::FreeHeadersInterval`] for details. + fn free_headers_interval() -> Option; + $( /// Returns the justifications accepted in the current block. fn []( diff --git a/bridges/relays/client-substrate/src/test_chain.rs b/bridges/relays/client-substrate/src/test_chain.rs index 77240d15884..d1203a2c58e 100644 --- a/bridges/relays/client-substrate/src/test_chain.rs +++ b/bridges/relays/client-substrate/src/test_chain.rs @@ -110,6 +110,7 @@ impl bp_runtime::Chain for TestParachainBase { impl bp_runtime::Parachain for TestParachainBase { const PARACHAIN_ID: u32 = 1000; + const MAX_HEADER_SIZE: u32 = 1_024; } /// Parachain that may be used in tests. diff --git a/bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml b/bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml index 52271f94421..f59f689bf6b 100644 --- a/bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml +++ b/bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml @@ -40,7 +40,7 @@ cumulus_based = true rpc_port = 8933 ws_port = 8943 args = [ - "-lparachain=debug,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" + "-lparachain=debug,runtime::bridge=trace,xcm=trace,txpool=trace" ] # run bob as parachain collator @@ -51,7 +51,7 @@ cumulus_based = true rpc_port = 8934 ws_port = 8944 args = [ - "-lparachain=trace,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" + "-lparachain=debug,runtime::bridge=trace,xcm=trace,txpool=trace" ] [[parachains]] @@ -65,14 +65,14 @@ cumulus_based = true ws_port = 9910 command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" + "-lparachain=debug,xcm=trace,runtime::bridge=trace,txpool=trace" ] [[parachains.collators]] name = "asset-hub-rococo-collator2" command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" + "-lparachain=debug,xcm=trace,runtime::bridge=trace,txpool=trace" ] #[[hrmp_channels]] diff --git a/bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml b/bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml index f2550bcc995..6ab03ad5fe2 100644 --- a/bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml +++ b/bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml @@ -40,7 +40,7 @@ cumulus_based = true rpc_port = 8935 ws_port = 8945 args = [ - "-lparachain=debug,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" + "-lparachain=debug,runtime::bridge=trace,xcm=trace,txpool=trace" ] # run bob as parachain collator @@ -51,7 +51,7 @@ cumulus_based = true rpc_port = 8936 ws_port = 8946 args = [ - "-lparachain=trace,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" + "-lparachain=debug,runtime::bridge=trace,xcm=trace,txpool=trace" ] [[parachains]] @@ -65,14 +65,14 @@ cumulus_based = true ws_port = 9010 command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" + "-lparachain=debug,xcm=trace,runtime::bridge=trace,txpool=trace" ] [[parachains.collators]] name = "asset-hub-westend-collator2" command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" + "-lparachain=debug,xcm=trace,runtime::bridge=trace,txpool=trace" ] #[[hrmp_channels]] diff --git a/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh b/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh index 41aa862be57..2f11692d97b 100755 --- a/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh +++ b/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh @@ -169,12 +169,107 @@ function run_relay() { --lane "${LANE_ID}" } +function run_finality_relay() { + local relayer_path=$(ensure_relayer) + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + $relayer_path relay-headers rococo-to-bridge-hub-westend \ + --only-free-headers \ + --source-host localhost \ + --source-port 9942 \ + --target-host localhost \ + --target-port 8945 \ + --target-version-mode Auto \ + --target-signer //Charlie \ + --target-transactions-mortality 4& + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + $relayer_path relay-headers westend-to-bridge-hub-rococo \ + --only-free-headers \ + --source-host localhost \ + --source-port 9945 \ + --target-host localhost \ + --target-port 8943 \ + --target-version-mode Auto \ + --target-signer //Charlie \ + --target-transactions-mortality 4 +} + +function run_parachains_relay() { + local relayer_path=$(ensure_relayer) + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + $relayer_path relay-parachains rococo-to-bridge-hub-westend \ + --only-free-headers \ + --source-host localhost \ + --source-port 9942 \ + --target-host localhost \ + --target-port 8945 \ + --target-version-mode Auto \ + --target-signer //Dave \ + --target-transactions-mortality 4& + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + $relayer_path relay-parachains westend-to-bridge-hub-rococo \ + --only-free-headers \ + --source-host localhost \ + --source-port 9945 \ + --target-host localhost \ + --target-port 8943 \ + --target-version-mode Auto \ + --target-signer //Dave \ + --target-transactions-mortality 4 +} + +function run_messages_relay() { + local relayer_path=$(ensure_relayer) + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + $relayer_path relay-messages bridge-hub-rococo-to-bridge-hub-westend \ + --source-host localhost \ + --source-port 8943 \ + --source-version-mode Auto \ + --source-signer //Eve \ + --source-transactions-mortality 4 \ + --target-host localhost \ + --target-port 8945 \ + --target-version-mode Auto \ + --target-signer //Eve \ + --target-transactions-mortality 4 \ + --lane $LANE_ID& + + RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ + $relayer_path relay-messages bridge-hub-westend-to-bridge-hub-rococo \ + --source-host localhost \ + --source-port 8945 \ + --source-version-mode Auto \ + --source-signer //Ferdie \ + --source-transactions-mortality 4 \ + --target-host localhost \ + --target-port 8943 \ + --target-version-mode Auto \ + --target-signer //Ferdie \ + --target-transactions-mortality 4 \ + --lane $LANE_ID +} + case "$1" in run-relay) init_wnd_ro init_ro_wnd run_relay ;; + run-finality-relay) + init_wnd_ro + init_ro_wnd + run_finality_relay + ;; + run-parachains-relay) + run_parachains_relay + ;; + run-messages-relay) + run_messages_relay + ;; init-asset-hub-rococo-local) ensure_polkadot_js_api # create foreign assets for native Westend token (governance call on Rococo) @@ -386,6 +481,9 @@ case "$1" in echo "A command is require. Supported commands for: Local (zombienet) run: - run-relay + - run-finality-relay + - run-parachains-relay + - run-messages-relay - init-asset-hub-rococo-local - init-bridge-hub-rococo-local - init-asset-hub-westend-local diff --git a/bridges/testing/environments/rococo-westend/explorers.sh b/bridges/testing/environments/rococo-westend/explorers.sh new file mode 100755 index 00000000000..fb137726c93 --- /dev/null +++ b/bridges/testing/environments/rococo-westend/explorers.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Rococo AH +xdg-open https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9910#/explorer& +# Rococo BH +xdg-open https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8943#/explorer& + +# Westend BH +xdg-open https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:8945#/explorer& +# Westend AH +xdg-open https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:9010#/explorer& diff --git a/bridges/testing/environments/rococo-westend/helper.sh b/bridges/testing/environments/rococo-westend/helper.sh index 0a13ded213f..571c78fea58 100755 --- a/bridges/testing/environments/rococo-westend/helper.sh +++ b/bridges/testing/environments/rococo-westend/helper.sh @@ -1,3 +1,9 @@ #!/bin/bash -$ENV_PATH/bridges_rococo_westend.sh "$@" +if [ $1 == "auto-log" ]; then + shift # ignore "auto-log" + log_name=$1 + $ENV_PATH/bridges_rococo_westend.sh "$@" >$TEST_DIR/logs/$log_name.log +else + $ENV_PATH/bridges_rococo_westend.sh "$@" +fi diff --git a/bridges/testing/environments/rococo-westend/spawn.sh b/bridges/testing/environments/rococo-westend/spawn.sh index cbd0b1bc623..a0ab00be144 100755 --- a/bridges/testing/environments/rococo-westend/spawn.sh +++ b/bridges/testing/environments/rococo-westend/spawn.sh @@ -59,12 +59,12 @@ if [[ $init -eq 1 ]]; then fi if [[ $start_relayer -eq 1 ]]; then - ${BASH_SOURCE%/*}/start_relayer.sh $rococo_dir $westend_dir relayer_pid + ${BASH_SOURCE%/*}/start_relayer.sh $rococo_dir $westend_dir finality_relayer_pid parachains_relayer_pid messages_relayer_pid fi echo $rococo_dir > $TEST_DIR/rococo.env echo $westend_dir > $TEST_DIR/westend.env echo -wait -n $rococo_pid $westend_pid $relayer_pid +wait -n $rococo_pid $westend_pid $finality_relayer_pid $parachains_relayer_pid $messages_relayer_pid kill -9 -$$ diff --git a/bridges/testing/environments/rococo-westend/start_relayer.sh b/bridges/testing/environments/rococo-westend/start_relayer.sh index 7ddd312d395..9c57e4a6ab6 100755 --- a/bridges/testing/environments/rococo-westend/start_relayer.sh +++ b/bridges/testing/environments/rococo-westend/start_relayer.sh @@ -7,17 +7,31 @@ source "$FRAMEWORK_PATH/utils/zombienet.sh" rococo_dir=$1 westend_dir=$2 -__relayer_pid=$3 +__finality_relayer_pid=$3 +__parachains_relayer_pid=$4 +__messages_relayer_pid=$5 logs_dir=$TEST_DIR/logs helper_script="${BASH_SOURCE%/*}/helper.sh" -relayer_log=$logs_dir/relayer.log -echo -e "Starting rococo-westend relayer. Logs available at: $relayer_log\n" -start_background_process "$helper_script run-relay" $relayer_log relayer_pid +# start finality relayer +finality_relayer_log=$logs_dir/relayer_finality.log +echo -e "Starting rococo-westend finality relayer. Logs available at: $finality_relayer_log\n" +start_background_process "$helper_script run-finality-relay" $finality_relayer_log finality_relayer_pid + +# start parachains relayer +parachains_relayer_log=$logs_dir/relayer_parachains.log +echo -e "Starting rococo-westend parachains relayer. Logs available at: $parachains_relayer_log\n" +start_background_process "$helper_script run-parachains-relay" $parachains_relayer_log parachains_relayer_pid + +# start messages relayer +messages_relayer_log=$logs_dir/relayer_messages.log +echo -e "Starting rococo-westend messages relayer. Logs available at: $messages_relayer_log\n" +start_background_process "$helper_script run-messages-relay" $messages_relayer_log messages_relayer_pid run_zndsl ${BASH_SOURCE%/*}/rococo.zndsl $rococo_dir run_zndsl ${BASH_SOURCE%/*}/westend.zndsl $westend_dir -eval $__relayer_pid="'$relayer_pid'" - +eval $__finality_relayer_pid="'$finality_relayer_pid'" +eval $__parachains_relayer_pid="'$parachains_relayer_pid'" +eval $__messages_relayer_pid="'$messages_relayer_pid'" diff --git a/bridges/testing/framework/js-helpers/native-asset-balance.js b/bridges/testing/framework/js-helpers/native-asset-balance.js new file mode 100644 index 00000000000..4869eba35d8 --- /dev/null +++ b/bridges/testing/framework/js-helpers/native-asset-balance.js @@ -0,0 +1,12 @@ +async function run(nodeName, networkInfo, args) { + const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + const accountAddress = args[0]; + const accountData = await api.query.system.account(accountAddress); + const accountBalance = accountData.data['free']; + console.log("Balance of " + accountAddress + ": " + accountBalance); + return accountBalance; +} + +module.exports = {run} diff --git a/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl b/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl index cdb7d28e940..6e26632fd9f 100644 --- a/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl +++ b/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl @@ -3,10 +3,10 @@ Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml Creds: config # send 5 ROC to //Alice from Rococo AH to Westend AH -asset-hub-westend-collator1: run {{ENV_PATH}}/helper.sh with "reserve-transfer-assets-from-asset-hub-rococo-local 5000000000000" within 120 seconds +asset-hub-westend-collator1: run {{ENV_PATH}}/helper.sh with "auto-log reserve-transfer-assets-from-asset-hub-rococo-local 5000000000000" within 120 seconds # check that //Alice received at least 4.8 ROC on Westend AH asset-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,4800000000000,Rococo" within 600 seconds -# check that the relayer //Charlie is rewarded by Westend AH -bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726F,ThisChain,0" within 30 seconds +# relayer //Ferdie is rewarded for delivering messages from Rococo BH +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/relayer-rewards.js with "5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw,0x00000002,0x6268726F,ThisChain,0" within 300 seconds diff --git a/bridges/testing/tests/0001-asset-transfer/roc-relayer-balance-does-not-change.zndsl b/bridges/testing/tests/0001-asset-transfer/roc-relayer-balance-does-not-change.zndsl new file mode 100644 index 00000000000..4839c19c0ff --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/roc-relayer-balance-does-not-change.zndsl @@ -0,0 +1,11 @@ +Description: Finality and parachain relays should have the constant balance, because their transactions are free +Network: {{ENV_PATH}}/bridge_hub_rococo_local_network.toml +Creds: config + +# local chain spec gives `1u64 << 60` tokens to every endowed account: if it'll ever +# change, it'd need to be fixed here as well + +# //Charlie only submits free and mandatory relay chain headers, so the balance should stay the same +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" return is 1152921504606846976 within 30 seconds +# //Dave only submits free parachain headers, so the balance should stay the same +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" return is 1152921504606846976 within 30 seconds diff --git a/bridges/testing/tests/0001-asset-transfer/run.sh b/bridges/testing/tests/0001-asset-transfer/run.sh index a7bb122919b..227069932f2 100755 --- a/bridges/testing/tests/0001-asset-transfer/run.sh +++ b/bridges/testing/tests/0001-asset-transfer/run.sh @@ -18,8 +18,14 @@ ensure_process_file $env_pid $TEST_DIR/westend.env 300 westend_dir=`cat $TEST_DIR/westend.env` echo +run_zndsl ${BASH_SOURCE%/*}/roc-relayer-balance-does-not-change.zndsl $rococo_dir +run_zndsl ${BASH_SOURCE%/*}/wnd-relayer-balance-does-not-change.zndsl $westend_dir + run_zndsl ${BASH_SOURCE%/*}/roc-reaches-westend.zndsl $westend_dir run_zndsl ${BASH_SOURCE%/*}/wnd-reaches-rococo.zndsl $rococo_dir run_zndsl ${BASH_SOURCE%/*}/wroc-reaches-rococo.zndsl $rococo_dir run_zndsl ${BASH_SOURCE%/*}/wwnd-reaches-westend.zndsl $westend_dir + +run_zndsl ${BASH_SOURCE%/*}/roc-relayer-balance-does-not-change.zndsl $rococo_dir +run_zndsl ${BASH_SOURCE%/*}/wnd-relayer-balance-does-not-change.zndsl $westend_dir diff --git a/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl b/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl index dbc03864e2b..5a8d6dabc20 100644 --- a/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl +++ b/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl @@ -3,10 +3,10 @@ Network: {{ENV_PATH}}/bridge_hub_rococo_local_network.toml Creds: config # send 5 WND to //Alice from Westend AH to Rococo AH -asset-hub-rococo-collator1: run {{ENV_PATH}}/helper.sh with "reserve-transfer-assets-from-asset-hub-westend-local 5000000000000" within 120 seconds +asset-hub-rococo-collator1: run {{ENV_PATH}}/helper.sh with "auto-log reserve-transfer-assets-from-asset-hub-westend-local 5000000000000" within 120 seconds # check that //Alice received at least 4.8 WND on Rococo AH asset-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,4800000000000,Westend" within 600 seconds -# check that the relayer //Charlie is rewarded by Rococo AH -bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,ThisChain,0" within 30 seconds +# relayer //Eve is rewarded for delivering messages from Westend BH +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/relayer-rewards.js with "5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL,0x00000002,0x62687764,ThisChain,0" within 300 seconds diff --git a/bridges/testing/tests/0001-asset-transfer/wnd-relayer-balance-does-not-change.zndsl b/bridges/testing/tests/0001-asset-transfer/wnd-relayer-balance-does-not-change.zndsl new file mode 100644 index 00000000000..d2563e18078 --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/wnd-relayer-balance-does-not-change.zndsl @@ -0,0 +1,11 @@ +Description: Finality and parachain relays should have the constant balance, because their transactions are free +Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml +Creds: config + +# local chain spec gives `1u64 << 60` tokens to every endowed account: if it'll ever +# change, it'd need to be fixed here as well + +# //Charlie only submits free and mandatory relay chain headers, so the balance should stay the same +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" return is 1152921504606846976 within 30 seconds +# //Dave only submits free parachain headers, so the balance should stay the same +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" return is 1152921504606846976 within 30 seconds diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index f5a75aa03ac..574406ab305 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -22,6 +22,7 @@ scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } +tuplex = { version = "0.1", default-features = false } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -218,6 +219,7 @@ std = [ "sp-version/std", "substrate-wasm-builder", "testnet-parachains-constants/std", + "tuplex/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs index 93ef9470363..5551b05e202 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs @@ -49,7 +49,8 @@ pub type BridgeGrandpaWestendInstance = pallet_bridge_grandpa::Instance3; impl pallet_bridge_grandpa::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgedChain = bp_westend::Westend; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type MaxFreeHeadersPerBlock = ConstU32<4>; + type FreeHeadersInterval = ConstU32<5>; type HeadersToKeep = RelayChainHeadersToKeep; type WeightInfo = weights::pallet_bridge_grandpa::WeightInfo; } @@ -89,7 +90,8 @@ pub type BridgeGrandpaRococoBulletinInstance = pallet_bridge_grandpa::Instance4; impl pallet_bridge_grandpa::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgedChain = bp_polkadot_bulletin::PolkadotBulletin; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type MaxFreeHeadersPerBlock = ConstU32<4>; + type FreeHeadersInterval = ConstU32<5>; type HeadersToKeep = RelayChainHeadersToKeep; // Technically this is incorrect - we have two pallet instances and ideally we shall // benchmark every instance separately. But the benchmarking engine has a flaw - it diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs index 8845f0538b5..94b936889b7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs @@ -20,17 +20,15 @@ //! are reusing Polkadot Bulletin chain primitives everywhere here. use crate::{ - bridge_common_config::{BridgeGrandpaRococoBulletinInstance, BridgeHubRococo}, - weights, - xcm_config::UniversalLocation, - AccountId, BridgeRococoBulletinGrandpa, BridgeRococoBulletinMessages, PolkadotXcm, Runtime, - RuntimeEvent, XcmOverRococoBulletin, XcmRouter, + bridge_common_config::BridgeHubRococo, weights, xcm_config::UniversalLocation, AccountId, + BridgeRococoBulletinGrandpa, BridgeRococoBulletinMessages, PolkadotXcm, Runtime, RuntimeEvent, + XcmOverRococoBulletin, XcmRouter, }; use bp_messages::LaneId; use bp_runtime::Chain; use bridge_runtime_common::{ extensions::refund_relayer_extension::{ - ActualFeeRefund, RefundBridgedGrandpaMessages, RefundSignedExtensionAdapter, + ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter, RefundableMessagesLane, }, messages, @@ -83,6 +81,9 @@ parameter_types! { pub const RococoPeopleToRococoBulletinMessagesLane: bp_messages::LaneId = XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN; + // see the `FEE_BOOST_PER_RELAY_HEADER` constant get the meaning of this value + pub PriorityBoostPerRelayHeader: u64 = 58_014_163_614_163; + /// Priority boost that the registered relayer receives for every additional message in the message /// delivery transaction. /// @@ -169,9 +170,8 @@ impl messages::BridgedChainWithMessages for RococoBulletin {} /// Signed extension that refunds relayers that are delivering messages from the Rococo Bulletin /// chain. pub type OnBridgeHubRococoRefundRococoBulletinMessages = RefundSignedExtensionAdapter< - RefundBridgedGrandpaMessages< + RefundBridgedMessages< Runtime, - BridgeGrandpaRococoBulletinInstance, RefundableMessagesLane< WithRococoBulletinMessagesInstance, RococoPeopleToRococoBulletinMessagesLane, @@ -244,6 +244,9 @@ mod tests { /// operational costs and a faster bridge), so this value should be significant. const FEE_BOOST_PER_MESSAGE: Balance = 2 * rococo::currency::UNITS; + // see `FEE_BOOST_PER_MESSAGE` comment + const FEE_BOOST_PER_RELAY_HEADER: Balance = 2 * rococo::currency::UNITS; + #[test] fn ensure_bridge_hub_rococo_message_lane_weights_are_correct() { check_message_lane_weights::< @@ -273,7 +276,13 @@ mod tests { // Bulletin chain - it has the same (almost) runtime for Polkadot Bulletin and Rococo // Bulletin, so we have to adhere Polkadot names here - bridge_runtime_common::extensions::priority_calculator::ensure_priority_boost_is_sane::< + bridge_runtime_common::extensions::priority_calculator::per_relay_header::ensure_priority_boost_is_sane::< + Runtime, + BridgeGrandpaRococoBulletinInstance, + PriorityBoostPerRelayHeader, + >(FEE_BOOST_PER_RELAY_HEADER); + + bridge_runtime_common::extensions::priority_calculator::per_message::ensure_priority_boost_is_sane::< Runtime, WithRococoBulletinMessagesInstance, PriorityBoostPerMessage, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs index e5a00073407..1681ac7f468 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs @@ -29,8 +29,8 @@ use bp_messages::LaneId; use bp_runtime::Chain; use bridge_runtime_common::{ extensions::refund_relayer_extension::{ - ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter, - RefundableMessagesLane, RefundableParachain, + ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter, + RefundableMessagesLane, }, messages, messages::{ @@ -65,6 +65,10 @@ parameter_types! { 2, [GlobalConsensus(WestendGlobalConsensusNetwork::get())] ); + // see the `FEE_BOOST_PER_RELAY_HEADER` constant get the meaning of this value + pub PriorityBoostPerRelayHeader: u64 = 32_007_814_407_814; + // see the `FEE_BOOST_PER_PARACHAIN_HEADER` constant get the meaning of this value + pub PriorityBoostPerParachainHeader: u64 = 1_396_340_903_540_903; // see the `FEE_BOOST_PER_MESSAGE` constant to get the meaning of this value pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; @@ -174,12 +178,8 @@ impl messages::BridgedChainWithMessages for BridgeHubWestend {} /// Signed extension that refunds relayers that are delivering messages from the Westend parachain. pub type OnBridgeHubRococoRefundBridgeHubWestendMessages = RefundSignedExtensionAdapter< - RefundBridgedParachainMessages< + RefundBridgedMessages< Runtime, - RefundableParachain< - BridgeParachainWestendInstance, - bp_bridge_hub_westend::BridgeHubWestend, - >, RefundableMessagesLane< WithBridgeHubWestendMessagesInstance, AssetHubRococoToAssetHubWestendMessagesLane, @@ -246,6 +246,7 @@ mod tests { use crate::bridge_common_config::BridgeGrandpaWestendInstance; use bridge_runtime_common::{ assert_complete_bridge_types, + extensions::refund_relayer_extension::RefundableParachain, integrity::{ assert_complete_bridge_constants, check_message_lane_weights, AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, @@ -266,6 +267,11 @@ mod tests { /// operational costs and a faster bridge), so this value should be significant. const FEE_BOOST_PER_MESSAGE: Balance = 2 * rococo::currency::UNITS; + // see `FEE_BOOST_PER_MESSAGE` comment + const FEE_BOOST_PER_RELAY_HEADER: Balance = 2 * rococo::currency::UNITS; + // see `FEE_BOOST_PER_MESSAGE` comment + const FEE_BOOST_PER_PARACHAIN_HEADER: Balance = 2 * rococo::currency::UNITS; + #[test] fn ensure_bridge_hub_rococo_message_lane_weights_are_correct() { check_message_lane_weights::< @@ -318,7 +324,19 @@ mod tests { }, }); - bridge_runtime_common::extensions::priority_calculator::ensure_priority_boost_is_sane::< + bridge_runtime_common::extensions::priority_calculator::per_relay_header::ensure_priority_boost_is_sane::< + Runtime, + BridgeGrandpaWestendInstance, + PriorityBoostPerRelayHeader, + >(FEE_BOOST_PER_RELAY_HEADER); + + bridge_runtime_common::extensions::priority_calculator::per_parachain_header::ensure_priority_boost_is_sane::< + Runtime, + RefundableParachain, + PriorityBoostPerParachainHeader, + >(FEE_BOOST_PER_PARACHAIN_HEADER); + + bridge_runtime_common::extensions::priority_calculator::per_message::ensure_priority_boost_is_sane::< Runtime, WithBridgeHubWestendMessagesInstance, PriorityBoostPerMessage, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 109b081f937..7c2aa490886 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -35,6 +35,12 @@ pub mod bridge_to_westend_config; mod weights; pub mod xcm_config; +use bridge_runtime_common::extensions::{ + check_obsolete_extension::{ + CheckAndBoostBridgeGrandpaTransactions, CheckAndBoostBridgeParachainsTransactions, + }, + refund_relayer_extension::RefundableParachain, +}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use snowbridge_beacon_primitives::{Fork, ForkVersions}; use snowbridge_core::{ @@ -63,7 +69,7 @@ use frame_support::{ dispatch::DispatchClass, genesis_builder_helper::{build_state, get_preset}, parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, TransformOrigin}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, Get, TransformOrigin}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -740,10 +746,28 @@ pub type XcmOverRococoBulletin = XcmOverPolkadotBulletin; bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! { RuntimeCall, AccountId, // Grandpa - BridgeWestendGrandpa, - BridgeRococoBulletinGrandpa, + CheckAndBoostBridgeGrandpaTransactions< + Runtime, + bridge_common_config::BridgeGrandpaWestendInstance, + bridge_to_westend_config::PriorityBoostPerRelayHeader, + xcm_config::TreasuryAccount, + >, + CheckAndBoostBridgeGrandpaTransactions< + Runtime, + bridge_common_config::BridgeGrandpaRococoBulletinInstance, + bridge_to_bulletin_config::PriorityBoostPerRelayHeader, + xcm_config::TreasuryAccount, + >, // Parachains - BridgeWestendParachains, + CheckAndBoostBridgeParachainsTransactions< + Runtime, + RefundableParachain< + bridge_common_config::BridgeParachainWestendInstance, + bp_bridge_hub_westend::BridgeHubWestend, + >, + bridge_to_westend_config::PriorityBoostPerParachainHeader, + xcm_config::TreasuryAccount, + >, // Messages BridgeWestendMessages, BridgeRococoBulletinMessages @@ -938,6 +962,11 @@ impl_runtime_apis! { fn best_finalized() -> Option> { BridgeWestendGrandpa::best_finalized() } + fn free_headers_interval() -> Option { + >::FreeHeadersInterval::get() + } fn synced_headers_grandpa_info( ) -> Vec> { BridgeWestendGrandpa::synced_headers_grandpa_info() @@ -950,6 +979,10 @@ impl_runtime_apis! { bp_bridge_hub_westend::BridgeHubWestend >().unwrap_or(None) } + fn free_headers_interval() -> Option { + // "free interval" is not currently used for parachains + None + } } // This is exposed by BridgeHubRococo @@ -984,6 +1017,12 @@ impl_runtime_apis! { BridgePolkadotBulletinGrandpa::best_finalized() } + fn free_headers_interval() -> Option { + >::FreeHeadersInterval::get() + } + fn synced_headers_grandpa_info( ) -> Vec> { BridgePolkadotBulletinGrandpa::synced_headers_grandpa_info() diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index aac39a4564f..942f243141d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -17,8 +17,10 @@ //! Expose the auto generated weight files. +use ::pallet_bridge_grandpa::WeightInfoExt as GrandpaWeightInfoExt; use ::pallet_bridge_messages::WeightInfoExt as MessagesWeightInfoExt; use ::pallet_bridge_parachains::WeightInfoExt as ParachainsWeightInfoExt; +use ::pallet_bridge_relayers::WeightInfo as _; pub mod block_weights; pub mod cumulus_pallet_parachain_system; @@ -56,6 +58,16 @@ use frame_support::weights::Weight; // import trait from dependency module use ::pallet_bridge_relayers::WeightInfoExt as _; +impl GrandpaWeightInfoExt for pallet_bridge_grandpa::WeightInfo { + fn submit_finality_proof_overhead_from_runtime() -> Weight { + // our signed extension: + // 1) checks whether relayer registration is active from validate/pre_dispatch; + // 2) may slash and deregister relayer from post_dispatch + // (2) includes (1), so (2) is the worst case + pallet_bridge_relayers::WeightInfo::::slash_and_deregister() + } +} + impl MessagesWeightInfoExt for pallet_bridge_messages_rococo_to_rococo_bulletin::WeightInfo { @@ -94,4 +106,12 @@ impl ParachainsWeightInfoExt for pallet_bridge_parachains::WeightInfo u32 { bp_bridge_hub_westend::EXTRA_STORAGE_PROOF_SIZE } + + fn submit_parachain_heads_overhead_from_runtime() -> Weight { + // our signed extension: + // 1) checks whether relayer registration is active from validate/pre_dispatch; + // 2) may slash and deregister relayer from post_dispatch + // (2) includes (1), so (2) is the worst case + pallet_bridge_relayers::WeightInfo::::slash_and_deregister() + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 776c505fa64..b309232825d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -80,11 +80,10 @@ fn construct_and_apply_extrinsic( r.unwrap() } -fn construct_and_estimate_extrinsic_fee(batch: pallet_utility::Call) -> Balance { - let batch_call = RuntimeCall::Utility(batch); - let batch_info = batch_call.get_dispatch_info(); - let xt = construct_extrinsic(Alice, batch_call); - TransactionPayment::compute_fee(xt.encoded_size() as _, &batch_info, 0) +fn construct_and_estimate_extrinsic_fee(call: RuntimeCall) -> Balance { + let info = call.get_dispatch_info(); + let xt = construct_extrinsic(Alice, call); + TransactionPayment::compute_fee(xt.encoded_size() as _, &info, 0) } fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { @@ -376,20 +375,20 @@ mod bridge_hub_westend_tests { } #[test] - pub fn complex_relay_extrinsic_works() { - // for Westend - from_parachain::complex_relay_extrinsic_works::( + fn free_relay_extrinsic_works() { + // from Westend + from_parachain::free_relay_extrinsic_works::( collator_session_keys(), slot_durations(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, BridgeHubWestendChainId::get(), + SIBLING_PARACHAIN_ID, Rococo, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, || (), construct_and_apply_extrinsic, - ); + ) } #[test] @@ -414,12 +413,12 @@ mod bridge_hub_westend_tests { } #[test] - pub fn can_calculate_fee_for_complex_message_delivery_transaction() { + fn can_calculate_fee_for_standalone_message_delivery_transaction() { bridge_hub_test_utils::check_sane_fees_values( "bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs", bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get(), || { - from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< + from_parachain::can_calculate_fee_for_standalone_message_delivery_transaction::< RuntimeTestsAdapter, >(collator_session_keys(), construct_and_estimate_extrinsic_fee) }, @@ -433,12 +432,12 @@ mod bridge_hub_westend_tests { } #[test] - pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { + fn can_calculate_fee_for_standalone_message_confirmation_transaction() { bridge_hub_test_utils::check_sane_fees_values( "bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs", bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs::get(), || { - from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< + from_parachain::can_calculate_fee_for_standalone_message_confirmation_transaction::< RuntimeTestsAdapter, >(collator_session_keys(), construct_and_estimate_extrinsic_fee) }, @@ -581,28 +580,28 @@ mod bridge_hub_bulletin_tests { } #[test] - pub fn complex_relay_extrinsic_works() { - // for Bulletin - from_grandpa_chain::complex_relay_extrinsic_works::( + fn free_relay_extrinsic_works() { + // from Bulletin + from_grandpa_chain::free_relay_extrinsic_works::( collator_session_keys(), slot_durations(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, RococoBulletinChainId::get(), + SIBLING_PARACHAIN_ID, Rococo, XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, || (), construct_and_apply_extrinsic, - ); + ) } #[test] - pub fn can_calculate_fee_for_complex_message_delivery_transaction() { + pub fn can_calculate_fee_for_standalone_message_delivery_transaction() { bridge_hub_test_utils::check_sane_fees_values( "bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs", bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get(), || { - from_grandpa_chain::can_calculate_fee_for_complex_message_delivery_transaction::< + from_grandpa_chain::can_calculate_fee_for_standalone_message_delivery_transaction::< RuntimeTestsAdapter, >(collator_session_keys(), construct_and_estimate_extrinsic_fee) }, @@ -617,12 +616,12 @@ mod bridge_hub_bulletin_tests { } #[test] - pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { + pub fn can_calculate_fee_for_standalone_message_confirmation_transaction() { bridge_hub_test_utils::check_sane_fees_values( "bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs", bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs::get(), || { - from_grandpa_chain::can_calculate_fee_for_complex_message_confirmation_transaction::< + from_grandpa_chain::can_calculate_fee_for_standalone_message_confirmation_transaction::< RuntimeTestsAdapter, >(collator_session_keys(), construct_and_estimate_extrinsic_fee) }, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index 86560caca99..a7241cc6d10 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -18,6 +18,7 @@ hex-literal = { version = "0.4.1" } log = { workspace = true } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } +tuplex = { version = "0.1", default-features = false } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -180,6 +181,7 @@ std = [ "sp-version/std", "substrate-wasm-builder", "testnet-parachains-constants/std", + "tuplex/std", "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs index d5da41cce28..425b53da30f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs @@ -26,8 +26,8 @@ use bp_parachains::SingleParaStoredHeaderDataBuilder; use bp_runtime::Chain; use bridge_runtime_common::{ extensions::refund_relayer_extension::{ - ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter, - RefundableMessagesLane, RefundableParachain, + ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter, + RefundableMessagesLane, }, messages, messages::{ @@ -70,6 +70,10 @@ parameter_types! { 2, [GlobalConsensus(RococoGlobalConsensusNetwork::get())] ); + // see the `FEE_BOOST_PER_RELAY_HEADER` constant get the meaning of this value + pub PriorityBoostPerRelayHeader: u64 = 32_007_814_407_814; + // see the `FEE_BOOST_PER_PARACHAIN_HEADER` constant get the meaning of this value + pub PriorityBoostPerParachainHeader: u64 = 1_396_340_903_540_903; // see the `FEE_BOOST_PER_MESSAGE` constant to get the meaning of this value pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; @@ -191,9 +195,8 @@ impl ThisChainWithMessages for BridgeHubWestend { /// Signed extension that refunds relayers that are delivering messages from the Rococo parachain. pub type OnBridgeHubWestendRefundBridgeHubRococoMessages = RefundSignedExtensionAdapter< - RefundBridgedParachainMessages< + RefundBridgedMessages< Runtime, - RefundableParachain, RefundableMessagesLane< WithBridgeHubRococoMessagesInstance, AssetHubWestendToAssetHubRococoMessagesLane, @@ -210,7 +213,8 @@ pub type BridgeGrandpaRococoInstance = pallet_bridge_grandpa::Instance1; impl pallet_bridge_grandpa::Config for Runtime { type RuntimeEvent = RuntimeEvent; type BridgedChain = bp_rococo::Rococo; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type MaxFreeHeadersPerBlock = ConstU32<4>; + type FreeHeadersInterval = ConstU32<5>; type HeadersToKeep = RelayChainHeadersToKeep; type WeightInfo = weights::pallet_bridge_grandpa::WeightInfo; } @@ -281,6 +285,7 @@ mod tests { use super::*; use bridge_runtime_common::{ assert_complete_bridge_types, + extensions::refund_relayer_extension::RefundableParachain, integrity::{ assert_complete_bridge_constants, check_message_lane_weights, AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, @@ -301,6 +306,11 @@ mod tests { /// operational costs and a faster bridge), so this value should be significant. const FEE_BOOST_PER_MESSAGE: Balance = 2 * westend::currency::UNITS; + // see `FEE_BOOST_PER_MESSAGE` comment + const FEE_BOOST_PER_RELAY_HEADER: Balance = 2 * westend::currency::UNITS; + // see `FEE_BOOST_PER_MESSAGE` comment + const FEE_BOOST_PER_PARACHAIN_HEADER: Balance = 2 * westend::currency::UNITS; + #[test] fn ensure_bridge_hub_westend_message_lane_weights_are_correct() { check_message_lane_weights::< @@ -352,7 +362,19 @@ mod tests { }, }); - bridge_runtime_common::extensions::priority_calculator::ensure_priority_boost_is_sane::< + bridge_runtime_common::extensions::priority_calculator::per_relay_header::ensure_priority_boost_is_sane::< + Runtime, + BridgeGrandpaRococoInstance, + PriorityBoostPerRelayHeader, + >(FEE_BOOST_PER_RELAY_HEADER); + + bridge_runtime_common::extensions::priority_calculator::per_parachain_header::ensure_priority_boost_is_sane::< + Runtime, + RefundableParachain, + PriorityBoostPerParachainHeader, + >(FEE_BOOST_PER_PARACHAIN_HEADER); + + bridge_runtime_common::extensions::priority_calculator::per_message::ensure_priority_boost_is_sane::< Runtime, WithBridgeHubRococoMessagesInstance, PriorityBoostPerMessage, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index cf09a1acc54..640eaf881a5 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -32,6 +32,12 @@ pub mod bridge_to_rococo_config; mod weights; pub mod xcm_config; +use bridge_runtime_common::extensions::{ + check_obsolete_extension::{ + CheckAndBoostBridgeGrandpaTransactions, CheckAndBoostBridgeParachainsTransactions, + }, + refund_relayer_extension::RefundableParachain, +}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::ParaId; use sp_api::impl_runtime_apis; @@ -57,7 +63,7 @@ use frame_support::{ dispatch::DispatchClass, genesis_builder_helper::{build_state, get_preset}, parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, TransformOrigin}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, Get, TransformOrigin}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -502,9 +508,22 @@ construct_runtime!( bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! { RuntimeCall, AccountId, // Grandpa - BridgeRococoGrandpa, + CheckAndBoostBridgeGrandpaTransactions< + Runtime, + bridge_to_rococo_config::BridgeGrandpaRococoInstance, + bridge_to_rococo_config::PriorityBoostPerRelayHeader, + xcm_config::TreasuryAccount, + >, // Parachains - BridgeRococoParachains, + CheckAndBoostBridgeParachainsTransactions< + Runtime, + RefundableParachain< + bridge_to_rococo_config::BridgeParachainRococoInstance, + bp_bridge_hub_rococo::BridgeHubRococo, + >, + bridge_to_rococo_config::PriorityBoostPerParachainHeader, + xcm_config::TreasuryAccount, + >, // Messages BridgeRococoMessages } @@ -692,6 +711,11 @@ impl_runtime_apis! { fn best_finalized() -> Option> { BridgeRococoGrandpa::best_finalized() } + fn free_headers_interval() -> Option { + >::FreeHeadersInterval::get() + } fn synced_headers_grandpa_info( ) -> Vec> { BridgeRococoGrandpa::synced_headers_grandpa_info() @@ -704,6 +728,10 @@ impl_runtime_apis! { bp_bridge_hub_rococo::BridgeHubRococo >().unwrap_or(None) } + fn free_headers_interval() -> Option { + // "free interval" is not currently used for parachains + None + } } impl bp_bridge_hub_rococo::FromBridgeHubRococoInboundLaneApi for Runtime { diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs index a65ee31d3e5..245daaf8ed9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs @@ -17,8 +17,10 @@ //! Expose the auto generated weight files. +use ::pallet_bridge_grandpa::WeightInfoExt as GrandpaWeightInfoExt; use ::pallet_bridge_messages::WeightInfoExt as MessagesWeightInfoExt; use ::pallet_bridge_parachains::WeightInfoExt as ParachainsWeightInfoExt; +use ::pallet_bridge_relayers::WeightInfo as _; pub mod block_weights; pub mod cumulus_pallet_parachain_system; @@ -51,6 +53,16 @@ use frame_support::weights::Weight; // import trait from dependency module use ::pallet_bridge_relayers::WeightInfoExt as _; +impl GrandpaWeightInfoExt for pallet_bridge_grandpa::WeightInfo { + fn submit_finality_proof_overhead_from_runtime() -> Weight { + // our signed extension: + // 1) checks whether relayer registration is active from validate/pre_dispatch; + // 2) may slash and deregister relayer from post_dispatch + // (2) includes (1), so (2) is the worst case + pallet_bridge_relayers::WeightInfo::::slash_and_deregister() + } +} + impl MessagesWeightInfoExt for pallet_bridge_messages::WeightInfo { fn expected_extra_storage_proof_size() -> u32 { bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE @@ -70,4 +82,12 @@ impl ParachainsWeightInfoExt for pallet_bridge_parachains::WeightInfo u32 { bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE } + + fn submit_parachain_heads_overhead_from_runtime() -> Weight { + // our signed extension: + // 1) checks whether relayer registration is active from validate/pre_dispatch; + // 2) may slash and deregister relayer from post_dispatch + // (2) includes (1), so (2) is the worst case + pallet_bridge_relayers::WeightInfo::::slash_and_deregister() + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 988b10e1e2d..836594140b2 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -94,11 +94,10 @@ fn construct_and_apply_extrinsic( r.unwrap() } -fn construct_and_estimate_extrinsic_fee(batch: pallet_utility::Call) -> Balance { - let batch_call = RuntimeCall::Utility(batch); - let batch_info = batch_call.get_dispatch_info(); - let xt = construct_extrinsic(Alice, batch_call); - TransactionPayment::compute_fee(xt.encoded_size() as _, &batch_info, 0) +fn construct_and_estimate_extrinsic_fee(call: RuntimeCall) -> Balance { + let info = call.get_dispatch_info(); + let xt = construct_extrinsic(Alice, call); + TransactionPayment::compute_fee(xt.encoded_size() as _, &info, 0) } fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { @@ -271,22 +270,6 @@ fn relayed_incoming_message_works() { ) } -#[test] -pub fn complex_relay_extrinsic_works() { - from_parachain::complex_relay_extrinsic_works::( - collator_session_keys(), - slot_durations(), - bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - BridgeHubRococoChainId::get(), - Westend, - XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, - || (), - construct_and_apply_extrinsic, - ); -} - #[test] pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer() { bridge_hub_test_utils::check_sane_fees_values( @@ -309,12 +292,12 @@ pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer() { } #[test] -pub fn can_calculate_fee_for_complex_message_delivery_transaction() { +pub fn can_calculate_fee_for_standalone_message_delivery_transaction() { bridge_hub_test_utils::check_sane_fees_values( "bp_bridge_hub_westend::BridgeHubWestendBaseDeliveryFeeInWnds", bp_bridge_hub_westend::BridgeHubWestendBaseDeliveryFeeInWnds::get(), || { - from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< + from_parachain::can_calculate_fee_for_standalone_message_delivery_transaction::< RuntimeTestsAdapter, >(collator_session_keys(), construct_and_estimate_extrinsic_fee) }, @@ -328,12 +311,12 @@ pub fn can_calculate_fee_for_complex_message_delivery_transaction() { } #[test] -pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { +pub fn can_calculate_fee_for_standalone_message_confirmation_transaction() { bridge_hub_test_utils::check_sane_fees_values( "bp_bridge_hub_westend::BridgeHubWestendBaseConfirmationFeeInWnds", bp_bridge_hub_westend::BridgeHubWestendBaseConfirmationFeeInWnds::get(), || { - from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< + from_parachain::can_calculate_fee_for_standalone_message_confirmation_transaction::< RuntimeTestsAdapter, >(collator_session_keys(), construct_and_estimate_extrinsic_fee) }, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index 8aaaa4f59d7..bfa2f0f50f9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -41,6 +41,7 @@ use frame_system::pallet_prelude::BlockNumberFor; use parachains_runtimes_test_utils::{ AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, SlotDurations, }; +use sp_core::Get; use sp_keyring::AccountKeyring::*; use sp_runtime::{traits::Header as HeaderT, AccountId32}; use xcm::latest::prelude::*; @@ -162,7 +163,14 @@ pub fn relayed_incoming_message_works( test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< RuntimeHelper::MB, (), - >(lane_id, xcm.into(), message_nonce, message_destination, relay_header_number); + >( + lane_id, + xcm.into(), + message_nonce, + message_destination, + relay_header_number, + false, + ); let relay_chain_header_hash = relay_chain_header.hash(); vec![ @@ -202,6 +210,142 @@ pub fn relayed_incoming_message_works( ); } +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, message) independently submitted. +/// Finality proof is submitted for free in this test. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn free_relay_extrinsic_works( + collator_session_key: CollatorSessionKeys, + slot_durations: SlotDurations, + runtime_para_id: u32, + bridged_chain_id: bp_runtime::ChainId, + sibling_parachain_id: u32, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + prepare_configuration: impl Fn(), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + RuntimeCallOf, + ) -> sp_runtime::DispatchOutcome, +) where + RuntimeHelper: WithRemoteGrandpaChainHelper, + RuntimeHelper::Runtime: pallet_balances::Config, + AccountIdOf: From, + RuntimeCallOf: From> + + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, +{ + // ensure that the runtime allows free header submissions + let free_headers_interval = >::FreeHeadersInterval::get() + .expect("this test requires runtime, configured to accept headers for free; qed"); + + helpers::relayed_incoming_message_works::< + RuntimeHelper::Runtime, + RuntimeHelper::AllPalletsWithoutSystem, + RuntimeHelper::MPI, + >( + collator_session_key, + slot_durations, + runtime_para_id, + sibling_parachain_id, + local_relay_chain_id, + construct_and_apply_extrinsic, + |relayer_id_at_this_chain, + relayer_id_at_bridged_chain, + message_destination, + message_nonce, + xcm| { + prepare_configuration(); + + // start with bridged relay chain block#0 + let initial_block_number = 0; + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::( + initial_block_number, + ), + ); + + // free relay chain header is `0 + free_headers_interval` + let relay_header_number = initial_block_number + free_headers_interval; + + // relayer balance shall not change after relay and para header submissions + let initial_relayer_balance = + pallet_balances::Pallet::::free_balance( + relayer_id_at_this_chain.clone(), + ); + + // initialize the `FreeHeadersRemaining` storage value + pallet_bridge_grandpa::Pallet::::on_initialize( + 0u32.into(), + ); + + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let (relay_chain_header, grandpa_justification, message_proof) = + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< + RuntimeHelper::MB, + (), + >( + lane_id, + xcm.into(), + message_nonce, + message_destination, + relay_header_number.into(), + true, + ); + + let relay_chain_header_hash = relay_chain_header.hash(); + vec![ + ( + BridgeGrandpaCall::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }.into(), + Box::new(( + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash( + relay_chain_header_hash, + ), + helpers::VerifyRelayerBalance::::expect_relayer_balance( + relayer_id_at_this_chain.clone(), + initial_relayer_balance, + ), + )) + ), + ( + BridgeMessagesCall::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }.into(), + Box::new(( + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce( + lane_id, + 1, + ), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( + relayer_id_at_this_chain, + RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ), + ), + )), + ), + ] + }, + ); +} + /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, message) batched together in signed extrinsic. /// Also verifies relayer transaction signed extensions work as intended. @@ -265,7 +409,14 @@ pub fn complex_relay_extrinsic_works( test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< RuntimeHelper::MB, (), - >(lane_id, xcm.into(), message_nonce, message_destination, relay_header_number); + >( + lane_id, + xcm.into(), + message_nonce, + message_destination, + relay_header_number, + false, + ); let relay_chain_header_hash = relay_chain_header.hash(); vec![( @@ -344,6 +495,7 @@ where 1, [GlobalConsensus(Polkadot), Parachain(1_000)].into(), 1u32.into(), + false, ); // generate batch call that provides finality for bridged relay and parachains + message @@ -423,3 +575,109 @@ where compute_extrinsic_fee(batch) }) } + +/// Estimates transaction fee for default message delivery transaction from bridged GRANDPA chain. +pub fn can_calculate_fee_for_standalone_message_delivery_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn( + ::RuntimeCall, + ) -> u128, +) -> u128 +where + RuntimeHelper: WithRemoteGrandpaChainHelper, + RuntimeCallOf: + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + // + // we don't care about parameter values here, apart from the XCM message size. But we + // do not need to have a large message here, because we're charging for every byte of + // the message additionally + let (_, _, message_proof) = + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< + RuntimeHelper::MB, + (), + >( + LaneId::default(), + vec![Instruction::<()>::ClearOrigin; 1_024].into(), + 1, + [GlobalConsensus(Polkadot), Parachain(1_000)].into(), + 1u32.into(), + false, + ); + + let call = test_data::from_grandpa_chain::make_standalone_relayer_delivery_call::< + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + RuntimeHelper::MPI, + >( + message_proof, + helpers::relayer_id_at_bridged_chain::(), + ); + + compute_extrinsic_fee(call) + }) +} + +/// Estimates transaction fee for default message confirmation transaction (batched with required +/// proofs) from bridged parachain. +pub fn can_calculate_fee_for_standalone_message_confirmation_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn( + ::RuntimeCall, + ) -> u128, +) -> u128 +where + RuntimeHelper: WithRemoteGrandpaChainHelper, + AccountIdOf: From, + MessageThisChain: + bp_runtime::Chain>, + RuntimeCallOf: + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::TargetHeaderChain: + TargetHeaderChain< + XcmAsPlainPayload, + AccountIdOf, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>>, + >, + >, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let unrewarded_relayers = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }; + let (_, _, message_delivery_proof) = + test_data::from_grandpa_chain::make_complex_relayer_confirmation_proofs::< + RuntimeHelper::MB, + (), + >( + LaneId::default(), + 1u32.into(), + AccountId32::from(Alice.public()).into(), + unrewarded_relayers.clone(), + ); + + let call = test_data::from_grandpa_chain::make_standalone_relayer_confirmation_call::< + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + RuntimeHelper::MPI, + >(message_delivery_proof, unrewarded_relayers); + + compute_extrinsic_fee(call) + }) +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index 72ec0718acf..12ab382d9e0 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -42,6 +42,7 @@ use frame_system::pallet_prelude::BlockNumberFor; use parachains_runtimes_test_utils::{ AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, SlotDurations, }; +use sp_core::Get; use sp_keyring::AccountKeyring::*; use sp_runtime::{traits::Header as HeaderT, AccountId32}; use xcm::latest::prelude::*; @@ -188,6 +189,7 @@ pub fn relayed_incoming_message_works( para_header_number, relay_header_number, bridged_para_id, + false, ); let parachain_head_hash = parachain_head.hash(); @@ -241,6 +243,177 @@ pub fn relayed_incoming_message_works( ); } +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, para heads, message) independently submitted. +/// Finality and para heads are submitted for free in this test. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn free_relay_extrinsic_works( + collator_session_key: CollatorSessionKeys, + slot_durations: SlotDurations, + runtime_para_id: u32, + bridged_para_id: u32, + bridged_chain_id: bp_runtime::ChainId, + sibling_parachain_id: u32, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + prepare_configuration: impl Fn(), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, +) where + RuntimeHelper: WithRemoteParachainHelper, + RuntimeHelper::Runtime: pallet_balances::Config, + AccountIdOf: From, + RuntimeCallOf: From> + + From> + + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, +{ + // ensure that the runtime allows free header submissions + let free_headers_interval = >::FreeHeadersInterval::get() + .expect("this test requires runtime, configured to accept headers for free; qed"); + + helpers::relayed_incoming_message_works::< + RuntimeHelper::Runtime, + RuntimeHelper::AllPalletsWithoutSystem, + RuntimeHelper::MPI, + >( + collator_session_key, + slot_durations, + runtime_para_id, + sibling_parachain_id, + local_relay_chain_id, + construct_and_apply_extrinsic, + |relayer_id_at_this_chain, + relayer_id_at_bridged_chain, + message_destination, + message_nonce, + xcm| { + prepare_configuration(); + + // start with bridged relay chain block#0 + let initial_block_number = 0; + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::( + initial_block_number, + ), + ); + + // free relay chain header is `0 + free_headers_interval` + let relay_header_number = initial_block_number + free_headers_interval; + // first parachain header is always submitted for free + let para_header_number = 1; + + // relayer balance shall not change after relay and para header submissions + let initial_relayer_balance = + pallet_balances::Pallet::::free_balance( + relayer_id_at_this_chain.clone(), + ); + + // initialize the `FreeHeadersRemaining` storage value + pallet_bridge_grandpa::Pallet::::on_initialize( + 0u32.into(), + ); + + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let ( + relay_chain_header, + grandpa_justification, + parachain_head, + parachain_heads, + para_heads_proof, + message_proof, + ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< + >::BridgedChain, + RuntimeHelper::MB, + (), + >( + lane_id, + xcm.into(), + message_nonce, + message_destination, + para_header_number, + relay_header_number, + bridged_para_id, + true, + ); + + let parachain_head_hash = parachain_head.hash(); + let relay_chain_header_hash = relay_chain_header.hash(); + let relay_chain_header_number = *relay_chain_header.number(); + vec![ + ( + BridgeGrandpaCall::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }.into(), + Box::new(( + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash( + relay_chain_header_hash, + ), + helpers::VerifyRelayerBalance::::expect_relayer_balance( + relayer_id_at_this_chain.clone(), + initial_relayer_balance, + ), + )), + ), + ( + BridgeParachainsCall::::submit_parachain_heads { + at_relay_block: (relay_chain_header_number, relay_chain_header_hash), + parachains: parachain_heads, + parachain_heads_proof: para_heads_proof, + }.into(), + Box::new(( + helpers::VerifySubmitParachainHeaderProofOutcome::::expect_best_header_hash( + bridged_para_id, + parachain_head_hash, + ), + /*helpers::VerifyRelayerBalance::::expect_relayer_balance( + relayer_id_at_this_chain.clone(), + initial_relayer_balance, + ),*/ + )), + ), + ( + BridgeMessagesCall::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }.into(), + Box::new(( + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce( + lane_id, + 1, + ), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( + relayer_id_at_this_chain, + RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ), + ), + )), + ), + ] + }, + ); +} + /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, para heads, message) batched together in signed extrinsic. /// Also verifies relayer transaction signed extensions work as intended. @@ -325,6 +498,7 @@ pub fn complex_relay_extrinsic_works( para_header_number, relay_header_number, bridged_para_id, + false, ); let parachain_head_hash = parachain_head.hash(); @@ -428,6 +602,7 @@ where 1, 5, 1_000, + false, ); // generate batch call that provides finality for bridged relay and parachains + message @@ -527,3 +702,126 @@ where compute_extrinsic_fee(batch) }) } + +/// Estimates transaction fee for default message delivery transaction from bridged parachain. +pub fn can_calculate_fee_for_standalone_message_delivery_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn( + ::RuntimeCall, + ) -> u128, +) -> u128 +where + RuntimeHelper: WithRemoteParachainHelper, + RuntimeCallOf: + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + // + // we don't care about parameter values here, apart from the XCM message size. But we + // do not need to have a large message here, because we're charging for every byte of + // the message additionally + let ( + _, + _, + _, + _, + _, + message_proof, + ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< + >::BridgedChain, + RuntimeHelper::MB, + (), + >( + LaneId::default(), + vec![Instruction::<()>::ClearOrigin; 1_024].into(), + 1, + [GlobalConsensus(Polkadot), Parachain(1_000)].into(), + 1, + 5, + 1_000, + false, + ); + + let call = test_data::from_parachain::make_standalone_relayer_delivery_call::< + RuntimeHelper::Runtime, + RuntimeHelper::MPI, + _, + >( + message_proof, + helpers::relayer_id_at_bridged_chain::(), + ); + + compute_extrinsic_fee(call) + }) +} + +/// Estimates transaction fee for default message confirmation transaction (batched with required +/// proofs) from bridged parachain. +pub fn can_calculate_fee_for_standalone_message_confirmation_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn( + ::RuntimeCall, + ) -> u128, +) -> u128 +where + RuntimeHelper: WithRemoteParachainHelper, + AccountIdOf: From, + MessageThisChain: + bp_runtime::Chain>, + RuntimeCallOf: + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::TargetHeaderChain: + TargetHeaderChain< + XcmAsPlainPayload, + AccountIdOf, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>>, + >, + >, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let unrewarded_relayers = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }; + let (_, _, _, _, _, message_delivery_proof) = + test_data::from_parachain::make_complex_relayer_confirmation_proofs::< + >::BridgedChain, + RuntimeHelper::MB, + (), + >( + LaneId::default(), + 1, + 5, + 1_000, + AccountId32::from(Alice.public()).into(), + unrewarded_relayers.clone(), + ); + + let call = test_data::from_parachain::make_standalone_relayer_confirmation_call::< + RuntimeHelper::Runtime, + RuntimeHelper::MPI, + >(message_delivery_proof, unrewarded_relayers); + + compute_extrinsic_fee(call) + }) +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 2b48f2e3d51..0ce049cd1c4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -193,6 +193,34 @@ where } } +/// Verifies that relayer balance is equal to given value. +pub struct VerifyRelayerBalance { + relayer: Runtime::AccountId, + balance: Runtime::Balance, +} + +impl VerifyRelayerBalance +where + Runtime: pallet_balances::Config, +{ + /// Expect given relayer balance after transaction. + pub fn expect_relayer_balance( + relayer: Runtime::AccountId, + balance: Runtime::Balance, + ) -> Box { + Box::new(Self { relayer, balance }) + } +} + +impl VerifyTransactionOutcome for VerifyRelayerBalance +where + Runtime: pallet_balances::Config, +{ + fn verify_outcome(&self) { + assert_eq!(pallet_balances::Pallet::::free_balance(&self.relayer), self.balance,); + } +} + /// Initialize bridge GRANDPA pallet. pub(crate) fn initialize_bridge_grandpa_pallet( init_data: bp_header_chain::InitializationData>, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs index 017ec0fd540..e5d5e7cac96 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs @@ -121,6 +121,60 @@ where } } +/// Prepare a call with message proof. +pub fn make_standalone_relayer_delivery_call( + message_proof: FromBridgedChainMessagesProof>>, + relayer_id_at_bridged_chain: AccountIdOf>, +) -> Runtime::RuntimeCall +where + Runtime: pallet_bridge_grandpa::Config + + pallet_bridge_messages::Config< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = AccountIdOf>, + >, + MPI: 'static, + >::SourceHeaderChain: SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>>, + >, + Runtime::RuntimeCall: From>, +{ + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + } + .into() +} + +/// Prepare a call with message delivery proof. +pub fn make_standalone_relayer_confirmation_call( + message_delivery_proof: FromBridgedChainMessagesDeliveryProof< + HashOf>, + >, + relayers_state: UnrewardedRelayersState, +) -> Runtime::RuntimeCall +where + Runtime: pallet_bridge_grandpa::Config + + pallet_bridge_messages::Config, + MPI: 'static, + >::TargetHeaderChain: TargetHeaderChain< + XcmAsPlainPayload, + Runtime::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>, + >, + >, + Runtime::RuntimeCall: From>, +{ + pallet_bridge_messages::Call::::receive_messages_delivery_proof { + proof: message_delivery_proof, + relayers_state, + } + .into() +} + /// Prepare storage proofs of messages, stored at the (bridged) source GRANDPA chain. pub fn make_complex_relayer_delivery_proofs( lane_id: LaneId, @@ -128,6 +182,7 @@ pub fn make_complex_relayer_delivery_proofs( message_nonce: MessageNonce, message_destination: Junctions, header_number: BlockNumberOf>, + is_minimal_call: bool, ) -> ( HeaderOf>, GrandpaJustification>>, @@ -153,7 +208,7 @@ where let (header, justification) = make_complex_bridged_grandpa_header_proof::< MessageBridgedChain, - >(state_root, header_number); + >(state_root, header_number, is_minimal_call); let message_proof = FromBridgedChainMessagesProof { bridged_header_hash: header.hash(), @@ -200,8 +255,11 @@ where StorageProofSize::Minimal(0), ); - let (header, justification) = - make_complex_bridged_grandpa_header_proof::(state_root, header_number); + let (header, justification) = make_complex_bridged_grandpa_header_proof::( + state_root, + header_number, + false, + ); let message_delivery_proof = FromBridgedChainMessagesDeliveryProof { bridged_header_hash: header.hash(), @@ -216,6 +274,7 @@ where pub fn make_complex_bridged_grandpa_header_proof( state_root: HashOf, header_number: BlockNumberOf, + is_minimal_call: bool, ) -> (HeaderOf, GrandpaJustification>) where BridgedChain: ChainWithGrandpa, @@ -229,7 +288,9 @@ where // `submit_finality_proof` call size would be close to maximal expected (and refundable) let extra_bytes_required = maximal_expected_submit_finality_proof_call_size::() .saturating_sub(header.encoded_size()); - header.digest_mut().push(DigestItem::Other(vec![42; extra_bytes_required])); + if !is_minimal_call { + header.digest_mut().push(DigestItem::Other(vec![42; extra_bytes_required])); + } let justification = make_default_justification(&header); (header, justification) diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs index 932ba231239..5d3cba4e53b 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs @@ -159,6 +159,52 @@ where } } +/// Prepare a call with message proof. +pub fn make_standalone_relayer_delivery_call( + message_proof: FromBridgedChainMessagesProof, + relayer_id_at_bridged_chain: InboundRelayer, +) -> Runtime::RuntimeCall where + Runtime: pallet_bridge_messages::Config< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = InboundRelayer, + >, + MPI: 'static, + Runtime::RuntimeCall: From>, + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: + From>, +{ + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_at_bridged_chain.into(), + proof: message_proof.into(), + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + } + .into() +} + +/// Prepare a call with message delivery proof. +pub fn make_standalone_relayer_confirmation_call( + message_delivery_proof: FromBridgedChainMessagesDeliveryProof, + relayers_state: UnrewardedRelayersState, +) -> Runtime::RuntimeCall +where + Runtime: pallet_bridge_messages::Config, + MPI: 'static, + Runtime::RuntimeCall: From>, + >::TargetHeaderChain: TargetHeaderChain< + XcmAsPlainPayload, + Runtime::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof, + >, +{ + pallet_bridge_messages::Call::::receive_messages_delivery_proof { + proof: message_delivery_proof, + relayers_state, + } + .into() +} + /// Prepare storage proofs of messages, stored at the source chain. pub fn make_complex_relayer_delivery_proofs( lane_id: LaneId, @@ -168,6 +214,7 @@ pub fn make_complex_relayer_delivery_proofs ( HeaderOf, GrandpaJustification>, @@ -201,6 +248,7 @@ where para_header_number, relay_header_number, bridged_para_id, + is_minimal_call, ); let message_proof = FromBridgedChainMessagesProof { @@ -266,6 +314,7 @@ where para_header_number, relay_header_number, bridged_para_id, + false, ); let message_delivery_proof = FromBridgedChainMessagesDeliveryProof { @@ -290,6 +339,7 @@ pub fn make_complex_bridged_parachain_heads_proof( para_header_number: u32, relay_header_number: BlockNumberOf, bridged_para_id: u32, + is_minimal_call: bool, ) -> ( HeaderOf, GrandpaJustification>, @@ -319,9 +369,12 @@ where )]); assert_eq!(bridged_para_head.hash(), parachain_heads[0].1); - let (relay_chain_header, justification) = make_complex_bridged_grandpa_header_proof::< - BridgedRelayChain, - >(relay_state_root, relay_header_number); + let (relay_chain_header, justification) = + make_complex_bridged_grandpa_header_proof::( + relay_state_root, + relay_header_number, + is_minimal_call, + ); (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) } diff --git a/prdoc/pr_4102.prdoc b/prdoc/pr_4102.prdoc new file mode 100644 index 00000000000..50c1ec23b2a --- /dev/null +++ b/prdoc/pr_4102.prdoc @@ -0,0 +1,43 @@ +title: "Bridge: make some headers submissions free" + +doc: + - audience: Runtime Dev + description: | + Adds `FreeHeadersInterval` configuration constant to the `pallet_bridge_grandpa`. + Transactions that improve best known header by at least `FreeHeadersInterval` headers + are now free for the submitter. Additionally, we allow single free parachain header + update per every free relay chain header. Bridge signed extensions are adjusted + to support that new scheme. Bridge runtime APIs are extended to support that new + scheme. Bridge fees are decreased by ~98% because now they do not include cost of + finality submissions - we assume relayers will be submitting finality transactions + for free. + +crates: + - name: bridge-runtime-common + bump: major + - name: bp-bridge-hub-cumulus + bump: patch + - name: bp-bridge-hub-kusama + bump: major + - name: bp-bridge-hub-polkadot + bump: major + - name: bp-bridge-hub-rococo + bump: major + - name: bp-bridge-hub-westend + bump: major + - name: pallet-bridge-grandpa + bump: major + - name: pallet-bridge-parachains + bump: major + - name: bp-parachains + bump: major + - name: bp-runtime + bump: major + - name: relay-substrate-client + bump: major + - name: bridge-hub-rococo-runtime + bump: major + - name: bridge-hub-westend-runtime + bump: major + - name: bridge-hub-test-utils + bump: minor -- GitLab From 7e68b2b8da9caf634ff4f6c6d96d2d7914c44fb7 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 25 Apr 2024 10:20:17 +0300 Subject: [PATCH 002/170] Bridge: added free headers submission support to the substrate-relay (#4157) Original PR: https://github.com/paritytech/parity-bridges-common/pull/2884. Since chain-specific code lives in the `parity-bridges-common` repo, some parts of original PR will require another PR --------- Co-authored-by: Adrian Catangiu --- bridges/chains/chain-kusama/src/lib.rs | 2 + bridges/chains/chain-polkadot/src/lib.rs | 2 + bridges/chains/chain-rococo/src/lib.rs | 2 + bridges/chains/chain-westend/src/lib.rs | 2 + bridges/relays/client-substrate/src/chain.rs | 9 + .../relays/client-substrate/src/test_chain.rs | 2 + bridges/relays/finality/README.md | 4 +- bridges/relays/finality/src/finality_loop.rs | 152 +++++++-- bridges/relays/finality/src/headers.rs | 143 ++++++++- bridges/relays/finality/src/lib.rs | 4 +- bridges/relays/finality/src/mock.rs | 5 + .../src/cli/relay_headers.rs | 18 +- .../src/cli/relay_headers_and_messages/mod.rs | 17 +- .../parachain_to_parachain.rs | 4 +- .../relay_to_parachain.rs | 4 +- .../relay_to_relay.rs | 4 +- .../src/cli/relay_parachains.rs | 14 +- .../lib-substrate-relay/src/finality/mod.rs | 16 +- .../src/finality/target.rs | 21 +- bridges/relays/lib-substrate-relay/src/lib.rs | 3 + .../src/on_demand/headers.rs | 16 +- .../src/on_demand/parachains.rs | 14 +- .../lib-substrate-relay/src/parachains/mod.rs | 2 + .../src/parachains/target.rs | 109 +++++-- .../relays/parachains/src/parachains_loop.rs | 303 ++++++++++++++++-- prdoc/pr_4157.prdoc | 29 ++ 26 files changed, 769 insertions(+), 132 deletions(-) create mode 100644 prdoc/pr_4157.prdoc diff --git a/bridges/chains/chain-kusama/src/lib.rs b/bridges/chains/chain-kusama/src/lib.rs index a81004afe81..fd7172c5869 100644 --- a/bridges/chains/chain-kusama/src/lib.rs +++ b/bridges/chains/chain-kusama/src/lib.rs @@ -67,6 +67,8 @@ pub const PARAS_PALLET_NAME: &str = "Paras"; /// Name of the With-Kusama GRANDPA pallet instance that is deployed at bridged chains. pub const WITH_KUSAMA_GRANDPA_PALLET_NAME: &str = "BridgeKusamaGrandpa"; +/// Name of the With-Kusama parachains pallet instance that is deployed at bridged chains. +pub const WITH_KUSAMA_BRIDGE_PARACHAINS_PALLET_NAME: &str = "BridgeKusamaParachains"; /// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot /// parachains. diff --git a/bridges/chains/chain-polkadot/src/lib.rs b/bridges/chains/chain-polkadot/src/lib.rs index 00d35783a9b..a8cac0467d5 100644 --- a/bridges/chains/chain-polkadot/src/lib.rs +++ b/bridges/chains/chain-polkadot/src/lib.rs @@ -69,6 +69,8 @@ pub const PARAS_PALLET_NAME: &str = "Paras"; /// Name of the With-Polkadot GRANDPA pallet instance that is deployed at bridged chains. pub const WITH_POLKADOT_GRANDPA_PALLET_NAME: &str = "BridgePolkadotGrandpa"; +/// Name of the With-Polkadot parachains pallet instance that is deployed at bridged chains. +pub const WITH_POLKADOT_BRIDGE_PARACHAINS_PALLET_NAME: &str = "BridgePolkadotParachains"; /// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot /// parachains. diff --git a/bridges/chains/chain-rococo/src/lib.rs b/bridges/chains/chain-rococo/src/lib.rs index 2385dd2cbb2..b290fe71c82 100644 --- a/bridges/chains/chain-rococo/src/lib.rs +++ b/bridges/chains/chain-rococo/src/lib.rs @@ -67,6 +67,8 @@ pub const PARAS_PALLET_NAME: &str = "Paras"; /// Name of the With-Rococo GRANDPA pallet instance that is deployed at bridged chains. pub const WITH_ROCOCO_GRANDPA_PALLET_NAME: &str = "BridgeRococoGrandpa"; +/// Name of the With-Rococo parachains pallet instance that is deployed at bridged chains. +pub const WITH_ROCOCO_BRIDGE_PARACHAINS_PALLET_NAME: &str = "BridgeRococoParachains"; /// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Rococo /// parachains. diff --git a/bridges/chains/chain-westend/src/lib.rs b/bridges/chains/chain-westend/src/lib.rs index b344b7f4bf9..ef451f7de0a 100644 --- a/bridges/chains/chain-westend/src/lib.rs +++ b/bridges/chains/chain-westend/src/lib.rs @@ -67,6 +67,8 @@ pub const PARAS_PALLET_NAME: &str = "Paras"; /// Name of the With-Westend GRANDPA pallet instance that is deployed at bridged chains. pub const WITH_WESTEND_GRANDPA_PALLET_NAME: &str = "BridgeWestendGrandpa"; +/// Name of the With-Westend parachains pallet instance that is deployed at bridged chains. +pub const WITH_WESTEND_BRIDGE_PARACHAINS_PALLET_NAME: &str = "BridgeWestendParachains"; /// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Westend /// parachains. diff --git a/bridges/relays/client-substrate/src/chain.rs b/bridges/relays/client-substrate/src/chain.rs index 2aba5f5674d..40269fe64c8 100644 --- a/bridges/relays/client-substrate/src/chain.rs +++ b/bridges/relays/client-substrate/src/chain.rs @@ -46,6 +46,12 @@ pub trait Chain: ChainBase + Clone { /// Keep in mind that this method is normally provided by the other chain, which is /// bridged with this chain. const BEST_FINALIZED_HEADER_ID_METHOD: &'static str; + /// Name of the runtime API method that is returning interval between source chain + /// headers that may be submitted for free to the target chain. + /// + /// Keep in mind that this method is normally provided by the other chain, which is + /// bridged with this chain. + const FREE_HEADERS_INTERVAL_METHOD: &'static str; /// Average block interval. /// @@ -75,6 +81,9 @@ pub trait ChainWithRuntimeVersion: Chain { pub trait RelayChain: Chain { /// Name of the `runtime_parachains::paras` pallet in the runtime of this chain. const PARAS_PALLET_NAME: &'static str; + /// Name of the `pallet-bridge-parachains`, deployed at the **bridged** chain to sync + /// parachains of **this** chain. + const WITH_CHAIN_BRIDGE_PARACHAINS_PALLET_NAME: &'static str; } /// Substrate-based chain that is using direct GRANDPA finality from minimal relay-client point of diff --git a/bridges/relays/client-substrate/src/test_chain.rs b/bridges/relays/client-substrate/src/test_chain.rs index d1203a2c58e..cfd241c022a 100644 --- a/bridges/relays/client-substrate/src/test_chain.rs +++ b/bridges/relays/client-substrate/src/test_chain.rs @@ -56,6 +56,7 @@ impl bp_runtime::Chain for TestChain { impl Chain for TestChain { const NAME: &'static str = "Test"; const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestMethod"; + const FREE_HEADERS_INTERVAL_METHOD: &'static str = "TestMethod"; const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); type SignedBlock = sp_runtime::generic::SignedBlock< @@ -124,6 +125,7 @@ impl bp_runtime::UnderlyingChainProvider for TestParachain { impl Chain for TestParachain { const NAME: &'static str = "TestParachain"; const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestParachainMethod"; + const FREE_HEADERS_INTERVAL_METHOD: &'static str = "TestParachainMethod"; const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); type SignedBlock = sp_runtime::generic::SignedBlock< diff --git a/bridges/relays/finality/README.md b/bridges/relays/finality/README.md index 92e765cea0e..89b9d139958 100644 --- a/bridges/relays/finality/README.md +++ b/bridges/relays/finality/README.md @@ -33,7 +33,9 @@ node. The transaction is then tracked by the relay until it is mined and finaliz The main entrypoint for the crate is the [`run` function](./src/finality_loop.rs), which takes source and target clients and [`FinalitySyncParams`](./src/finality_loop.rs) parameters. The most important parameter is the `only_mandatory_headers` - it is set to `true`, the relay will only submit mandatory headers. Since transactions -with mandatory headers are fee-free, the cost of running such relay is zero (in terms of fees). +with mandatory headers are fee-free, the cost of running such relay is zero (in terms of fees). If a similar, +`only_free_headers` parameter, is set to `true`, then free headers (if configured in the runtime) are also +relayed. ## Finality Relay Metrics diff --git a/bridges/relays/finality/src/finality_loop.rs b/bridges/relays/finality/src/finality_loop.rs index e31d8a70812..8b3def868a4 100644 --- a/bridges/relays/finality/src/finality_loop.rs +++ b/bridges/relays/finality/src/finality_loop.rs @@ -29,7 +29,7 @@ use crate::{ use async_trait::async_trait; use backoff::{backoff::Backoff, ExponentialBackoff}; use futures::{future::Fuse, select, Future, FutureExt}; -use num_traits::Saturating; +use num_traits::{Saturating, Zero}; use relay_utils::{ metrics::MetricsParams, relay_loop::Client as RelayClient, retry_backoff, FailedClient, HeaderId, MaybeConnectionError, TrackedTransactionStatus, TransactionTracker, @@ -39,6 +39,17 @@ use std::{ time::{Duration, Instant}, }; +/// Type of headers that we relay. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum HeadersToRelay { + /// Relay all headers. + All, + /// Relay only mandatory headers. + Mandatory, + /// Relay only free (including mandatory) headers. + Free, +} + /// Finality proof synchronization loop parameters. #[derive(Debug, Clone)] pub struct FinalitySyncParams { @@ -63,7 +74,7 @@ pub struct FinalitySyncParams { /// Timeout before we treat our transactions as lost and restart the whole sync process. pub stall_timeout: Duration, /// If true, only mandatory headers are relayed. - pub only_mandatory_headers: bool, + pub headers_to_relay: HeadersToRelay, } /// Source client used in finality synchronization loop. @@ -90,11 +101,16 @@ pub trait TargetClient: RelayClient { &self, ) -> Result, Self::Error>; + /// Get free source headers submission interval, if it is configured in the + /// target runtime. + async fn free_source_headers_interval(&self) -> Result, Self::Error>; + /// Submit header finality proof. async fn submit_finality_proof( &self, header: P::Header, proof: P::FinalityProof, + is_free_execution_expected: bool, ) -> Result; } @@ -104,9 +120,13 @@ pub fn metrics_prefix() -> String { format!("{}_to_{}_Sync", P::SOURCE_NAME, P::TARGET_NAME) } +/// Finality sync information. pub struct SyncInfo { + /// Best finalized header at the source client. pub best_number_at_source: P::Number, + /// Best source header, known to the target client. pub best_number_at_target: P::Number, + /// Whether the target client follows the same fork as the source client do. pub is_using_same_fork: bool, } @@ -183,6 +203,7 @@ impl Transaction Result { let header_number = header.number(); log::debug!( @@ -193,7 +214,9 @@ impl Transaction, TC: TargetClient

> Finality pub async fn select_header_to_submit( &mut self, info: &SyncInfo

, + free_headers_interval: Option, ) -> Result>, Error> { // to see that the loop is progressing log::trace!( @@ -302,9 +326,15 @@ impl, TC: TargetClient

> Finality ); // read missing headers - let selector = JustifiedHeaderSelector::new::(&self.source_client, info).await?; + let selector = JustifiedHeaderSelector::new::( + &self.source_client, + info, + self.sync_params.headers_to_relay, + free_headers_interval, + ) + .await?; // if we see that the header schedules GRANDPA change, we need to submit it - if self.sync_params.only_mandatory_headers { + if self.sync_params.headers_to_relay == HeadersToRelay::Mandatory { return Ok(selector.select_mandatory()) } @@ -312,7 +342,12 @@ impl, TC: TargetClient

> Finality // => even if we have already selected some header and its persistent finality proof, // we may try to select better header by reading non-persistent proofs from the stream self.finality_proofs_buf.fill(&mut self.finality_proofs_stream); - let maybe_justified_header = selector.select(&self.finality_proofs_buf); + let maybe_justified_header = selector.select( + info, + self.sync_params.headers_to_relay, + free_headers_interval, + &self.finality_proofs_buf, + ); // remove obsolete 'recent' finality proofs + keep its size under certain limit let oldest_finality_proof_to_keep = maybe_justified_header @@ -329,6 +364,7 @@ impl, TC: TargetClient

> Finality pub async fn run_iteration( &mut self, + free_headers_interval: Option, ) -> Result< Option>, Error, @@ -345,12 +381,16 @@ impl, TC: TargetClient

> Finality } // submit new header if we have something new - match self.select_header_to_submit(&info).await? { + match self.select_header_to_submit(&info, free_headers_interval).await? { Some(header) => { - let transaction = - Transaction::submit(&self.target_client, header.header, header.proof) - .await - .map_err(Error::Target)?; + let transaction = Transaction::submit( + &self.target_client, + header.header, + header.proof, + self.sync_params.headers_to_relay == HeadersToRelay::Free, + ) + .await + .map_err(Error::Target)?; self.best_submitted_number = Some(transaction.header_number); Ok(Some(transaction)) }, @@ -378,9 +418,11 @@ impl, TC: TargetClient

> Finality let exit_signal = exit_signal.fuse(); futures::pin_mut!(exit_signal, proof_submission_tx_tracker); + let free_headers_interval = free_headers_interval(&self.target_client).await?; + loop { // run loop iteration - let next_tick = match self.run_iteration().await { + let next_tick = match self.run_iteration(free_headers_interval).await { Ok(Some(tx)) => { proof_submission_tx_tracker .set(tx.track::(self.target_client.clone()).fuse()); @@ -433,6 +475,52 @@ impl, TC: TargetClient

> Finality } } +async fn free_headers_interval( + target_client: &impl TargetClient

, +) -> Result, FailedClient> { + match target_client.free_source_headers_interval().await { + Ok(Some(free_headers_interval)) if !free_headers_interval.is_zero() => { + log::trace!( + target: "bridge", + "Free headers interval for {} headers at {} is: {:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + free_headers_interval, + ); + Ok(Some(free_headers_interval)) + }, + Ok(Some(_free_headers_interval)) => { + log::trace!( + target: "bridge", + "Free headers interval for {} headers at {} is zero. Not submitting any free headers", + P::SOURCE_NAME, + P::TARGET_NAME, + ); + Ok(None) + }, + Ok(None) => { + log::trace!( + target: "bridge", + "Free headers interval for {} headers at {} is None. Not submitting any free headers", + P::SOURCE_NAME, + P::TARGET_NAME, + ); + + Ok(None) + }, + Err(e) => { + log::error!( + target: "bridge", + "Failed to read free headers interval for {} headers at {}: {:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + e, + ); + Err(FailedClient::Target) + }, + } +} + /// Run finality proofs synchronization loop. pub async fn run( source_client: impl SourceClient

, @@ -509,7 +597,7 @@ mod tests { tick: Duration::from_secs(0), recent_finality_proofs_limit: 1024, stall_timeout: Duration::from_secs(1), - only_mandatory_headers: false, + headers_to_relay: HeadersToRelay::All, } } @@ -593,8 +681,8 @@ mod tests { ); } - fn run_only_mandatory_headers_mode_test( - only_mandatory_headers: bool, + fn run_headers_to_relay_mode_test( + headers_to_relay: HeadersToRelay, has_mandatory_headers: bool, ) -> Option> { let (exit_sender, _) = futures::channel::mpsc::unbounded(); @@ -619,7 +707,7 @@ mod tests { tick: Duration::from_secs(0), recent_finality_proofs_limit: 0, stall_timeout: Duration::from_secs(0), - only_mandatory_headers, + headers_to_relay, }, None, ); @@ -628,16 +716,22 @@ mod tests { best_number_at_target: 5, is_using_same_fork: true, }; - finality_loop.select_header_to_submit(&info).await.unwrap() + finality_loop.select_header_to_submit(&info, Some(3)).await.unwrap() }) } #[test] - fn select_header_to_submit_skips_non_mandatory_headers_when_only_mandatory_headers_are_required( - ) { - assert_eq!(run_only_mandatory_headers_mode_test(true, false), None); + fn select_header_to_submit_may_select_non_mandatory_header() { + assert_eq!(run_headers_to_relay_mode_test(HeadersToRelay::Mandatory, false), None); assert_eq!( - run_only_mandatory_headers_mode_test(false, false), + run_headers_to_relay_mode_test(HeadersToRelay::Free, false), + Some(JustifiedHeader { + header: TestSourceHeader(false, 10, 10), + proof: TestFinalityProof(10) + }), + ); + assert_eq!( + run_headers_to_relay_mode_test(HeadersToRelay::All, false), Some(JustifiedHeader { header: TestSourceHeader(false, 10, 10), proof: TestFinalityProof(10) @@ -646,17 +740,23 @@ mod tests { } #[test] - fn select_header_to_submit_selects_mandatory_headers_when_only_mandatory_headers_are_required() - { + fn select_header_to_submit_may_select_mandatory_header() { + assert_eq!( + run_headers_to_relay_mode_test(HeadersToRelay::Mandatory, true), + Some(JustifiedHeader { + header: TestSourceHeader(true, 8, 8), + proof: TestFinalityProof(8) + }), + ); assert_eq!( - run_only_mandatory_headers_mode_test(true, true), + run_headers_to_relay_mode_test(HeadersToRelay::Free, true), Some(JustifiedHeader { header: TestSourceHeader(true, 8, 8), proof: TestFinalityProof(8) }), ); assert_eq!( - run_only_mandatory_headers_mode_test(false, true), + run_headers_to_relay_mode_test(HeadersToRelay::All, true), Some(JustifiedHeader { header: TestSourceHeader(true, 8, 8), proof: TestFinalityProof(8) @@ -690,7 +790,7 @@ mod tests { test_sync_params(), Some(metrics_sync.clone()), ); - finality_loop.run_iteration().await.unwrap() + finality_loop.run_iteration(None).await.unwrap() }); assert!(!metrics_sync.is_using_same_fork()); diff --git a/bridges/relays/finality/src/headers.rs b/bridges/relays/finality/src/headers.rs index 91f7cd0378e..5bba4a38456 100644 --- a/bridges/relays/finality/src/headers.rs +++ b/bridges/relays/finality/src/headers.rs @@ -16,10 +16,11 @@ use crate::{ finality_loop::SyncInfo, finality_proofs::FinalityProofsBuf, Error, FinalitySyncPipeline, - SourceClient, SourceHeader, TargetClient, + HeadersToRelay, SourceClient, SourceHeader, TargetClient, }; use bp_header_chain::FinalityProof; +use num_traits::Saturating; use std::cmp::Ordering; /// Unjustified headers container. Ordered by header number. @@ -50,9 +51,13 @@ pub enum JustifiedHeaderSelector { } impl JustifiedHeaderSelector

{ + /// Selects last header with persistent justification, missing from the target and matching + /// the `headers_to_relay` criteria. pub(crate) async fn new, TC: TargetClient

>( source_client: &SC, info: &SyncInfo

, + headers_to_relay: HeadersToRelay, + free_headers_interval: Option, ) -> Result> { let mut unjustified_headers = Vec::new(); let mut maybe_justified_header = None; @@ -70,12 +75,19 @@ impl JustifiedHeaderSelector

{ return Ok(Self::Mandatory(JustifiedHeader { header, proof })) }, (true, None) => return Err(Error::MissingMandatoryFinalityProof(header.number())), - (false, Some(proof)) => { + (false, Some(proof)) + if need_to_relay::

( + info, + headers_to_relay, + free_headers_interval, + &header, + ) => + { log::trace!(target: "bridge", "Header {:?} has persistent finality proof", header_number); unjustified_headers.clear(); maybe_justified_header = Some(JustifiedHeader { header, proof }); }, - (false, None) => { + _ => { unjustified_headers.push(header); }, } @@ -97,6 +109,7 @@ impl JustifiedHeaderSelector

{ }) } + /// Returns selected mandatory header if we have seen one. Otherwise returns `None`. pub fn select_mandatory(self) -> Option> { match self { JustifiedHeaderSelector::Mandatory(header) => Some(header), @@ -104,7 +117,15 @@ impl JustifiedHeaderSelector

{ } } - pub fn select(self, buf: &FinalityProofsBuf

) -> Option> { + /// Tries to improve previously selected header using ephemeral + /// justifications stream. + pub fn select( + self, + info: &SyncInfo

, + headers_to_relay: HeadersToRelay, + free_headers_interval: Option, + buf: &FinalityProofsBuf

, + ) -> Option> { let (unjustified_headers, maybe_justified_header) = match self { JustifiedHeaderSelector::Mandatory(justified_header) => return Some(justified_header), JustifiedHeaderSelector::Regular(unjustified_headers, justified_header) => @@ -122,7 +143,14 @@ impl JustifiedHeaderSelector

{ (maybe_finality_proof, maybe_unjustified_header) { match finality_proof.target_header_number().cmp(&unjustified_header.number()) { - Ordering::Equal => { + Ordering::Equal + if need_to_relay::

( + info, + headers_to_relay, + free_headers_interval, + &unjustified_header, + ) => + { log::trace!( target: "bridge", "Managed to improve selected {} finality proof {:?} to {:?}.", @@ -135,6 +163,10 @@ impl JustifiedHeaderSelector

{ proof: finality_proof.clone(), }) }, + Ordering::Equal => { + maybe_finality_proof = finality_proofs_iter.next(); + maybe_unjustified_header = unjustified_headers_iter.next(); + }, Ordering::Less => maybe_unjustified_header = unjustified_headers_iter.next(), Ordering::Greater => { maybe_finality_proof = finality_proofs_iter.next(); @@ -152,6 +184,27 @@ impl JustifiedHeaderSelector

{ } } +/// Returns true if we want to relay header `header_number`. +fn need_to_relay( + info: &SyncInfo

, + headers_to_relay: HeadersToRelay, + free_headers_interval: Option, + header: &P::Header, +) -> bool { + match headers_to_relay { + HeadersToRelay::All => true, + HeadersToRelay::Mandatory => header.is_mandatory(), + HeadersToRelay::Free => + header.is_mandatory() || + free_headers_interval + .map(|free_headers_interval| { + header.number().saturating_sub(info.best_number_at_target) >= + free_headers_interval + }) + .unwrap_or(false), + } +} + #[cfg(test)] mod tests { use super::*; @@ -159,13 +212,22 @@ mod tests { #[test] fn select_better_recent_finality_proof_works() { + let info = SyncInfo { + best_number_at_source: 10, + best_number_at_target: 5, + is_using_same_fork: true, + }; + // if there are no unjustified headers, nothing is changed let finality_proofs_buf = FinalityProofsBuf::::new(vec![TestFinalityProof(5)]); let justified_header = JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; let selector = JustifiedHeaderSelector::Regular(vec![], justified_header.clone()); - assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + assert_eq!( + selector.select(&info, HeadersToRelay::All, None, &finality_proofs_buf), + Some(justified_header) + ); // if there are no buffered finality proofs, nothing is changed let finality_proofs_buf = FinalityProofsBuf::::new(vec![]); @@ -175,7 +237,10 @@ mod tests { vec![TestSourceHeader(false, 5, 5)], justified_header.clone(), ); - assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + assert_eq!( + selector.select(&info, HeadersToRelay::All, None, &finality_proofs_buf), + Some(justified_header) + ); // if there's no intersection between recent finality proofs and unjustified headers, // nothing is changed @@ -189,7 +254,10 @@ mod tests { vec![TestSourceHeader(false, 9, 9), TestSourceHeader(false, 10, 10)], justified_header.clone(), ); - assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + assert_eq!( + selector.select(&info, HeadersToRelay::All, None, &finality_proofs_buf), + Some(justified_header) + ); // if there's intersection between recent finality proofs and unjustified headers, but there // are no proofs in this intersection, nothing is changed @@ -207,7 +275,10 @@ mod tests { ], justified_header.clone(), ); - assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + assert_eq!( + selector.select(&info, HeadersToRelay::All, None, &finality_proofs_buf), + Some(justified_header) + ); // if there's intersection between recent finality proofs and unjustified headers and // there's a proof in this intersection: @@ -228,11 +299,63 @@ mod tests { justified_header, ); assert_eq!( - selector.select(&finality_proofs_buf), + selector.select(&info, HeadersToRelay::All, None, &finality_proofs_buf), Some(JustifiedHeader { header: TestSourceHeader(false, 9, 9), proof: TestFinalityProof(9) }) ); + + // when only free headers needs to be relayed and there are no free headers + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(7), + TestFinalityProof(9), + ]); + let selector = JustifiedHeaderSelector::None(vec![ + TestSourceHeader(false, 8, 8), + TestSourceHeader(false, 9, 9), + TestSourceHeader(false, 10, 10), + ]); + assert_eq!( + selector.select(&info, HeadersToRelay::Free, Some(7), &finality_proofs_buf), + None, + ); + + // when only free headers needs to be relayed, mandatory header may be selected + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(6), + TestFinalityProof(9), + ]); + let selector = JustifiedHeaderSelector::None(vec![ + TestSourceHeader(false, 8, 8), + TestSourceHeader(true, 9, 9), + TestSourceHeader(false, 10, 10), + ]); + assert_eq!( + selector.select(&info, HeadersToRelay::Free, Some(7), &finality_proofs_buf), + Some(JustifiedHeader { + header: TestSourceHeader(true, 9, 9), + proof: TestFinalityProof(9) + }) + ); + + // when only free headers needs to be relayed and there is free header + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(7), + TestFinalityProof(9), + TestFinalityProof(14), + ]); + let selector = JustifiedHeaderSelector::None(vec![ + TestSourceHeader(false, 7, 7), + TestSourceHeader(false, 10, 10), + TestSourceHeader(false, 14, 14), + ]); + assert_eq!( + selector.select(&info, HeadersToRelay::Free, Some(7), &finality_proofs_buf), + Some(JustifiedHeader { + header: TestSourceHeader(false, 14, 14), + proof: TestFinalityProof(14) + }) + ); } } diff --git a/bridges/relays/finality/src/lib.rs b/bridges/relays/finality/src/lib.rs index 3579e68e1ef..4346f96674b 100644 --- a/bridges/relays/finality/src/lib.rs +++ b/bridges/relays/finality/src/lib.rs @@ -21,7 +21,9 @@ pub use crate::{ base::{FinalityPipeline, SourceClientBase}, - finality_loop::{metrics_prefix, run, FinalitySyncParams, SourceClient, TargetClient}, + finality_loop::{ + metrics_prefix, run, FinalitySyncParams, HeadersToRelay, SourceClient, TargetClient, + }, finality_proofs::{FinalityProofsBuf, FinalityProofsStream}, sync_loop_metrics::SyncLoopMetrics, }; diff --git a/bridges/relays/finality/src/mock.rs b/bridges/relays/finality/src/mock.rs index e3ec4e4d0d4..69357f71ce2 100644 --- a/bridges/relays/finality/src/mock.rs +++ b/bridges/relays/finality/src/mock.rs @@ -198,10 +198,15 @@ impl TargetClient for TestTargetClient { Ok(data.target_best_block_id) } + async fn free_source_headers_interval(&self) -> Result, TestError> { + Ok(Some(3)) + } + async fn submit_finality_proof( &self, header: TestSourceHeader, proof: TestFinalityProof, + _is_free_execution_expected: bool, ) -> Result { let mut data = self.data.lock(); (self.on_method_call)(&mut data); diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs index 90558ed4613..cf1957c7323 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs @@ -24,6 +24,7 @@ use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; use crate::{ cli::{bridge::*, chain_schema::*, PrometheusParams}, finality::SubstrateFinalitySyncPipeline, + HeadersToRelay, }; /// Chain headers relaying params. @@ -33,6 +34,10 @@ pub struct RelayHeadersParams { /// are relayed. #[structopt(long)] only_mandatory_headers: bool, + /// If passed, only free headers (mandatory and every Nth header, if configured in runtime) + /// are relayed. Overrides `only_mandatory_headers`. + #[structopt(long)] + only_free_headers: bool, #[structopt(flatten)] source: SourceConnectionParams, #[structopt(flatten)] @@ -43,11 +48,22 @@ pub struct RelayHeadersParams { prometheus_params: PrometheusParams, } +impl RelayHeadersParams { + fn headers_to_relay(&self) -> HeadersToRelay { + match (self.only_mandatory_headers, self.only_free_headers) { + (_, true) => HeadersToRelay::Free, + (true, false) => HeadersToRelay::Mandatory, + _ => HeadersToRelay::All, + } + } +} + /// Trait used for relaying headers between 2 chains. #[async_trait] pub trait HeadersRelayer: RelayToRelayHeadersCliBridge { /// Relay headers. async fn relay_headers(data: RelayHeadersParams) -> anyhow::Result<()> { + let headers_to_relay = data.headers_to_relay(); let source_client = data.source.into_client::().await?; let target_client = data.target.into_client::().await?; let target_transactions_mortality = data.target_sign.target_transactions_mortality; @@ -67,7 +83,7 @@ pub trait HeadersRelayer: RelayToRelayHeadersCliBridge { crate::finality::run::( source_client, target_client, - data.only_mandatory_headers, + headers_to_relay, target_transactions_params, metrics_params, ) diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs index 27e9f1c21ba..a796df6721b 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs @@ -40,7 +40,7 @@ use crate::{ cli::{bridge::MessagesCliBridge, HexLaneId, PrometheusParams}, messages_lane::{MessagesRelayLimits, MessagesRelayParams}, on_demand::OnDemandRelay, - TaggedAccount, TransactionParams, + HeadersToRelay, TaggedAccount, TransactionParams, }; use bp_messages::LaneId; use bp_runtime::BalanceOf; @@ -61,11 +61,25 @@ pub struct HeadersAndMessagesSharedParams { /// are relayed. #[structopt(long)] pub only_mandatory_headers: bool, + /// If passed, only free headers (mandatory and every Nth header, if configured in runtime) + /// are relayed. Overrides `only_mandatory_headers`. + #[structopt(long)] + pub only_free_headers: bool, #[structopt(flatten)] /// Prometheus metrics params. pub prometheus_params: PrometheusParams, } +impl HeadersAndMessagesSharedParams { + fn headers_to_relay(&self) -> HeadersToRelay { + match (self.only_mandatory_headers, self.only_free_headers) { + (_, true) => HeadersToRelay::Free, + (true, false) => HeadersToRelay::Mandatory, + _ => HeadersToRelay::All, + } + } +} + /// Bridge parameters, shared by all bridge types. pub struct Full2WayBridgeCommonParams< Left: ChainWithTransactions + ChainWithRuntimeVersion, @@ -418,6 +432,7 @@ mod tests { shared: HeadersAndMessagesSharedParams { lane: vec![HexLaneId([0x00, 0x00, 0x00, 0x00])], only_mandatory_headers: false, + only_free_headers: false, prometheus_params: PrometheusParams { no_prometheus: false, prometheus_host: "0.0.0.0".into(), diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs index 76accfa2905..7f6f4077782 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs @@ -180,7 +180,7 @@ where self.left_relay.clone(), self.common.right.client.clone(), self.common.right.tx_params.clone(), - self.common.shared.only_mandatory_headers, + self.common.shared.headers_to_relay(), Some(self.common.metrics_params.clone()), ); let right_relay_to_left_on_demand_headers = @@ -188,7 +188,7 @@ where self.right_relay.clone(), self.common.left.client.clone(), self.common.left.tx_params.clone(), - self.common.shared.only_mandatory_headers, + self.common.shared.headers_to_relay(), Some(self.common.metrics_params.clone()), ); diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs index b75ac3e60c2..5911fe49df4 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs @@ -171,7 +171,7 @@ where self.common.left.client.clone(), self.common.right.client.clone(), self.common.right.tx_params.clone(), - self.common.shared.only_mandatory_headers, + self.common.shared.headers_to_relay(), None, ); let right_relay_to_left_on_demand_headers = @@ -179,7 +179,7 @@ where self.right_relay.clone(), self.common.left.client.clone(), self.common.left.tx_params.clone(), - self.common.shared.only_mandatory_headers, + self.common.shared.headers_to_relay(), Some(self.common.metrics_params.clone()), ); let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs index b397ff50a20..832df4ae400 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs @@ -152,7 +152,7 @@ where self.common.left.client.clone(), self.common.right.client.clone(), self.common.right.tx_params.clone(), - self.common.shared.only_mandatory_headers, + self.common.shared.headers_to_relay(), None, ); let right_to_left_on_demand_headers = @@ -160,7 +160,7 @@ where self.common.right.client.clone(), self.common.left.client.clone(), self.common.left.tx_params.clone(), - self.common.shared.only_mandatory_headers, + self.common.shared.headers_to_relay(), None, ); diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs index e5a52349469..1425233add1 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs @@ -43,6 +43,10 @@ pub struct RelayParachainsParams { target: TargetConnectionParams, #[structopt(flatten)] target_sign: TargetSigningParams, + /// If passed, only free headers (those, available at "free" relay chain headers) + /// are relayed. + #[structopt(long)] + only_free_headers: bool, #[structopt(flatten)] prometheus_params: PrometheusParams, } @@ -59,9 +63,9 @@ where { /// Start relaying parachains finality. async fn relay_parachains(data: RelayParachainsParams) -> anyhow::Result<()> { - let source_client = data.source.into_client::().await?; + let source_chain_client = data.source.into_client::().await?; let source_client = ParachainsSource::::new( - source_client, + source_chain_client.clone(), Arc::new(Mutex::new(AvailableHeader::Missing)), ); @@ -69,9 +73,10 @@ where signer: data.target_sign.to_keypair::()?, mortality: data.target_sign.target_transactions_mortality, }; - let target_client = data.target.into_client::().await?; + let target_chain_client = data.target.into_client::().await?; let target_client = ParachainsTarget::::new( - target_client.clone(), + source_chain_client, + target_chain_client, target_transaction_params, ); @@ -83,6 +88,7 @@ where source_client, target_client, metrics_params, + data.only_free_headers, futures::future::pending(), ) .await diff --git a/bridges/relays/lib-substrate-relay/src/finality/mod.rs b/bridges/relays/lib-substrate-relay/src/finality/mod.rs index 206f628b143..a06857ae1d9 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/mod.rs @@ -25,7 +25,7 @@ use crate::{ use async_trait::async_trait; use bp_header_chain::justification::{GrandpaJustification, JustificationVerificationContext}; -use finality_relay::{FinalityPipeline, FinalitySyncPipeline}; +use finality_relay::{FinalityPipeline, FinalitySyncPipeline, HeadersToRelay}; use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; use relay_substrate_client::{ transaction_stall_timeout, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, @@ -115,6 +115,7 @@ pub trait SubmitFinalityProofCallBuilder { fn build_submit_finality_proof_call( header: SyncHeader>, proof: SubstrateFinalityProof

, + is_free_execution_expected: bool, context: <

::FinalityEngine as Engine>::FinalityVerificationContext, ) -> CallOf; } @@ -142,6 +143,7 @@ where fn build_submit_finality_proof_call( header: SyncHeader>, proof: GrandpaJustification>, + _is_free_execution_expected: bool, _context: JustificationVerificationContext, ) -> CallOf { BridgeGrandpaCall::::submit_finality_proof { @@ -176,6 +178,7 @@ macro_rules! generate_submit_finality_proof_call_builder { <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain > >, + _is_free_execution_expected: bool, _context: bp_header_chain::justification::JustificationVerificationContext, ) -> relay_substrate_client::CallOf< <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::TargetChain @@ -215,6 +218,7 @@ macro_rules! generate_submit_finality_proof_ex_call_builder { <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain > >, + is_free_execution_expected: bool, context: bp_header_chain::justification::JustificationVerificationContext, ) -> relay_substrate_client::CallOf< <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::TargetChain @@ -223,7 +227,8 @@ macro_rules! generate_submit_finality_proof_ex_call_builder { $bridge_grandpa($submit_finality_proof { finality_target: Box::new(header.into_inner()), justification: proof, - current_set_id: context.authority_set_id + current_set_id: context.authority_set_id, + is_free_execution_expected, }) } } @@ -235,15 +240,16 @@ macro_rules! generate_submit_finality_proof_ex_call_builder { pub async fn run( source_client: Client, target_client: Client, - only_mandatory_headers: bool, + headers_to_relay: HeadersToRelay, transaction_params: TransactionParams>, metrics_params: MetricsParams, ) -> anyhow::Result<()> { log::info!( target: "bridge", - "Starting {} -> {} finality proof relay", + "Starting {} -> {} finality proof relay: relaying {:?} headers", P::SourceChain::NAME, P::TargetChain::NAME, + headers_to_relay, ); finality_relay::run( @@ -260,7 +266,7 @@ pub async fn run( P::TargetChain::AVERAGE_BLOCK_INTERVAL, relay_utils::STALL_TIMEOUT, ), - only_mandatory_headers, + headers_to_relay, }, metrics_params, futures::future::pending(), diff --git a/bridges/relays/lib-substrate-relay/src/finality/target.rs b/bridges/relays/lib-substrate-relay/src/finality/target.rs index 18464d523f4..adbcfe0096d 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/target.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/target.rs @@ -25,9 +25,10 @@ use crate::{ }; use async_trait::async_trait; +use bp_runtime::BlockNumberOf; use finality_relay::TargetClient; use relay_substrate_client::{ - AccountKeyPairOf, Client, Error, HeaderIdOf, HeaderOf, SyncHeader, TransactionEra, + AccountKeyPairOf, Chain, Client, Error, HeaderIdOf, HeaderOf, SyncHeader, TransactionEra, TransactionTracker, UnsignedTransaction, }; use relay_utils::relay_loop::Client as RelayClient; @@ -103,10 +104,23 @@ impl TargetClient Result>, Self::Error> { + self.client + .typed_state_call( + P::SourceChain::FREE_HEADERS_INTERVAL_METHOD.into(), + (), + Some(self.client.best_header().await?.hash()), + ) + .await + } + async fn submit_finality_proof( &self, header: SyncHeader>, mut proof: SubstrateFinalityProof

, + is_free_execution_expected: bool, ) -> Result { // verify and runtime module at target chain may require optimized finality proof let context = @@ -115,7 +129,10 @@ impl TargetClient OnDemandHeadersRelay

{ source_client: Client, target_client: Client, target_transaction_params: TransactionParams>, - only_mandatory_headers: bool, + headers_to_relay: HeadersToRelay, metrics_params: Option, ) -> Self where @@ -94,7 +94,7 @@ impl OnDemandHeadersRelay

{ source_client, target_client, target_transaction_params, - only_mandatory_headers, + headers_to_relay, required_header_number, metrics_params, ) @@ -191,7 +191,7 @@ impl OnDemandRelay( source_client: Client, target_client: Client, target_transaction_params: TransactionParams>, - only_mandatory_headers: bool, + headers_to_relay: HeadersToRelay, required_header_number: RequiredHeaderNumberRef, metrics_params: Option, ) where @@ -346,11 +346,11 @@ async fn background_task( log::info!( target: "bridge", "[{}] Starting on-demand headers relay task\n\t\ - Only mandatory headers: {}\n\t\ + Headers to relay: {:?}\n\t\ Tx mortality: {:?} (~{}m)\n\t\ Stall timeout: {:?}", relay_task_name, - only_mandatory_headers, + headers_to_relay, target_transactions_mortality, stall_timeout.as_secs_f64() / 60.0f64, stall_timeout, @@ -367,7 +367,7 @@ async fn background_task( ), recent_finality_proofs_limit: RECENT_FINALITY_PROOFS_LIMIT, stall_timeout, - only_mandatory_headers, + headers_to_relay, }, metrics_params.clone().unwrap_or_else(MetricsParams::disabled), futures::future::pending(), diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs index f67c002bba7..966bdc31072 100644 --- a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs +++ b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -222,6 +222,7 @@ where proved_relay_block, vec![(para_id, para_hash)], para_proof, + false, )); Ok((proved_parachain_block, calls)) @@ -256,8 +257,11 @@ async fn background_task( let mut parachains_source = ParachainsSource::

::new(source_relay_client.clone(), required_para_header_ref.clone()); - let mut parachains_target = - ParachainsTarget::

::new(target_client.clone(), target_transaction_params.clone()); + let mut parachains_target = ParachainsTarget::

::new( + source_relay_client.clone(), + target_client.clone(), + target_transaction_params.clone(), + ); loop { select! { @@ -392,6 +396,8 @@ async fn background_task( parachains_source.clone(), parachains_target.clone(), MetricsParams::disabled(), + // we do not support free parachain headers relay in on-demand relays + false, futures::future::pending(), ) .fuse(), @@ -481,7 +487,7 @@ where let para_header_at_target = best_finalized_peer_header_at_self::< P::TargetChain, P::SourceParachain, - >(target.client(), best_target_block_hash) + >(target.target_client(), best_target_block_hash) .await; // if there are no parachain heads at the target (`NoParachainHeadAtTarget`), we'll need to // submit at least one. Otherwise the pallet will be treated as uninitialized and messages @@ -504,7 +510,7 @@ where let relay_header_at_target = best_finalized_peer_header_at_self::< P::TargetChain, P::SourceRelayChain, - >(target.client(), best_target_block_hash) + >(target.target_client(), best_target_block_hash) .await .map_err(map_target_err)?; diff --git a/bridges/relays/lib-substrate-relay/src/parachains/mod.rs b/bridges/relays/lib-substrate-relay/src/parachains/mod.rs index 722f9b61f9f..8b128bb770d 100644 --- a/bridges/relays/lib-substrate-relay/src/parachains/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/parachains/mod.rs @@ -71,6 +71,7 @@ pub trait SubmitParachainHeadsCallBuilder: at_relay_block: HeaderIdOf, parachains: Vec<(ParaId, ParaHash)>, parachain_heads_proof: ParaHeadsProof, + is_free_execution_expected: bool, ) -> CallOf; } @@ -97,6 +98,7 @@ where at_relay_block: HeaderIdOf, parachains: Vec<(ParaId, ParaHash)>, parachain_heads_proof: ParaHeadsProof, + _is_free_execution_expected: bool, ) -> CallOf { BridgeParachainsCall::::submit_parachain_heads { at_relay_block: (at_relay_block.0, at_relay_block.1), diff --git a/bridges/relays/lib-substrate-relay/src/parachains/target.rs b/bridges/relays/lib-substrate-relay/src/parachains/target.rs index 6df7bc0a742..e10d15b6edf 100644 --- a/bridges/relays/lib-substrate-relay/src/parachains/target.rs +++ b/bridges/relays/lib-substrate-relay/src/parachains/target.rs @@ -24,42 +24,53 @@ use crate::{ }; use async_trait::async_trait; -use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; -use bp_runtime::HeaderIdProvider; -use codec::Decode; +use bp_parachains::{ + ImportedParaHeadsKeyProvider, ParaInfo, ParaStoredHeaderData, ParasInfoKeyProvider, +}; +use bp_polkadot_core::{ + parachains::{ParaHash, ParaHeadsProof, ParaId}, + BlockNumber as RelayBlockNumber, +}; +use bp_runtime::{ + Chain as ChainBase, HeaderId, HeaderIdProvider, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, +}; use parachains_relay::parachains_loop::TargetClient; use relay_substrate_client::{ - AccountIdOf, AccountKeyPairOf, Chain, Client, Error as SubstrateError, HeaderIdOf, - ParachainBase, TransactionEra, TransactionTracker, UnsignedTransaction, + AccountIdOf, AccountKeyPairOf, BlockNumberOf, Chain, Client, Error as SubstrateError, + HeaderIdOf, ParachainBase, RelayChain, TransactionEra, TransactionTracker, UnsignedTransaction, }; use relay_utils::relay_loop::Client as RelayClient; -use sp_core::{Bytes, Pair}; +use sp_core::Pair; /// Substrate client as parachain heads source. pub struct ParachainsTarget { - client: Client, + source_client: Client, + target_client: Client, transaction_params: TransactionParams>, } impl ParachainsTarget

{ /// Creates new parachains target client. pub fn new( - client: Client, + source_client: Client, + target_client: Client, transaction_params: TransactionParams>, ) -> Self { - ParachainsTarget { client, transaction_params } + ParachainsTarget { source_client, target_client, transaction_params } } /// Returns reference to the underlying RPC client. - pub fn client(&self) -> &Client { - &self.client + pub fn target_client(&self) -> &Client { + &self.target_client } } impl Clone for ParachainsTarget

{ fn clone(&self) -> Self { ParachainsTarget { - client: self.client.clone(), + source_client: self.source_client.clone(), + target_client: self.target_client.clone(), transaction_params: self.transaction_params.clone(), } } @@ -70,7 +81,9 @@ impl RelayClient for ParachainsTarget

{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { - self.client.reconnect().await + self.target_client.reconnect().await?; + self.source_client.reconnect().await?; + Ok(()) } } @@ -79,11 +92,13 @@ impl

TargetClient> for ParachainsTarget

where P: SubstrateParachainsPipeline, AccountIdOf: From< as Pair>::Public>, + P::SourceParachain: ChainBase, + P::SourceRelayChain: ChainBase, { type TransactionTracker = TransactionTracker>; async fn best_block(&self) -> Result, Self::Error> { - let best_header = self.client.best_header().await?; + let best_header = self.target_client.best_header().await?; let best_id = best_header.id(); Ok(best_id) @@ -93,7 +108,7 @@ where &self, at_block: &HeaderIdOf, ) -> Result, Self::Error> { - self.client + self.target_client .typed_state_call::<_, Option>>( P::SourceRelayChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), (), @@ -104,23 +119,57 @@ where .unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized)) } + async fn free_source_relay_headers_interval( + &self, + ) -> Result>, Self::Error> { + self.target_client + .typed_state_call(P::SourceRelayChain::FREE_HEADERS_INTERVAL_METHOD.into(), (), None) + .await + } + async fn parachain_head( &self, at_block: HeaderIdOf, - ) -> Result>, Self::Error> { - let encoded_best_finalized_source_para_block = self - .client - .state_call( - P::SourceParachain::BEST_FINALIZED_HEADER_ID_METHOD.into(), - Bytes(Vec::new()), - Some(at_block.1), - ) - .await?; + ) -> Result< + Option<(HeaderIdOf, HeaderIdOf)>, + Self::Error, + > { + // read best parachain head from the target bridge-parachains pallet + let storage_key = ParasInfoKeyProvider::final_key( + P::SourceRelayChain::WITH_CHAIN_BRIDGE_PARACHAINS_PALLET_NAME, + &P::SourceParachain::PARACHAIN_ID.into(), + ); + let storage_value: Option = + self.target_client.storage_value(storage_key, Some(at_block.hash())).await?; + let para_info = match storage_value { + Some(para_info) => para_info, + None => return Ok(None), + }; + + // now we need to get full header ids. For source relay chain it is simple, because we + // are connected + let relay_header_id = self + .source_client + .header_by_number(para_info.best_head_hash.at_relay_block_number) + .await? + .id(); - Ok(Option::>::decode( - &mut &encoded_best_finalized_source_para_block.0[..], - ) - .map_err(SubstrateError::ResponseParseFailed)?) + // for parachain, we need to read from the target chain runtime storage + let storage_key = ImportedParaHeadsKeyProvider::final_key( + P::SourceRelayChain::WITH_CHAIN_BRIDGE_PARACHAINS_PALLET_NAME, + &P::SourceParachain::PARACHAIN_ID.into(), + ¶_info.best_head_hash.head_hash, + ); + let storage_value: Option = + self.target_client.storage_value(storage_key, Some(at_block.hash())).await?; + let para_head_number = match storage_value { + Some(para_head_data) => + para_head_data.decode_parachain_head_data::()?.number, + None => return Ok(None), + }; + + let para_head_id = HeaderId(para_head_number, para_info.best_head_hash.head_hash); + Ok(Some((relay_header_id, para_head_id))) } async fn submit_parachain_head_proof( @@ -128,14 +177,16 @@ where at_relay_block: HeaderIdOf, updated_head_hash: ParaHash, proof: ParaHeadsProof, + is_free_execution_expected: bool, ) -> Result { let transaction_params = self.transaction_params.clone(); let call = P::SubmitParachainHeadsCallBuilder::build_submit_parachain_heads_call( at_relay_block, vec![(ParaId(P::SourceParachain::PARACHAIN_ID), updated_head_hash)], proof, + is_free_execution_expected, ); - self.client + self.target_client .submit_and_watch_signed_extrinsic( &transaction_params.signer, move |best_block_id, transaction_nonce| { diff --git a/bridges/relays/parachains/src/parachains_loop.rs b/bridges/relays/parachains/src/parachains_loop.rs index 41ebbf5aade..55f236eeac1 100644 --- a/bridges/relays/parachains/src/parachains_loop.rs +++ b/bridges/relays/parachains/src/parachains_loop.rs @@ -25,7 +25,7 @@ use futures::{ future::{FutureExt, Shared}, poll, select_biased, }; -use relay_substrate_client::{Chain, HeaderIdOf, ParachainBase}; +use relay_substrate_client::{BlockNumberOf, Chain, HeaderIdOf, ParachainBase}; use relay_utils::{ metrics::MetricsParams, relay_loop::Client as RelayClient, FailedClient, TrackedTransactionStatus, TransactionTracker, @@ -96,17 +96,27 @@ pub trait TargetClient: RelayClient { /// Get best block id. async fn best_block(&self) -> Result, Self::Error>; - /// Get best finalized source relay chain block id. + /// Get best finalized source relay chain block id. If `free_source_relay_headers_interval` + /// is `Some(_)`, the returned async fn best_finalized_source_relay_chain_block( &self, at_block: &HeaderIdOf, ) -> Result, Self::Error>; + /// Get free source **relay** headers submission interval, if it is configured in the + /// target runtime. We assume that the target chain will accept parachain header, proved + /// at such relay header for free. + async fn free_source_relay_headers_interval( + &self, + ) -> Result>, Self::Error>; /// Get parachain head id at given block. async fn parachain_head( &self, at_block: HeaderIdOf, - ) -> Result>, Self::Error>; + ) -> Result< + Option<(HeaderIdOf, HeaderIdOf)>, + Self::Error, + >; /// Submit parachain heads proof. async fn submit_parachain_head_proof( @@ -114,6 +124,7 @@ pub trait TargetClient: RelayClient { at_source_block: HeaderIdOf, para_head_hash: ParaHash, proof: ParaHeadsProof, + is_free_execution_expected: bool, ) -> Result; } @@ -133,6 +144,7 @@ pub async fn run( source_client: impl SourceClient

, target_client: impl TargetClient

, metrics_params: MetricsParams, + only_free_headers: bool, exit_signal: impl Future + 'static + Send, ) -> Result<(), relay_utils::Error> where @@ -145,7 +157,13 @@ where .expose() .await? .run(metrics_prefix::

(), move |source_client, target_client, metrics| { - run_until_connection_lost(source_client, target_client, metrics, exit_signal.clone()) + run_until_connection_lost( + source_client, + target_client, + metrics, + only_free_headers, + exit_signal.clone(), + ) }) .await } @@ -155,6 +173,7 @@ async fn run_until_connection_lost( source_client: impl SourceClient

, target_client: impl TargetClient

, metrics: Option, + only_free_headers: bool, exit_signal: impl Future + Send, ) -> Result<(), FailedClient> where @@ -166,6 +185,47 @@ where P::TargetChain::AVERAGE_BLOCK_INTERVAL, ); + // free parachain header = header, available (proved) at free relay chain block. Let's + // read interval of free source relay chain blocks from target client + let free_source_relay_headers_interval = if only_free_headers { + let free_source_relay_headers_interval = + target_client.free_source_relay_headers_interval().await.map_err(|e| { + log::warn!( + target: "bridge", + "Failed to read free {} headers interval at {}: {:?}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + e, + ); + FailedClient::Target + })?; + match free_source_relay_headers_interval { + Some(free_source_relay_headers_interval) if free_source_relay_headers_interval != 0 => { + log::trace!( + target: "bridge", + "Free {} headers interval at {}: {:?}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + free_source_relay_headers_interval, + ); + free_source_relay_headers_interval + }, + _ => { + log::warn!( + target: "bridge", + "Invalid free {} headers interval at {}: {:?}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + free_source_relay_headers_interval, + ); + return Err(FailedClient::Target) + }, + } + } else { + // ignore - we don't need it + 0 + }; + let mut submitted_heads_tracker: Option> = None; futures::pin_mut!(exit_signal); @@ -211,7 +271,7 @@ where log::warn!(target: "bridge", "Failed to read best {} block: {:?}", P::SourceRelayChain::NAME, e); FailedClient::Target })?; - let head_at_target = + let (relay_of_head_at_target, head_at_target) = read_head_at_target(&target_client, metrics.as_ref(), &best_target_block).await?; // check if our transaction has been mined @@ -238,9 +298,9 @@ where } } - // we have no active transaction and may need to update heads, but do we have something for - // update? - let best_finalized_relay_block = target_client + // in all-headers strategy we'll be submitting para head, available at + // `best_finalized_relay_block_at_target` + let best_finalized_relay_block_at_target = target_client .best_finalized_source_relay_chain_block(&best_target_block) .await .map_err(|e| { @@ -253,21 +313,56 @@ where ); FailedClient::Target })?; + + // ..but if we only need to submit free headers, we need to submit para + // head, available at best free source relay chain header, known to the + // target chain + let prove_at_relay_block = if only_free_headers { + match relay_of_head_at_target { + Some(relay_of_head_at_target) => { + // find last free relay chain header in the range that we are interested in + let scan_range_begin = relay_of_head_at_target.number(); + let scan_range_end = best_finalized_relay_block_at_target.number(); + if scan_range_end.saturating_sub(scan_range_begin) < + free_source_relay_headers_interval + { + // there are no new **free** relay chain headers in the range + log::trace!( + target: "bridge", + "Waiting for new free {} headers at {}: scanned {:?}..={:?}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + scan_range_begin, + scan_range_end, + ); + continue; + } + + // we may submit new parachain head for free + best_finalized_relay_block_at_target + }, + None => { + // no parachain head at target => let's submit first one + best_finalized_relay_block_at_target + }, + } + } else { + best_finalized_relay_block_at_target + }; + + // now let's check if we need to update parachain head at all let head_at_source = - read_head_at_source(&source_client, metrics.as_ref(), &best_finalized_relay_block) - .await?; + read_head_at_source(&source_client, metrics.as_ref(), &prove_at_relay_block).await?; let is_update_required = is_update_required::

( head_at_source, head_at_target, - best_finalized_relay_block, + prove_at_relay_block, best_target_block, ); if is_update_required { - let (head_proof, head_hash) = source_client - .prove_parachain_head(best_finalized_relay_block) - .await - .map_err(|e| { + let (head_proof, head_hash) = + source_client.prove_parachain_head(prove_at_relay_block).await.map_err(|e| { log::warn!( target: "bridge", "Failed to prove {} parachain ParaId({}) heads: {:?}", @@ -283,12 +378,17 @@ where P::SourceRelayChain::NAME, P::SourceParachain::PARACHAIN_ID, P::TargetChain::NAME, - best_finalized_relay_block, + prove_at_relay_block, head_hash, ); let transaction_tracker = target_client - .submit_parachain_head_proof(best_finalized_relay_block, head_hash, head_proof) + .submit_parachain_head_proof( + prove_at_relay_block, + head_hash, + head_proof, + only_free_headers, + ) .await .map_err(|e| { log::warn!( @@ -311,7 +411,7 @@ where fn is_update_required( head_at_source: AvailableHeader>, head_at_target: Option>, - best_finalized_relay_block_at_source: HeaderIdOf, + prove_at_relay_block: HeaderIdOf, best_target_block: HeaderIdOf, ) -> bool where @@ -326,7 +426,7 @@ where P::SourceParachain::PARACHAIN_ID, P::TargetChain::NAME, P::SourceRelayChain::NAME, - best_finalized_relay_block_at_source, + prove_at_relay_block, head_at_source, P::TargetChain::NAME, best_target_block, @@ -413,24 +513,28 @@ async fn read_head_at_source( } } -/// Reads parachain head from the target client. +/// Reads parachain head from the target client. Also returns source relay chain header +/// that has been used to prove that head. async fn read_head_at_target( target_client: &impl TargetClient

, metrics: Option<&ParachainsLoopMetrics>, at_block: &HeaderIdOf, -) -> Result>, FailedClient> { +) -> Result< + (Option>, Option>), + FailedClient, +> { let para_head_id = target_client.parachain_head(*at_block).await; match para_head_id { - Ok(Some(para_head_id)) => { + Ok(Some((relay_header_id, para_head_id))) => { if let Some(metrics) = metrics { metrics.update_best_parachain_block_at_target( ParaId(P::SourceParachain::PARACHAIN_ID), para_head_id.number(), ); } - Ok(Some(para_head_id)) + Ok((Some(relay_header_id), Some(para_head_id))) }, - Ok(None) => Ok(None), + Ok(None) => Ok((None, None)), Err(e) => { log::warn!( target: "bridge", @@ -543,6 +647,7 @@ mod tests { use relay_substrate_client::test_chain::{TestChain, TestParachain}; use relay_utils::{HeaderId, MaybeConnectionError}; use sp_core::H256; + use std::collections::HashMap; const PARA_10_HASH: ParaHash = H256([10u8; 32]); const PARA_20_HASH: ParaHash = H256([20u8; 32]); @@ -590,14 +695,21 @@ mod tests { #[derive(Clone, Debug)] struct TestClientData { source_sync_status: Result, - source_head: Result>, TestError>, + source_head: HashMap< + BlockNumberOf, + Result>, TestError>, + >, source_proof: Result<(), TestError>, + target_free_source_relay_headers_interval: + Result>, TestError>, target_best_block: Result, TestError>, target_best_finalized_source_block: Result, TestError>, - target_head: Result>, TestError>, + #[allow(clippy::type_complexity)] + target_head: Result, HeaderIdOf)>, TestError>, target_submit_result: Result<(), TestError>, + submitted_proof_at_source_relay_block: Option>, exit_signal_sender: Option>>, } @@ -605,14 +717,18 @@ mod tests { pub fn minimal() -> Self { TestClientData { source_sync_status: Ok(true), - source_head: Ok(AvailableHeader::Available(HeaderId(0, PARA_20_HASH))), + source_head: vec![(0, Ok(AvailableHeader::Available(HeaderId(0, PARA_20_HASH))))] + .into_iter() + .collect(), source_proof: Ok(()), + target_free_source_relay_headers_interval: Ok(None), target_best_block: Ok(HeaderId(0, Default::default())), target_best_finalized_source_block: Ok(HeaderId(0, Default::default())), target_head: Ok(None), target_submit_result: Ok(()), + submitted_proof_at_source_relay_block: None, exit_signal_sender: None, } } @@ -649,16 +765,24 @@ mod tests { async fn parachain_head( &self, - _at_block: HeaderIdOf, + at_block: HeaderIdOf, ) -> Result>, TestError> { - self.data.lock().await.source_head.clone() + self.data + .lock() + .await + .source_head + .get(&at_block.0) + .expect(&format!("SourceClient::parachain_head({})", at_block.0)) + .clone() } async fn prove_parachain_head( &self, - _at_block: HeaderIdOf, + at_block: HeaderIdOf, ) -> Result<(ParaHeadsProof, ParaHash), TestError> { - let head = *self.data.lock().await.source_head.clone()?.as_available().unwrap(); + let head_result = + SourceClient::::parachain_head(self, at_block).await?; + let head = head_result.as_available().unwrap(); let storage_proof = vec![head.hash().encode()]; let proof = (ParaHeadsProof { storage_proof }, head.hash()); self.data.lock().await.source_proof.clone().map(|_| proof) @@ -680,21 +804,29 @@ mod tests { self.data.lock().await.target_best_finalized_source_block.clone() } + async fn free_source_relay_headers_interval( + &self, + ) -> Result>, TestError> { + self.data.lock().await.target_free_source_relay_headers_interval.clone() + } + async fn parachain_head( &self, _at_block: HeaderIdOf, - ) -> Result>, TestError> { + ) -> Result, HeaderIdOf)>, TestError> { self.data.lock().await.target_head.clone() } async fn submit_parachain_head_proof( &self, - _at_source_block: HeaderIdOf, + at_source_block: HeaderIdOf, _updated_parachain_head: ParaHash, _proof: ParaHeadsProof, + _is_free_execution_expected: bool, ) -> Result { let mut data = self.data.lock().await; data.target_submit_result.clone()?; + data.submitted_proof_at_source_relay_block = Some(at_source_block); if let Some(mut exit_signal_sender) = data.exit_signal_sender.take() { exit_signal_sender.send(()).await.unwrap(); @@ -715,6 +847,7 @@ mod tests { TestClient::from(test_source_client), TestClient::from(TestClientData::minimal()), None, + false, futures::future::pending(), )), Err(FailedClient::Source), @@ -731,6 +864,7 @@ mod tests { TestClient::from(TestClientData::minimal()), TestClient::from(test_target_client), None, + false, futures::future::pending(), )), Err(FailedClient::Target), @@ -747,6 +881,7 @@ mod tests { TestClient::from(TestClientData::minimal()), TestClient::from(test_target_client), None, + false, futures::future::pending(), )), Err(FailedClient::Target), @@ -763,6 +898,7 @@ mod tests { TestClient::from(TestClientData::minimal()), TestClient::from(test_target_client), None, + false, futures::future::pending(), )), Err(FailedClient::Target), @@ -772,13 +908,14 @@ mod tests { #[test] fn when_source_client_fails_to_read_heads() { let mut test_source_client = TestClientData::minimal(); - test_source_client.source_head = Err(TestError::Error); + test_source_client.source_head.insert(0, Err(TestError::Error)); assert_eq!( async_std::task::block_on(run_until_connection_lost( TestClient::from(test_source_client), TestClient::from(TestClientData::minimal()), None, + false, futures::future::pending(), )), Err(FailedClient::Source), @@ -795,6 +932,7 @@ mod tests { TestClient::from(test_source_client), TestClient::from(TestClientData::minimal()), None, + false, futures::future::pending(), )), Err(FailedClient::Source), @@ -811,6 +949,7 @@ mod tests { TestClient::from(TestClientData::minimal()), TestClient::from(test_target_client), None, + false, futures::future::pending(), )), Err(FailedClient::Target), @@ -825,12 +964,108 @@ mod tests { TestClient::from(TestClientData::minimal()), TestClient::from(TestClientData::with_exit_signal_sender(exit_signal_sender)), None, + false, exit_signal.into_future().map(|(_, _)| ()), )), Ok(()), ); } + #[async_std::test] + async fn free_headers_are_relayed() { + // prepare following case: + // 1) best source relay at target: 95 + // 2) best source parachain at target: 5 at relay 50 + // 3) free headers interval: 10 + // 4) at source relay chain block 90 source parachain block is 9 + // + + // 5) best finalized source relay chain block is 95 + // 6) at source relay chain block 95 source parachain block is 42 + // => + // parachain block 42 would have been relayed, because 95 - 50 > 10 + let (exit_signal_sender, exit_signal) = futures::channel::mpsc::unbounded(); + let clients_data = TestClientData { + source_sync_status: Ok(true), + source_head: vec![ + (90, Ok(AvailableHeader::Available(HeaderId(9, [9u8; 32].into())))), + (95, Ok(AvailableHeader::Available(HeaderId(42, [42u8; 32].into())))), + ] + .into_iter() + .collect(), + source_proof: Ok(()), + + target_free_source_relay_headers_interval: Ok(Some(10)), + target_best_block: Ok(HeaderId(200, [200u8; 32].into())), + target_best_finalized_source_block: Ok(HeaderId(95, [95u8; 32].into())), + target_head: Ok(Some((HeaderId(50, [50u8; 32].into()), HeaderId(5, [5u8; 32].into())))), + target_submit_result: Ok(()), + + submitted_proof_at_source_relay_block: None, + exit_signal_sender: Some(Box::new(exit_signal_sender)), + }; + + let source_client = TestClient::from(clients_data.clone()); + let target_client = TestClient::from(clients_data); + assert_eq!( + run_until_connection_lost( + source_client, + target_client.clone(), + None, + true, + exit_signal.into_future().map(|(_, _)| ()), + ) + .await, + Ok(()), + ); + + assert_eq!( + target_client + .data + .lock() + .await + .submitted_proof_at_source_relay_block + .map(|id| id.0), + Some(95) + ); + + // now source relay block chain 104 is mined with parachain head #84 + // => since 104 - 95 < 10, there are no free headers + // => nothing is submitted + let mut clients_data: TestClientData = target_client.data.lock().await.clone(); + clients_data + .source_head + .insert(104, Ok(AvailableHeader::Available(HeaderId(84, [84u8; 32].into())))); + clients_data.target_best_finalized_source_block = Ok(HeaderId(104, [104u8; 32].into())); + clients_data.target_head = + Ok(Some((HeaderId(95, [95u8; 32].into()), HeaderId(42, [42u8; 32].into())))); + clients_data.target_best_block = Ok(HeaderId(255, [255u8; 32].into())); + clients_data.exit_signal_sender = None; + + let source_client = TestClient::from(clients_data.clone()); + let target_client = TestClient::from(clients_data); + assert_eq!( + run_until_connection_lost( + source_client, + target_client.clone(), + None, + true, + async_std::task::sleep(std::time::Duration::from_millis(100)), + ) + .await, + Ok(()), + ); + + assert_eq!( + target_client + .data + .lock() + .await + .submitted_proof_at_source_relay_block + .map(|id| id.0), + Some(95) + ); + } + fn test_tx_tracker() -> SubmittedHeadsTracker { SubmittedHeadsTracker::new( AvailableHeader::Available(HeaderId(20, PARA_20_HASH)), diff --git a/prdoc/pr_4157.prdoc b/prdoc/pr_4157.prdoc new file mode 100644 index 00000000000..783eaa2dd42 --- /dev/null +++ b/prdoc/pr_4157.prdoc @@ -0,0 +1,29 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Bridge: added free headers submission support to the substrate-relay" + +doc: + - audience: Node Dev + description: | + Bridge finality and parachains relayer now supports mode, where it only submits some headers + for free. There's a setting in a runtime configuration, which introduces this "free header" + concept. Submitting such header is considered a common good deed, so it is free for relayers. + +crates: + - name: bp-bridge-hub-kusama + bump: major + - name: bp-bridge-hub-polkadot + bump: major + - name: bp-bridge-hub-rococo + bump: major + - name: bp-bridge-hub-westend + bump: major + - name: relay-substrate-client + bump: major + - name: finality-relay + bump: major + - name: substrate-relay-helper + bump: major + - name: parachains-relay + bump: major -- GitLab From b801d001e812778b1547352468d5f243b7070994 Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Thu, 25 Apr 2024 10:47:46 +0200 Subject: [PATCH 003/170] Contracts: Stabilize XCM host fns (#4213) See https://github.com/paritytech/ink/pull/1912 https://github.com/paritytech/ink-docs/pull/338 --- prdoc/pr_4213.prdoc | 11 +++++++++++ substrate/frame/contracts/src/lib.rs | 4 ++-- substrate/frame/contracts/src/wasm/runtime.rs | 2 -- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 prdoc/pr_4213.prdoc diff --git a/prdoc/pr_4213.prdoc b/prdoc/pr_4213.prdoc new file mode 100644 index 00000000000..ce7eb65969b --- /dev/null +++ b/prdoc/pr_4213.prdoc @@ -0,0 +1,11 @@ +title: "[pallet-contracts] stabilize xcm_send and xcm_execute" + +doc: + - audience: Runtime Dev + description: | + `xcm_send` and `xcm_execute` are currently marked as unstable. This PR stabilizes them. +crates: +- name: pallet-contracts + bump: major + + diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index 20cf7d1651c..0045d72141c 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -223,14 +223,14 @@ pub struct Environment { pub struct ApiVersion(u16); impl Default for ApiVersion { fn default() -> Self { - Self(2) + Self(3) } } #[test] fn api_version_is_up_to_date() { assert_eq!( - 109, + 111, crate::wasm::STABLE_API_COUNT, "Stable API count has changed. Bump the returned value of ApiVersion::default() and update the test." ); diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 160dfa0d2f3..52ceda99edb 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -2104,7 +2104,6 @@ pub mod env { /// Execute an XCM program locally, using the contract's address as the origin. /// See [`pallet_contracts_uapi::HostFn::execute_xcm`]. - #[unstable] fn xcm_execute( ctx: _, memory: _, @@ -2143,7 +2142,6 @@ pub mod env { /// Send an XCM program from the contract to the specified destination. /// See [`pallet_contracts_uapi::HostFn::send_xcm`]. - #[unstable] fn xcm_send( ctx: _, memory: _, -- GitLab From 077041788070eddc6f3c1043b9cb6146585b1469 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Thu, 25 Apr 2024 12:01:21 +0300 Subject: [PATCH 004/170] [XCM] Treat recursion limit error as transient in the MQ (#4202) Changes: - Add new error variant `ProcessMessageError::StackLimitReached` and treat XCM error `ExceedsStackLimit` as such. --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Branislav Kontur --- .../xcm-builder/src/process_xcm_message.rs | 46 +++++++- polkadot/xcm/xcm-executor/src/lib.rs | 7 ++ prdoc/pr_4202.prdoc | 16 +++ substrate/frame/message-queue/src/lib.rs | 16 ++- substrate/frame/message-queue/src/mock.rs | 3 + substrate/frame/message-queue/src/tests.rs | 101 +++++++++++++++++- .../frame/support/src/traits/messages.rs | 4 + 7 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 prdoc/pr_4202.prdoc diff --git a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs index bcf91d8e68c..7760274f6e2 100644 --- a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs +++ b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs @@ -102,7 +102,12 @@ impl< target: LOG_TARGET, "XCM message execution error: {error:?}", ); - (required, Err(ProcessMessageError::Unsupported)) + let error = match error { + xcm::latest::Error::ExceedsStackLimit => ProcessMessageError::StackLimitReached, + _ => ProcessMessageError::Unsupported, + }; + + (required, Err(error)) }, }; meter.consume(consumed); @@ -148,6 +153,45 @@ mod tests { } } + #[test] + fn process_message_exceeds_limits_fails() { + struct MockedExecutor; + impl ExecuteXcm<()> for MockedExecutor { + type Prepared = xcm_executor::WeighedMessage<()>; + fn prepare( + message: xcm::latest::Xcm<()>, + ) -> core::result::Result> { + Ok(xcm_executor::WeighedMessage::new(Weight::zero(), message)) + } + fn execute( + _: impl Into, + _: Self::Prepared, + _: &mut XcmHash, + _: Weight, + ) -> Outcome { + Outcome::Error { error: xcm::latest::Error::ExceedsStackLimit } + } + fn charge_fees(_location: impl Into, _fees: Assets) -> xcm::latest::Result { + unreachable!() + } + } + + type Processor = ProcessXcmMessage; + + let xcm = VersionedXcm::V4(xcm::latest::Xcm::<()>(vec![ + xcm::latest::Instruction::<()>::ClearOrigin, + ])); + assert_err!( + Processor::process_message( + &xcm.encode(), + ORIGIN, + &mut WeightMeter::new(), + &mut [0; 32] + ), + ProcessMessageError::StackLimitReached, + ); + } + #[test] fn process_message_overweight_fails() { for msg in [v3_xcm(true), v3_xcm(false), v3_xcm(false), v2_xcm(false)] { diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index e673a46c4ac..a7052328da0 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -182,6 +182,13 @@ impl PreparedMessage for WeighedMessage { } } +#[cfg(any(test, feature = "std"))] +impl WeighedMessage { + pub fn new(weight: Weight, message: Xcm) -> Self { + Self(weight, message) + } +} + impl ExecuteXcm for XcmExecutor { type Prepared = WeighedMessage; fn prepare( diff --git a/prdoc/pr_4202.prdoc b/prdoc/pr_4202.prdoc new file mode 100644 index 00000000000..6469c3c7840 --- /dev/null +++ b/prdoc/pr_4202.prdoc @@ -0,0 +1,16 @@ +title: "Treat XCM ExceedsStackLimit errors as transient in the MQ pallet" + +doc: + - audience: Runtime User + description: | + Fixes an issue where the MessageQueue can incorrectly assume that a message will permanently fail to process and disallow retrial of it. + +crates: + - name: frame-support + bump: major + - name: pallet-message-queue + bump: patch + - name: staging-xcm-builder + bump: patch + - name: staging-xcm-executor + bump: patch diff --git a/substrate/frame/message-queue/src/lib.rs b/substrate/frame/message-queue/src/lib.rs index ec85c785f79..ef3420d21be 100644 --- a/substrate/frame/message-queue/src/lib.rs +++ b/substrate/frame/message-queue/src/lib.rs @@ -765,6 +765,13 @@ enum MessageExecutionStatus { Processed, /// The message was processed and resulted in a, possibly permanent, error. Unprocessable { permanent: bool }, + /// The stack depth limit was reached. + /// + /// We cannot just return `Unprocessable` in this case, because the processability of the + /// message depends on how the function was called. This may be a permanent error if it was + /// called by a top-level function, or a transient error if it was already called in a nested + /// function. + StackLimitReached, } impl Pallet { @@ -984,7 +991,8 @@ impl Pallet { // additional overweight event being deposited. ) { Overweight | InsufficientWeight => Err(Error::::InsufficientWeight), - Unprocessable { permanent: false } => Err(Error::::TemporarilyUnprocessable), + StackLimitReached | Unprocessable { permanent: false } => + Err(Error::::TemporarilyUnprocessable), Unprocessable { permanent: true } | Processed => { page.note_processed_at_pos(pos); book_state.message_count.saturating_dec(); @@ -1250,7 +1258,7 @@ impl Pallet { let is_processed = match res { InsufficientWeight => return ItemExecutionStatus::Bailed, Unprocessable { permanent: false } => return ItemExecutionStatus::NoProgress, - Processed | Unprocessable { permanent: true } => true, + Processed | Unprocessable { permanent: true } | StackLimitReached => true, Overweight => false, }; @@ -1461,6 +1469,10 @@ impl Pallet { Self::deposit_event(Event::::ProcessingFailed { id: id.into(), origin, error }); MessageExecutionStatus::Unprocessable { permanent: true } }, + Err(error @ StackLimitReached) => { + Self::deposit_event(Event::::ProcessingFailed { id: id.into(), origin, error }); + MessageExecutionStatus::StackLimitReached + }, Ok(success) => { // Success let weight_used = meter.consumed().saturating_sub(prev_consumed); diff --git a/substrate/frame/message-queue/src/mock.rs b/substrate/frame/message-queue/src/mock.rs index 1281de6b0a6..66a242d5a18 100644 --- a/substrate/frame/message-queue/src/mock.rs +++ b/substrate/frame/message-queue/src/mock.rs @@ -198,6 +198,7 @@ impl ProcessMessage for RecordingMessageProcessor { parameter_types! { pub static Callback: Box = Box::new(|_, _| {}); + pub static IgnoreStackOvError: bool = false; } /// Processed a mocked message. Messages that end with `badformat`, `corrupt`, `unsupported` or @@ -216,6 +217,8 @@ fn processing_message(msg: &[u8], origin: &MessageOrigin) -> Result<(), ProcessM Err(ProcessMessageError::Unsupported) } else if msg.ends_with("yield") { Err(ProcessMessageError::Yield) + } else if msg.ends_with("stacklimitreached") && !IgnoreStackOvError::get() { + Err(ProcessMessageError::StackLimitReached) } else { Ok(()) } diff --git a/substrate/frame/message-queue/src/tests.rs b/substrate/frame/message-queue/src/tests.rs index d6788847d57..e89fdb8b320 100644 --- a/substrate/frame/message-queue/src/tests.rs +++ b/substrate/frame/message-queue/src/tests.rs @@ -174,9 +174,10 @@ fn service_queues_failing_messages_works() { MessageQueue::enqueue_message(msg("badformat"), Here); MessageQueue::enqueue_message(msg("corrupt"), Here); MessageQueue::enqueue_message(msg("unsupported"), Here); + MessageQueue::enqueue_message(msg("stacklimitreached"), Here); MessageQueue::enqueue_message(msg("yield"), Here); // Starts with four pages. - assert_pages(&[0, 1, 2, 3]); + assert_pages(&[0, 1, 2, 3, 4]); assert_eq!(MessageQueue::service_queues(1.into_weight()), 1.into_weight()); assert_last_event::( @@ -206,9 +207,9 @@ fn service_queues_failing_messages_works() { .into(), ); assert_eq!(MessageQueue::service_queues(1.into_weight()), 1.into_weight()); - assert_eq!(System::events().len(), 3); + assert_eq!(System::events().len(), 4); // Last page with the `yield` stays in. - assert_pages(&[3]); + assert_pages(&[4]); }); } @@ -1880,3 +1881,97 @@ fn process_enqueued_on_idle_requires_enough_weight() { assert_eq!(MessagesProcessed::take(), vec![]); }) } + +/// A message that reports `StackLimitReached` will not be put into the overweight queue when +/// executed from the top level. +#[test] +fn process_discards_stack_ov_message() { + use MessageOrigin::*; + build_and_execute::(|| { + MessageQueue::enqueue_message(msg("stacklimitreached"), Here); + + MessageQueue::service_queues(10.into_weight()); + + assert_last_event::( + Event::ProcessingFailed { + id: blake2_256(b"stacklimitreached").into(), + origin: MessageOrigin::Here, + error: ProcessMessageError::StackLimitReached, + } + .into(), + ); + + assert!(MessagesProcessed::take().is_empty()); + // Message is gone and not overweight: + assert_pages(&[]); + }); +} + +/// A message that reports `StackLimitReached` will stay in the overweight queue when it is executed +/// by `execute_overweight`. +#[test] +fn execute_overweight_keeps_stack_ov_message() { + use MessageOrigin::*; + build_and_execute::(|| { + // We need to create a mocked message that first reports insufficient weight, and then + // `StackLimitReached`: + IgnoreStackOvError::set(true); + MessageQueue::enqueue_message(msg("stacklimitreached"), Here); + MessageQueue::service_queues(0.into_weight()); + + assert_last_event::( + Event::OverweightEnqueued { + id: blake2_256(b"stacklimitreached"), + origin: MessageOrigin::Here, + message_index: 0, + page_index: 0, + } + .into(), + ); + // Does not count as 'processed': + assert!(MessagesProcessed::take().is_empty()); + assert_pages(&[0]); + + // Now let it return `StackLimitReached`. Note that this case would normally not happen, + // since we assume that the top-level execution is the one with the most remaining stack + // depth. + IgnoreStackOvError::set(false); + // Ensure that trying to execute the message does not change any state (besides events). + System::reset_events(); + let storage_noop = StorageNoopGuard::new(); + assert_eq!( + ::execute_overweight(3.into_weight(), (Here, 0, 0)), + Err(ExecuteOverweightError::Other) + ); + assert_last_event::( + Event::ProcessingFailed { + id: blake2_256(b"stacklimitreached").into(), + origin: MessageOrigin::Here, + error: ProcessMessageError::StackLimitReached, + } + .into(), + ); + System::reset_events(); + drop(storage_noop); + + // Now let's process it normally: + IgnoreStackOvError::set(true); + assert_eq!( + ::execute_overweight(1.into_weight(), (Here, 0, 0)) + .unwrap(), + 1.into_weight() + ); + + assert_last_event::( + Event::Processed { + id: blake2_256(b"stacklimitreached").into(), + origin: MessageOrigin::Here, + weight_used: 1.into_weight(), + success: true, + } + .into(), + ); + assert_pages(&[]); + System::reset_events(); + }); +} diff --git a/substrate/frame/support/src/traits/messages.rs b/substrate/frame/support/src/traits/messages.rs index f3d893bcc1d..2eec606b6d1 100644 --- a/substrate/frame/support/src/traits/messages.rs +++ b/substrate/frame/support/src/traits/messages.rs @@ -46,6 +46,8 @@ pub enum ProcessMessageError { /// the case that a queue is re-serviced within the same block after *yielding*. A queue is /// not required to *yield* again when it is being re-serviced withing the same block. Yield, + /// The message could not be processed for reaching the stack depth limit. + StackLimitReached, } /// Can process messages from a specific origin. @@ -96,6 +98,8 @@ pub trait ServiceQueues { /// - `weight_limit`: The maximum amount of dynamic weight that this call can use. /// /// Returns the dynamic weight used by this call; is never greater than `weight_limit`. + /// Should only be called in top-level runtime entry points like `on_initialize` or `on_idle`. + /// Otherwise, stack depth limit errors may be miss-handled. fn service_queues(weight_limit: Weight) -> Weight; /// Executes a message that could not be executed by [`Self::service_queues()`] because it was -- GitLab From 239a23d9cc712aab8c0a87eab7e558e5a149fd42 Mon Sep 17 00:00:00 2001 From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Date: Thu, 25 Apr 2024 13:11:07 +0300 Subject: [PATCH 005/170] Fix polkadot parachains not producing blocks until next session (#4269) ... a few sessions too late :(, this already happened on polkadot, so as of now there are no known relay-chains without async backing enabled in runtime, but let's fix it in case someone else wants to repeat our steps. Fixes: https://github.com/paritytech/polkadot-sdk/issues/4226 --------- Signed-off-by: Alexandru Gheorghe --- .../node/network/statement-distribution/src/v2/mod.rs | 11 ++++++++++- .../statement-distribution/src/v2/tests/mod.rs | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 68caa5f0e70..118e34e9206 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -826,7 +826,16 @@ pub(crate) fn handle_deactivate_leaves(state: &mut State, leaves: &[Hash]) { // clean up sessions based on everything remaining. let sessions: HashSet<_> = state.per_relay_parent.values().map(|r| r.session).collect(); state.per_session.retain(|s, _| sessions.contains(s)); - state.unused_topologies.retain(|s, _| sessions.contains(s)); + + let last_session_index = state.unused_topologies.keys().max().copied(); + // Do not clean-up the last saved toplogy unless we moved to the next session + // This is needed because handle_deactive_leaves, gets also called when + // prospective_parachains APIs are not present, so we would actually remove + // the topology without using it because `per_relay_parent` is empty until + // prospective_parachains gets enabled + state + .unused_topologies + .retain(|s, _| sessions.contains(s) || last_session_index == Some(*s)); } #[overseer::contextbounds(StatementDistribution, prefix=self::overseer)] diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs index 8dda7219cd1..3d987d3fc43 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs @@ -509,6 +509,12 @@ async fn setup_test_and_connect_peers( // Send gossip topology and activate leaf. if send_topology_before_leaf { send_new_topology(overseer, state.make_dummy_topology()).await; + // Send cleaning up of a leaf to make sure it does not clear the save topology as well. + overseer + .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(Hash::random()), + ))) + .await; activate_leaf(overseer, &test_leaf, &state, true, vec![]).await; } else { activate_leaf(overseer, &test_leaf, &state, true, vec![]).await; -- GitLab From c26cf3f6f2d2b7f7783703308ece440c338459f8 Mon Sep 17 00:00:00 2001 From: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Date: Thu, 25 Apr 2024 12:16:12 +0200 Subject: [PATCH 006/170] Do not re-prepare PVFs if not needed (#4211) Currently, PVFs are re-prepared if any execution environment parameter changes. As we've recently seen on Kusama and Polkadot, that may lead to a severe finality lag because every validator has to re-prepare every PVF. That cannot be avoided altogether; however, we could cease re-preparing PVFs when a change in the execution environment can't lead to a change in the artifact itself. For example, it's clear that changing the execution timeout cannot affect the artifact. In this PR, I'm introducing a separate hash for the subset of execution environment parameters that changes only if a preparation-related parameter changes. It introduces some minor code duplication, but without that, the scope of changes would be much bigger. TODO: - [x] Add a test to ensure the artifact is not re-prepared if non-preparation-related parameter is changed - [x] Add a test to ensure the artifact is re-prepared if a preparation-related parameter is changed - [x] Add comments, warnings, and, possibly, a test to ensure a new parameter ever added to the executor environment parameters will be evaluated by the author of changes with respect to its artifact preparation impact and added to the new hash preimage if needed. Closes #4132 --- polkadot/node/core/pvf/src/artifacts.rs | 19 ++-- polkadot/node/core/pvf/tests/it/main.rs | 72 +++++++++++++- polkadot/primitives/src/lib.rs | 2 +- polkadot/primitives/src/v7/executor_params.rs | 99 +++++++++++++++++++ polkadot/primitives/src/v7/mod.rs | 4 +- prdoc/pr_4211.prdoc | 15 +++ 6 files changed, 201 insertions(+), 10 deletions(-) create mode 100644 prdoc/pr_4211.prdoc diff --git a/polkadot/node/core/pvf/src/artifacts.rs b/polkadot/node/core/pvf/src/artifacts.rs index 6288755526d..a3a48b61acb 100644 --- a/polkadot/node/core/pvf/src/artifacts.rs +++ b/polkadot/node/core/pvf/src/artifacts.rs @@ -58,7 +58,7 @@ use crate::{host::PrecheckResultSender, worker_interface::WORKER_DIR_PREFIX}; use always_assert::always; use polkadot_node_core_pvf_common::{error::PrepareError, prepare::PrepareStats, pvf::PvfPrepData}; use polkadot_parachain_primitives::primitives::ValidationCodeHash; -use polkadot_primitives::ExecutorParamsHash; +use polkadot_primitives::ExecutorParamsPrepHash; use std::{ collections::HashMap, fs, @@ -85,22 +85,27 @@ pub fn generate_artifact_path(cache_path: &Path) -> PathBuf { artifact_path } -/// Identifier of an artifact. Encodes a code hash of the PVF and a hash of executor parameter set. +/// Identifier of an artifact. Encodes a code hash of the PVF and a hash of preparation-related +/// executor parameter set. #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ArtifactId { pub(crate) code_hash: ValidationCodeHash, - pub(crate) executor_params_hash: ExecutorParamsHash, + pub(crate) executor_params_prep_hash: ExecutorParamsPrepHash, } impl ArtifactId { /// Creates a new artifact ID with the given hash. - pub fn new(code_hash: ValidationCodeHash, executor_params_hash: ExecutorParamsHash) -> Self { - Self { code_hash, executor_params_hash } + pub fn new( + code_hash: ValidationCodeHash, + executor_params_prep_hash: ExecutorParamsPrepHash, + ) -> Self { + Self { code_hash, executor_params_prep_hash } } - /// Returns an artifact ID that corresponds to the PVF with given executor params. + /// Returns an artifact ID that corresponds to the PVF with given preparation-related + /// executor parameters. pub fn from_pvf_prep_data(pvf: &PvfPrepData) -> Self { - Self::new(pvf.code_hash(), pvf.executor_params().hash()) + Self::new(pvf.code_hash(), pvf.executor_params().prep_hash()) } } diff --git a/polkadot/node/core/pvf/tests/it/main.rs b/polkadot/node/core/pvf/tests/it/main.rs index 56cc681aff3..6961b93832a 100644 --- a/polkadot/node/core/pvf/tests/it/main.rs +++ b/polkadot/node/core/pvf/tests/it/main.rs @@ -26,7 +26,7 @@ use polkadot_node_core_pvf::{ ValidationHost, JOB_TIMEOUT_WALL_CLOCK_FACTOR, }; use polkadot_parachain_primitives::primitives::{BlockData, ValidationParams, ValidationResult}; -use polkadot_primitives::{ExecutorParam, ExecutorParams}; +use polkadot_primitives::{ExecutorParam, ExecutorParams, PvfExecKind, PvfPrepKind}; use std::{io::Write, time::Duration}; use tokio::sync::Mutex; @@ -559,3 +559,73 @@ async fn nonexistent_cache_dir() { .await .unwrap(); } + +// Checks the the artifact is not re-prepared when the executor environment parameters change +// in a way not affecting the preparation +#[tokio::test] +async fn artifact_does_not_reprepare_on_non_meaningful_exec_parameter_change() { + let host = TestHost::new_with_config(|cfg| { + cfg.prepare_workers_hard_max_num = 1; + }) + .await; + let cache_dir = host.cache_dir.path(); + + let set1 = ExecutorParams::default(); + let set2 = + ExecutorParams::from(&[ExecutorParam::PvfExecTimeout(PvfExecKind::Backing, 2500)][..]); + + let _stats = host.precheck_pvf(halt::wasm_binary_unwrap(), set1).await.unwrap(); + + let md1 = { + let mut cache_dir: Vec<_> = std::fs::read_dir(cache_dir).unwrap().collect(); + assert_eq!(cache_dir.len(), 2); + let mut artifact_path = cache_dir.pop().unwrap().unwrap(); + if artifact_path.path().is_dir() { + artifact_path = cache_dir.pop().unwrap().unwrap(); + } + std::fs::metadata(artifact_path.path()).unwrap() + }; + + // FS times are not monotonical so we wait 2 secs here to be sure that the creation time of the + // second attifact will be different + tokio::time::sleep(Duration::from_secs(2)).await; + + let _stats = host.precheck_pvf(halt::wasm_binary_unwrap(), set2).await.unwrap(); + + let md2 = { + let mut cache_dir: Vec<_> = std::fs::read_dir(cache_dir).unwrap().collect(); + assert_eq!(cache_dir.len(), 2); + let mut artifact_path = cache_dir.pop().unwrap().unwrap(); + if artifact_path.path().is_dir() { + artifact_path = cache_dir.pop().unwrap().unwrap(); + } + std::fs::metadata(artifact_path.path()).unwrap() + }; + + assert_eq!(md1.created().unwrap(), md2.created().unwrap()); +} + +// Checks if the artifact is re-prepared if the re-preparation is needed by the nature of +// the execution environment parameters change +#[tokio::test] +async fn artifact_does_reprepare_on_meaningful_exec_parameter_change() { + let host = TestHost::new_with_config(|cfg| { + cfg.prepare_workers_hard_max_num = 1; + }) + .await; + let cache_dir = host.cache_dir.path(); + + let set1 = ExecutorParams::default(); + let set2 = + ExecutorParams::from(&[ExecutorParam::PvfPrepTimeout(PvfPrepKind::Prepare, 60000)][..]); + + let _stats = host.precheck_pvf(halt::wasm_binary_unwrap(), set1).await.unwrap(); + let cache_dir_contents: Vec<_> = std::fs::read_dir(cache_dir).unwrap().collect(); + + assert_eq!(cache_dir_contents.len(), 2); + + let _stats = host.precheck_pvf(halt::wasm_binary_unwrap(), set2).await.unwrap(); + let cache_dir_contents: Vec<_> = std::fs::read_dir(cache_dir).unwrap().collect(); + + assert_eq!(cache_dir_contents.len(), 3); // new artifact has been added +} diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index d4eeb3cc3d2..01f393086a6 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -44,7 +44,7 @@ pub use v7::{ CandidateReceipt, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CollatorId, CollatorSignature, CommittedCandidateReceipt, CompactStatement, ConsensusLog, CoreIndex, CoreState, DisputeState, DisputeStatement, DisputeStatementSet, DownwardMessage, EncodeAs, - ExecutorParam, ExecutorParamError, ExecutorParams, ExecutorParamsHash, + ExecutorParam, ExecutorParamError, ExecutorParams, ExecutorParamsHash, ExecutorParamsPrepHash, ExplicitDisputeStatement, GroupIndex, GroupRotationInfo, Hash, HashT, HeadData, Header, HorizontalMessages, HrmpChannelId, Id, InboundDownwardMessage, InboundHrmpMessage, IndexedVec, InherentData, InvalidDisputeStatementKind, Moment, MultiDisputeStatementSet, NodeFeatures, diff --git a/polkadot/primitives/src/v7/executor_params.rs b/polkadot/primitives/src/v7/executor_params.rs index 1e19f3b23fe..918a7f17a7e 100644 --- a/polkadot/primitives/src/v7/executor_params.rs +++ b/polkadot/primitives/src/v7/executor_params.rs @@ -152,13 +152,42 @@ impl sp_std::fmt::LowerHex for ExecutorParamsHash { } } +/// Unit type wrapper around [`type@Hash`] that represents a hash of preparation-related +/// executor parameters. +/// +/// This type is produced by [`ExecutorParams::prep_hash`]. +#[derive(Clone, Copy, Encode, Decode, Hash, Eq, PartialEq, PartialOrd, Ord, TypeInfo)] +pub struct ExecutorParamsPrepHash(Hash); + +impl sp_std::fmt::Display for ExecutorParamsPrepHash { + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + self.0.fmt(f) + } +} + +impl sp_std::fmt::Debug for ExecutorParamsPrepHash { + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + write!(f, "{:?}", self.0) + } +} + +impl sp_std::fmt::LowerHex for ExecutorParamsPrepHash { + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + sp_std::fmt::LowerHex::fmt(&self.0, f) + } +} + /// # Deterministically serialized execution environment semantics /// Represents an arbitrary semantics of an arbitrary execution environment, so should be kept as /// abstract as possible. +// // ADR: For mandatory entries, mandatoriness should be enforced in code rather than separating them // into individual fields of the structure. Thus, complex migrations shall be avoided when adding // new entries and removing old ones. At the moment, there's no mandatory parameters defined. If // they show up, they must be clearly documented as mandatory ones. +// +// !!! Any new parameter that does not affect the prepared artifact must be added to the exclusion +// !!! list in `prep_hash()` to avoid unneccessary artifact rebuilds. #[derive( Clone, Debug, Default, Encode, Decode, PartialEq, Eq, TypeInfo, Serialize, Deserialize, )] @@ -175,6 +204,28 @@ impl ExecutorParams { ExecutorParamsHash(BlakeTwo256::hash(&self.encode())) } + /// Returns hash of preparation-related executor parameters + pub fn prep_hash(&self) -> ExecutorParamsPrepHash { + use ExecutorParam::*; + + let mut enc = b"prep".to_vec(); + + self.0 + .iter() + .flat_map(|param| match param { + MaxMemoryPages(..) => None, + StackLogicalMax(..) => Some(param), + StackNativeMax(..) => None, + PrecheckingMaxMemory(..) => None, + PvfPrepTimeout(..) => Some(param), + PvfExecTimeout(..) => None, + WasmExtBulkMemory => Some(param), + }) + .for_each(|p| enc.extend(p.encode())); + + ExecutorParamsPrepHash(BlakeTwo256::hash(&enc)) + } + /// Returns a PVF preparation timeout, if any pub fn pvf_prep_timeout(&self, kind: PvfPrepKind) -> Option { for param in &self.0 { @@ -336,3 +387,51 @@ impl From<&[ExecutorParam]> for ExecutorParams { ExecutorParams(arr.to_vec()) } } + +// This test ensures the hash generated by `prep_hash()` changes if any preparation-related +// executor parameter changes. If you're adding a new executor parameter, you must add it into +// this test, and if changing that parameter may not affect the artifact produced on the +// preparation step, it must be added to the list of exlusions in `pre_hash()` as well. +// See also `prep_hash()` comments. +#[test] +fn ensure_prep_hash_changes() { + use ExecutorParam::*; + let ep = ExecutorParams::from( + &[ + MaxMemoryPages(0), + StackLogicalMax(0), + StackNativeMax(0), + PrecheckingMaxMemory(0), + PvfPrepTimeout(PvfPrepKind::Precheck, 0), + PvfPrepTimeout(PvfPrepKind::Prepare, 0), + PvfExecTimeout(PvfExecKind::Backing, 0), + PvfExecTimeout(PvfExecKind::Approval, 0), + WasmExtBulkMemory, + ][..], + ); + + for p in ep.iter() { + let (ep1, ep2) = match p { + MaxMemoryPages(_) => continue, + StackLogicalMax(_) => ( + ExecutorParams::from(&[StackLogicalMax(1)][..]), + ExecutorParams::from(&[StackLogicalMax(2)][..]), + ), + StackNativeMax(_) => continue, + PrecheckingMaxMemory(_) => continue, + PvfPrepTimeout(PvfPrepKind::Precheck, _) => ( + ExecutorParams::from(&[PvfPrepTimeout(PvfPrepKind::Precheck, 1)][..]), + ExecutorParams::from(&[PvfPrepTimeout(PvfPrepKind::Precheck, 2)][..]), + ), + PvfPrepTimeout(PvfPrepKind::Prepare, _) => ( + ExecutorParams::from(&[PvfPrepTimeout(PvfPrepKind::Prepare, 1)][..]), + ExecutorParams::from(&[PvfPrepTimeout(PvfPrepKind::Prepare, 2)][..]), + ), + PvfExecTimeout(_, _) => continue, + WasmExtBulkMemory => + (ExecutorParams::default(), ExecutorParams::from(&[WasmExtBulkMemory][..])), + }; + + assert_ne!(ep1.prep_hash(), ep2.prep_hash()); + } +} diff --git a/polkadot/primitives/src/v7/mod.rs b/polkadot/primitives/src/v7/mod.rs index 5647bfe68d5..8a059408496 100644 --- a/polkadot/primitives/src/v7/mod.rs +++ b/polkadot/primitives/src/v7/mod.rs @@ -62,7 +62,9 @@ pub mod executor_params; pub mod slashing; pub use async_backing::AsyncBackingParams; -pub use executor_params::{ExecutorParam, ExecutorParamError, ExecutorParams, ExecutorParamsHash}; +pub use executor_params::{ + ExecutorParam, ExecutorParamError, ExecutorParams, ExecutorParamsHash, ExecutorParamsPrepHash, +}; mod metrics; pub use metrics::{ diff --git a/prdoc/pr_4211.prdoc b/prdoc/pr_4211.prdoc new file mode 100644 index 00000000000..161dc8485e8 --- /dev/null +++ b/prdoc/pr_4211.prdoc @@ -0,0 +1,15 @@ +title: "Re-prepare PVF artifacts only if needed" + +doc: + - audience: Node Dev + description: | + When a change in the executor environment parameters can not affect the prepared artifact, + it is preserved without recompilation and used for future executions. That mitigates + situations where every unrelated executor parameter change resulted in re-preparing every + artifact on every validator, causing a significant finality lag. + +crates: + - name: polkadot-node-core-pvf + bump: minor + - name: polkadot-primitives + bump: minor -- GitLab From ff2b178206f9952c3337638659450c67fd700e7e Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Thu, 25 Apr 2024 22:01:05 +1000 Subject: [PATCH 007/170] remote-externalities: retry get child keys query (#4280) --- .../frame/remote-externalities/src/lib.rs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/substrate/utils/frame/remote-externalities/src/lib.rs b/substrate/utils/frame/remote-externalities/src/lib.rs index e429d39669f..58cb901470c 100644 --- a/substrate/utils/frame/remote-externalities/src/lib.rs +++ b/substrate/utils/frame/remote-externalities/src/lib.rs @@ -830,19 +830,22 @@ where child_prefix: StorageKey, at: B::Hash, ) -> Result, &'static str> { - // This is deprecated and will generate a warning which causes the CI to fail. - #[allow(warnings)] - let child_keys = substrate_rpc_client::ChildStateApi::storage_keys( - client, - PrefixedStorageKey::new(prefixed_top_key.as_ref().to_vec()), - child_prefix, - Some(at), - ) - .await - .map_err(|e| { - error!(target: LOG_TARGET, "Error = {:?}", e); - "rpc child_get_keys failed." - })?; + let retry_strategy = + FixedInterval::new(Self::KEYS_PAGE_RETRY_INTERVAL).take(Self::MAX_RETRIES); + let get_child_keys_closure = || { + #[allow(deprecated)] + substrate_rpc_client::ChildStateApi::storage_keys( + client, + PrefixedStorageKey::new(prefixed_top_key.as_ref().to_vec()), + child_prefix.clone(), + Some(at), + ) + }; + let child_keys = + Retry::spawn(retry_strategy, get_child_keys_closure).await.map_err(|e| { + error!(target: LOG_TARGET, "Error = {:?}", e); + "rpc child_get_keys failed." + })?; debug!( target: LOG_TARGET, -- GitLab From c9923cd7feb9e7c6337f0942abd3279468df5559 Mon Sep 17 00:00:00 2001 From: Alin Dima Date: Thu, 25 Apr 2024 16:52:24 +0300 Subject: [PATCH 008/170] rename fragment_tree folder to fragment_chain (#4294) Makes https://github.com/paritytech/polkadot-sdk/pull/4035 easier to review --- .../src/{fragment_tree => fragment_chain}/mod.rs | 0 .../src/{fragment_tree => fragment_chain}/tests.rs | 0 polkadot/node/core/prospective-parachains/src/lib.rs | 12 ++++++------ 3 files changed, 6 insertions(+), 6 deletions(-) rename polkadot/node/core/prospective-parachains/src/{fragment_tree => fragment_chain}/mod.rs (100%) rename polkadot/node/core/prospective-parachains/src/{fragment_tree => fragment_chain}/tests.rs (100%) diff --git a/polkadot/node/core/prospective-parachains/src/fragment_tree/mod.rs b/polkadot/node/core/prospective-parachains/src/fragment_chain/mod.rs similarity index 100% rename from polkadot/node/core/prospective-parachains/src/fragment_tree/mod.rs rename to polkadot/node/core/prospective-parachains/src/fragment_chain/mod.rs diff --git a/polkadot/node/core/prospective-parachains/src/fragment_tree/tests.rs b/polkadot/node/core/prospective-parachains/src/fragment_chain/tests.rs similarity index 100% rename from polkadot/node/core/prospective-parachains/src/fragment_tree/tests.rs rename to polkadot/node/core/prospective-parachains/src/fragment_chain/tests.rs diff --git a/polkadot/node/core/prospective-parachains/src/lib.rs b/polkadot/node/core/prospective-parachains/src/lib.rs index f5d50fb74fa..0b1a2e034a2 100644 --- a/polkadot/node/core/prospective-parachains/src/lib.rs +++ b/polkadot/node/core/prospective-parachains/src/lib.rs @@ -55,13 +55,13 @@ use polkadot_primitives::{ use crate::{ error::{FatalError, FatalResult, JfyiError, JfyiErrorResult, Result}, - fragment_tree::{ + fragment_chain::{ CandidateStorage, CandidateStorageInsertionError, FragmentTree, Scope as TreeScope, }, }; mod error; -mod fragment_tree; +mod fragment_chain; #[cfg(test)] mod tests; @@ -349,7 +349,7 @@ fn prune_view_candidate_storage(view: &mut View, metrics: &Metrics) { struct ImportablePendingAvailability { candidate: CommittedCandidateReceipt, persisted_validation_data: PersistedValidationData, - compact: crate::fragment_tree::PendingAvailability, + compact: crate::fragment_chain::PendingAvailability, } #[overseer::contextbounds(ProspectiveParachains, prefix = self::overseer)] @@ -394,7 +394,7 @@ async fn preprocess_candidates_pending_availability( relay_parent_number: relay_parent.number, relay_parent_storage_root: relay_parent.storage_root, }, - compact: crate::fragment_tree::PendingAvailability { + compact: crate::fragment_chain::PendingAvailability { candidate_hash: pending.candidate_hash, relay_parent, }, @@ -675,7 +675,7 @@ fn answer_hypothetical_frontier_request( let candidate_hash = c.candidate_hash(); let hypothetical = match c { HypotheticalCandidate::Complete { receipt, persisted_validation_data, .. } => - fragment_tree::HypotheticalCandidate::Complete { + fragment_chain::HypotheticalCandidate::Complete { receipt: Cow::Borrowed(receipt), persisted_validation_data: Cow::Borrowed(persisted_validation_data), }, @@ -683,7 +683,7 @@ fn answer_hypothetical_frontier_request( parent_head_data_hash, candidate_relay_parent, .. - } => fragment_tree::HypotheticalCandidate::Incomplete { + } => fragment_chain::HypotheticalCandidate::Incomplete { relay_parent: *candidate_relay_parent, parent_head_data_hash: *parent_head_data_hash, }, -- GitLab From 8f5c8f735af9048b83957821db7fb363e89e919f Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Thu, 25 Apr 2024 17:04:20 +0200 Subject: [PATCH 009/170] Update approval-voting banchmarks base values (#4283) --- .../benches/approval-voting-regression-bench.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/polkadot/node/core/approval-voting/benches/approval-voting-regression-bench.rs b/polkadot/node/core/approval-voting/benches/approval-voting-regression-bench.rs index 7157362a79c..9a5f0d29dbd 100644 --- a/polkadot/node/core/approval-voting/benches/approval-voting-regression-bench.rs +++ b/polkadot/node/core/approval-voting/benches/approval-voting-regression-bench.rs @@ -77,12 +77,12 @@ fn main() -> Result<(), String> { // We expect no variance for received and sent // but use 0.001 because we operate with floats messages.extend(average_usage.check_network_usage(&[ - ("Received from peers", 52944.7000, 0.001), - ("Sent to peers", 63532.2000, 0.001), + ("Received from peers", 52942.4600, 0.001), + ("Sent to peers", 63547.0330, 0.001), ])); messages.extend(average_usage.check_cpu_usage(&[ - ("approval-distribution", 7.7883, 0.1), - ("approval-voting", 10.4655, 0.1), + ("approval-distribution", 7.0317, 0.1), + ("approval-voting", 9.5751, 0.1), ])); if messages.is_empty() { -- GitLab From dd5b06e622c6c5c301a1554286ec1f4995c7daca Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Thu, 25 Apr 2024 17:06:37 +0200 Subject: [PATCH 010/170] [subsystem-benchmarks] Log standart deviation for subsystem-benchmarks (#4285) Should help us to understand more what's happening between individual runs and possibly adjust the number of runs --- polkadot/node/subsystem-bench/src/lib/usage.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/polkadot/node/subsystem-bench/src/lib/usage.rs b/polkadot/node/subsystem-bench/src/lib/usage.rs index 59296746ec3..bfaac3265a2 100644 --- a/polkadot/node/subsystem-bench/src/lib/usage.rs +++ b/polkadot/node/subsystem-bench/src/lib/usage.rs @@ -161,6 +161,13 @@ impl ResourceUsage { for (resource_name, values) in by_name { let total = values.iter().map(|v| v.total).sum::() / values.len() as f64; let per_block = values.iter().map(|v| v.per_block).sum::() / values.len() as f64; + let per_block_sd = + standard_deviation(&values.iter().map(|v| v.per_block).collect::>()); + println!( + "[{}] standart_deviation {:.2}%", + resource_name, + per_block_sd / per_block * 100.0 + ); average.push(Self { resource_name, total, per_block }); } average @@ -179,3 +186,11 @@ pub struct ChartItem { pub unit: String, pub value: f64, } + +fn standard_deviation(values: &[f64]) -> f64 { + let n = values.len() as f64; + let mean = values.iter().sum::() / n; + let variance = values.iter().map(|v| (v - mean).powi(2)).sum::() / (n - 1.0); + + variance.sqrt() +} -- GitLab From 8f8c49deffe56567ba5cde0e1047de15b660bb0e Mon Sep 17 00:00:00 2001 From: Noah Jelich <12912633+njelich@users.noreply.github.com> Date: Fri, 26 Apr 2024 09:03:53 +0200 Subject: [PATCH 011/170] Fix bad links (#4231) The solochain template links to parachain template instead of solochain. --- templates/solochain/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/solochain/README.md b/templates/solochain/README.md index 6390c9524ce..37c65797dcb 100644 --- a/templates/solochain/README.md +++ b/templates/solochain/README.md @@ -4,10 +4,10 @@ A fresh [Substrate](https://substrate.io/) node, ready for hacking :rocket: A standalone version of this template is available for each release of Polkadot in the [Substrate Developer Hub Parachain -Template](https://github.com/substrate-developer-hub/substrate-parachain-template/) +Template](https://github.com/substrate-developer-hub/substrate-node-template/) repository. The parachain template is generated directly at each Polkadot -release branch from the [Node Template in -Substrate](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/bin/node-template) +release branch from the [Solochain Template in +Substrate](https://github.com/paritytech/polkadot-sdk/tree/master/templates/solochain) upstream It is usually best to use the stand-alone version to start a new project. All -- GitLab From e8f7c81db66abb40802c582c22041aa63c78ddff Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Fri, 26 Apr 2024 11:16:03 +0300 Subject: [PATCH 012/170] [balances] Safeguard against consumer ref underflow (#3865) There are some accounts that do not have a consumer ref while having a reserve. This adds a fail-safe mechanism to trigger in the case that `does_consume` is true, but the assumption of `consumer>0` is not. This should prevent those accounts from loosing balance and the TI from getting messed up even more, but is not an "ideal" fix. TBH an ideal fix is not possible, since on-chain data is in an invalid state. --------- Signed-off-by: Oliver Tale-Yazdi --- prdoc/pr_3865.prdoc | 11 ++ substrate/frame/balances/Cargo.toml | 1 + substrate/frame/balances/src/lib.rs | 7 ++ .../frame/balances/src/tests/general_tests.rs | 111 ++++++++++++++++++ substrate/frame/balances/src/tests/mod.rs | 20 +++- substrate/frame/balances/src/types.rs | 2 +- 6 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_3865.prdoc create mode 100644 substrate/frame/balances/src/tests/general_tests.rs diff --git a/prdoc/pr_3865.prdoc b/prdoc/pr_3865.prdoc new file mode 100644 index 00000000000..8e39c04825b --- /dev/null +++ b/prdoc/pr_3865.prdoc @@ -0,0 +1,11 @@ +title: "Balances: add failsafe for consumer ref underflow" + +doc: + - audience: Runtime Dev + description: | + Pallet balances now handles the case that historic accounts violate a invariant that they should have a consumer ref on `reserved > 0` balance. + This disallows such accounts from reaping and should prevent TI from getting messed up even more. + +crates: + - name: pallet-balances + bump: patch diff --git a/substrate/frame/balances/Cargo.toml b/substrate/frame/balances/Cargo.toml index 28eabdaf506..1cc9ac5d8fd 100644 --- a/substrate/frame/balances/Cargo.toml +++ b/substrate/frame/balances/Cargo.toml @@ -28,6 +28,7 @@ docify = "0.2.8" [dev-dependencies] pallet-transaction-payment = { path = "../transaction-payment" } +frame-support = { path = "../support", features = ["experimental"] } sp-core = { path = "../../primitives/core" } sp-io = { path = "../../primitives/io" } paste = "1.0.12" diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index 685b12499ac..bd811955d63 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -954,6 +954,13 @@ pub mod pallet { if !did_consume && does_consume { frame_system::Pallet::::inc_consumers(who)?; } + if does_consume && frame_system::Pallet::::consumers(who) == 0 { + // NOTE: This is a failsafe and should not happen for normal accounts. A normal + // account should have gotten a consumer ref in `!did_consume && does_consume` + // at some point. + log::error!(target: LOG_TARGET, "Defensively bumping a consumer ref."); + frame_system::Pallet::::inc_consumers(who)?; + } if did_provide && !does_provide { // This could reap the account so must go last. frame_system::Pallet::::dec_providers(who).map_err(|r| { diff --git a/substrate/frame/balances/src/tests/general_tests.rs b/substrate/frame/balances/src/tests/general_tests.rs new file mode 100644 index 00000000000..0f3e015d0a8 --- /dev/null +++ b/substrate/frame/balances/src/tests/general_tests.rs @@ -0,0 +1,111 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(test)] + +use crate::{ + system::AccountInfo, + tests::{ensure_ti_valid, Balances, ExtBuilder, System, Test, TestId, UseSystem}, + AccountData, ExtraFlags, TotalIssuance, +}; +use frame_support::{ + assert_noop, assert_ok, hypothetically, + traits::{ + fungible::{Mutate, MutateHold}, + tokens::Precision, + }, +}; +use sp_runtime::DispatchError; + +/// There are some accounts that have one consumer ref too few. These accounts are at risk of losing +/// their held (reserved) balance. They do not just lose it - it is also not accounted for in the +/// Total Issuance. Here we test the case that the account does not reap in such a case, but gets +/// one consumer ref for its reserved balance. +#[test] +fn regression_historic_acc_does_not_evaporate_reserve() { + ExtBuilder::default().build_and_execute_with(|| { + UseSystem::set(true); + let (alice, bob) = (0, 1); + // Alice is in a bad state with consumer == 0 && reserved > 0: + Balances::set_balance(&alice, 100); + TotalIssuance::::put(100); + ensure_ti_valid(); + + assert_ok!(Balances::hold(&TestId::Foo, &alice, 10)); + // This is the issue of the account: + System::dec_consumers(&alice); + + assert_eq!( + System::account(&alice), + AccountInfo { + data: AccountData { + free: 90, + reserved: 10, + frozen: 0, + flags: ExtraFlags(1u128 << 127), + }, + nonce: 0, + consumers: 0, // should be 1 on a good acc + providers: 1, + sufficients: 0, + } + ); + + ensure_ti_valid(); + + // Reaping the account is prevented by the new logic: + assert_noop!( + Balances::transfer_allow_death(Some(alice).into(), bob, 90), + DispatchError::ConsumerRemaining + ); + assert_noop!( + Balances::transfer_all(Some(alice).into(), bob, false), + DispatchError::ConsumerRemaining + ); + + // normal transfers still work: + hypothetically!({ + assert_ok!(Balances::transfer_keep_alive(Some(alice).into(), bob, 40)); + // Alice got back her consumer ref: + assert_eq!(System::consumers(&alice), 1); + ensure_ti_valid(); + }); + hypothetically!({ + assert_ok!(Balances::transfer_all(Some(alice).into(), bob, true)); + // Alice got back her consumer ref: + assert_eq!(System::consumers(&alice), 1); + ensure_ti_valid(); + }); + + // un-reserving all does not add a consumer ref: + hypothetically!({ + assert_ok!(Balances::release(&TestId::Foo, &alice, 10, Precision::Exact)); + assert_eq!(System::consumers(&alice), 0); + assert_ok!(Balances::transfer_keep_alive(Some(alice).into(), bob, 40)); + assert_eq!(System::consumers(&alice), 0); + ensure_ti_valid(); + }); + // un-reserving some does add a consumer ref: + hypothetically!({ + assert_ok!(Balances::release(&TestId::Foo, &alice, 5, Precision::Exact)); + assert_eq!(System::consumers(&alice), 1); + assert_ok!(Balances::transfer_keep_alive(Some(alice).into(), bob, 40)); + assert_eq!(System::consumers(&alice), 1); + ensure_ti_valid(); + }); + }); +} diff --git a/substrate/frame/balances/src/tests/mod.rs b/substrate/frame/balances/src/tests/mod.rs index 234fe6eaf2c..0abf2251290 100644 --- a/substrate/frame/balances/src/tests/mod.rs +++ b/substrate/frame/balances/src/tests/mod.rs @@ -19,7 +19,7 @@ #![cfg(test)] -use crate::{self as pallet_balances, AccountData, Config, CreditOf, Error, Pallet}; +use crate::{self as pallet_balances, AccountData, Config, CreditOf, Error, Pallet, TotalIssuance}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ assert_err, assert_noop, assert_ok, assert_storage_noop, derive_impl, @@ -47,6 +47,7 @@ mod currency_tests; mod dispatchable_tests; mod fungible_conformance_tests; mod fungible_tests; +mod general_tests; mod reentrancy_tests; type Block = frame_system::mocking::MockBlock; @@ -278,6 +279,23 @@ pub fn info_from_weight(w: Weight) -> DispatchInfo { DispatchInfo { weight: w, ..Default::default() } } +/// Check that the total-issuance matches the sum of all accounts' total balances. +pub fn ensure_ti_valid() { + let mut sum = 0; + + for acc in frame_system::Account::::iter_keys() { + if UseSystem::get() { + let data = frame_system::Pallet::::account(acc); + sum += data.data.total(); + } else { + let data = crate::Account::::get(acc); + sum += data.total(); + } + } + + assert_eq!(TotalIssuance::::get(), sum, "Total Issuance wrong"); +} + #[test] fn weights_sane() { let info = crate::Call::::transfer_allow_death { dest: 10, value: 4 }.get_dispatch_info(); diff --git a/substrate/frame/balances/src/types.rs b/substrate/frame/balances/src/types.rs index 69d33bb023f..3e36a83575c 100644 --- a/substrate/frame/balances/src/types.rs +++ b/substrate/frame/balances/src/types.rs @@ -111,7 +111,7 @@ pub struct AccountData { const IS_NEW_LOGIC: u128 = 0x80000000_00000000_00000000_00000000u128; #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, MaxEncodedLen, TypeInfo)] -pub struct ExtraFlags(u128); +pub struct ExtraFlags(pub(crate) u128); impl Default for ExtraFlags { fn default() -> Self { Self(IS_NEW_LOGIC) -- GitLab From c66d8a84687f5d68c0192122aa513b4b340794ca Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 26 Apr 2024 12:24:42 +0300 Subject: [PATCH 013/170] Bump bridges relay version + uncomment bridges zombeinet tests (#4289) TODOs: - [x] wait and see if test `1` works; - [x] ~think of whether we need remaining tests.~ I think we should keep it - will try to revive and update it --- .gitlab/pipeline/zombienet.yml | 4 +--- .gitlab/pipeline/zombienet/bridges.yml | 4 ++-- ...hen-idle.js => multiple-headers-synced.js} | 22 +++++-------------- .../rococo-to-westend.zndsl | 20 +++++++++++++++++ .../run.sh | 2 +- .../westend-to-rococo.zndsl | 20 +++++++++++++++++ .../rococo-to-westend.zndsl | 8 ------- .../westend-to-rococo.zndsl | 7 ------ ...ridges_zombienet_tests_injected.Dockerfile | 2 +- 9 files changed, 51 insertions(+), 38 deletions(-) rename bridges/testing/framework/js-helpers/{only-mandatory-headers-synced-when-idle.js => multiple-headers-synced.js} (61%) create mode 100644 bridges/testing/tests/0002-free-headers-synced-while-idle/rococo-to-westend.zndsl rename bridges/testing/tests/{0002-mandatory-headers-synced-while-idle => 0002-free-headers-synced-while-idle}/run.sh (90%) create mode 100644 bridges/testing/tests/0002-free-headers-synced-while-idle/westend-to-rococo.zndsl delete mode 100644 bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl delete mode 100644 bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl diff --git a/.gitlab/pipeline/zombienet.yml b/.gitlab/pipeline/zombienet.yml index e306cb43c02..52948e1eb71 100644 --- a/.gitlab/pipeline/zombienet.yml +++ b/.gitlab/pipeline/zombienet.yml @@ -12,6 +12,4 @@ include: # polkadot tests - .gitlab/pipeline/zombienet/polkadot.yml # bridges tests - # TODO: https://github.com/paritytech/parity-bridges-common/pull/2884 - # commenting until we have a new relatye, compatible with updated fees scheme - # - .gitlab/pipeline/zombienet/bridges.yml + - .gitlab/pipeline/zombienet/bridges.yml diff --git a/.gitlab/pipeline/zombienet/bridges.yml b/.gitlab/pipeline/zombienet/bridges.yml index 4278f59b1e9..9d7a8b93119 100644 --- a/.gitlab/pipeline/zombienet/bridges.yml +++ b/.gitlab/pipeline/zombienet/bridges.yml @@ -55,9 +55,9 @@ zombienet-bridges-0001-asset-transfer-works: - /home/nonroot/bridges-polkadot-sdk/bridges/testing/run-new-test.sh 0001-asset-transfer --docker - echo "Done" -zombienet-bridges-0002-mandatory-headers-synced-while-idle: +zombienet-bridges-0002-free-headers-synced-while-idle: extends: - .zombienet-bridges-common script: - - /home/nonroot/bridges-polkadot-sdk/bridges/testing/run-new-test.sh 0002-mandatory-headers-synced-while-idle --docker + - /home/nonroot/bridges-polkadot-sdk/bridges/testing/run-new-test.sh 0002-free-headers-synced-while-idle --docker - echo "Done" diff --git a/bridges/testing/framework/js-helpers/only-mandatory-headers-synced-when-idle.js b/bridges/testing/framework/js-helpers/multiple-headers-synced.js similarity index 61% rename from bridges/testing/framework/js-helpers/only-mandatory-headers-synced-when-idle.js rename to bridges/testing/framework/js-helpers/multiple-headers-synced.js index 979179245eb..a30efc82165 100644 --- a/bridges/testing/framework/js-helpers/only-mandatory-headers-synced-when-idle.js +++ b/bridges/testing/framework/js-helpers/multiple-headers-synced.js @@ -10,33 +10,23 @@ async function run(nodeName, networkInfo, args) { // start listening to new blocks let totalGrandpaHeaders = 0; - let initialParachainHeaderImported = false; + let totalParachainHeaders = 0; api.rpc.chain.subscribeNewHeads(async function (header) { const apiAtParent = await api.at(header.parentHash); const apiAtCurrent = await api.at(header.hash); const currentEvents = await apiAtCurrent.query.system.events(); - totalGrandpaHeaders += await utils.ensureOnlyMandatoryGrandpaHeadersImported( - bridgedChain, - apiAtParent, - apiAtCurrent, - currentEvents, - ); - initialParachainHeaderImported = await utils.ensureOnlyInitialParachainHeaderImported( - bridgedChain, - apiAtParent, - apiAtCurrent, - currentEvents, - ); + totalGrandpaHeaders += await utils.countGrandpaHeaderImports(bridgedChain, currentEvents); + totalParachainHeaders += await utils.countParachainHeaderImports(bridgedChain, currentEvents); }); // wait given time await new Promise(resolve => setTimeout(resolve, exitAfterSeconds * 1000)); - // if we haven't seen any new GRANDPA or parachain headers => fail - if (totalGrandpaHeaders == 0) { + // if we haven't seen many (>1) new GRANDPA or parachain headers => fail + if (totalGrandpaHeaders <= 1) { throw new Error("No bridged relay chain headers imported"); } - if (!initialParachainHeaderImported) { + if (totalParachainHeaders <= 1) { throw new Error("No bridged parachain headers imported"); } } diff --git a/bridges/testing/tests/0002-free-headers-synced-while-idle/rococo-to-westend.zndsl b/bridges/testing/tests/0002-free-headers-synced-while-idle/rococo-to-westend.zndsl new file mode 100644 index 00000000000..0f779caa87c --- /dev/null +++ b/bridges/testing/tests/0002-free-headers-synced-while-idle/rococo-to-westend.zndsl @@ -0,0 +1,20 @@ +Description: While relayer is idle, we only sync free Rococo (and a single Rococo BH) headers to Westend BH. +Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml +Creds: config + +# local chain spec gives `1u64 << 60` tokens to every endowed account: if it'll ever +# change, it'd need to be fixed here as well + +# //Charlie only submits free and mandatory relay chain headers, so the balance should stay the same +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" return is 1152921504606846976 within 30 seconds +# //Dave only submits free parachain headers, so the balance should stay the same +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" return is 1152921504606846976 within 30 seconds + +# ensure that we have synced multiple relay and parachain headers while idle. This includes both +# headers that were generated while relay was offline and those in the next 100 seconds while script is active. +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/multiple-headers-synced.js with "300,rococo-at-westend" within 600 seconds + +# //Charlie only submits free and mandatory relay chain headers, so the balance should stay the same +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" return is 1152921504606846976 within 30 seconds +# //Dave only submits free parachain headers, so the balance should stay the same +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" return is 1152921504606846976 within 30 seconds diff --git a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/run.sh b/bridges/testing/tests/0002-free-headers-synced-while-idle/run.sh similarity index 90% rename from bridges/testing/tests/0002-mandatory-headers-synced-while-idle/run.sh rename to bridges/testing/tests/0002-free-headers-synced-while-idle/run.sh index 32419dc84f5..9d19a9688f9 100755 --- a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/run.sh +++ b/bridges/testing/tests/0002-free-headers-synced-while-idle/run.sh @@ -22,7 +22,7 @@ echo # which is expected to be 60 seconds for the test environment. echo -e "Sleeping 90s before starting relayer ...\n" sleep 90 -${BASH_SOURCE%/*}/../../environments/rococo-westend/start_relayer.sh $rococo_dir $westend_dir relayer_pid +${BASH_SOURCE%/*}/../../environments/rococo-westend/start_relayer.sh $rococo_dir $westend_dir finality_relayer_pid parachains_relayer_pid messages_relayer_pid run_zndsl ${BASH_SOURCE%/*}/rococo-to-westend.zndsl $westend_dir run_zndsl ${BASH_SOURCE%/*}/westend-to-rococo.zndsl $rococo_dir diff --git a/bridges/testing/tests/0002-free-headers-synced-while-idle/westend-to-rococo.zndsl b/bridges/testing/tests/0002-free-headers-synced-while-idle/westend-to-rococo.zndsl new file mode 100644 index 00000000000..7a6f1ec379d --- /dev/null +++ b/bridges/testing/tests/0002-free-headers-synced-while-idle/westend-to-rococo.zndsl @@ -0,0 +1,20 @@ +Description: While relayer is idle, we only sync free Westend (and a single Westend BH) headers to Rococo BH. +Network: {{ENV_PATH}}/bridge_hub_rococo_local_network.toml +Creds: config + +# local chain spec gives `1u64 << 60` tokens to every endowed account: if it'll ever +# change, it'd need to be fixed here as well + +# //Charlie has inital balance +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" return is 1152921504606846976 within 30 seconds +# //Dave has inital balance +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" return is 1152921504606846976 within 30 seconds + +# ensure that we have synced multiple relay and parachain headers while idle. This includes both +# headers that were generated while relay was offline and those in the next 100 seconds while script is active. +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/multiple-headers-synced.js with "300,westend-at-rococo" within 600 seconds + +# //Charlie only submits free and mandatory relay chain headers, so the balance should stay the same +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" return is 1152921504606846976 within 30 seconds +# //Dave only submits free parachain headers, so the balance should stay the same +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-asset-balance.js with "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" return is 1152921504606846976 within 30 seconds diff --git a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl deleted file mode 100644 index 6e381f53773..00000000000 --- a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl +++ /dev/null @@ -1,8 +0,0 @@ -Description: While relayer is idle, we only sync mandatory Rococo (and a single Rococo BH) headers to Westend BH. -Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml -Creds: config - -# ensure that relayer is only syncing mandatory headers while idle. This includes both headers that were -# generated while relay was offline and those in the next 100 seconds while script is active. -bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/only-mandatory-headers-synced-when-idle.js with "300,rococo-at-westend" within 600 seconds - diff --git a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl deleted file mode 100644 index b4b3e436791..00000000000 --- a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl +++ /dev/null @@ -1,7 +0,0 @@ -Description: While relayer is idle, we only sync mandatory Westend (and a single Westend BH) headers to Rococo BH. -Network: {{ENV_PATH}}/bridge_hub_rococo_local_network.toml -Creds: config - -# ensure that relayer is only syncing mandatory headers while idle. This includes both headers that were -# generated while relay was offline and those in the next 100 seconds while script is active. -bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/only-mandatory-headers-synced-when-idle.js with "300,westend-at-rococo" within 600 seconds diff --git a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile index 938f5cc45a1..196ba861f50 100644 --- a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile +++ b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile @@ -1,7 +1,7 @@ # this image is built on top of existing Zombienet image ARG ZOMBIENET_IMAGE # this image uses substrate-relay image built elsewhere -ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.2.1 +ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.5.0 # metadata ARG VCS_REF -- GitLab From d212fc7a41fc72299913737c5fea2f3fcfe0a253 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Fri, 26 Apr 2024 13:24:03 +0200 Subject: [PATCH 014/170] review-bot: reverted #4271 and added `workflow_dispatch` (#4293) This PR includes two changes: - added `workflow_dispatch` to review bot - reverted #4271 ### Added `workflow_dispatch` to review bot This allows us, in the case that review-bot fails for some fork reasons, to trigger it manually ensuring that we can overcame the problem with the multiple actions while we look for a solution. image ### Reverted #4271 Unfortunately, the changes added in #4271 do not work in forks. Here is a lengthy discussion of many individuals facing the same problem as me: - [GitHub Action `pull_request` attribute empty in `workflow_run` event object for PR from forked repo #25220](https://github.com/orgs/community/discussions/25220) So I had to revert it (but I updated the dependencies to latest). #### Miscellaneous changes I added a debug log at the end of review bot in case it fails so we can easily debug it without having to make a lot of boilerplate and forks to duplicate the environment. --- .github/workflows/review-bot.yml | 19 ++++++++++++++++++- .github/workflows/review-trigger.yml | 13 +++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/.github/workflows/review-bot.yml b/.github/workflows/review-bot.yml index fb877357b23..f1401406ae4 100644 --- a/.github/workflows/review-bot.yml +++ b/.github/workflows/review-bot.yml @@ -5,6 +5,12 @@ on: - Review-Trigger types: - completed + workflow_dispatch: + inputs: + pr-number: + description: "Number of the PR to evaluate" + required: true + type: number jobs: review-approvals: @@ -17,6 +23,12 @@ jobs: with: app-id: ${{ secrets.REVIEW_APP_ID }} private-key: ${{ secrets.REVIEW_APP_KEY }} + - name: Extract content of artifact + if: ${{ !inputs.pr-number }} + id: number + uses: Bullrich/extract-text-from-artifact@v1.0.1 + with: + artifact-name: pr_number - name: "Evaluates PR reviews and assigns reviewers" uses: paritytech/review-bot@v2.4.0 with: @@ -24,5 +36,10 @@ jobs: team-token: ${{ steps.app_token.outputs.token }} checks-token: ${{ steps.app_token.outputs.token }} # This is extracted from the triggering event - pr-number: ${{ github.event.workflow_run.pull_requests[0].number }} + pr-number: ${{ inputs.pr-number || steps.number.outputs.content }} request-reviewers: true + - name: Log payload + if: ${{ failure() || runner.debug }} + run: echo "::debug::$payload" + env: + payload: ${{ toJson(github.event) }} diff --git a/.github/workflows/review-trigger.yml b/.github/workflows/review-trigger.yml index 6437be161d3..ec4a62afc0c 100644 --- a/.github/workflows/review-trigger.yml +++ b/.github/workflows/review-trigger.yml @@ -58,3 +58,16 @@ jobs: env: GH_TOKEN: ${{ github.token }} COMMENTS: ${{ steps.comments.outputs.users }} + - name: Get PR number + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + echo "Saving PR number: $PR_NUMBER" + mkdir -p ./pr + echo $PR_NUMBER > ./pr/pr_number + - uses: actions/upload-artifact@v4 + name: Save PR number + with: + name: pr_number + path: pr/ + retention-days: 5 -- GitLab From 9a48cd707ed7f4034aadb8dc05065080ad102037 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 26 Apr 2024 14:26:05 +0300 Subject: [PATCH 015/170] Bridges: added helper function to relay single GRANDPA proof + header (#4307) related to https://github.com/paritytech/parity-bridges-common/issues/2962 silent, because the actual code for subcommand is added in the `parity-bridges-common` repo, where binary lives --------- Co-authored-by: Adrian Catangiu --- .../src/cli/relay_headers.rs | 39 ++++++++++++++++++- .../lib-substrate-relay/src/finality/mod.rs | 37 +++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs index cf1957c7323..093f98ef21e 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs @@ -19,7 +19,10 @@ use async_trait::async_trait; use structopt::StructOpt; -use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; +use relay_utils::{ + metrics::{GlobalMetrics, StandaloneMetric}, + UniqueSaturatedInto, +}; use crate::{ cli::{bridge::*, chain_schema::*, PrometheusParams}, @@ -48,6 +51,21 @@ pub struct RelayHeadersParams { prometheus_params: PrometheusParams, } +/// Single header relaying params. +#[derive(StructOpt)] +pub struct RelayHeaderParams { + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + /// Number of the source chain header that we want to relay. It must have a persistent + /// storage proof at the [`Self::source`] node, otherwise the command will fail. + #[structopt(long)] + number: u128, +} + impl RelayHeadersParams { fn headers_to_relay(&self) -> HeadersToRelay { match (self.only_mandatory_headers, self.only_free_headers) { @@ -89,4 +107,23 @@ pub trait HeadersRelayer: RelayToRelayHeadersCliBridge { ) .await } + + /// Relay single header. No checks are made to ensure that transaction will succeed. + async fn relay_header(data: RelayHeaderParams) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let target_client = data.target.into_client::().await?; + let target_transactions_mortality = data.target_sign.target_transactions_mortality; + let target_sign = data.target_sign.to_keypair::()?; + + crate::finality::relay_single_header::( + source_client, + target_client, + crate::TransactionParams { + signer: target_sign, + mortality: target_transactions_mortality, + }, + data.number.unique_saturated_into(), + ) + .await + } } diff --git a/bridges/relays/lib-substrate-relay/src/finality/mod.rs b/bridges/relays/lib-substrate-relay/src/finality/mod.rs index a06857ae1d9..0293e1da224 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/mod.rs @@ -25,13 +25,15 @@ use crate::{ use async_trait::async_trait; use bp_header_chain::justification::{GrandpaJustification, JustificationVerificationContext}; -use finality_relay::{FinalityPipeline, FinalitySyncPipeline, HeadersToRelay}; +use finality_relay::{ + FinalityPipeline, FinalitySyncPipeline, HeadersToRelay, SourceClient, TargetClient, +}; use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; use relay_substrate_client::{ transaction_stall_timeout, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, ChainWithTransactions, Client, HashOf, HeaderOf, SyncHeader, }; -use relay_utils::metrics::MetricsParams; +use relay_utils::{metrics::MetricsParams, TrackedTransactionStatus, TransactionTracker}; use sp_core::Pair; use std::{fmt::Debug, marker::PhantomData}; @@ -274,3 +276,34 @@ pub async fn run( .await .map_err(|e| anyhow::format_err!("{}", e)) } + +/// Relay single header. No checks are made to ensure that transaction will succeed. +pub async fn relay_single_header( + source_client: Client, + target_client: Client, + transaction_params: TransactionParams>, + header_number: BlockNumberOf, +) -> anyhow::Result<()> { + let finality_source = SubstrateFinalitySource::

::new(source_client, None); + let (header, proof) = finality_source.header_and_finality_proof(header_number).await?; + let Some(proof) = proof else { + return Err(anyhow::format_err!( + "Unable to submit {} header #{} to {}: no finality proof", + P::SourceChain::NAME, + header_number, + P::TargetChain::NAME, + )); + }; + + let finality_target = SubstrateFinalityTarget::

::new(target_client, transaction_params); + let tx_tracker = finality_target.submit_finality_proof(header, proof, false).await?; + match tx_tracker.wait().await { + TrackedTransactionStatus::Finalized(_) => Ok(()), + TrackedTransactionStatus::Lost => Err(anyhow::format_err!( + "Transaction with {} header #{} is considered lost at {}", + P::SourceChain::NAME, + header_number, + P::TargetChain::NAME, + )), + } +} -- GitLab From 97f74253387ee43e30c25fd970b5ae4cc1a722d7 Mon Sep 17 00:00:00 2001 From: gui Date: Fri, 26 Apr 2024 21:27:14 +0900 Subject: [PATCH 016/170] Try state: log errors instead of loggin the number of error and discarding them (#4265) Currently we discard errors content We should at least log it. Code now is more similar to what is written in try_on_runtime_upgrade. label should be R0 --------- Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Liam Aharon Co-authored-by: Javier Bullrich --- .../support/src/traits/try_runtime/mod.rs | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/substrate/frame/support/src/traits/try_runtime/mod.rs b/substrate/frame/support/src/traits/try_runtime/mod.rs index bec2dbf549a..c1bf1feb19e 100644 --- a/substrate/frame/support/src/traits/try_runtime/mod.rs +++ b/substrate/frame/support/src/traits/try_runtime/mod.rs @@ -161,22 +161,31 @@ impl TryState Ok(()), Select::All => { - let mut error_count = 0; + let mut errors = Vec::::new(); + for_tuples!(#( - if let Err(_) = Tuple::try_state(n.clone(), targets.clone()) { - error_count += 1; + if let Err(err) = Tuple::try_state(n.clone(), targets.clone()) { + errors.push(err); } )*); - if error_count > 0 { + if !errors.is_empty() { log::error!( target: "try-runtime", - "{} pallets exited with errors while executing try_state checks.", - error_count + "Detected errors while executing `try_state`:", ); + errors.iter().for_each(|err| { + log::error!( + target: "try-runtime", + "{:?}", + err + ); + }); + return Err( - "Detected errors while executing try_state checks. See logs for more info." + "Detected errors while executing `try_state` checks. See logs for more \ + info." .into(), ) } -- GitLab From 988e30f102b155ab68d664d62ac5c73da171659a Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov Date: Fri, 26 Apr 2024 16:28:08 +0300 Subject: [PATCH 017/170] Implementation of the new validator disabling strategy (#2226) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/paritytech/polkadot-sdk/issues/1966, https://github.com/paritytech/polkadot-sdk/issues/1963 and https://github.com/paritytech/polkadot-sdk/issues/1962. Disabling strategy specification [here](https://github.com/paritytech/polkadot-sdk/pull/2955). (Updated 13/02/2024) Implements: * validator disabling for a whole era instead of just a session * no more than 1/3 of the validators in the active set are disabled Removes: * `DisableStrategy` enum - now each validator committing an offence is disabled. * New era is not forced if too many validators are disabled. Before this PR not all offenders were disabled. A decision was made based on [`enum DisableStrategy`](https://github.com/paritytech/polkadot-sdk/blob/bbb6631641f9adba30c0ee6f4d11023a424dd362/substrate/primitives/staking/src/offence.rs#L54). Some offenders were disabled for a whole era, some just for a session, some were not disabled at all. This PR changes the disabling behaviour. Now a validator committing an offense is disabled immediately till the end of the current era. Some implementation notes: * `OffendingValidators` in pallet session keeps all offenders (this is not changed). However its type is changed from `Vec<(u32, bool)>` to `Vec`. The reason is simple - each offender is getting disabled so the bool doesn't make sense anymore. * When a validator is disabled it is first added to `OffendingValidators` and then to `DisabledValidators`. This is done in [`add_offending_validator`](https://github.com/paritytech/polkadot-sdk/blob/bbb6631641f9adba30c0ee6f4d11023a424dd362/substrate/frame/staking/src/slashing.rs#L325) from staking pallet. * In [`rotate_session`](https://github.com/paritytech/polkadot-sdk/blob/bdbe98297032e21a553bf191c530690b1d591405/substrate/frame/session/src/lib.rs#L623) the `end_session` also calls [`end_era`](https://github.com/paritytech/polkadot-sdk/blob/bbb6631641f9adba30c0ee6f4d11023a424dd362/substrate/frame/staking/src/pallet/impls.rs#L490) when an era ends. In this case `OffendingValidators` are cleared **(1)**. * Then in [`rotate_session`](https://github.com/paritytech/polkadot-sdk/blob/bdbe98297032e21a553bf191c530690b1d591405/substrate/frame/session/src/lib.rs#L623) `DisabledValidators` are cleared **(2)** * And finally (still in `rotate_session`) a call to [`start_session`](https://github.com/paritytech/polkadot-sdk/blob/bbb6631641f9adba30c0ee6f4d11023a424dd362/substrate/frame/staking/src/pallet/impls.rs#L430) repopulates the disabled validators **(3)**. * The reason for this complication is that session pallet knows nothing abut eras. To overcome this on each new session the disabled list is repopulated (points 2 and 3). Staking pallet knows when a new era starts so with point 1 it ensures that the offenders list is cleared. --------- Co-authored-by: ordian Co-authored-by: ordian Co-authored-by: Maciej Co-authored-by: Gonçalo Pestana Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: command-bot <> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> --- .../parachains/src/disputes/slashing.rs | 11 +- polkadot/runtime/test-runtime/src/lib.rs | 3 +- polkadot/runtime/westend/src/lib.rs | 5 +- .../functional/0010-validator-disabling.toml | 2 +- prdoc/pr_2226.prdoc | 28 + substrate/bin/node/runtime/src/lib.rs | 3 +- substrate/frame/babe/src/mock.rs | 3 +- substrate/frame/beefy/src/mock.rs | 3 +- .../test-staking-e2e/src/lib.rs | 162 +--- .../test-staking-e2e/src/mock.rs | 27 +- substrate/frame/fast-unstake/src/mock.rs | 2 +- substrate/frame/grandpa/src/mock.rs | 3 +- substrate/frame/im-online/src/lib.rs | 6 +- substrate/frame/im-online/src/tests.rs | 3 - .../nomination-pools/benchmarking/src/mock.rs | 2 +- .../nomination-pools/test-staking/src/mock.rs | 2 +- .../frame/offences/benchmarking/src/mock.rs | 2 +- substrate/frame/offences/src/lib.rs | 1 - substrate/frame/offences/src/migration.rs | 9 +- substrate/frame/offences/src/mock.rs | 3 +- substrate/frame/root-offences/src/lib.rs | 4 +- substrate/frame/root-offences/src/mock.rs | 3 +- .../frame/session/benchmarking/src/mock.rs | 2 +- substrate/frame/session/src/lib.rs | 2 +- substrate/frame/staking/CHANGELOG.md | 19 + substrate/frame/staking/src/lib.rs | 76 ++ substrate/frame/staking/src/migrations.rs | 57 +- substrate/frame/staking/src/mock.rs | 22 +- substrate/frame/staking/src/pallet/impls.rs | 33 +- substrate/frame/staking/src/pallet/mod.rs | 35 +- substrate/frame/staking/src/slashing.rs | 80 +- substrate/frame/staking/src/tests.rs | 834 ++++++++++-------- substrate/primitives/staking/src/offence.rs | 32 - 33 files changed, 777 insertions(+), 702 deletions(-) create mode 100644 prdoc/pr_2226.prdoc diff --git a/polkadot/runtime/parachains/src/disputes/slashing.rs b/polkadot/runtime/parachains/src/disputes/slashing.rs index d0c74e4bc95..a61d0c89983 100644 --- a/polkadot/runtime/parachains/src/disputes/slashing.rs +++ b/polkadot/runtime/parachains/src/disputes/slashing.rs @@ -64,7 +64,7 @@ use sp_runtime::{ KeyTypeId, Perbill, }; use sp_session::{GetSessionNumber, GetValidatorCount}; -use sp_staking::offence::{DisableStrategy, Kind, Offence, OffenceError, ReportOffence}; +use sp_staking::offence::{Kind, Offence, OffenceError, ReportOffence}; use sp_std::{ collections::{btree_map::Entry, btree_set::BTreeSet}, prelude::*, @@ -134,15 +134,6 @@ where self.time_slot.clone() } - fn disable_strategy(&self) -> DisableStrategy { - match self.kind { - SlashingOffenceKind::ForInvalid => DisableStrategy::Always, - // in the future we might change it based on number of disputes initiated: - // - SlashingOffenceKind::AgainstValid => DisableStrategy::Never, - } - } - fn slash_fraction(&self, _offenders: u32) -> Perbill { self.slash_fraction } diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 514643c0a20..d0f1ff0035f 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -313,7 +313,6 @@ parameter_types! { pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxExposurePageSize: u32 = 64; pub const MaxNominators: u32 = 256; - pub storage OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub const MaxAuthorities: u32 = 100_000; pub const OnChainMaxWinners: u32 = u32::MAX; // Unbounded number of election targets and voters. @@ -349,7 +348,6 @@ impl pallet_staking::Config for Runtime { type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type MaxExposurePageSize = MaxExposurePageSize; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = onchain::OnChainExecution; @@ -364,6 +362,7 @@ impl pallet_staking::Config for Runtime { type BenchmarkingConfig = runtime_common::StakingBenchmarkingConfig; type EventListeners = (); type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 7924939c79b..03ecd5c070b 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -613,7 +613,6 @@ parameter_types! { // this is an unbounded number. We just set it to a reasonably high value, 1 full page // of nominators. pub const MaxNominators: u32 = 64; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub const MaxNominations: u32 = ::LIMIT as u32; pub const MaxControllersInDeprecationBatch: u32 = 751; } @@ -634,7 +633,6 @@ impl pallet_staking::Config for Runtime { type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type MaxExposurePageSize = MaxExposurePageSize; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = ElectionProviderMultiPhase; type GenesisElectionProvider = onchain::OnChainExecution; @@ -647,6 +645,7 @@ impl pallet_staking::Config for Runtime { type BenchmarkingConfig = runtime_common::StakingBenchmarkingConfig; type EventListeners = NominationPools; type WeightInfo = weights::pallet_staking::WeightInfo; + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_fast_unstake::Config for Runtime { @@ -1649,7 +1648,7 @@ pub mod migrations { } /// Unreleased migrations. Add new ones here: - pub type Unreleased = (); + pub type Unreleased = (pallet_staking::migrations::v15::MigrateV14ToV15,); } /// Unchecked extrinsic type as expected by this runtime. diff --git a/polkadot/zombienet_tests/functional/0010-validator-disabling.toml b/polkadot/zombienet_tests/functional/0010-validator-disabling.toml index c9d79c5f8f2..806f34d7f76 100644 --- a/polkadot/zombienet_tests/functional/0010-validator-disabling.toml +++ b/polkadot/zombienet_tests/functional/0010-validator-disabling.toml @@ -21,7 +21,7 @@ requests = { memory = "2G", cpu = "1" } [[relaychain.node_groups]] name = "honest-validator" count = 3 - args = ["-lparachain=debug"] + args = ["-lparachain=debug,runtime::staking=debug"] [[relaychain.node_groups]] image = "{{MALUS_IMAGE}}" diff --git a/prdoc/pr_2226.prdoc b/prdoc/pr_2226.prdoc new file mode 100644 index 00000000000..f03540a50f6 --- /dev/null +++ b/prdoc/pr_2226.prdoc @@ -0,0 +1,28 @@ +title: Validator disabling strategy in runtime + +doc: + - audience: Node Operator + description: | + On each committed offence (no matter slashable or not) the offending validator will be + disabled for a whole era. + - audience: Runtime Dev + description: | + The disabling strategy in staking pallet is no longer hardcoded but abstracted away via + `DisablingStrategy` trait. The trait contains a single function (make_disabling_decision) which + is called for each offence. The function makes a decision if (and which) validators should be + disabled. A default implementation is provided - `UpToLimitDisablingStrategy`. It + will be used on Kusama and Polkadot. In nutshell `UpToLimitDisablingStrategy` + disables offenders up to the configured threshold. Offending validators are not disabled for + offences in previous eras. The threshold is controlled via `DISABLING_LIMIT_FACTOR` (a generic + parameter of `UpToLimitDisablingStrategy`). + +migrations: + db: [] + runtime: + - reference: pallet-staking + description: | + Renames `OffendingValidators` storage item to `DisabledValidators` and changes its type from + `Vec<(u32, bool)>` to `Vec`. + +crates: + - name: pallet-staking \ No newline at end of file diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 43c617023bc..0caaa8c7322 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -654,7 +654,6 @@ parameter_types! { pub const SlashDeferDuration: sp_staking::EraIndex = 24 * 7; // 1/4 the bonding duration. pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominators: u32 = 64; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub const MaxControllersInDeprecationBatch: u32 = 5900; pub OffchainRepeat: BlockNumber = 5; pub HistoryDepth: u32 = 84; @@ -690,7 +689,6 @@ impl pallet_staking::Config for Runtime { type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; type MaxExposurePageSize = ConstU32<256>; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type ElectionProvider = ElectionProviderMultiPhase; type GenesisElectionProvider = onchain::OnChainExecution; type VoterList = VoterList; @@ -703,6 +701,7 @@ impl pallet_staking::Config for Runtime { type EventListeners = NominationPools; type WeightInfo = pallet_staking::weights::SubstrateWeight; type BenchmarkingConfig = StakingBenchmarkingConfig; + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_fast_unstake::Config for Runtime { diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index ec54275278e..395a86e6528 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -144,7 +144,6 @@ parameter_types! { pub const BondingDuration: EraIndex = 3; pub const SlashDeferDuration: EraIndex = 0; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(16); pub static ElectionsBounds: ElectionBounds = ElectionBoundsBuilder::default().build(); } @@ -174,7 +173,6 @@ impl pallet_staking::Config for Test { type UnixTime = pallet_timestamp::Pallet; type EraPayout = pallet_staking::ConvertCurve; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; @@ -187,6 +185,7 @@ impl pallet_staking::Config for Test { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_offences::Config for Test { diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index 1c55adc8de4..0b87de6bf5d 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -158,7 +158,6 @@ parameter_types! { pub const SessionsPerEra: SessionIndex = 3; pub const BondingDuration: EraIndex = 3; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub static ElectionsBoundsOnChain: ElectionBounds = ElectionBoundsBuilder::default().build(); } @@ -188,7 +187,6 @@ impl pallet_staking::Config for Test { type UnixTime = pallet_timestamp::Pallet; type EraPayout = pallet_staking::ConvertCurve; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; @@ -201,6 +199,7 @@ impl pallet_staking::Config for Test { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_offences::Config for Test { diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs index 83083c91209..c00bb66ea13 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs @@ -23,7 +23,6 @@ pub(crate) const LOG_TARGET: &str = "tests::e2e-epm"; use frame_support::{assert_err, assert_noop, assert_ok}; use mock::*; use sp_core::Get; -use sp_npos_elections::{to_supports, StakedAssignment}; use sp_runtime::Perbill; use crate::mock::RuntimeOrigin; @@ -127,75 +126,48 @@ fn offchainify_works() { } #[test] -/// Replicates the Kusama incident of 8th Dec 2022 and its resolution through the governance +/// Inspired by the Kusama incident of 8th Dec 2022 and its resolution through the governance /// fallback. /// -/// After enough slashes exceeded the `Staking::OffendingValidatorsThreshold`, the staking pallet -/// set `Forcing::ForceNew`. When a new session starts, staking will start to force a new era and -/// calls ::elect(). If at this point EPM and the staking miners did not -/// have enough time to queue a new solution (snapshot + solution submission), the election request -/// fails. If there is no election fallback mechanism in place, EPM enters in emergency mode. -/// Recovery: Once EPM is in emergency mode, subsequent calls to `elect()` will fail until a new -/// solution is added to EPM's `QueuedSolution` queue. This can be achieved through -/// `Call::set_emergency_election_result` or `Call::governance_fallback` dispatchables. Once a new -/// solution is added to the queue, EPM phase transitions to `Phase::Off` and the election flow -/// restarts. Note that in this test case, the emergency throttling is disabled. -fn enters_emergency_phase_after_forcing_before_elect() { +/// Mass slash of validators shouldn't disable more than 1/3 of them (the byzantine threshold). Also +/// no new era should be forced which could lead to EPM entering emergency mode. +fn mass_slash_doesnt_enter_emergency_phase() { let epm_builder = EpmExtBuilder::default().disable_emergency_throttling(); - let (ext, pool_state, _) = ExtBuilder::default().epm(epm_builder).build_offchainify(); - - execute_with(ext, || { - log!( - trace, - "current validators (staking): {:?}", - >::validators() - ); - let session_validators_before = Session::validators(); - - roll_to_epm_off(); - assert!(ElectionProviderMultiPhase::current_phase().is_off()); + let staking_builder = StakingExtBuilder::default().validator_count(7); + let (mut ext, _, _) = ExtBuilder::default() + .epm(epm_builder) + .staking(staking_builder) + .build_offchainify(); + ext.execute_with(|| { assert_eq!(pallet_staking::ForceEra::::get(), pallet_staking::Forcing::NotForcing); - // slashes so that staking goes into `Forcing::ForceNew`. - slash_through_offending_threshold(); - assert_eq!(pallet_staking::ForceEra::::get(), pallet_staking::Forcing::ForceNew); + let active_set_size_before_slash = Session::validators().len(); - advance_session_delayed_solution(pool_state.clone()); - assert!(ElectionProviderMultiPhase::current_phase().is_emergency()); - log_current_time(); + // Slash more than 1/3 of the active validators + let mut slashed = slash_half_the_active_set(); - let era_before_delayed_next = Staking::current_era(); - // try to advance 2 eras. - assert!(start_next_active_era_delayed_solution(pool_state.clone()).is_ok()); - assert_eq!(Staking::current_era(), era_before_delayed_next); - assert!(start_next_active_era(pool_state).is_err()); - assert_eq!(Staking::current_era(), era_before_delayed_next); + let active_set_size_after_slash = Session::validators().len(); - // EPM is still in emergency phase. - assert!(ElectionProviderMultiPhase::current_phase().is_emergency()); + // active set should stay the same before and after the slash + assert_eq!(active_set_size_before_slash, active_set_size_after_slash); - // session validator set remains the same. - assert_eq!(Session::validators(), session_validators_before); - - // performs recovery through the set emergency result. - let supports = to_supports(&vec![ - StakedAssignment { who: 21, distribution: vec![(21, 10)] }, - StakedAssignment { who: 31, distribution: vec![(21, 10), (31, 10)] }, - StakedAssignment { who: 41, distribution: vec![(41, 10)] }, - ]); - assert!(ElectionProviderMultiPhase::set_emergency_election_result( - RuntimeOrigin::root(), - supports - ) - .is_ok()); + // Slashed validators are disabled up to a limit + slashed.truncate( + pallet_staking::UpToLimitDisablingStrategy::::disable_limit( + active_set_size_after_slash, + ), + ); - // EPM can now roll to signed phase to proceed with elections. The validator set is the - // expected (ie. set through `set_emergency_election_result`). - roll_to_epm_signed(); - //assert!(ElectionProviderMultiPhase::current_phase().is_signed()); - assert_eq!(Session::validators(), vec![21, 31, 41]); - assert_eq!(Staking::current_era(), era_before_delayed_next.map(|e| e + 1)); + // Find the indices of the disabled validators + let active_set = Session::validators(); + let expected_disabled = slashed + .into_iter() + .map(|d| active_set.iter().position(|a| *a == d).unwrap() as u32) + .collect::>(); + + assert_eq!(pallet_staking::ForceEra::::get(), pallet_staking::Forcing::NotForcing); + assert_eq!(Session::disabled_validators(), expected_disabled); }); } @@ -253,77 +225,7 @@ fn continuous_slashes_below_offending_threshold() { } #[test] -/// Slashed validator sets intentions in the same era of slashing. -/// -/// When validators are slashed, they are chilled and removed from the current `VoterList`. Thus, -/// the slashed validator should not be considered in the next validator set. However, if the -/// slashed validator sets its intention to validate again in the same era when it was slashed and -/// chilled, the validator may not be removed from the active validator set across eras, provided -/// it would selected in the subsequent era if there was no slash. Nominators of the slashed -/// validator will also be slashed and chilled, as expected, but the nomination intentions will -/// remain after the validator re-set the intention to be validating again. -/// -/// This behaviour is due to removing implicit chill upon slash -/// . -/// -/// Related to . -fn set_validation_intention_after_chilled() { - use frame_election_provider_support::SortedListProvider; - use pallet_staking::{Event, Forcing, Nominators}; - - let (ext, pool_state, _) = ExtBuilder::default() - .epm(EpmExtBuilder::default()) - .staking(StakingExtBuilder::default()) - .build_offchainify(); - - execute_with(ext, || { - assert_eq!(active_era(), 0); - // validator is part of the validator set. - assert!(Session::validators().contains(&41)); - assert!(::VoterList::contains(&41)); - - // nominate validator 81. - assert_ok!(Staking::nominate(RuntimeOrigin::signed(21), vec![41])); - assert_eq!(Nominators::::get(21).unwrap().targets, vec![41]); - - // validator is slashed. it is removed from the `VoterList` through chilling but in the - // current era, the validator is still part of the active validator set. - add_slash(&41); - assert!(Session::validators().contains(&41)); - assert!(!::VoterList::contains(&41)); - assert_eq!( - staking_events(), - [ - Event::Chilled { stash: 41 }, - Event::ForceEra { mode: Forcing::ForceNew }, - Event::SlashReported { - validator: 41, - slash_era: 0, - fraction: Perbill::from_percent(10) - } - ], - ); - - // after the nominator is slashed and chilled, the nominations remain. - assert_eq!(Nominators::::get(21).unwrap().targets, vec![41]); - - // validator sets intention to stake again in the same era it was chilled. - assert_ok!(Staking::validate(RuntimeOrigin::signed(41), Default::default())); - - // progress era and check that the slashed validator is still part of the validator - // set. - assert!(start_next_active_era(pool_state).is_ok()); - assert_eq!(active_era(), 1); - assert!(Session::validators().contains(&41)); - assert!(::VoterList::contains(&41)); - - // nominations are still active as before the slash. - assert_eq!(Nominators::::get(21).unwrap().targets, vec![41]); - }) -} - -#[test] -/// Active ledger balance may fall below ED if account chills before unbonding. +/// Active ledger balance may fall below ED if account chills before unbounding. /// /// Unbonding call fails if the remaining ledger's stash balance falls below the existential /// deposit. However, if the stash is chilled before unbonding, the ledger's active balance may diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index a727e3bf816..8f1775a7e59 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -35,7 +35,7 @@ use sp_runtime::{ transaction_validity, BuildStorage, PerU16, Perbill, Percent, }; use sp_staking::{ - offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, + offence::{OffenceDetails, OnOffenceHandler}, EraIndex, SessionIndex, }; use sp_std::prelude::*; @@ -236,7 +236,6 @@ parameter_types! { pub const SessionsPerEra: sp_staking::SessionIndex = 2; pub static BondingDuration: sp_staking::EraIndex = 28; pub const SlashDeferDuration: sp_staking::EraIndex = 7; // 1/4 the bonding duration. - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(40); pub HistoryDepth: u32 = 84; } @@ -290,6 +289,8 @@ parameter_types! { /// Upper limit on the number of NPOS nominations. const MAX_QUOTA_NOMINATIONS: u32 = 16; +/// Disabling factor set explicitly to byzantine threshold +pub(crate) const SLASHING_DISABLING_FACTOR: usize = 3; impl pallet_staking::Config for Runtime { type Currency = Balances; @@ -308,7 +309,6 @@ impl pallet_staking::Config for Runtime { type EraPayout = (); type NextNewSession = Session; type MaxExposurePageSize = ConstU32<256>; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type ElectionProvider = ElectionProviderMultiPhase; type GenesisElectionProvider = onchain::OnChainExecution; type VoterList = BagsList; @@ -320,6 +320,7 @@ impl pallet_staking::Config for Runtime { type EventListeners = Pools; type WeightInfo = pallet_staking::weights::SubstrateWeight; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl frame_system::offchain::SendTransactionTypes for Runtime @@ -871,7 +872,6 @@ pub(crate) fn on_offence_now( offenders, slash_fraction, Staking::eras_start_session_index(now).unwrap(), - DisableStrategy::WhenSlashed, ); } @@ -886,19 +886,16 @@ pub(crate) fn add_slash(who: &AccountId) { ); } -// Slashes enough validators to cross the `Staking::OffendingValidatorsThreshold`. -pub(crate) fn slash_through_offending_threshold() { - let validators = Session::validators(); - let mut remaining_slashes = - ::OffendingValidatorsThreshold::get() * - validators.len() as u32; +// Slashes 1/2 of the active set. Returns the `AccountId`s of the slashed validators. +pub(crate) fn slash_half_the_active_set() -> Vec { + let mut slashed = Session::validators(); + slashed.truncate(slashed.len() / 2); - for v in validators.into_iter() { - if remaining_slashes != 0 { - add_slash(&v); - remaining_slashes -= 1; - } + for v in slashed.iter() { + add_slash(v); } + + slashed } // Slashes a percentage of the active nominators that haven't been slashed yet, with diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs index b731cb822f3..d876f9f6171 100644 --- a/substrate/frame/fast-unstake/src/mock.rs +++ b/substrate/frame/fast-unstake/src/mock.rs @@ -134,7 +134,6 @@ impl pallet_staking::Config for Runtime { type NextNewSession = (); type HistoryDepth = ConstU32<84>; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = (); type ElectionProvider = MockElection; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; @@ -145,6 +144,7 @@ impl pallet_staking::Config for Runtime { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } pub struct BalanceToU256; diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 4a21da655e5..2d54f525b1f 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -146,7 +146,6 @@ parameter_types! { pub const SessionsPerEra: SessionIndex = 3; pub const BondingDuration: EraIndex = 3; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub static ElectionsBoundsOnChain: ElectionBounds = ElectionBoundsBuilder::default().build(); } @@ -176,7 +175,6 @@ impl pallet_staking::Config for Test { type UnixTime = pallet_timestamp::Pallet; type EraPayout = pallet_staking::ConvertCurve; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; @@ -189,6 +187,7 @@ impl pallet_staking::Config for Test { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_offences::Config for Test { diff --git a/substrate/frame/im-online/src/lib.rs b/substrate/frame/im-online/src/lib.rs index 239b47834d1..f91a473e53d 100644 --- a/substrate/frame/im-online/src/lib.rs +++ b/substrate/frame/im-online/src/lib.rs @@ -104,7 +104,7 @@ use sp_runtime::{ PerThing, Perbill, Permill, RuntimeDebug, SaturatedConversion, }; use sp_staking::{ - offence::{DisableStrategy, Kind, Offence, ReportOffence}, + offence::{Kind, Offence, ReportOffence}, SessionIndex, }; use sp_std::prelude::*; @@ -847,10 +847,6 @@ impl Offence for UnresponsivenessOffence { self.session_index } - fn disable_strategy(&self) -> DisableStrategy { - DisableStrategy::Never - } - fn slash_fraction(&self, offenders: u32) -> Perbill { // the formula is min((3 * (k - (n / 10 + 1))) / n, 1) * 0.07 // basically, 10% can be offline with no slash, but after that, it linearly climbs up to 7% diff --git a/substrate/frame/im-online/src/tests.rs b/substrate/frame/im-online/src/tests.rs index f9959593494..12333d59ef8 100644 --- a/substrate/frame/im-online/src/tests.rs +++ b/substrate/frame/im-online/src/tests.rs @@ -50,9 +50,6 @@ fn test_unresponsiveness_slash_fraction() { dummy_offence.slash_fraction(17), Perbill::from_parts(46200000), // 4.62% ); - - // Offline offences should never lead to being disabled. - assert_eq!(dummy_offence.disable_strategy(), DisableStrategy::Never); } #[test] diff --git a/substrate/frame/nomination-pools/benchmarking/src/mock.rs b/substrate/frame/nomination-pools/benchmarking/src/mock.rs index a59f8f3f40e..2752d53a6b9 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/mock.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/mock.rs @@ -111,7 +111,6 @@ impl pallet_staking::Config for Runtime { type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = (); type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = (); type ElectionProvider = frame_election_provider_support::NoElection<(AccountId, BlockNumber, Staking, ())>; type GenesisElectionProvider = Self::ElectionProvider; @@ -124,6 +123,7 @@ impl pallet_staking::Config for Runtime { type EventListeners = Pools; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/nomination-pools/test-staking/src/mock.rs b/substrate/frame/nomination-pools/test-staking/src/mock.rs index 2ec47e0d164..93a05ddfae9 100644 --- a/substrate/frame/nomination-pools/test-staking/src/mock.rs +++ b/substrate/frame/nomination-pools/test-staking/src/mock.rs @@ -125,7 +125,6 @@ impl pallet_staking::Config for Runtime { type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = (); type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = (); type ElectionProvider = frame_election_provider_support::NoElection<(AccountId, BlockNumber, Staking, ())>; type GenesisElectionProvider = Self::ElectionProvider; @@ -138,6 +137,7 @@ impl pallet_staking::Config for Runtime { type EventListeners = Pools; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/offences/benchmarking/src/mock.rs b/substrate/frame/offences/benchmarking/src/mock.rs index 27129e73c71..eeaa1364504 100644 --- a/substrate/frame/offences/benchmarking/src/mock.rs +++ b/substrate/frame/offences/benchmarking/src/mock.rs @@ -174,7 +174,6 @@ impl pallet_staking::Config for Test { type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = (); type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; @@ -186,6 +185,7 @@ impl pallet_staking::Config for Test { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_im_online::Config for Test { diff --git a/substrate/frame/offences/src/lib.rs b/substrate/frame/offences/src/lib.rs index 1c7ffeca719..a328b2fee4e 100644 --- a/substrate/frame/offences/src/lib.rs +++ b/substrate/frame/offences/src/lib.rs @@ -132,7 +132,6 @@ where &concurrent_offenders, &slash_perbill, offence.session_index(), - offence.disable_strategy(), ); // Deposit the event. diff --git a/substrate/frame/offences/src/migration.rs b/substrate/frame/offences/src/migration.rs index 3b5cf3ce926..199f4749136 100644 --- a/substrate/frame/offences/src/migration.rs +++ b/substrate/frame/offences/src/migration.rs @@ -23,7 +23,7 @@ use frame_support::{ weights::Weight, Twox64Concat, }; -use sp_staking::offence::{DisableStrategy, OnOffenceHandler}; +use sp_staking::offence::OnOffenceHandler; use sp_std::vec::Vec; #[cfg(feature = "try-runtime")] @@ -106,12 +106,7 @@ pub fn remove_deferred_storage() -> Weight { let deferred = >::take(); log::info!(target: LOG_TARGET, "have {} deferred offences, applying.", deferred.len()); for (offences, perbill, session) in deferred.iter() { - let consumed = T::OnOffenceHandler::on_offence( - offences, - perbill, - *session, - DisableStrategy::WhenSlashed, - ); + let consumed = T::OnOffenceHandler::on_offence(offences, perbill, *session); weight = weight.saturating_add(consumed); } diff --git a/substrate/frame/offences/src/mock.rs b/substrate/frame/offences/src/mock.rs index 31d5f805f3e..9a3120e41ea 100644 --- a/substrate/frame/offences/src/mock.rs +++ b/substrate/frame/offences/src/mock.rs @@ -33,7 +33,7 @@ use sp_runtime::{ BuildStorage, Perbill, }; use sp_staking::{ - offence::{self, DisableStrategy, Kind, OffenceDetails}, + offence::{self, Kind, OffenceDetails}, SessionIndex, }; @@ -51,7 +51,6 @@ impl offence::OnOffenceHandler _offenders: &[OffenceDetails], slash_fraction: &[Perbill], _offence_session: SessionIndex, - _disable_strategy: DisableStrategy, ) -> Weight { OnOffencePerbill::mutate(|f| { *f = slash_fraction.to_vec(); diff --git a/substrate/frame/root-offences/src/lib.rs b/substrate/frame/root-offences/src/lib.rs index 24d259ed1d4..6531080b8d1 100644 --- a/substrate/frame/root-offences/src/lib.rs +++ b/substrate/frame/root-offences/src/lib.rs @@ -33,7 +33,7 @@ use alloc::vec::Vec; use pallet_session::historical::IdentificationTuple; use pallet_staking::{BalanceOf, Exposure, ExposureOf, Pallet as Staking}; use sp_runtime::Perbill; -use sp_staking::offence::{DisableStrategy, OnOffenceHandler}; +use sp_staking::offence::OnOffenceHandler; pub use pallet::*; @@ -128,7 +128,7 @@ pub mod pallet { T::AccountId, IdentificationTuple, Weight, - >>::on_offence(&offenders, &slash_fraction, session_index, DisableStrategy::WhenSlashed); + >>::on_offence(&offenders, &slash_fraction, session_index); } } } diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index 626db138c2b..7e7332c3f7e 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -133,7 +133,6 @@ parameter_types! { pub static SlashDeferDuration: EraIndex = 0; pub const BondingDuration: EraIndex = 3; pub static LedgerSlashPerEra: (BalanceOf, BTreeMap>) = (Zero::zero(), BTreeMap::new()); - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(75); } impl pallet_staking::Config for Test { @@ -153,7 +152,6 @@ impl pallet_staking::Config for Test { type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type TargetList = pallet_staking::UseValidatorsMap; @@ -165,6 +163,7 @@ impl pallet_staking::Config for Test { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_session::historical::Config for Test { diff --git a/substrate/frame/session/benchmarking/src/mock.rs b/substrate/frame/session/benchmarking/src/mock.rs index 81052141fd8..6cefa8f39a8 100644 --- a/substrate/frame/session/benchmarking/src/mock.rs +++ b/substrate/frame/session/benchmarking/src/mock.rs @@ -174,7 +174,6 @@ impl pallet_staking::Config for Test { type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; type MaxExposurePageSize = ConstU32<64>; - type OffendingValidatorsThreshold = (); type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type MaxUnlockingChunks = ConstU32<32>; @@ -186,6 +185,7 @@ impl pallet_staking::Config for Test { type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl crate::Config for Test {} diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index 17b6aa7a464..9506e98adf7 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -627,7 +627,7 @@ impl Pallet { Validators::::put(&validators); if changed { - // reset disabled validators + // reset disabled validators if active set was changed >::take(); } diff --git a/substrate/frame/staking/CHANGELOG.md b/substrate/frame/staking/CHANGELOG.md index 719aa388755..113b7a6200b 100644 --- a/substrate/frame/staking/CHANGELOG.md +++ b/substrate/frame/staking/CHANGELOG.md @@ -7,6 +7,25 @@ on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). We maintain a single integer version number for staking pallet to keep track of all storage migrations. +## [v15] + +### Added + +- New trait `DisablingStrategy` which is responsible for making a decision which offenders should be + disabled on new offence. +- Default implementation of `DisablingStrategy` - `UpToLimitDisablingStrategy`. It + disables each new offender up to a threshold (1/3 by default). Offenders are not runtime disabled for + offences in previous era(s). But they will be low-priority node-side disabled for dispute initiation. +- `OffendingValidators` storage item is replaced with `DisabledValidators`. The former keeps all + offenders and if they are disabled or not. The latter just keeps a list of all offenders as they + are disabled by default. + +### Deprecated + +- `enum DisableStrategy` is no longer needed because disabling is not related to the type of the + offence anymore. A decision if a offender is disabled or not is made by a `DisablingStrategy` + implementation. + ## [v14] ### Added diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index f5b7e3eca3d..047ad6b87cc 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -1239,3 +1239,79 @@ impl BenchmarkingConfig for TestBenchmarkingConfig { type MaxValidators = frame_support::traits::ConstU32<100>; type MaxNominators = frame_support::traits::ConstU32<100>; } + +/// Controls validator disabling +pub trait DisablingStrategy { + /// Make a disabling decision. Returns the index of the validator to disable or `None` if no new + /// validator should be disabled. + fn decision( + offender_stash: &T::AccountId, + slash_era: EraIndex, + currently_disabled: &Vec, + ) -> Option; +} + +/// Implementation of [`DisablingStrategy`] which disables validators from the active set up to a +/// threshold. `DISABLING_LIMIT_FACTOR` is the factor of the maximum disabled validators in the +/// active set. E.g. setting this value to `3` means no more than 1/3 of the validators in the +/// active set can be disabled in an era. +/// By default a factor of 3 is used which is the byzantine threshold. +pub struct UpToLimitDisablingStrategy; + +impl UpToLimitDisablingStrategy { + /// Disabling limit calculated from the total number of validators in the active set. When + /// reached no more validators will be disabled. + pub fn disable_limit(validators_len: usize) -> usize { + validators_len + .saturating_sub(1) + .checked_div(DISABLING_LIMIT_FACTOR) + .unwrap_or_else(|| { + defensive!("DISABLING_LIMIT_FACTOR should not be 0"); + 0 + }) + } +} + +impl DisablingStrategy + for UpToLimitDisablingStrategy +{ + fn decision( + offender_stash: &T::AccountId, + slash_era: EraIndex, + currently_disabled: &Vec, + ) -> Option { + let active_set = T::SessionInterface::validators(); + + // We don't disable more than the limit + if currently_disabled.len() >= Self::disable_limit(active_set.len()) { + log!( + debug, + "Won't disable: reached disabling limit {:?}", + Self::disable_limit(active_set.len()) + ); + return None + } + + // We don't disable for offences in previous eras + if ActiveEra::::get().map(|e| e.index).unwrap_or_default() > slash_era { + log!( + debug, + "Won't disable: current_era {:?} > slash_era {:?}", + Pallet::::current_era().unwrap_or_default(), + slash_era + ); + return None + } + + let offender_idx = if let Some(idx) = active_set.iter().position(|i| i == offender_stash) { + idx as u32 + } else { + log!(debug, "Won't disable: offender not in active set",); + return None + }; + + log!(debug, "Will disable {:?}", offender_idx); + + Some(offender_idx) + } +} diff --git a/substrate/frame/staking/src/migrations.rs b/substrate/frame/staking/src/migrations.rs index d5b18421d5b..510252be26c 100644 --- a/substrate/frame/staking/src/migrations.rs +++ b/substrate/frame/staking/src/migrations.rs @@ -20,9 +20,10 @@ use super::*; use frame_election_provider_support::SortedListProvider; use frame_support::{ + migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, - traits::{GetStorageVersion, OnRuntimeUpgrade}, + traits::{GetStorageVersion, OnRuntimeUpgrade, UncheckedOnRuntimeUpgrade}, }; #[cfg(feature = "try-runtime")] @@ -59,11 +60,61 @@ impl Default for ObsoleteReleases { #[storage_alias] type StorageVersion = StorageValue, ObsoleteReleases, ValueQuery>; +/// Migrating `OffendingValidators` from `Vec<(u32, bool)>` to `Vec` +pub mod v15 { + use super::*; + + // The disabling strategy used by staking pallet + type DefaultDisablingStrategy = UpToLimitDisablingStrategy; + + pub struct VersionUncheckedMigrateV14ToV15(sp_std::marker::PhantomData); + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV14ToV15 { + fn on_runtime_upgrade() -> Weight { + let mut migrated = v14::OffendingValidators::::take() + .into_iter() + .filter(|p| p.1) // take only disabled validators + .map(|p| p.0) + .collect::>(); + + // Respect disabling limit + migrated.truncate(DefaultDisablingStrategy::disable_limit( + T::SessionInterface::validators().len(), + )); + + DisabledValidators::::set(migrated); + + log!(info, "v15 applied successfully."); + T::DbWeight::get().reads_writes(1, 1) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_state: Vec) -> Result<(), TryRuntimeError> { + frame_support::ensure!( + v14::OffendingValidators::::decode_len().is_none(), + "OffendingValidators is not empty after the migration" + ); + Ok(()) + } + } + + pub type MigrateV14ToV15 = VersionedMigration< + 14, + 15, + VersionUncheckedMigrateV14ToV15, + Pallet, + ::DbWeight, + >; +} + /// Migration of era exposure storage items to paged exposures. /// Changelog: [v14.](https://github.com/paritytech/substrate/blob/ankan/paged-rewards-rebased2/frame/staking/CHANGELOG.md#14) pub mod v14 { use super::*; + #[frame_support::storage_alias] + pub(crate) type OffendingValidators = + StorageValue, Vec<(u32, bool)>, ValueQuery>; + pub struct MigrateToV14(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV14 { fn on_runtime_upgrade() -> Weight { @@ -73,10 +124,10 @@ pub mod v14 { if in_code == 14 && on_chain == 13 { in_code.put::>(); - log!(info, "v14 applied successfully."); + log!(info, "staking v14 applied successfully."); T::DbWeight::get().reads_writes(1, 1) } else { - log!(warn, "v14 not applied."); + log!(warn, "staking v14 not applied."); T::DbWeight::get().reads(1) } } diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index b46b863c016..8c60dec65a8 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -34,7 +34,7 @@ use frame_system::{EnsureRoot, EnsureSignedBy}; use sp_io; use sp_runtime::{curve::PiecewiseLinear, testing::UintAuthorityId, traits::Zero, BuildStorage}; use sp_staking::{ - offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, + offence::{OffenceDetails, OnOffenceHandler}, OnStakingUpdate, }; @@ -186,7 +186,6 @@ pallet_staking_reward_curve::build! { parameter_types! { pub const BondingDuration: EraIndex = 3; pub const RewardCurve: &'static PiecewiseLinear<'static> = &I_NPOS; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(75); } parameter_types! { @@ -267,6 +266,9 @@ impl OnStakingUpdate for EventListenerMock { } } +// Disabling threshold for `UpToLimitDisablingStrategy` +pub(crate) const DISABLING_LIMIT_FACTOR: usize = 3; + impl crate::pallet::pallet::Config for Test { type Currency = Balances; type CurrencyBalance = ::Balance; @@ -284,7 +286,6 @@ impl crate::pallet::pallet::Config for Test { type EraPayout = ConvertCurve; type NextNewSession = Session; type MaxExposurePageSize = MaxExposurePageSize; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; // NOTE: consider a macro and use `UseNominatorsAndValidatorsMap` as well. @@ -297,6 +298,7 @@ impl crate::pallet::pallet::Config for Test { type EventListeners = EventListenerMock; type BenchmarkingConfig = TestBenchmarkingConfig; type WeightInfo = (); + type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } pub struct WeightedNominationsQuota; @@ -461,6 +463,8 @@ impl ExtBuilder { (31, self.balance_factor * 2000), (41, self.balance_factor * 2000), (51, self.balance_factor * 2000), + (201, self.balance_factor * 2000), + (202, self.balance_factor * 2000), // optional nominator (100, self.balance_factor * 2000), (101, self.balance_factor * 2000), @@ -488,8 +492,10 @@ impl ExtBuilder { (31, 31, self.balance_factor * 500, StakerStatus::::Validator), // an idle validator (41, 41, self.balance_factor * 1000, StakerStatus::::Idle), - ]; - // optionally add a nominator + (51, 51, self.balance_factor * 1000, StakerStatus::::Idle), + (201, 201, self.balance_factor * 1000, StakerStatus::::Idle), + (202, 202, self.balance_factor * 1000, StakerStatus::::Idle), + ]; // optionally add a nominator if self.nominate { stakers.push(( 101, @@ -728,12 +734,11 @@ pub(crate) fn on_offence_in_era( >], slash_fraction: &[Perbill], era: EraIndex, - disable_strategy: DisableStrategy, ) { let bonded_eras = crate::BondedEras::::get(); for &(bonded_era, start_session) in bonded_eras.iter() { if bonded_era == era { - let _ = Staking::on_offence(offenders, slash_fraction, start_session, disable_strategy); + let _ = Staking::on_offence(offenders, slash_fraction, start_session); return } else if bonded_era > era { break @@ -745,7 +750,6 @@ pub(crate) fn on_offence_in_era( offenders, slash_fraction, Staking::eras_start_session_index(era).unwrap(), - disable_strategy, ); } else { panic!("cannot slash in era {}", era); @@ -760,7 +764,7 @@ pub(crate) fn on_offence_now( slash_fraction: &[Perbill], ) { let now = Staking::active_era().unwrap().index; - on_offence_in_era(offenders, slash_fraction, now, DisableStrategy::WhenSlashed) + on_offence_in_era(offenders, slash_fraction, now) } pub(crate) fn add_slash(who: &AccountId) { diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index 0c0ef0dbf46..f4d4a7133dd 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -43,7 +43,7 @@ use sp_runtime::{ }; use sp_staking::{ currency_to_vote::CurrencyToVote, - offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, + offence::{OffenceDetails, OnOffenceHandler}, EraIndex, OnStakingUpdate, Page, SessionIndex, Stake, StakingAccount::{self, Controller, Stash}, StakingInterface, @@ -505,10 +505,8 @@ impl Pallet { } // disable all offending validators that have been disabled for the whole era - for (index, disabled) in >::get() { - if disabled { - T::SessionInterface::disable_validator(index); - } + for index in >::get() { + T::SessionInterface::disable_validator(index); } } @@ -598,8 +596,8 @@ impl Pallet { >::insert(&active_era.index, validator_payout); T::RewardRemainder::on_unbalanced(T::Currency::issue(remainder)); - // Clear offending validators. - >::kill(); + // Clear disabled validators. + >::kill(); } } @@ -868,14 +866,6 @@ impl Pallet { Self::deposit_event(Event::::ForceEra { mode }); } - /// Ensures that at the end of the current session there will be a new era. - pub(crate) fn ensure_new_era() { - match ForceEra::::get() { - Forcing::ForceAlways | Forcing::ForceNew => (), - _ => Self::set_force_era(Forcing::ForceNew), - } - } - #[cfg(feature = "runtime-benchmarks")] pub fn add_era_stakers( current_era: EraIndex, @@ -1447,7 +1437,6 @@ where >], slash_fraction: &[Perbill], slash_session: SessionIndex, - disable_strategy: DisableStrategy, ) -> Weight { let reward_proportion = SlashRewardFraction::::get(); let mut consumed_weight = Weight::from_parts(0, 0); @@ -1512,7 +1501,6 @@ where window_start, now: active_era, reward_proportion, - disable_strategy, }); Self::deposit_event(Event::::SlashReported { @@ -1986,7 +1974,8 @@ impl Pallet { Self::check_nominators()?; Self::check_exposures()?; Self::check_paged_exposures()?; - Self::check_count() + Self::check_count()?; + Self::ensure_disabled_validators_sorted() } /// Invariants: @@ -2300,4 +2289,12 @@ impl Pallet { Ok(()) } + + fn ensure_disabled_validators_sorted() -> Result<(), TryRuntimeError> { + ensure!( + DisabledValidators::::get().windows(2).all(|pair| pair[0] <= pair[1]), + "DisabledValidators is not sorted" + ); + Ok(()) + } } diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index 76ddad6f135..9c968d88344 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -47,10 +47,11 @@ mod impls; pub use impls::*; use crate::{ - slashing, weights::WeightInfo, AccountIdLookupOf, ActiveEraInfo, BalanceOf, EraPayout, - EraRewardPoints, Exposure, ExposurePage, Forcing, LedgerIntegrityState, MaxNominationsOf, - NegativeImbalanceOf, Nominations, NominationsQuota, PositiveImbalanceOf, RewardDestination, - SessionInterface, StakingLedger, UnappliedSlash, UnlockChunk, ValidatorPrefs, + slashing, weights::WeightInfo, AccountIdLookupOf, ActiveEraInfo, BalanceOf, DisablingStrategy, + EraPayout, EraRewardPoints, Exposure, ExposurePage, Forcing, LedgerIntegrityState, + MaxNominationsOf, NegativeImbalanceOf, Nominations, NominationsQuota, PositiveImbalanceOf, + RewardDestination, SessionInterface, StakingLedger, UnappliedSlash, UnlockChunk, + ValidatorPrefs, }; // The speculative number of spans are used as an input of the weight annotation of @@ -67,7 +68,7 @@ pub mod pallet { use super::*; /// The in-code storage version. - const STORAGE_VERSION: StorageVersion = StorageVersion::new(14); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(15); #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)] @@ -217,10 +218,6 @@ pub mod pallet { #[pallet::constant] type MaxExposurePageSize: Get; - /// The fraction of the validator set that is safe to be offending. - /// After the threshold is reached a new era will be forced. - type OffendingValidatorsThreshold: Get; - /// Something that provides a best-effort sorted list of voters aka electing nominators, /// used for NPoS election. /// @@ -278,6 +275,9 @@ pub mod pallet { /// WARNING: this only reports slashing and withdraw events for the time being. type EventListeners: sp_staking::OnStakingUpdate>; + // `DisablingStragegy` controls how validators are disabled + type DisablingStrategy: DisablingStrategy; + /// Some parameters of the benchmarking. type BenchmarkingConfig: BenchmarkingConfig; @@ -654,19 +654,16 @@ pub mod pallet { #[pallet::getter(fn current_planned_session)] pub type CurrentPlannedSession = StorageValue<_, SessionIndex, ValueQuery>; - /// Indices of validators that have offended in the active era and whether they are currently - /// disabled. + /// Indices of validators that have offended in the active era. The offenders are disabled for a + /// whole era. For this reason they are kept here - only staking pallet knows about eras. The + /// implementor of [`DisablingStrategy`] defines if a validator should be disabled which + /// implicitly means that the implementor also controls the max number of disabled validators. /// - /// This value should be a superset of disabled validators since not all offences lead to the - /// validator being disabled (if there was no slash). This is needed to track the percentage of - /// validators that have offended in the current era, ensuring a new era is forced if - /// `OffendingValidatorsThreshold` is reached. The vec is always kept sorted so that we can find - /// whether a given validator has previously offended using binary search. It gets cleared when - /// the era ends. + /// The vec is always kept sorted so that we can find whether a given validator has previously + /// offended using binary search. #[pallet::storage] #[pallet::unbounded] - #[pallet::getter(fn offending_validators)] - pub type OffendingValidators = StorageValue<_, Vec<(u32, bool)>, ValueQuery>; + pub type DisabledValidators = StorageValue<_, Vec, ValueQuery>; /// The threshold for when users can start calling `chill_other` for other validators / /// nominators. The threshold is compared to the actual number of validators / nominators diff --git a/substrate/frame/staking/src/slashing.rs b/substrate/frame/staking/src/slashing.rs index 2011e9eb830..f831f625957 100644 --- a/substrate/frame/staking/src/slashing.rs +++ b/substrate/frame/staking/src/slashing.rs @@ -50,21 +50,21 @@ //! Based on research at use crate::{ - BalanceOf, Config, Error, Exposure, NegativeImbalanceOf, NominatorSlashInEra, - OffendingValidators, Pallet, Perbill, SessionInterface, SpanSlash, UnappliedSlash, + BalanceOf, Config, DisabledValidators, DisablingStrategy, Error, Exposure, NegativeImbalanceOf, + NominatorSlashInEra, Pallet, Perbill, SessionInterface, SpanSlash, UnappliedSlash, ValidatorSlashInEra, }; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ ensure, - traits::{Currency, Defensive, DefensiveSaturating, Get, Imbalance, OnUnbalanced}, + traits::{Currency, Defensive, DefensiveSaturating, Imbalance, OnUnbalanced}, }; use scale_info::TypeInfo; use sp_runtime::{ traits::{Saturating, Zero}, DispatchResult, RuntimeDebug, }; -use sp_staking::{offence::DisableStrategy, EraIndex}; +use sp_staking::EraIndex; use sp_std::vec::Vec; /// The proportion of the slashing reward to be paid out on the first slashing detection. @@ -220,8 +220,6 @@ pub(crate) struct SlashParams<'a, T: 'a + Config> { /// The maximum percentage of a slash that ever gets paid out. /// This is f_inf in the paper. pub(crate) reward_proportion: Perbill, - /// When to disable offenders. - pub(crate) disable_strategy: DisableStrategy, } /// Computes a slash of a validator and nominators. It returns an unapplied @@ -280,18 +278,13 @@ pub(crate) fn compute_slash( let target_span = spans.compare_and_update_span_slash(params.slash_era, own_slash); if target_span == Some(spans.span_index()) { - // misbehavior occurred within the current slashing span - take appropriate - // actions. - - // chill the validator - it misbehaved in the current span and should - // not continue in the next election. also end the slashing span. + // misbehavior occurred within the current slashing span - end current span. + // Check for details. spans.end_span(params.now); - >::chill_stash(params.stash); } } - let disable_when_slashed = params.disable_strategy != DisableStrategy::Never; - add_offending_validator::(params.stash, disable_when_slashed); + add_offending_validator::(¶ms); let mut nominators_slashed = Vec::new(); reward_payout += slash_nominators::(params.clone(), prior_slash_p, &mut nominators_slashed); @@ -320,54 +313,31 @@ fn kick_out_if_recent(params: SlashParams) { ); if spans.era_span(params.slash_era).map(|s| s.index) == Some(spans.span_index()) { + // Check https://github.com/paritytech/polkadot-sdk/issues/2650 for details spans.end_span(params.now); - >::chill_stash(params.stash); } - let disable_without_slash = params.disable_strategy == DisableStrategy::Always; - add_offending_validator::(params.stash, disable_without_slash); + add_offending_validator::(¶ms); } -/// Add the given validator to the offenders list and optionally disable it. -/// If after adding the validator `OffendingValidatorsThreshold` is reached -/// a new era will be forced. -fn add_offending_validator(stash: &T::AccountId, disable: bool) { - OffendingValidators::::mutate(|offending| { - let validators = T::SessionInterface::validators(); - let validator_index = match validators.iter().position(|i| i == stash) { - Some(index) => index, - None => return, - }; - - let validator_index_u32 = validator_index as u32; - - match offending.binary_search_by_key(&validator_index_u32, |(index, _)| *index) { - // this is a new offending validator - Err(index) => { - offending.insert(index, (validator_index_u32, disable)); - - let offending_threshold = - T::OffendingValidatorsThreshold::get() * validators.len() as u32; - - if offending.len() >= offending_threshold as usize { - // force a new era, to select a new validator set - >::ensure_new_era() - } - - if disable { - T::SessionInterface::disable_validator(validator_index_u32); - } - }, - Ok(index) => { - if disable && !offending[index].1 { - // the validator had previously offended without being disabled, - // let's make sure we disable it now - offending[index].1 = true; - T::SessionInterface::disable_validator(validator_index_u32); - } - }, +/// Inform the [`DisablingStrategy`] implementation about the new offender and disable the list of +/// validators provided by [`make_disabling_decision`]. +fn add_offending_validator(params: &SlashParams) { + DisabledValidators::::mutate(|disabled| { + if let Some(offender) = + T::DisablingStrategy::decision(params.stash, params.slash_era, &disabled) + { + // Add the validator to `DisabledValidators` and disable it. Do nothing if it is + // already disabled. + if let Err(index) = disabled.binary_search_by_key(&offender, |index| *index) { + disabled.insert(index, offender); + T::SessionInterface::disable_validator(offender); + } } }); + + // `DisabledValidators` should be kept sorted + debug_assert!(DisabledValidators::::get().windows(2).all(|pair| pair[0] < pair[1])); } /// Slash nominators. Accepts general parameters and the prior slash percentage of the validator. diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 87f6fd424bd..6cf5a56e5a6 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -38,7 +38,7 @@ use sp_runtime::{ Perbill, Percent, Perquintill, Rounding, TokenError, }; use sp_staking::{ - offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, + offence::{OffenceDetails, OnOffenceHandler}, SessionIndex, }; use sp_std::prelude::*; @@ -716,56 +716,65 @@ fn nominating_and_rewards_should_work() { #[test] fn nominators_also_get_slashed_pro_rata() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - let slash_percent = Perbill::from_percent(5); - let initial_exposure = Staking::eras_stakers(active_era(), &11); - // 101 is a nominator for 11 - assert_eq!(initial_exposure.others.first().unwrap().who, 101); - - // staked values; - let nominator_stake = Staking::ledger(101.into()).unwrap().active; - let nominator_balance = balances(&101).0; - let validator_stake = Staking::ledger(11.into()).unwrap().active; - let validator_balance = balances(&11).0; - let exposed_stake = initial_exposure.total; - let exposed_validator = initial_exposure.own; - let exposed_nominator = initial_exposure.others.first().unwrap().value; - - // 11 goes offline - on_offence_now( - &[OffenceDetails { offender: (11, initial_exposure.clone()), reporters: vec![] }], - &[slash_percent], - ); + ExtBuilder::default() + .validator_count(4) + .set_status(41, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + let slash_percent = Perbill::from_percent(5); + let initial_exposure = Staking::eras_stakers(active_era(), &11); + // 101 is a nominator for 11 + assert_eq!(initial_exposure.others.first().unwrap().who, 101); + + // staked values; + let nominator_stake = Staking::ledger(101.into()).unwrap().active; + let nominator_balance = balances(&101).0; + let validator_stake = Staking::ledger(11.into()).unwrap().active; + let validator_balance = balances(&11).0; + let exposed_stake = initial_exposure.total; + let exposed_validator = initial_exposure.own; + let exposed_nominator = initial_exposure.others.first().unwrap().value; + + // 11 goes offline + on_offence_now( + &[OffenceDetails { offender: (11, initial_exposure.clone()), reporters: vec![] }], + &[slash_percent], + ); - // both stakes must have been decreased. - assert!(Staking::ledger(101.into()).unwrap().active < nominator_stake); - assert!(Staking::ledger(11.into()).unwrap().active < validator_stake); + // both stakes must have been decreased. + assert!(Staking::ledger(101.into()).unwrap().active < nominator_stake); + assert!(Staking::ledger(11.into()).unwrap().active < validator_stake); - let slash_amount = slash_percent * exposed_stake; - let validator_share = - Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; - let nominator_share = - Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; + let slash_amount = slash_percent * exposed_stake; + let validator_share = + Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; + let nominator_share = + Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; - // both slash amounts need to be positive for the test to make sense. - assert!(validator_share > 0); - assert!(nominator_share > 0); + // both slash amounts need to be positive for the test to make sense. + assert!(validator_share > 0); + assert!(nominator_share > 0); - // both stakes must have been decreased pro-rata. - assert_eq!(Staking::ledger(101.into()).unwrap().active, nominator_stake - nominator_share); - assert_eq!(Staking::ledger(11.into()).unwrap().active, validator_stake - validator_share); - assert_eq!( - balances(&101).0, // free balance - nominator_balance - nominator_share, - ); - assert_eq!( - balances(&11).0, // free balance - validator_balance - validator_share, - ); - // Because slashing happened. - assert!(is_disabled(11)); - }); + // both stakes must have been decreased pro-rata. + assert_eq!( + Staking::ledger(101.into()).unwrap().active, + nominator_stake - nominator_share + ); + assert_eq!( + Staking::ledger(11.into()).unwrap().active, + validator_stake - validator_share + ); + assert_eq!( + balances(&101).0, // free balance + nominator_balance - nominator_share, + ); + assert_eq!( + balances(&11).0, // free balance + validator_balance - validator_share, + ); + // Because slashing happened. + assert!(is_disabled(11)); + }); } #[test] @@ -2401,7 +2410,7 @@ fn era_is_always_same_length() { } #[test] -fn offence_forces_new_era() { +fn offence_doesnt_force_new_era() { ExtBuilder::default().build_and_execute(|| { on_offence_now( &[OffenceDetails { @@ -2411,7 +2420,7 @@ fn offence_forces_new_era() { &[Perbill::from_percent(5)], ); - assert_eq!(Staking::force_era(), Forcing::ForceNew); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -2435,26 +2444,32 @@ fn offence_ensures_new_era_without_clobbering() { #[test] fn offence_deselects_validator_even_when_slash_is_zero() { - ExtBuilder::default().build_and_execute(|| { - assert!(Session::validators().contains(&11)); - assert!(>::contains_key(11)); + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + assert!(Session::validators().contains(&11)); + assert!(>::contains_key(11)); - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), &11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - ); + on_offence_now( + &[OffenceDetails { + offender: (11, Staking::eras_stakers(active_era(), &11)), + reporters: vec![], + }], + &[Perbill::from_percent(0)], + ); - assert_eq!(Staking::force_era(), Forcing::ForceNew); - assert!(!>::contains_key(11)); + assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(is_disabled(11)); - mock::start_active_era(1); + mock::start_active_era(1); - assert!(!Session::validators().contains(&11)); - assert!(!>::contains_key(11)); - }); + // The validator should be reenabled in the new era + assert!(!is_disabled(11)); + }); } #[test] @@ -2479,71 +2494,70 @@ fn slashing_performed_according_exposure() { } #[test] -fn slash_in_old_span_does_not_deselect() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - - assert!(>::contains_key(11)); - assert!(Session::validators().contains(&11)); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), &11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - ); +fn validator_is_not_disabled_for_an_offence_in_previous_era() { + ExtBuilder::default() + .validator_count(4) + .set_status(41, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); - assert_eq!(Staking::force_era(), Forcing::ForceNew); - assert!(!>::contains_key(11)); + assert!(>::contains_key(11)); + assert!(Session::validators().contains(&11)); - mock::start_active_era(2); + on_offence_now( + &[OffenceDetails { + offender: (11, Staking::eras_stakers(active_era(), &11)), + reporters: vec![], + }], + &[Perbill::from_percent(0)], + ); - Staking::validate(RuntimeOrigin::signed(11), Default::default()).unwrap(); - assert_eq!(Staking::force_era(), Forcing::NotForcing); - assert!(>::contains_key(11)); - assert!(!Session::validators().contains(&11)); + assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(is_disabled(11)); - mock::start_active_era(3); + mock::start_active_era(2); - // this staker is in a new slashing span now, having re-registered after - // their prior slash. + // the validator is not disabled in the new era + Staking::validate(RuntimeOrigin::signed(11), Default::default()).unwrap(); + assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(>::contains_key(11)); + assert!(Session::validators().contains(&11)); - on_offence_in_era( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), &11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - 1, - DisableStrategy::WhenSlashed, - ); + mock::start_active_era(3); - // the validator doesn't get chilled again - assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + // an offence committed in era 1 is reported in era 3 + on_offence_in_era( + &[OffenceDetails { + offender: (11, Staking::eras_stakers(active_era(), &11)), + reporters: vec![], + }], + &[Perbill::from_percent(0)], + 1, + ); - // but we are still forcing a new era - assert_eq!(Staking::force_era(), Forcing::ForceNew); + // the validator doesn't get disabled for an old offence + assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + assert!(!is_disabled(11)); - on_offence_in_era( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), &11)), - reporters: vec![], - }], - // NOTE: A 100% slash here would clean up the account, causing de-registration. - &[Perbill::from_percent(95)], - 1, - DisableStrategy::WhenSlashed, - ); + // and we are not forcing a new era + assert_eq!(Staking::force_era(), Forcing::NotForcing); - // the validator doesn't get chilled again - assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + on_offence_in_era( + &[OffenceDetails { + offender: (11, Staking::eras_stakers(active_era(), &11)), + reporters: vec![], + }], + // NOTE: A 100% slash here would clean up the account, causing de-registration. + &[Perbill::from_percent(95)], + 1, + ); - // but it's disabled - assert!(is_disabled(11)); - // and we are still forcing a new era - assert_eq!(Staking::force_era(), Forcing::ForceNew); - }); + // the validator doesn't get disabled again + assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + assert!(!is_disabled(11)); + // and we are still not forcing a new era + assert_eq!(Staking::force_era(), Forcing::NotForcing); + }); } #[test] @@ -2671,7 +2685,7 @@ fn dont_slash_if_fraction_is_zero() { // The validator hasn't been slashed. The new era is not forced. assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Staking::force_era(), Forcing::ForceNew); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -2692,7 +2706,7 @@ fn only_slash_for_max_in_era() { // The validator has been slashed and has been force-chilled. assert_eq!(Balances::free_balance(11), 500); - assert_eq!(Staking::force_era(), Forcing::ForceNew); + assert_eq!(Staking::force_era(), Forcing::NotForcing); on_offence_now( &[OffenceDetails { @@ -2833,7 +2847,6 @@ fn slashing_nominators_by_span_max() { }], &[Perbill::from_percent(10)], 2, - DisableStrategy::WhenSlashed, ); assert_eq!(Balances::free_balance(11), 900); @@ -2860,7 +2873,6 @@ fn slashing_nominators_by_span_max() { }], &[Perbill::from_percent(30)], 3, - DisableStrategy::WhenSlashed, ); // 11 was not further slashed, but 21 and 101 were. @@ -2882,7 +2894,6 @@ fn slashing_nominators_by_span_max() { }], &[Perbill::from_percent(20)], 2, - DisableStrategy::WhenSlashed, ); // 11 was further slashed, but 21 and 101 were not. @@ -2999,11 +3010,8 @@ fn deferred_slashes_are_deferred() { assert!(matches!( staking_events_since_last_call().as_slice(), &[ - Event::Chilled { stash: 11 }, - Event::ForceEra { mode: Forcing::ForceNew }, Event::SlashReported { validator: 11, slash_era: 1, .. }, Event::StakersElected, - Event::ForceEra { mode: Forcing::NotForcing }, .., Event::Slashed { staker: 11, amount: 100 }, Event::Slashed { staker: 101, amount: 12 } @@ -3029,7 +3037,6 @@ fn retroactive_deferred_slashes_two_eras_before() { &[OffenceDetails { offender: (11, exposure_11_at_era1), reporters: vec![] }], &[Perbill::from_percent(10)], 1, // should be deferred for two full eras, and applied at the beginning of era 4. - DisableStrategy::Never, ); mock::start_active_era(4); @@ -3037,8 +3044,6 @@ fn retroactive_deferred_slashes_two_eras_before() { assert!(matches!( staking_events_since_last_call().as_slice(), &[ - Event::Chilled { stash: 11 }, - Event::ForceEra { mode: Forcing::ForceNew }, Event::SlashReported { validator: 11, slash_era: 1, .. }, .., Event::Slashed { staker: 11, amount: 100 }, @@ -3067,7 +3072,6 @@ fn retroactive_deferred_slashes_one_before() { &[OffenceDetails { offender: (11, exposure_11_at_era1), reporters: vec![] }], &[Perbill::from_percent(10)], 2, // should be deferred for two full eras, and applied at the beginning of era 5. - DisableStrategy::Never, ); mock::start_active_era(4); @@ -3197,7 +3201,6 @@ fn remove_deferred() { &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], &[Perbill::from_percent(15)], 1, - DisableStrategy::WhenSlashed, ); // fails if empty @@ -3312,192 +3315,198 @@ fn remove_multi_deferred() { #[test] fn slash_kicks_validators_not_nominators_and_disables_nominator_for_kicked_validator() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); - - // pre-slash balance - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); - // 100 has approval for 11 as of now - assert!(Staking::nominators(101).unwrap().targets.contains(&11)); + // pre-slash balance + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); - // 11 and 21 both have the support of 100 - let exposure_11 = Staking::eras_stakers(active_era(), &11); - let exposure_21 = Staking::eras_stakers(active_era(), &21); + // 100 has approval for 11 as of now + assert!(Staking::nominators(101).unwrap().targets.contains(&11)); - assert_eq!(exposure_11.total, 1000 + 125); - assert_eq!(exposure_21.total, 1000 + 375); + // 11 and 21 both have the support of 100 + let exposure_11 = Staking::eras_stakers(active_era(), &11); + let exposure_21 = Staking::eras_stakers(active_era(), &21); - on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], - &[Perbill::from_percent(10)], - ); + assert_eq!(exposure_11.total, 1000 + 125); + assert_eq!(exposure_21.total, 1000 + 375); - assert_eq!( - staking_events_since_last_call(), - vec![ - Event::StakersElected, - Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, - Event::Chilled { stash: 11 }, - Event::ForceEra { mode: Forcing::ForceNew }, - Event::SlashReported { - validator: 11, - fraction: Perbill::from_percent(10), - slash_era: 1 - }, - Event::Slashed { staker: 11, amount: 100 }, - Event::Slashed { staker: 101, amount: 12 }, - ] - ); + on_offence_now( + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[Perbill::from_percent(10)], + ); - // post-slash balance - let nominator_slash_amount_11 = 125 / 10; - assert_eq!(Balances::free_balance(11), 900); - assert_eq!(Balances::free_balance(101), 2000 - nominator_slash_amount_11); + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(10), + slash_era: 1 + }, + Event::Slashed { staker: 11, amount: 100 }, + Event::Slashed { staker: 101, amount: 12 }, + ] + ); - // check that validator was chilled. - assert!(Validators::::iter().all(|(stash, _)| stash != 11)); + // post-slash balance + let nominator_slash_amount_11 = 125 / 10; + assert_eq!(Balances::free_balance(11), 900); + assert_eq!(Balances::free_balance(101), 2000 - nominator_slash_amount_11); - // actually re-bond the slashed validator - assert_ok!(Staking::validate(RuntimeOrigin::signed(11), Default::default())); + // check that validator was disabled. + assert!(is_disabled(11)); - mock::start_active_era(2); - let exposure_11 = Staking::eras_stakers(active_era(), &11); - let exposure_21 = Staking::eras_stakers(active_era(), &21); + // actually re-bond the slashed validator + assert_ok!(Staking::validate(RuntimeOrigin::signed(11), Default::default())); - // 11's own expo is reduced. sum of support from 11 is less (448), which is 500 - // 900 + 146 - assert!(matches!(exposure_11, Exposure { own: 900, total: 1046, .. })); - // 1000 + 342 - assert!(matches!(exposure_21, Exposure { own: 1000, total: 1342, .. })); - assert_eq!(500 - 146 - 342, nominator_slash_amount_11); - }); + mock::start_active_era(2); + let exposure_11 = Staking::eras_stakers(active_era(), &11); + let exposure_21 = Staking::eras_stakers(active_era(), &21); + + // 11's own expo is reduced. sum of support from 11 is less (448), which is 500 + // 900 + 146 + assert!(matches!(exposure_11, Exposure { own: 900, total: 1046, .. })); + // 1000 + 342 + assert!(matches!(exposure_21, Exposure { own: 1000, total: 1342, .. })); + assert_eq!(500 - 146 - 342, nominator_slash_amount_11); + }); } #[test] -fn non_slashable_offence_doesnt_disable_validator() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); +fn non_slashable_offence_disables_validator() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); - let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); - let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); + let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); + let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - // offence with no slash associated - on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], - &[Perbill::zero()], - ); + // offence with no slash associated + on_offence_now( + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[Perbill::zero()], + ); - // it does NOT affect the nominator. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); + // it does NOT affect the nominator. + assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - // offence that slashes 25% of the bond - on_offence_now( - &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], - &[Perbill::from_percent(25)], - ); + // offence that slashes 25% of the bond + on_offence_now( + &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], + &[Perbill::from_percent(25)], + ); - // it DOES NOT affect the nominator. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); + // it DOES NOT affect the nominator. + assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - assert_eq!( - staking_events_since_last_call(), - vec![ - Event::StakersElected, - Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, - Event::Chilled { stash: 11 }, - Event::ForceEra { mode: Forcing::ForceNew }, - Event::SlashReported { - validator: 11, - fraction: Perbill::from_percent(0), - slash_era: 1 - }, - Event::Chilled { stash: 21 }, - Event::SlashReported { - validator: 21, - fraction: Perbill::from_percent(25), - slash_era: 1 - }, - Event::Slashed { staker: 21, amount: 250 }, - Event::Slashed { staker: 101, amount: 94 } - ] - ); + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(0), + slash_era: 1 + }, + Event::SlashReported { + validator: 21, + fraction: Perbill::from_percent(25), + slash_era: 1 + }, + Event::Slashed { staker: 21, amount: 250 }, + Event::Slashed { staker: 101, amount: 94 } + ] + ); - // the offence for validator 10 wasn't slashable so it wasn't disabled - assert!(!is_disabled(11)); - // whereas validator 20 gets disabled - assert!(is_disabled(21)); - }); + // the offence for validator 11 wasn't slashable but it is disabled + assert!(is_disabled(11)); + // validator 21 gets disabled too + assert!(is_disabled(21)); + }); } #[test] fn slashing_independent_of_disabling_validator() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); + ExtBuilder::default() + .validator_count(5) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51]); - let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); - let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); + let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); + let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - let now = Staking::active_era().unwrap().index; + let now = Staking::active_era().unwrap().index; - // offence with no slash associated, BUT disabling - on_offence_in_era( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], - &[Perbill::zero()], - now, - DisableStrategy::Always, - ); + // offence with no slash associated + on_offence_in_era( + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[Perbill::zero()], + now, + ); - // nomination remains untouched. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); + // nomination remains untouched. + assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - // offence that slashes 25% of the bond, BUT not disabling - on_offence_in_era( - &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], - &[Perbill::from_percent(25)], - now, - DisableStrategy::Never, - ); + // offence that slashes 25% of the bond + on_offence_in_era( + &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], + &[Perbill::from_percent(25)], + now, + ); - // nomination remains untouched. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); + // nomination remains untouched. + assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - assert_eq!( - staking_events_since_last_call(), - vec![ - Event::StakersElected, - Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, - Event::Chilled { stash: 11 }, - Event::ForceEra { mode: Forcing::ForceNew }, - Event::SlashReported { - validator: 11, - fraction: Perbill::from_percent(0), - slash_era: 1 - }, - Event::Chilled { stash: 21 }, - Event::SlashReported { - validator: 21, - fraction: Perbill::from_percent(25), - slash_era: 1 - }, - Event::Slashed { staker: 21, amount: 250 }, - Event::Slashed { staker: 101, amount: 94 } - ] - ); + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(0), + slash_era: 1 + }, + Event::SlashReported { + validator: 21, + fraction: Perbill::from_percent(25), + slash_era: 1 + }, + Event::Slashed { staker: 21, amount: 250 }, + Event::Slashed { staker: 101, amount: 94 } + ] + ); - // the offence for validator 10 was explicitly disabled - assert!(is_disabled(11)); - // whereas validator 21 is explicitly not disabled - assert!(!is_disabled(21)); - }); + // first validator is disabled but not slashed + assert!(is_disabled(11)); + // second validator is slashed but not disabled + assert!(!is_disabled(21)); + }); } #[test] -fn offence_threshold_triggers_new_era() { +fn offence_threshold_doesnt_trigger_new_era() { ExtBuilder::default() .validator_count(4) .set_status(41, StakerStatus::Validator) @@ -3506,12 +3515,14 @@ fn offence_threshold_triggers_new_era() { assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41]); assert_eq!( - ::OffendingValidatorsThreshold::get(), - Perbill::from_percent(75), + UpToLimitDisablingStrategy::::disable_limit( + Session::validators().len() + ), + 1 ); - // we have 4 validators and an offending validator threshold of 75%, - // once the third validator commits an offence a new era should be forced + // we have 4 validators and an offending validator threshold of 1/3, + // even if the third validator commits an offence a new era should not be forced let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); @@ -3522,6 +3533,9 @@ fn offence_threshold_triggers_new_era() { &[Perbill::zero()], ); + // 11 should be disabled because the byzantine threshold is 1 + assert!(is_disabled(11)); + assert_eq!(ForceEra::::get(), Forcing::NotForcing); on_offence_now( @@ -3529,6 +3543,10 @@ fn offence_threshold_triggers_new_era() { &[Perbill::zero()], ); + // 21 should not be disabled because the number of disabled validators will be above the + // byzantine threshold + assert!(!is_disabled(21)); + assert_eq!(ForceEra::::get(), Forcing::NotForcing); on_offence_now( @@ -3536,28 +3554,29 @@ fn offence_threshold_triggers_new_era() { &[Perbill::zero()], ); - assert_eq!(ForceEra::::get(), Forcing::ForceNew); + // same for 31 + assert!(!is_disabled(31)); + + assert_eq!(ForceEra::::get(), Forcing::NotForcing); }); } #[test] fn disabled_validators_are_kept_disabled_for_whole_era() { ExtBuilder::default() - .validator_count(4) + .validator_count(7) .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) .build_and_execute(|| { mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41]); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); assert_eq!(::SessionsPerEra::get(), 3); let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], - &[Perbill::zero()], - ); - on_offence_now( &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], &[Perbill::from_percent(25)], @@ -3566,18 +3585,15 @@ fn disabled_validators_are_kept_disabled_for_whole_era() { // nominations are not updated. assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - // validator 11 should not be disabled since the offence wasn't slashable - assert!(!is_disabled(11)); // validator 21 gets disabled since it got slashed assert!(is_disabled(21)); advance_session(); // disabled validators should carry-on through all sessions in the era - assert!(!is_disabled(11)); assert!(is_disabled(21)); - // validator 11 should now get disabled + // validator 11 commits an offence on_offence_now( &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], &[Perbill::from_percent(25)], @@ -3687,27 +3703,34 @@ fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() { #[test] fn zero_slash_keeps_nominators() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); - assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(11), 1000); - let exposure = Staking::eras_stakers(active_era(), &11); - assert_eq!(Balances::free_balance(101), 2000); + let exposure = Staking::eras_stakers(active_era(), &11); + assert_eq!(Balances::free_balance(101), 2000); - on_offence_now( - &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], - &[Perbill::from_percent(0)], - ); + on_offence_now( + &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], + &[Perbill::from_percent(0)], + ); - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); + assert_eq!(Balances::free_balance(11), 1000); + assert_eq!(Balances::free_balance(101), 2000); - // 11 is still removed.. - assert!(Validators::::iter().all(|(stash, _)| stash != 11)); - // but their nominations are kept. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - }); + // 11 is not removed but disabled + assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + assert!(is_disabled(11)); + // and their nominations are kept. + assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); + }); } #[test] @@ -4710,7 +4733,7 @@ fn offences_weight_calculated_correctly() { let zero_offence_weight = ::DbWeight::get().reads_writes(4, 1); assert_eq!( - Staking::on_offence(&[], &[Perbill::from_percent(50)], 0, DisableStrategy::WhenSlashed), + Staking::on_offence(&[], &[Perbill::from_percent(50)], 0), zero_offence_weight ); @@ -4735,7 +4758,6 @@ fn offences_weight_calculated_correctly() { &offenders, &[Perbill::from_percent(50)], 0, - DisableStrategy::WhenSlashed ), n_offence_unapplied_weight ); @@ -4765,7 +4787,6 @@ fn offences_weight_calculated_correctly() { &one_offender, &[Perbill::from_percent(50)], 0, - DisableStrategy::WhenSlashed{} ), one_offence_unapplied_weight ); @@ -7011,62 +7032,71 @@ mod staking_unchecked { #[test] fn virtual_nominators_are_lazily_slashed() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - let slash_percent = Perbill::from_percent(5); - let initial_exposure = Staking::eras_stakers(active_era(), &11); - // 101 is a nominator for 11 - assert_eq!(initial_exposure.others.first().unwrap().who, 101); - // make 101 a virtual nominator - ::migrate_to_virtual_staker(&101); - // set payee different to self. - assert_ok!(::update_payee(&101, &102)); - - // cache values - let nominator_stake = Staking::ledger(101.into()).unwrap().active; - let nominator_balance = balances(&101).0; - let validator_stake = Staking::ledger(11.into()).unwrap().active; - let validator_balance = balances(&11).0; - let exposed_stake = initial_exposure.total; - let exposed_validator = initial_exposure.own; - let exposed_nominator = initial_exposure.others.first().unwrap().value; - - // 11 goes offline - on_offence_now( - &[OffenceDetails { offender: (11, initial_exposure.clone()), reporters: vec![] }], - &[slash_percent], - ); + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + let slash_percent = Perbill::from_percent(5); + let initial_exposure = Staking::eras_stakers(active_era(), &11); + // 101 is a nominator for 11 + assert_eq!(initial_exposure.others.first().unwrap().who, 101); + // make 101 a virtual nominator + ::migrate_to_virtual_staker(&101); + // set payee different to self. + assert_ok!(::update_payee(&101, &102)); + + // cache values + let nominator_stake = Staking::ledger(101.into()).unwrap().active; + let nominator_balance = balances(&101).0; + let validator_stake = Staking::ledger(11.into()).unwrap().active; + let validator_balance = balances(&11).0; + let exposed_stake = initial_exposure.total; + let exposed_validator = initial_exposure.own; + let exposed_nominator = initial_exposure.others.first().unwrap().value; + + // 11 goes offline + on_offence_now( + &[OffenceDetails { + offender: (11, initial_exposure.clone()), + reporters: vec![], + }], + &[slash_percent], + ); - let slash_amount = slash_percent * exposed_stake; - let validator_share = - Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; - let nominator_share = - Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; + let slash_amount = slash_percent * exposed_stake; + let validator_share = + Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; + let nominator_share = + Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; - // both slash amounts need to be positive for the test to make sense. - assert!(validator_share > 0); - assert!(nominator_share > 0); + // both slash amounts need to be positive for the test to make sense. + assert!(validator_share > 0); + assert!(nominator_share > 0); - // both stakes must have been decreased pro-rata. - assert_eq!( - Staking::ledger(101.into()).unwrap().active, - nominator_stake - nominator_share - ); - assert_eq!( - Staking::ledger(11.into()).unwrap().active, - validator_stake - validator_share - ); + // both stakes must have been decreased pro-rata. + assert_eq!( + Staking::ledger(101.into()).unwrap().active, + nominator_stake - nominator_share + ); + assert_eq!( + Staking::ledger(11.into()).unwrap().active, + validator_stake - validator_share + ); - // validator balance is slashed as usual - assert_eq!(balances(&11).0, validator_balance - validator_share); - // Because slashing happened. - assert!(is_disabled(11)); + // validator balance is slashed as usual + assert_eq!(balances(&11).0, validator_balance - validator_share); + // Because slashing happened. + assert!(is_disabled(11)); - // but virtual nominator's balance is not slashed. - assert_eq!(Balances::free_balance(&101), nominator_balance); - // but slash is broadcasted to slash observers. - assert_eq!(SlashObserver::get().get(&101).unwrap(), &nominator_share); - }) + // but virtual nominator's balance is not slashed. + assert_eq!(Balances::free_balance(&101), nominator_balance); + // but slash is broadcasted to slash observers. + assert_eq!(SlashObserver::get().get(&101).unwrap(), &nominator_share); + }) } } mod ledger { @@ -7926,3 +7956,69 @@ mod ledger_recovery { }) } } + +mod byzantine_threshold_disabling_strategy { + use crate::{ + tests::Test, ActiveEra, ActiveEraInfo, DisablingStrategy, UpToLimitDisablingStrategy, + }; + use sp_staking::EraIndex; + + // Common test data - the stash of the offending validator, the era of the offence and the + // active set + const OFFENDER_ID: ::AccountId = 7; + const SLASH_ERA: EraIndex = 1; + const ACTIVE_SET: [::ValidatorId; 7] = [1, 2, 3, 4, 5, 6, 7]; + const OFFENDER_VALIDATOR_IDX: u32 = 6; // the offender is with index 6 in the active set + + #[test] + fn dont_disable_for_ancient_offence() { + sp_io::TestExternalities::default().execute_with(|| { + let initially_disabled = vec![]; + pallet_session::Validators::::put(ACTIVE_SET.to_vec()); + ActiveEra::::put(ActiveEraInfo { index: 2, start: None }); + + let disable_offender = + >::decision( + &OFFENDER_ID, + SLASH_ERA, + &initially_disabled, + ); + + assert!(disable_offender.is_none()); + }); + } + + #[test] + fn dont_disable_beyond_byzantine_threshold() { + sp_io::TestExternalities::default().execute_with(|| { + let initially_disabled = vec![1, 2]; + pallet_session::Validators::::put(ACTIVE_SET.to_vec()); + + let disable_offender = + >::decision( + &OFFENDER_ID, + SLASH_ERA, + &initially_disabled, + ); + + assert!(disable_offender.is_none()); + }); + } + + #[test] + fn disable_when_below_byzantine_threshold() { + sp_io::TestExternalities::default().execute_with(|| { + let initially_disabled = vec![1]; + pallet_session::Validators::::put(ACTIVE_SET.to_vec()); + + let disable_offender = + >::decision( + &OFFENDER_ID, + SLASH_ERA, + &initially_disabled, + ); + + assert_eq!(disable_offender, Some(OFFENDER_VALIDATOR_IDX)); + }); + } +} diff --git a/substrate/primitives/staking/src/offence.rs b/substrate/primitives/staking/src/offence.rs index 30d96d0cbaf..2c2ebc1fc97 100644 --- a/substrate/primitives/staking/src/offence.rs +++ b/substrate/primitives/staking/src/offence.rs @@ -37,29 +37,6 @@ pub type Kind = [u8; 16]; /// so that we can slash it accordingly. pub type OffenceCount = u32; -/// In case of an offence, which conditions get an offending validator disabled. -#[derive( - Clone, - Copy, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - Encode, - Decode, - sp_runtime::RuntimeDebug, - scale_info::TypeInfo, -)] -pub enum DisableStrategy { - /// Independently of slashing, this offence will not disable the offender. - Never, - /// Only disable the offender if it is also slashed. - WhenSlashed, - /// Independently of slashing, this offence will always disable the offender. - Always, -} - /// A trait implemented by an offence report. /// /// This trait assumes that the offence is legitimate and was validated already. @@ -102,11 +79,6 @@ pub trait Offence { /// number. Note that for GRANDPA the round number is reset each epoch. fn time_slot(&self) -> Self::TimeSlot; - /// In which cases this offence needs to disable offenders until the next era starts. - fn disable_strategy(&self) -> DisableStrategy { - DisableStrategy::WhenSlashed - } - /// A slash fraction of the total exposure that should be slashed for this /// particular offence for the `offenders_count` that happened at a singular `TimeSlot`. /// @@ -177,15 +149,12 @@ pub trait OnOffenceHandler { /// /// The `session` parameter is the session index of the offence. /// - /// The `disable_strategy` parameter decides if the offenders need to be disabled immediately. - /// /// The receiver might decide to not accept this offence. In this case, the call site is /// responsible for queuing the report and re-submitting again. fn on_offence( offenders: &[OffenceDetails], slash_fraction: &[Perbill], session: SessionIndex, - disable_strategy: DisableStrategy, ) -> Res; } @@ -194,7 +163,6 @@ impl OnOffenceHandler _offenders: &[OffenceDetails], _slash_fraction: &[Perbill], _session: SessionIndex, - _disable_strategy: DisableStrategy, ) -> Res { Default::default() } -- GitLab From d893cde2cfd1992a3e589614ae09088d92f28a59 Mon Sep 17 00:00:00 2001 From: Ron Date: Fri, 26 Apr 2024 23:51:58 +0800 Subject: [PATCH 018/170] Snowbridge: deposit extra fee to beneficiary on Asset Hub (#4175) Just the upper-stream for https://github.com/Snowfork/polkadot-sdk/pull/137 and more context there. --------- Co-authored-by: Clara van Staden Co-authored-by: Adrian Catangiu --- .../primitives/router/src/inbound/mod.rs | 6 +- .../bridge-hub-rococo/src/tests/snowbridge.rs | 133 +++++++++++++++++- prdoc/pr_4175.prdoc | 13 ++ 3 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 prdoc/pr_4175.prdoc diff --git a/bridges/snowbridge/primitives/router/src/inbound/mod.rs b/bridges/snowbridge/primitives/router/src/inbound/mod.rs index c20554c6d18..54e47a7a8b6 100644 --- a/bridges/snowbridge/primitives/router/src/inbound/mod.rs +++ b/bridges/snowbridge/primitives/router/src/inbound/mod.rs @@ -273,8 +273,10 @@ where }, None => { instructions.extend(vec![ - // Deposit asset to beneficiary. - DepositAsset { assets: Definite(asset.into()), beneficiary }, + // Deposit both asset and fees to beneficiary so the fees will not get + // trapped. Another benefit is when fees left more than ED on AssetHub could be + // used to create the beneficiary account in case it does not exist. + DepositAsset { assets: Wild(AllCounted(2)), beneficiary }, ]); }, } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index d0c02e61134..1c1c51404aa 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -27,7 +27,7 @@ use snowbridge_pallet_inbound_queue_fixtures::{ }; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ - Command, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, + Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, }; use sp_core::H256; use sp_runtime::{DispatchError::Token, TokenError::FundsUnavailable}; @@ -40,6 +40,7 @@ const TREASURY_ACCOUNT: [u8; 32] = const WETH: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); const ETHEREUM_DESTINATION_ADDRESS: [u8; 20] = hex!("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e"); const INSUFFICIENT_XCM_FEE: u128 = 1000; +const XCM_FEE: u128 = 4_000_000_000; #[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] pub enum ControlCall { @@ -555,3 +556,133 @@ fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { ); }); } + +fn send_token_from_ethereum_to_asset_hub_with_fee(account_id: [u8; 32], fee: u128) { + let weth_asset_location: Location = Location::new( + 2, + [EthereumNetwork::get().into(), AccountKey20 { network: None, key: WETH }], + ); + // (Parent, Parent, EthereumNetwork::get(), AccountKey20 { network: None, key: WETH }) + // Fund asset hub sovereign on bridge hub + let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(Location::new( + 1, + [Parachain(AssetHubRococo::para_id().into())], + )); + BridgeHubRococo::fund_accounts(vec![(asset_hub_sovereign.clone(), INITIAL_FUND)]); + + // Register WETH + AssetHubRococo::execute_with(|| { + type RuntimeOrigin = ::RuntimeOrigin; + + assert_ok!(::ForeignAssets::force_create( + RuntimeOrigin::root(), + weth_asset_location.clone().try_into().unwrap(), + asset_hub_sovereign.into(), + false, + 1, + )); + + assert!(::ForeignAssets::asset_exists( + weth_asset_location.clone().try_into().unwrap(), + )); + }); + + // Send WETH to an existent account on asset hub + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message_id: H256 = [0; 32].into(); + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::SendToken { + token: WETH.into(), + destination: Destination::AccountId32 { id: account_id }, + amount: 1_000_000, + fee, + }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); + assert_ok!(EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into())); + + // Check that the message was sent + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_existent_account_on_asset_hub() { + send_token_from_ethereum_to_asset_hub_with_fee(AssetHubRococoSender::get().into(), XCM_FEE); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // Check that the token was received and issued as a foreign asset on AssetHub + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_non_existent_account_on_asset_hub() { + send_token_from_ethereum_to_asset_hub_with_fee([1; 32], XCM_FEE); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // Check that the token was received and issued as a foreign asset on AssetHub + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_non_existent_account_on_asset_hub_with_insufficient_fee() { + send_token_from_ethereum_to_asset_hub_with_fee([1; 32], INSUFFICIENT_XCM_FEE); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // Check that the message was not processed successfully due to insufficient fee + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success:false, .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_non_existent_account_on_asset_hub_with_sufficient_fee_but_do_not_satisfy_ed( +) { + // On AH the xcm fee is 33_873_024 and the ED is 3_300_000 + send_token_from_ethereum_to_asset_hub_with_fee([1; 32], 36_000_000); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // Check that the message was not processed successfully due to insufficient ED + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success:false, .. }) => {}, + ] + ); + }); +} diff --git a/prdoc/pr_4175.prdoc b/prdoc/pr_4175.prdoc new file mode 100644 index 00000000000..7fc2fb68b38 --- /dev/null +++ b/prdoc/pr_4175.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Snowbridge: deposit extra fee to beneficiary on Asset Hub" + +doc: + - audience: Runtime Dev + description: | + Snowbridge transfers arriving on Asset Hub will deposit both asset and fees to beneficiary so the fees will not get trapped. + Another benefit is when fees left more than ED, could be used to create the beneficiary account in case it does not exist on asset hub. + +crates: + - name: snowbridge-router-primitives -- GitLab From 2a497d297575947b613fe0f3bbac9273a48fd6b0 Mon Sep 17 00:00:00 2001 From: antiyro <74653697+antiyro@users.noreply.github.com> Date: Fri, 26 Apr 2024 18:23:58 +0200 Subject: [PATCH 019/170] fix(seal): shameless fix on sealing typo (#4304) --- substrate/client/consensus/manual-seal/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/client/consensus/manual-seal/src/lib.rs b/substrate/client/consensus/manual-seal/src/lib.rs index c3d360f0719..8fc7e7ecab2 100644 --- a/substrate/client/consensus/manual-seal/src/lib.rs +++ b/substrate/client/consensus/manual-seal/src/lib.rs @@ -86,7 +86,7 @@ where BasicQueue::new(ManualSealVerifier, block_import, None, spawner, registry) } -/// Params required to start the instant sealing authorship task. +/// Params required to start the manual sealing authorship task. pub struct ManualSealParams, TP, SC, CS, CIDP, P> { /// Block import instance. pub block_import: BI, @@ -114,7 +114,7 @@ pub struct ManualSealParams, TP, SC, C pub create_inherent_data_providers: CIDP, } -/// Params required to start the manual sealing authorship task. +/// Params required to start the instant sealing authorship task. pub struct InstantSealParams, TP, SC, CIDP, P> { /// Block import instance for well. importing blocks. pub block_import: BI, -- GitLab From 73b9a8391fa0b18308fa35f905e31cec77f5618f Mon Sep 17 00:00:00 2001 From: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Sun, 28 Apr 2024 14:35:51 +0200 Subject: [PATCH 020/170] [Staking] Runtime api if era rewards are pending to be claimed (#4301) closes https://github.com/paritytech/polkadot-sdk/issues/426. related to https://github.com/paritytech/polkadot-sdk/pull/1189. Would help offchain programs to query if there are unclaimed pages of rewards for a given era. The logic could look like below ```js // loop as long as all era pages are claimed. while (api.call.stakingApi.pendingRewards(era, validator_stash)) { api.tx.staking.payout_stakers(validator_stash, era) } ``` --- polkadot/runtime/westend/src/lib.rs | 4 + prdoc/pr_4301.prdoc | 13 +++ substrate/bin/node/runtime/src/lib.rs | 4 + .../frame/staking/runtime-api/src/lib.rs | 5 +- substrate/frame/staking/src/lib.rs | 28 ++++- substrate/frame/staking/src/pallet/impls.rs | 4 + substrate/frame/staking/src/tests.rs | 107 ++++++++++++++++++ 7 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4301.prdoc diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 03ecd5c070b..de961bb4c39 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -2250,6 +2250,10 @@ sp_api::impl_runtime_apis! { fn eras_stakers_page_count(era: sp_staking::EraIndex, account: AccountId) -> sp_staking::Page { Staking::api_eras_stakers_page_count(era, account) } + + fn pending_rewards(era: sp_staking::EraIndex, account: AccountId) -> bool { + Staking::api_pending_rewards(era, account) + } } #[cfg(feature = "try-runtime")] diff --git a/prdoc/pr_4301.prdoc b/prdoc/pr_4301.prdoc new file mode 100644 index 00000000000..2ca2534243a --- /dev/null +++ b/prdoc/pr_4301.prdoc @@ -0,0 +1,13 @@ +title: New runtime api to check if a validator has pending pages of rewards for an era. + +doc: + - audience: + - Node Dev + - Runtime User + description: | + Creates a new runtime api to check if reward for an era is pending for a validator. Era rewards are paged and this + api will return true as long as there is one or more pages of era reward which are not claimed. + +crates: +- name: pallet-staking +- name: pallet-staking-runtime-api diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 0caaa8c7322..5d8016532a5 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -2791,6 +2791,10 @@ impl_runtime_apis! { fn eras_stakers_page_count(era: sp_staking::EraIndex, account: AccountId) -> sp_staking::Page { Staking::api_eras_stakers_page_count(era, account) } + + fn pending_rewards(era: sp_staking::EraIndex, account: AccountId) -> bool { + Staking::api_pending_rewards(era, account) + } } impl sp_consensus_babe::BabeApi for Runtime { diff --git a/substrate/frame/staking/runtime-api/src/lib.rs b/substrate/frame/staking/runtime-api/src/lib.rs index b04c383a077..7955f4184a4 100644 --- a/substrate/frame/staking/runtime-api/src/lib.rs +++ b/substrate/frame/staking/runtime-api/src/lib.rs @@ -30,7 +30,10 @@ sp_api::decl_runtime_apis! { /// Returns the nominations quota for a nominator with a given balance. fn nominations_quota(balance: Balance) -> u32; - /// Returns the page count of exposures for a validator in a given era. + /// Returns the page count of exposures for a validator `account` in a given era. fn eras_stakers_page_count(era: sp_staking::EraIndex, account: AccountId) -> sp_staking::Page; + + /// Returns true if validator `account` has pages to be claimed for the given era. + fn pending_rewards(era: sp_staking::EraIndex, account: AccountId) -> bool; } } diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index 047ad6b87cc..692e62acfdf 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -1035,11 +1035,37 @@ where /// can and add more functions to it as needed. pub struct EraInfo(sp_std::marker::PhantomData); impl EraInfo { + /// Returns true if validator has one or more page of era rewards not claimed yet. + // Also looks at legacy storage that can be cleaned up after #433. + pub fn pending_rewards(era: EraIndex, validator: &T::AccountId) -> bool { + let page_count = if let Some(overview) = >::get(&era, validator) { + overview.page_count + } else { + if >::contains_key(era, validator) { + // this means non paged exposure, and we treat them as single paged. + 1 + } else { + // if no exposure, then no rewards to claim. + return false + } + }; + + // check if era is marked claimed in legacy storage. + if >::get(validator) + .map(|l| l.legacy_claimed_rewards.contains(&era)) + .unwrap_or_default() + { + return false + } + + ClaimedRewards::::get(era, validator).len() < page_count as usize + } + /// Temporary function which looks at both (1) passed param `T::StakingLedger` for legacy /// non-paged rewards, and (2) `T::ClaimedRewards` for paged rewards. This function can be /// removed once `T::HistoryDepth` eras have passed and none of the older non-paged rewards /// are relevant/claimable. - // Refer tracker issue for cleanup: #13034 + // Refer tracker issue for cleanup: https://github.com/paritytech/polkadot-sdk/issues/433 pub(crate) fn is_rewards_claimed_with_legacy_fallback( era: EraIndex, ledger: &StakingLedger, diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index f4d4a7133dd..4eb24311ab3 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -1183,6 +1183,10 @@ impl Pallet { pub fn api_eras_stakers_page_count(era: EraIndex, account: T::AccountId) -> Page { EraInfo::::get_page_count(era, &account) } + + pub fn api_pending_rewards(era: EraIndex, account: T::AccountId) -> bool { + EraInfo::::pending_rewards(era, &account) + } } impl ElectionDataProvider for Pallet { diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 6cf5a56e5a6..d05752f54be 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -6796,6 +6796,113 @@ fn test_validator_exposure_is_backward_compatible_with_non_paged_rewards_payout( }); } +#[test] +fn test_runtime_api_pending_rewards() { + ExtBuilder::default().build_and_execute(|| { + // GIVEN + let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); + let stake = 100; + + // validator with non-paged exposure, rewards marked in legacy claimed rewards. + let validator_one = 301; + // validator with non-paged exposure, rewards marked in paged claimed rewards. + let validator_two = 302; + // validator with paged exposure. + let validator_three = 303; + + // Set staker + for v in validator_one..=validator_three { + let _ = Balances::make_free_balance_be(&v, stake); + assert_ok!(Staking::bond(RuntimeOrigin::signed(v), stake, RewardDestination::Staked)); + } + + // Add reward points + let reward = EraRewardPoints:: { + total: 1, + individual: vec![(validator_one, 1), (validator_two, 1), (validator_three, 1)] + .into_iter() + .collect(), + }; + ErasRewardPoints::::insert(0, reward); + + // build exposure + let mut individual_exposures: Vec> = vec![]; + for i in 0..=MaxExposurePageSize::get() { + individual_exposures.push(IndividualExposure { who: i.into(), value: stake }); + } + let exposure = Exposure:: { + total: stake * (MaxExposurePageSize::get() as Balance + 2), + own: stake, + others: individual_exposures, + }; + + // add non-paged exposure for one and two. + >::insert(0, validator_one, exposure.clone()); + >::insert(0, validator_two, exposure.clone()); + // add paged exposure for third validator + EraInfo::::set_exposure(0, &validator_three, exposure); + + // add some reward to be distributed + ErasValidatorReward::::insert(0, 1000); + + // mark rewards claimed for validator_one in legacy claimed rewards + >::insert( + validator_one, + StakingLedgerInspect { + stash: validator_one, + total: stake, + active: stake, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![0], + }, + ); + + // SCENARIO ONE: rewards already marked claimed in legacy storage. + // runtime api should return false for pending rewards for validator_one. + assert!(!EraInfo::::pending_rewards(0, &validator_one)); + // and if we try to pay, we get an error. + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_one, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // SCENARIO TWO: non-paged exposure + // validator two has not claimed rewards, so pending rewards is true. + assert!(EraInfo::::pending_rewards(0, &validator_two)); + // and payout works + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_two, 0)); + // now pending rewards is false. + assert!(!EraInfo::::pending_rewards(0, &validator_two)); + // and payout fails + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_two, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // SCENARIO THREE: validator with paged exposure (two pages). + // validator three has not claimed rewards, so pending rewards is true. + assert!(EraInfo::::pending_rewards(0, &validator_three)); + // and payout works + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_three, 0)); + // validator three has two pages of exposure, so pending rewards is still true. + assert!(EraInfo::::pending_rewards(0, &validator_three)); + // payout again + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_three, 0)); + // now pending rewards is false. + assert!(!EraInfo::::pending_rewards(0, &validator_three)); + // and payout fails + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_three, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // for eras with no exposure, pending rewards is false. + assert!(!EraInfo::::pending_rewards(0, &validator_one)); + assert!(!EraInfo::::pending_rewards(0, &validator_two)); + assert!(!EraInfo::::pending_rewards(0, &validator_three)); + }); +} + mod staking_interface { use frame_support::storage::with_storage_layer; use sp_staking::StakingInterface; -- GitLab From 954150f3b5fdb7d07d1ed01b138e2025245bb227 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Sun, 28 Apr 2024 16:29:21 +0100 Subject: [PATCH 021/170] remove unnessisary use statements due to 2021 core prelude (#4183) Some traits are already included in the 2021 prelude and so shouldn't be needed to use explicitly: use `convert::TryFrom`, `convert::TryInto`, and `iter::FromIterator` are removed. ( https://doc.rust-lang.org/core/prelude/rust_2021/ ) No breaking changes or change of functionality, so I think no PR doc is needed in this case. (Motivation: Removes some references to `sp-std`) --- bridges/bin/runtime-common/src/messages.rs | 2 +- bridges/modules/grandpa/src/lib.rs | 2 +- bridges/primitives/runtime/src/chain.rs | 2 +- bridges/primitives/runtime/src/lib.rs | 2 +- bridges/relays/lib-substrate-relay/src/messages_lane.rs | 2 +- bridges/relays/lib-substrate-relay/src/messages_metrics.rs | 2 +- bridges/relays/lib-substrate-relay/src/messages_target.rs | 2 +- bridges/snowbridge/pallets/inbound-queue/src/envelope.rs | 2 +- bridges/snowbridge/pallets/inbound-queue/src/lib.rs | 2 +- bridges/snowbridge/primitives/beacon/src/bits.rs | 2 +- bridges/snowbridge/primitives/beacon/src/serde_utils.rs | 2 +- bridges/snowbridge/primitives/ethereum/src/header.rs | 2 +- bridges/snowbridge/primitives/ethereum/src/mpt.rs | 2 +- bridges/snowbridge/runtime/test-common/Cargo.toml | 2 +- cumulus/client/consensus/aura/src/collator.rs | 2 +- cumulus/client/consensus/aura/src/collators/basic.rs | 2 +- cumulus/client/consensus/aura/src/collators/lookahead.rs | 2 +- cumulus/client/network/src/lib.rs | 2 +- cumulus/parachains/pallets/collective-content/Cargo.toml | 2 +- polkadot/node/core/bitfield-signing/src/lib.rs | 2 +- polkadot/node/network/bitfield-distribution/src/tests.rs | 2 +- .../node/network/collator-protocol/src/collator_side/mod.rs | 1 - .../network/collator-protocol/src/validator_side/mod.rs | 2 -- .../network/statement-distribution/src/legacy_v1/tests.rs | 2 +- .../subsystem-types/src/messages/network_bridge_event.rs | 2 +- polkadot/xcm/src/v3/junction.rs | 1 - polkadot/xcm/src/v3/junctions.rs | 2 +- polkadot/xcm/src/v3/mod.rs | 6 +----- polkadot/xcm/src/v3/multiasset.rs | 5 +---- polkadot/xcm/src/v3/multilocation.rs | 6 +----- polkadot/xcm/src/v4/asset.rs | 5 +---- polkadot/xcm/src/v4/junction.rs | 1 - polkadot/xcm/src/v4/junctions.rs | 2 +- polkadot/xcm/src/v4/location.rs | 6 +----- polkadot/xcm/src/v4/mod.rs | 6 +----- polkadot/xcm/xcm-builder/src/tests/mod.rs | 1 - substrate/client/consensus/grandpa/rpc/src/lib.rs | 2 +- substrate/client/consensus/grandpa/src/environment.rs | 1 - substrate/client/mixnet/Cargo.toml | 2 +- .../network/src/protocol/notifications/upgrade/collec.rs | 1 - substrate/frame/Cargo.toml | 2 +- substrate/frame/alliance/src/benchmarking.rs | 6 +----- substrate/frame/alliance/src/lib.rs | 2 +- substrate/frame/alliance/src/mock.rs | 1 - substrate/frame/alliance/src/types.rs | 2 +- substrate/frame/examples/frame-crate/Cargo.toml | 2 +- substrate/frame/mixnet/Cargo.toml | 2 +- substrate/frame/node-authorization/src/lib.rs | 2 +- substrate/frame/safe-mode/src/lib.rs | 1 - substrate/frame/sassafras/Cargo.toml | 2 +- substrate/frame/transaction-payment/rpc/src/lib.rs | 2 +- substrate/frame/tx-pause/src/lib.rs | 2 +- substrate/primitives/consensus/sassafras/Cargo.toml | 2 +- substrate/primitives/core/fuzz/Cargo.toml | 1 + substrate/primitives/mixnet/Cargo.toml | 2 +- substrate/primitives/state-machine/src/basic.rs | 1 - 56 files changed, 46 insertions(+), 82 deletions(-) diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs index 4aca53f3b98..0fe9935dbdb 100644 --- a/bridges/bin/runtime-common/src/messages.rs +++ b/bridges/bin/runtime-common/src/messages.rs @@ -35,7 +35,7 @@ use frame_support::{traits::Get, weights::Weight}; use hash_db::Hasher; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; -use sp_std::{convert::TryFrom, marker::PhantomData, vec::Vec}; +use sp_std::{marker::PhantomData, vec::Vec}; /// Bidirectional message bridge. pub trait MessageBridge { diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index cb536eb07ff..efcbfb1654b 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -49,7 +49,7 @@ use sp_runtime::{ traits::{Header as HeaderT, Zero}, SaturatedConversion, }; -use sp_std::{boxed::Box, convert::TryInto, prelude::*}; +use sp_std::{boxed::Box, prelude::*}; mod call_ext; #[cfg(test)] diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index 1b1c623104f..369386e41b0 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -26,7 +26,7 @@ use sp_runtime::{ }, FixedPointOperand, }; -use sp_std::{convert::TryFrom, fmt::Debug, hash::Hash, str::FromStr, vec, vec::Vec}; +use sp_std::{fmt::Debug, hash::Hash, str::FromStr, vec, vec::Vec}; /// Chain call, that is either SCALE-encoded, or decoded. #[derive(Debug, Clone, PartialEq)] diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index c9c5c941291..5daba0351ad 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -31,7 +31,7 @@ use sp_runtime::{ traits::{BadOrigin, Header as HeaderT, UniqueSaturatedInto}, RuntimeDebug, }; -use sp_std::{convert::TryFrom, fmt::Debug, ops::RangeInclusive, vec, vec::Vec}; +use sp_std::{fmt::Debug, ops::RangeInclusive, vec, vec::Vec}; pub use chain::{ AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain, EncodedOrDecodedCall, HashOf, diff --git a/bridges/relays/lib-substrate-relay/src/messages_lane.rs b/bridges/relays/lib-substrate-relay/src/messages_lane.rs index abeab8c1402..58e9ded312d 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_lane.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_lane.rs @@ -46,7 +46,7 @@ use relay_utils::{ }; use sp_core::Pair; use sp_runtime::traits::Zero; -use std::{convert::TryFrom, fmt::Debug, marker::PhantomData}; +use std::{fmt::Debug, marker::PhantomData}; /// Substrate -> Substrate messages synchronization pipeline. pub trait SubstrateMessageLane: 'static + Clone + Debug + Send + Sync { diff --git a/bridges/relays/lib-substrate-relay/src/messages_metrics.rs b/bridges/relays/lib-substrate-relay/src/messages_metrics.rs index 27bf6186c3b..b30e75bd8ba 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_metrics.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_metrics.rs @@ -32,7 +32,7 @@ use relay_substrate_client::{ use relay_utils::metrics::{MetricsParams, StandaloneMetric}; use sp_core::storage::StorageData; use sp_runtime::{FixedPointNumber, FixedU128}; -use std::{convert::TryFrom, fmt::Debug, marker::PhantomData}; +use std::{fmt::Debug, marker::PhantomData}; /// Add relay accounts balance metrics. pub async fn add_relay_balances_metrics( diff --git a/bridges/relays/lib-substrate-relay/src/messages_target.rs b/bridges/relays/lib-substrate-relay/src/messages_target.rs index 9396e785530..633b11f0b80 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_target.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_target.rs @@ -45,7 +45,7 @@ use relay_substrate_client::{ }; use relay_utils::relay_loop::Client as RelayClient; use sp_core::Pair; -use std::{convert::TryFrom, ops::RangeInclusive}; +use std::ops::RangeInclusive; /// Message receiving proof returned by the target Substrate node. pub type SubstrateMessagesDeliveryProof = diff --git a/bridges/snowbridge/pallets/inbound-queue/src/envelope.rs b/bridges/snowbridge/pallets/inbound-queue/src/envelope.rs index 826d535c2cb..31a8992442d 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/envelope.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/envelope.rs @@ -3,7 +3,7 @@ use snowbridge_core::{inbound::Log, ChannelId}; use sp_core::{RuntimeDebug, H160, H256}; -use sp_std::{convert::TryFrom, prelude::*}; +use sp_std::prelude::*; use alloy_primitives::B256; use alloy_sol_types::{sol, SolEvent}; diff --git a/bridges/snowbridge/pallets/inbound-queue/src/lib.rs b/bridges/snowbridge/pallets/inbound-queue/src/lib.rs index 8acbb0c2916..4a1486204eb 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/lib.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/lib.rs @@ -50,7 +50,7 @@ use frame_system::ensure_signed; use scale_info::TypeInfo; use sp_core::{H160, H256}; use sp_runtime::traits::Zero; -use sp_std::{convert::TryFrom, vec}; +use sp_std::vec; use xcm::prelude::{ send_xcm, Instruction::SetTopic, Junction::*, Location, SendError as XcmpSendError, SendXcm, Xcm, XcmContext, XcmHash, diff --git a/bridges/snowbridge/primitives/beacon/src/bits.rs b/bridges/snowbridge/primitives/beacon/src/bits.rs index 72b7135ee29..fb03588cf8b 100644 --- a/bridges/snowbridge/primitives/beacon/src/bits.rs +++ b/bridges/snowbridge/primitives/beacon/src/bits.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork -use sp_std::{convert::TryInto, prelude::*}; +use sp_std::prelude::*; use ssz_rs::{Bitvector, Deserialize}; pub fn decompress_sync_committee_bits< diff --git a/bridges/snowbridge/primitives/beacon/src/serde_utils.rs b/bridges/snowbridge/primitives/beacon/src/serde_utils.rs index 07f5cbe724e..5e39ff91225 100644 --- a/bridges/snowbridge/primitives/beacon/src/serde_utils.rs +++ b/bridges/snowbridge/primitives/beacon/src/serde_utils.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Deserializer}; // helper to deserialize arbitrary arrays like [T; N] pub mod arrays { - use std::{convert::TryInto, marker::PhantomData}; + use std::marker::PhantomData; use serde::{ de::{SeqAccess, Visitor}, diff --git a/bridges/snowbridge/primitives/ethereum/src/header.rs b/bridges/snowbridge/primitives/ethereum/src/header.rs index f0b51f8c79d..48fa179fe4f 100644 --- a/bridges/snowbridge/primitives/ethereum/src/header.rs +++ b/bridges/snowbridge/primitives/ethereum/src/header.rs @@ -8,7 +8,7 @@ use rlp::RlpStream; use scale_info::TypeInfo; use sp_io::hashing::keccak_256; use sp_runtime::RuntimeDebug; -use sp_std::{convert::TryInto, prelude::*}; +use sp_std::prelude::*; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; diff --git a/bridges/snowbridge/primitives/ethereum/src/mpt.rs b/bridges/snowbridge/primitives/ethereum/src/mpt.rs index 9a2dae486dc..0365f5e994f 100644 --- a/bridges/snowbridge/primitives/ethereum/src/mpt.rs +++ b/bridges/snowbridge/primitives/ethereum/src/mpt.rs @@ -3,7 +3,7 @@ //! Helper types to work with Ethereum's Merkle Patricia Trie nodes use ethereum_types::H256; -use sp_std::{convert::TryFrom, prelude::*}; +use sp_std::prelude::*; pub trait Node { fn contains_hash(&self, hash: H256) -> bool; diff --git a/bridges/snowbridge/runtime/test-common/Cargo.toml b/bridges/snowbridge/runtime/test-common/Cargo.toml index 92970339fac..7cbb3857403 100644 --- a/bridges/snowbridge/runtime/test-common/Cargo.toml +++ b/bridges/snowbridge/runtime/test-common/Cargo.toml @@ -3,7 +3,7 @@ name = "snowbridge-runtime-test-common" description = "Snowbridge Runtime Tests" version = "0.2.0" authors = ["Snowfork "] -edition = "2021" +edition.workspace = true license = "Apache-2.0" categories = ["cryptography::cryptocurrencies"] diff --git a/cumulus/client/consensus/aura/src/collator.rs b/cumulus/client/consensus/aura/src/collator.rs index 5b7669c88f4..776052215d9 100644 --- a/cumulus/client/consensus/aura/src/collator.rs +++ b/cumulus/client/consensus/aura/src/collator.rs @@ -55,7 +55,7 @@ use sp_runtime::{ }; use sp_state_machine::StorageChanges; use sp_timestamp::Timestamp; -use std::{convert::TryFrom, error::Error, time::Duration}; +use std::{error::Error, time::Duration}; /// Parameters for instantiating a [`Collator`]. pub struct Params { diff --git a/cumulus/client/consensus/aura/src/collators/basic.rs b/cumulus/client/consensus/aura/src/collators/basic.rs index a4c22a45266..1047c6219ad 100644 --- a/cumulus/client/consensus/aura/src/collators/basic.rs +++ b/cumulus/client/consensus/aura/src/collators/basic.rs @@ -48,7 +48,7 @@ use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; use sp_state_machine::Backend as _; -use std::{convert::TryFrom, sync::Arc, time::Duration}; +use std::{sync::Arc, time::Duration}; use crate::collator as collator_util; diff --git a/cumulus/client/consensus/aura/src/collators/lookahead.rs b/cumulus/client/consensus/aura/src/collators/lookahead.rs index 3fe87e94b7b..09416233ea9 100644 --- a/cumulus/client/consensus/aura/src/collators/lookahead.rs +++ b/cumulus/client/consensus/aura/src/collators/lookahead.rs @@ -67,7 +67,7 @@ use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; use sp_timestamp::Timestamp; -use std::{convert::TryFrom, sync::Arc, time::Duration}; +use std::{sync::Arc, time::Duration}; use crate::collator::{self as collator_util, SlotClaim}; diff --git a/cumulus/client/network/src/lib.rs b/cumulus/client/network/src/lib.rs index ebd557b805c..f442ed5840b 100644 --- a/cumulus/client/network/src/lib.rs +++ b/cumulus/client/network/src/lib.rs @@ -36,7 +36,7 @@ use polkadot_primitives::{ use codec::{Decode, DecodeAll, Encode}; use futures::{channel::oneshot, future::FutureExt, Future}; -use std::{convert::TryFrom, fmt, marker::PhantomData, pin::Pin, sync::Arc}; +use std::{fmt, marker::PhantomData, pin::Pin, sync::Arc}; #[cfg(test)] mod tests; diff --git a/cumulus/parachains/pallets/collective-content/Cargo.toml b/cumulus/parachains/pallets/collective-content/Cargo.toml index b3fac47cb4a..207259bee52 100644 --- a/cumulus/parachains/pallets/collective-content/Cargo.toml +++ b/cumulus/parachains/pallets/collective-content/Cargo.toml @@ -2,7 +2,7 @@ name = "pallet-collective-content" version = "0.6.0" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true description = "Managed content" license = "Apache-2.0" diff --git a/polkadot/node/core/bitfield-signing/src/lib.rs b/polkadot/node/core/bitfield-signing/src/lib.rs index 0fc0bb3d278..89851c4a033 100644 --- a/polkadot/node/core/bitfield-signing/src/lib.rs +++ b/polkadot/node/core/bitfield-signing/src/lib.rs @@ -38,7 +38,7 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_util::{self as util, Validator}; use polkadot_primitives::{AvailabilityBitfield, CoreState, Hash, ValidatorIndex}; use sp_keystore::{Error as KeystoreError, KeystorePtr}; -use std::{collections::HashMap, iter::FromIterator, time::Duration}; +use std::{collections::HashMap, time::Duration}; use wasm_timer::{Delay, Instant}; mod metrics; diff --git a/polkadot/node/network/bitfield-distribution/src/tests.rs b/polkadot/node/network/bitfield-distribution/src/tests.rs index 188b51ebccc..dc37f73ec8a 100644 --- a/polkadot/node/network/bitfield-distribution/src/tests.rs +++ b/polkadot/node/network/bitfield-distribution/src/tests.rs @@ -40,7 +40,7 @@ use sp_core::Pair as PairT; use sp_keyring::Sr25519Keyring; use sp_keystore::{testing::MemoryKeystore, Keystore, KeystorePtr}; -use std::{iter::FromIterator as _, sync::Arc, time::Duration}; +use std::{sync::Arc, time::Duration}; const TIMEOUT: Duration = Duration::from_millis(50); macro_rules! launch { diff --git a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs index e6aa55235b7..879caf92328 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs @@ -16,7 +16,6 @@ use std::{ collections::{HashMap, HashSet}, - convert::TryInto, time::Duration, }; diff --git a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs index f7b07133bff..ac8c060827f 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs @@ -20,9 +20,7 @@ use futures::{ use futures_timer::Delay; use std::{ collections::{hash_map::Entry, HashMap, HashSet}, - convert::TryInto, future::Future, - iter::FromIterator, time::{Duration, Instant}, }; use tokio_util::sync::CancellationToken; diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs index 0dea5ad0996..d4c5f95034a 100644 --- a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs +++ b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs @@ -55,7 +55,7 @@ use sp_application_crypto::{sr25519::Pair, AppCrypto, Pair as TraitPair}; use sp_authority_discovery::AuthorityPair; use sp_keyring::Sr25519Keyring; use sp_keystore::{Keystore, KeystorePtr}; -use std::{iter::FromIterator as _, sync::Arc, time::Duration}; +use std::{sync::Arc, time::Duration}; use util::reputation::add_reputation; // Some deterministic genesis hash for protocol names diff --git a/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs b/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs index fa2c7687b38..29798c785b9 100644 --- a/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs +++ b/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use std::{collections::HashSet, convert::TryFrom}; +use std::collections::HashSet; pub use sc_network::ReputationChange; pub use sc_network_types::PeerId; diff --git a/polkadot/xcm/src/v3/junction.rs b/polkadot/xcm/src/v3/junction.rs index e9e51941b1a..32ce352c5c0 100644 --- a/polkadot/xcm/src/v3/junction.rs +++ b/polkadot/xcm/src/v3/junction.rs @@ -26,7 +26,6 @@ use crate::{ VersionedLocation, }; use bounded_collections::{BoundedSlice, BoundedVec, ConstU32}; -use core::convert::{TryFrom, TryInto}; use parity_scale_codec::{self, Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; diff --git a/polkadot/xcm/src/v3/junctions.rs b/polkadot/xcm/src/v3/junctions.rs index 9748e81fa55..7b014304fda 100644 --- a/polkadot/xcm/src/v3/junctions.rs +++ b/polkadot/xcm/src/v3/junctions.rs @@ -17,7 +17,7 @@ //! XCM `Junctions`/`InteriorMultiLocation` datatype. use super::{Junction, MultiLocation, NetworkId}; -use core::{convert::TryFrom, mem, result}; +use core::{mem, result}; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; diff --git a/polkadot/xcm/src/v3/mod.rs b/polkadot/xcm/src/v3/mod.rs index d4e2da07a25..e7c57f414eb 100644 --- a/polkadot/xcm/src/v3/mod.rs +++ b/polkadot/xcm/src/v3/mod.rs @@ -29,11 +29,7 @@ use super::{ use crate::DoubleEncoded; use alloc::{vec, vec::Vec}; use bounded_collections::{parameter_types, BoundedVec}; -use core::{ - convert::{TryFrom, TryInto}, - fmt::Debug, - result, -}; +use core::{fmt::Debug, result}; use derivative::Derivative; use parity_scale_codec::{ self, decode_vec_with_len, Compact, Decode, Encode, Error as CodecError, Input as CodecInput, diff --git a/polkadot/xcm/src/v3/multiasset.rs b/polkadot/xcm/src/v3/multiasset.rs index 0662077b19d..9a67b0e4986 100644 --- a/polkadot/xcm/src/v3/multiasset.rs +++ b/polkadot/xcm/src/v3/multiasset.rs @@ -42,10 +42,7 @@ use crate::{ }; use alloc::{vec, vec::Vec}; use bounded_collections::{BoundedVec, ConstU32}; -use core::{ - cmp::Ordering, - convert::{TryFrom, TryInto}, -}; +use core::cmp::Ordering; use parity_scale_codec::{self as codec, Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; diff --git a/polkadot/xcm/src/v3/multilocation.rs b/polkadot/xcm/src/v3/multilocation.rs index 18fe01ec8fa..731e277b29d 100644 --- a/polkadot/xcm/src/v3/multilocation.rs +++ b/polkadot/xcm/src/v3/multilocation.rs @@ -20,10 +20,7 @@ use super::{Junction, Junctions}; use crate::{ v2::MultiLocation as OldMultiLocation, v4::Location as NewMultiLocation, VersionedLocation, }; -use core::{ - convert::{TryFrom, TryInto}, - result, -}; +use core::result; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -766,7 +763,6 @@ mod tests { #[test] fn conversion_from_other_types_works() { use crate::v2; - use core::convert::TryInto; fn takes_multilocation>(_arg: Arg) {} diff --git a/polkadot/xcm/src/v4/asset.rs b/polkadot/xcm/src/v4/asset.rs index 8abd8f9f8fd..6b6d200f32f 100644 --- a/polkadot/xcm/src/v4/asset.rs +++ b/polkadot/xcm/src/v4/asset.rs @@ -34,10 +34,7 @@ use crate::v3::{ }; use alloc::{vec, vec::Vec}; use bounded_collections::{BoundedVec, ConstU32}; -use core::{ - cmp::Ordering, - convert::{TryFrom, TryInto}, -}; +use core::cmp::Ordering; use parity_scale_codec::{self as codec, Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; diff --git a/polkadot/xcm/src/v4/junction.rs b/polkadot/xcm/src/v4/junction.rs index b5d10484aa0..3ae97de5e9b 100644 --- a/polkadot/xcm/src/v4/junction.rs +++ b/polkadot/xcm/src/v4/junction.rs @@ -23,7 +23,6 @@ use crate::{ VersionedLocation, }; use bounded_collections::{BoundedSlice, BoundedVec, ConstU32}; -use core::convert::TryFrom; use parity_scale_codec::{self, Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; diff --git a/polkadot/xcm/src/v4/junctions.rs b/polkadot/xcm/src/v4/junctions.rs index 48712dd74c6..6d1af59e13d 100644 --- a/polkadot/xcm/src/v4/junctions.rs +++ b/polkadot/xcm/src/v4/junctions.rs @@ -18,7 +18,7 @@ use super::{Junction, Location, NetworkId}; use alloc::sync::Arc; -use core::{convert::TryFrom, mem, ops::Range, result}; +use core::{mem, ops::Range, result}; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; diff --git a/polkadot/xcm/src/v4/location.rs b/polkadot/xcm/src/v4/location.rs index 9275bfdb949..cee76b68940 100644 --- a/polkadot/xcm/src/v4/location.rs +++ b/polkadot/xcm/src/v4/location.rs @@ -18,10 +18,7 @@ use super::{traits::Reanchorable, Junction, Junctions}; use crate::{v3::MultiLocation as OldLocation, VersionedLocation}; -use core::{ - convert::{TryFrom, TryInto}, - result, -}; +use core::result; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -723,7 +720,6 @@ mod tests { #[test] fn conversion_from_other_types_works() { use crate::v3; - use core::convert::TryInto; fn takes_location>(_arg: Arg) {} diff --git a/polkadot/xcm/src/v4/mod.rs b/polkadot/xcm/src/v4/mod.rs index 30ee485589a..77b6d915fcb 100644 --- a/polkadot/xcm/src/v4/mod.rs +++ b/polkadot/xcm/src/v4/mod.rs @@ -24,11 +24,7 @@ use super::v3::{ use crate::DoubleEncoded; use alloc::{vec, vec::Vec}; use bounded_collections::{parameter_types, BoundedVec}; -use core::{ - convert::{TryFrom, TryInto}, - fmt::Debug, - result, -}; +use core::{fmt::Debug, result}; use derivative::Derivative; use parity_scale_codec::{ self, decode_vec_with_len, Compact, Decode, Encode, Error as CodecError, Input as CodecInput, diff --git a/polkadot/xcm/xcm-builder/src/tests/mod.rs b/polkadot/xcm/xcm-builder/src/tests/mod.rs index 63d254a1067..16ce3d2cf8f 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mod.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mod.rs @@ -15,7 +15,6 @@ // along with Polkadot. If not, see . use super::{test_utils::*, *}; -use core::convert::TryInto; use frame_support::{ assert_err, traits::{ConstU32, ContainsPair, ProcessMessageError}, diff --git a/substrate/client/consensus/grandpa/rpc/src/lib.rs b/substrate/client/consensus/grandpa/rpc/src/lib.rs index 0557eab93e2..68de068c305 100644 --- a/substrate/client/consensus/grandpa/rpc/src/lib.rs +++ b/substrate/client/consensus/grandpa/rpc/src/lib.rs @@ -125,7 +125,7 @@ where #[cfg(test)] mod tests { use super::*; - use std::{collections::HashSet, convert::TryInto, sync::Arc}; + use std::{collections::HashSet, sync::Arc}; use jsonrpsee::{core::EmptyServerParams as EmptyParams, types::SubscriptionId, RpcModule}; use parity_scale_codec::{Decode, Encode}; diff --git a/substrate/client/consensus/grandpa/src/environment.rs b/substrate/client/consensus/grandpa/src/environment.rs index d3e2beb84e7..31df038044a 100644 --- a/substrate/client/consensus/grandpa/src/environment.rs +++ b/substrate/client/consensus/grandpa/src/environment.rs @@ -18,7 +18,6 @@ use std::{ collections::{BTreeMap, HashMap}, - iter::FromIterator, marker::PhantomData, pin::Pin, sync::Arc, diff --git a/substrate/client/mixnet/Cargo.toml b/substrate/client/mixnet/Cargo.toml index 65b81bda4b0..e605a06c9d9 100644 --- a/substrate/client/mixnet/Cargo.toml +++ b/substrate/client/mixnet/Cargo.toml @@ -4,7 +4,7 @@ name = "sc-mixnet" version = "0.4.0" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" readme = "README.md" diff --git a/substrate/client/network/src/protocol/notifications/upgrade/collec.rs b/substrate/client/network/src/protocol/notifications/upgrade/collec.rs index 791821b3f75..33c090ae50e 100644 --- a/substrate/client/network/src/protocol/notifications/upgrade/collec.rs +++ b/substrate/client/network/src/protocol/notifications/upgrade/collec.rs @@ -19,7 +19,6 @@ use futures::prelude::*; use libp2p::core::upgrade::{InboundUpgrade, ProtocolName, UpgradeInfo}; use std::{ - iter::FromIterator, pin::Pin, task::{Context, Poll}, vec, diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index 84bab86581c..ef8d8758f3d 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -2,7 +2,7 @@ name = "polkadot-sdk-frame" version = "0.1.0" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true license = "Apache-2.0" homepage = "paritytech.github.io" repository.workspace = true diff --git a/substrate/frame/alliance/src/benchmarking.rs b/substrate/frame/alliance/src/benchmarking.rs index 710c32a848d..09e2045555b 100644 --- a/substrate/frame/alliance/src/benchmarking.rs +++ b/substrate/frame/alliance/src/benchmarking.rs @@ -19,11 +19,7 @@ #![cfg(feature = "runtime-benchmarks")] -use core::{ - cmp, - convert::{TryFrom, TryInto}, - mem::size_of, -}; +use core::{cmp, mem::size_of}; use sp_runtime::traits::{Bounded, Hash, StaticLookup}; use frame_benchmarking::{account, v2::*, BenchmarkError}; diff --git a/substrate/frame/alliance/src/lib.rs b/substrate/frame/alliance/src/lib.rs index 1f06241e9c8..ed771c7226e 100644 --- a/substrate/frame/alliance/src/lib.rs +++ b/substrate/frame/alliance/src/lib.rs @@ -101,7 +101,7 @@ use sp_runtime::{ traits::{Dispatchable, Saturating, StaticLookup, Zero}, DispatchError, RuntimeDebug, }; -use sp_std::{convert::TryInto, prelude::*}; +use sp_std::prelude::*; use frame_support::{ dispatch::{DispatchResult, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo}, diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs index b183e412bed..7116e69efa1 100644 --- a/substrate/frame/alliance/src/mock.rs +++ b/substrate/frame/alliance/src/mock.rs @@ -17,7 +17,6 @@ //! Test utilities -use core::convert::{TryFrom, TryInto}; pub use sp_core::H256; use sp_runtime::traits::Hash; pub use sp_runtime::{ diff --git a/substrate/frame/alliance/src/types.rs b/substrate/frame/alliance/src/types.rs index 784993b2bc1..149030b52c6 100644 --- a/substrate/frame/alliance/src/types.rs +++ b/substrate/frame/alliance/src/types.rs @@ -19,7 +19,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{traits::ConstU32, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; -use sp_std::{convert::TryInto, prelude::*}; +use sp_std::prelude::*; /// A Multihash instance that only supports the basic functionality and no hashing. #[derive( diff --git a/substrate/frame/examples/frame-crate/Cargo.toml b/substrate/frame/examples/frame-crate/Cargo.toml index 3a0e4f720f9..48cb25f9094 100644 --- a/substrate/frame/examples/frame-crate/Cargo.toml +++ b/substrate/frame/examples/frame-crate/Cargo.toml @@ -2,7 +2,7 @@ name = "pallet-example-frame-crate" version = "0.0.1" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true license = "MIT-0" homepage = "https://substrate.io" repository.workspace = true diff --git a/substrate/frame/mixnet/Cargo.toml b/substrate/frame/mixnet/Cargo.toml index 6a4ef5c29ac..964d6acb889 100644 --- a/substrate/frame/mixnet/Cargo.toml +++ b/substrate/frame/mixnet/Cargo.toml @@ -4,7 +4,7 @@ name = "pallet-mixnet" version = "0.4.0" license = "Apache-2.0" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" readme = "README.md" diff --git a/substrate/frame/node-authorization/src/lib.rs b/substrate/frame/node-authorization/src/lib.rs index 9019a863ad8..a7967536079 100644 --- a/substrate/frame/node-authorization/src/lib.rs +++ b/substrate/frame/node-authorization/src/lib.rs @@ -47,7 +47,7 @@ pub mod weights; pub use pallet::*; use sp_core::OpaquePeerId as PeerId; use sp_runtime::traits::StaticLookup; -use sp_std::{collections::btree_set::BTreeSet, iter::FromIterator, prelude::*}; +use sp_std::{collections::btree_set::BTreeSet, prelude::*}; pub use weights::WeightInfo; type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; diff --git a/substrate/frame/safe-mode/src/lib.rs b/substrate/frame/safe-mode/src/lib.rs index 2bf2ebee0a4..4be0776d6c1 100644 --- a/substrate/frame/safe-mode/src/lib.rs +++ b/substrate/frame/safe-mode/src/lib.rs @@ -79,7 +79,6 @@ pub mod mock; mod tests; pub mod weights; -use core::convert::TryInto; use frame_support::{ defensive_assert, pallet_prelude::*, diff --git a/substrate/frame/sassafras/Cargo.toml b/substrate/frame/sassafras/Cargo.toml index 09977142efc..888b1d8f31f 100644 --- a/substrate/frame/sassafras/Cargo.toml +++ b/substrate/frame/sassafras/Cargo.toml @@ -2,7 +2,7 @@ name = "pallet-sassafras" version = "0.3.5-dev" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true license = "Apache-2.0" homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" diff --git a/substrate/frame/transaction-payment/rpc/src/lib.rs b/substrate/frame/transaction-payment/rpc/src/lib.rs index f5323cf852e..050c7fb8915 100644 --- a/substrate/frame/transaction-payment/rpc/src/lib.rs +++ b/substrate/frame/transaction-payment/rpc/src/lib.rs @@ -17,7 +17,7 @@ //! RPC interface for the transaction payment pallet. -use std::{convert::TryInto, sync::Arc}; +use std::sync::Arc; use codec::{Codec, Decode}; use jsonrpsee::{ diff --git a/substrate/frame/tx-pause/src/lib.rs b/substrate/frame/tx-pause/src/lib.rs index 31be575fba7..5904b5ed316 100644 --- a/substrate/frame/tx-pause/src/lib.rs +++ b/substrate/frame/tx-pause/src/lib.rs @@ -87,7 +87,7 @@ use frame_support::{ }; use frame_system::pallet_prelude::*; use sp_runtime::{traits::Dispatchable, DispatchResult}; -use sp_std::{convert::TryInto, prelude::*}; +use sp_std::prelude::*; pub use pallet::*; pub use weights::*; diff --git a/substrate/primitives/consensus/sassafras/Cargo.toml b/substrate/primitives/consensus/sassafras/Cargo.toml index 07304ed9b24..50348054da0 100644 --- a/substrate/primitives/consensus/sassafras/Cargo.toml +++ b/substrate/primitives/consensus/sassafras/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-consensus-sassafras" version = "0.3.4-dev" authors.workspace = true description = "Primitives for Sassafras consensus" -edition = "2021" +edition.workspace = true license = "Apache-2.0" homepage = "https://substrate.io" repository = "https://github.com/paritytech/polkadot-sdk/" diff --git a/substrate/primitives/core/fuzz/Cargo.toml b/substrate/primitives/core/fuzz/Cargo.toml index c6b5a065b6d..463eaea8ea3 100644 --- a/substrate/primitives/core/fuzz/Cargo.toml +++ b/substrate/primitives/core/fuzz/Cargo.toml @@ -2,6 +2,7 @@ name = "sp-core-fuzz" version = "0.0.0" publish = false +edition.workspace = true [lints] workspace = true diff --git a/substrate/primitives/mixnet/Cargo.toml b/substrate/primitives/mixnet/Cargo.toml index 07840ca63cb..166609ad922 100644 --- a/substrate/primitives/mixnet/Cargo.toml +++ b/substrate/primitives/mixnet/Cargo.toml @@ -4,7 +4,7 @@ name = "sp-mixnet" version = "0.4.0" license = "Apache-2.0" authors = ["Parity Technologies "] -edition = "2021" +edition.workspace = true homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" readme = "README.md" diff --git a/substrate/primitives/state-machine/src/basic.rs b/substrate/primitives/state-machine/src/basic.rs index ace88aee262..8b6f746eaba 100644 --- a/substrate/primitives/state-machine/src/basic.rs +++ b/substrate/primitives/state-machine/src/basic.rs @@ -33,7 +33,6 @@ use sp_trie::{empty_child_trie_root, LayoutV0, LayoutV1, TrieConfiguration}; use std::{ any::{Any, TypeId}, collections::BTreeMap, - iter::FromIterator, }; /// Simple Map-based Externalities impl. -- GitLab From 92a348f57deed44789511df73d3fbbbcb58d98cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Apr 2024 20:36:25 +0400 Subject: [PATCH 022/170] Bump snow from 0.9.3 to 0.9.6 (#4061) Bumps [snow](https://github.com/mcginty/snow) from 0.9.3 to 0.9.6.

Release notes

Sourced from snow's releases.

v0.9.6

  • Validate invalid PSK positions when building a Noise protocol.
  • Raise errors in various typos/mistakes in Noise patterns when parsing.
  • Deprecate the sodiumoxide backend, as that crate is no longer maintained. We may eventually migrate it to a maintaned version of the crate, but for now it's best to warn users.
  • Set a hard limit in read_message() in transport mode to 65535 to be fully compliant with the Noise specification.

Full Changelog: https://github.com/mcginty/snow/compare/v0.9.5...v0.9.6

v0.9.5

This is a security release that fixes a logic flaw in decryption in TransportState (i.e. the stateful one), where the nonce could increase even when decryption failed, which can cause a desync between the sender and receiver, opening this up as a denial of service vector if the attacker has the ability to inject packets in the channel Noise is talking over.

More details can be found in the advisory: https://github.com/mcginty/snow/security/advisories/GHSA-7g9j-g5jg-3vv3

All users are encouraged to update.

v0.9.4

This is a dependency version bump release because a couple of important dependencies released new versions that needed a Cargo.toml bump:

  • ring 0.17
  • pqcrypto-kyber 0.8
  • aes-gcm 0.10
  • chacha20poly1305 0.10
Commits
  • a4be73f meta: v0.9.6 release
  • 9e53dcf TransportState: limit read_message size to 65535
  • faf0560 Deprecate sodiumoxide resolver
  • 308a24d Add warnings about multiple calls to same method in Builder
  • f280991 Error when extraneous parameters are included in string to parse
  • dbdcc48 Error on duplicate modifiers in parameter string
  • 8b1a819 Validate PSK index in pattern to avoid panic
  • 74e30cf meta: v0.9.5 release
  • 12e8ae5 Stateful nonce desync fix
  • 02c26b7 Remove clap from simple example
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=snow&package-manager=cargo&previous-version=0.9.3&new-version=0.9.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/paritytech/polkadot-sdk/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 153 ++++++++--------------------------------------------- 1 file changed, 23 insertions(+), 130 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d64800fb085..67b0ad4def2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,15 +42,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" -[[package]] -name = "aead" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "aead" version = "0.5.2" @@ -61,18 +52,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug 0.3.0", -] - [[package]] name = "aes" version = "0.8.3" @@ -84,31 +63,17 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "aes-gcm" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc3be92e19a7ef47457b8e6f90707e12b6ac5d20c6f3866584fa3be0787d839f" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "cipher 0.3.0", - "ctr 0.7.0", - "ghash 0.4.4", - "subtle 2.5.0", -] - [[package]] name = "aes-gcm" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" dependencies = [ - "aead 0.5.2", - "aes 0.8.3", + "aead", + "aes", "cipher 0.4.4", - "ctr 0.9.2", - "ghash 0.5.0", + "ctr", + "ghash", "subtle 2.5.0", ] @@ -2540,18 +2505,6 @@ dependencies = [ "keystream", ] -[[package]] -name = "chacha20" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "zeroize", -] - [[package]] name = "chacha20" version = "0.9.1" @@ -2565,14 +2518,14 @@ dependencies = [ [[package]] name = "chacha20poly1305" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "aead 0.4.3", - "chacha20 0.8.2", - "cipher 0.3.0", - "poly1305 0.7.2", + "aead", + "chacha20", + "cipher 0.4.4", + "poly1305", "zeroize", ] @@ -2652,15 +2605,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "cipher" version = "0.4.4" @@ -2669,6 +2613,7 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", + "zeroize", ] [[package]] @@ -3676,15 +3621,6 @@ dependencies = [ "subtle 2.5.0", ] -[[package]] -name = "ctr" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a232f92a03f37dd7d7dd2adc67166c77e9cd88de5b019b9a9eecfaeaf7bfd481" -dependencies = [ - "cipher 0.3.0", -] - [[package]] name = "ctr" version = "0.9.2" @@ -6395,16 +6331,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "ghash" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" -dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.5.3", -] - [[package]] name = "ghash" version = "0.5.0" @@ -6412,7 +6338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" dependencies = [ "opaque-debug 0.3.0", - "polyval 0.6.1", + "polyval", ] [[package]] @@ -12032,7 +11958,7 @@ checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" dependencies = [ "bitcoin_hashes 0.13.0", "rand 0.8.5", - "rand_core 0.6.4", + "rand_core 0.5.1", "serde", "unicode-normalization", ] @@ -14568,17 +14494,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "poly1305" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" -dependencies = [ - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.0", -] - [[package]] name = "poly1305" version = "0.8.0" @@ -14587,19 +14502,7 @@ checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ "cpufeatures", "opaque-debug 0.3.0", - "universal-hash 0.5.1", -] - -[[package]] -name = "polyval" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.0", + "universal-hash", ] [[package]] @@ -14611,7 +14514,7 @@ dependencies = [ "cfg-if", "cpufeatures", "opaque-debug 0.3.0", - "universal-hash 0.5.1", + "universal-hash", ] [[package]] @@ -17890,7 +17793,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" dependencies = [ - "aead 0.5.2", + "aead", "arrayref", "arrayvec 0.7.4", "curve25519-dalek 4.1.2", @@ -18542,7 +18445,7 @@ dependencies = [ "bip39", "blake2-rfc", "bs58 0.5.0", - "chacha20 0.9.1", + "chacha20", "crossbeam-queue", "derive_more", "ed25519-zebra 4.0.3", @@ -18564,7 +18467,7 @@ dependencies = [ "num-traits", "pbkdf2", "pin-project", - "poly1305 0.8.0", + "poly1305", "rand 0.8.5", "rand_chacha 0.3.1", "ruzstd", @@ -18627,16 +18530,16 @@ checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" [[package]] name = "snow" -version = "0.9.3" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9d1425eb528a21de2755c75af4c9b5d57f50a0d4c3b7f1828a4cd03f8ba155" +checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" dependencies = [ - "aes-gcm 0.9.2", + "aes-gcm", "blake2 0.10.6", "chacha20poly1305", "curve25519-dalek 4.1.2", "rand_core 0.6.4", - "ring 0.16.20", + "ring 0.17.7", "rustc_version 0.4.0", "sha2 0.10.7", "subtle 2.5.0", @@ -19900,7 +19803,7 @@ dependencies = [ name = "sp-statement-store" version = "10.0.0" dependencies = [ - "aes-gcm 0.10.3", + "aes-gcm", "curve25519-dalek 4.1.2", "ed25519-dalek 2.1.0", "hkdf", @@ -22142,16 +22045,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" -[[package]] -name = "universal-hash" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" -dependencies = [ - "generic-array 0.14.7", - "subtle 2.5.0", -] - [[package]] name = "universal-hash" version = "0.5.1" -- GitLab From f34d8e3cf033e2a22a41b505c437972a5dc83d78 Mon Sep 17 00:00:00 2001 From: Tin Chung <56880684+chungquantin@users.noreply.github.com> Date: Mon, 29 Apr 2024 14:13:01 +0700 Subject: [PATCH 023/170] Remove hard-coded indices from pallet-xcm tests (#4248) # ISSUE - Link to issue: https://github.com/paritytech/polkadot-sdk/issues/4237 # DESCRIPTION Remove all ModuleError with hard-coded indices to pallet Error. For example: ```rs Err(DispatchError::Module(ModuleError { index: 4, error: [2, 0, 0, 0], message: Some("Filtered") })) ``` To ```rs let expected_result = Err(crate::Error::::Filtered.into()); assert_eq!(result, expected_result); ``` # TEST OUTCOME ``` test result: ok. 74 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s ``` --------- Co-authored-by: Oliver Tale-Yazdi --- .../pallet-xcm/src/tests/assets_transfer.rs | 218 ++++-------------- polkadot/xcm/pallet-xcm/src/tests/mod.rs | 6 +- 2 files changed, 40 insertions(+), 184 deletions(-) diff --git a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs index 7dc05c1cc70..f42e220d693 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs @@ -22,12 +22,12 @@ use crate::{ DispatchResult, OriginFor, }; use frame_support::{ - assert_ok, + assert_err, assert_ok, traits::{tokens::fungibles::Inspect, Currency}, weights::Weight, }; use polkadot_parachain_primitives::primitives::Id as ParaId; -use sp_runtime::{traits::AccountIdConversion, DispatchError, ModuleError}; +use sp_runtime::traits::AccountIdConversion; use xcm::prelude::*; use xcm_executor::traits::ConvertLocation; @@ -112,14 +112,8 @@ fn limited_teleport_filtered_assets_disallowed() { 0, Unlimited, ); - assert_eq!( - result, - Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered") - })) - ); + let expected_result = Err(crate::Error::::Filtered.into()); + assert_eq!(result, expected_result); }); } @@ -365,11 +359,7 @@ fn reserve_transfer_assets_with_local_asset_reserve_and_local_fee_reserve_works( /// Test `limited_teleport_assets` with local asset reserve and local fee reserve disallowed. #[test] fn teleport_assets_with_local_asset_reserve_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); local_asset_reserve_and_local_fee_reserve_call( XcmPallet::limited_teleport_assets, expected_result, @@ -527,11 +517,7 @@ fn transfer_assets_with_destination_asset_reserve_and_local_fee_reserve_works() /// disallowed. #[test] fn reserve_transfer_assets_with_destination_asset_reserve_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); destination_asset_reserve_and_local_fee_reserve_call( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -542,11 +528,7 @@ fn reserve_transfer_assets_with_destination_asset_reserve_and_local_fee_reserve_ /// disallowed. #[test] fn teleport_assets_with_destination_asset_reserve_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); destination_asset_reserve_and_local_fee_reserve_call( XcmPallet::limited_teleport_assets, expected_result, @@ -633,11 +615,7 @@ fn remote_asset_reserve_and_local_fee_reserve_call_disallowed( /// Test `transfer_assets` with remote asset reserve and local fee reserve is disallowed. #[test] fn transfer_assets_with_remote_asset_reserve_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [22, 0, 0, 0], - message: Some("InvalidAssetUnsupportedReserve"), - })); + let expected_result = Err(crate::Error::::InvalidAssetUnsupportedReserve.into()); remote_asset_reserve_and_local_fee_reserve_call_disallowed( XcmPallet::transfer_assets, expected_result, @@ -648,11 +626,7 @@ fn transfer_assets_with_remote_asset_reserve_and_local_fee_reserve_disallowed() /// disallowed. #[test] fn reserve_transfer_assets_with_remote_asset_reserve_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); remote_asset_reserve_and_local_fee_reserve_call_disallowed( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -662,11 +636,7 @@ fn reserve_transfer_assets_with_remote_asset_reserve_and_local_fee_reserve_disal /// Test `limited_teleport_assets` with remote asset reserve and local fee reserve is disallowed. #[test] fn teleport_assets_with_remote_asset_reserve_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); remote_asset_reserve_and_local_fee_reserve_call_disallowed( XcmPallet::limited_teleport_assets, expected_result, @@ -745,7 +715,7 @@ fn local_asset_reserve_and_destination_fee_reserve_call( assert_eq!(result, expected_result); if expected_result.is_err() { // short-circuit here for tests where we expect failure - return + return; } let weight = BaseXcmWeight::get() * 3; @@ -821,11 +791,7 @@ fn transfer_assets_with_local_asset_reserve_and_destination_fee_reserve_works() /// disallowed. #[test] fn reserve_transfer_assets_with_local_asset_reserve_and_destination_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); local_asset_reserve_and_destination_fee_reserve_call( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -835,11 +801,7 @@ fn reserve_transfer_assets_with_local_asset_reserve_and_destination_fee_reserve_ /// Test `limited_teleport_assets` with local asset reserve and destination fee reserve disallowed. #[test] fn teleport_assets_with_local_asset_reserve_and_destination_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); local_asset_reserve_and_destination_fee_reserve_call( XcmPallet::limited_teleport_assets, expected_result, @@ -993,11 +955,7 @@ fn reserve_transfer_assets_with_destination_asset_reserve_and_destination_fee_re /// disallowed. #[test] fn teleport_assets_with_destination_asset_reserve_and_destination_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); destination_asset_reserve_and_destination_fee_reserve_call( XcmPallet::limited_teleport_assets, expected_result, @@ -1102,11 +1060,7 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( /// Test `transfer_assets` with remote asset reserve and destination fee reserve is disallowed. #[test] fn transfer_assets_with_remote_asset_reserve_and_destination_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [22, 0, 0, 0], - message: Some("InvalidAssetUnsupportedReserve"), - })); + let expected_result = Err(crate::Error::::InvalidAssetUnsupportedReserve.into()); remote_asset_reserve_and_destination_fee_reserve_call_disallowed( XcmPallet::transfer_assets, expected_result, @@ -1117,11 +1071,7 @@ fn transfer_assets_with_remote_asset_reserve_and_destination_fee_reserve_disallo /// disallowed. #[test] fn reserve_transfer_assets_with_remote_asset_reserve_and_destination_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); remote_asset_reserve_and_destination_fee_reserve_call_disallowed( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -1132,11 +1082,7 @@ fn reserve_transfer_assets_with_remote_asset_reserve_and_destination_fee_reserve /// disallowed. #[test] fn teleport_assets_with_remote_asset_reserve_and_destination_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); remote_asset_reserve_and_destination_fee_reserve_call_disallowed( XcmPallet::limited_teleport_assets, expected_result, @@ -1222,11 +1168,7 @@ fn local_asset_reserve_and_remote_fee_reserve_call_disallowed( /// Test `transfer_assets` with local asset reserve and remote fee reserve is disallowed. #[test] fn transfer_assets_with_local_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [22, 0, 0, 0], - message: Some("InvalidAssetUnsupportedReserve"), - })); + let expected_result = Err(crate::Error::::InvalidAssetUnsupportedReserve.into()); local_asset_reserve_and_remote_fee_reserve_call_disallowed( XcmPallet::transfer_assets, expected_result, @@ -1237,11 +1179,7 @@ fn transfer_assets_with_local_asset_reserve_and_remote_fee_reserve_disallowed() /// disallowed. #[test] fn reserve_transfer_assets_with_local_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); local_asset_reserve_and_remote_fee_reserve_call_disallowed( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -1251,11 +1189,7 @@ fn reserve_transfer_assets_with_local_asset_reserve_and_remote_fee_reserve_disal /// Test `limited_teleport_assets` with local asset reserve and remote fee reserve is disallowed. #[test] fn teleport_assets_with_local_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); local_asset_reserve_and_remote_fee_reserve_call_disallowed( XcmPallet::limited_teleport_assets, expected_result, @@ -1366,11 +1300,7 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( /// Test `transfer_assets` with destination asset reserve and remote fee reserve is disallowed. #[test] fn transfer_assets_with_destination_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [22, 0, 0, 0], - message: Some("InvalidAssetUnsupportedReserve"), - })); + let expected_result = Err(crate::Error::::InvalidAssetUnsupportedReserve.into()); destination_asset_reserve_and_remote_fee_reserve_call_disallowed( XcmPallet::transfer_assets, expected_result, @@ -1381,11 +1311,7 @@ fn transfer_assets_with_destination_asset_reserve_and_remote_fee_reserve_disallo /// disallowed. #[test] fn reserve_transfer_assets_with_destination_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); destination_asset_reserve_and_remote_fee_reserve_call_disallowed( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -1396,11 +1322,7 @@ fn reserve_transfer_assets_with_destination_asset_reserve_and_remote_fee_reserve /// disallowed. #[test] fn teleport_assets_with_destination_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); destination_asset_reserve_and_remote_fee_reserve_call_disallowed( XcmPallet::limited_teleport_assets, expected_result, @@ -1485,7 +1407,7 @@ fn remote_asset_reserve_and_remote_fee_reserve_call( assert_eq!(result, expected_result); if expected_result.is_err() { // short-circuit here for tests where we expect failure - return + return; } assert!(matches!( @@ -1558,11 +1480,7 @@ fn reserve_transfer_assets_with_remote_asset_reserve_and_remote_fee_reserve_work /// disallowed. #[test] fn teleport_assets_with_remote_asset_reserve_and_remote_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); remote_asset_reserve_and_remote_fee_reserve_call( XcmPallet::limited_teleport_assets, expected_result, @@ -1702,11 +1620,7 @@ fn transfer_assets_with_local_asset_reserve_and_teleported_fee_works() { /// Test `limited_reserve_transfer_assets` with local asset reserve and teleported fee disallowed. #[test] fn reserve_transfer_assets_with_local_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); local_asset_reserve_and_teleported_fee_call( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -1716,11 +1630,7 @@ fn reserve_transfer_assets_with_local_asset_reserve_and_teleported_fee_disallowe /// Test `limited_teleport_assets` with local asset reserve and teleported fee disallowed. #[test] fn teleport_assets_with_local_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); local_asset_reserve_and_teleported_fee_call( XcmPallet::limited_teleport_assets, expected_result, @@ -1802,7 +1712,7 @@ fn destination_asset_reserve_and_teleported_fee_call( assert_eq!(result, expected_result); if expected_result.is_err() { // short-circuit here for tests where we expect failure - return + return; } let weight = BaseXcmWeight::get() * 4; @@ -1891,11 +1801,7 @@ fn transfer_assets_with_destination_asset_reserve_and_teleported_fee_works() { /// disallowed. #[test] fn reserve_transfer_assets_with_destination_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); destination_asset_reserve_and_teleported_fee_call( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -1905,11 +1811,7 @@ fn reserve_transfer_assets_with_destination_asset_reserve_and_teleported_fee_dis /// Test `limited_teleport_assets` with destination asset reserve and teleported fee disallowed. #[test] fn teleport_assets_with_destination_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); destination_asset_reserve_and_teleported_fee_call( XcmPallet::limited_teleport_assets, expected_result, @@ -2013,11 +1915,7 @@ fn remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( /// Test `transfer_assets` with remote asset reserve and teleported fee is disallowed. #[test] fn transfer_assets_with_remote_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [22, 0, 0, 0], - message: Some("InvalidAssetUnsupportedReserve"), - })); + let expected_result = Err(crate::Error::::InvalidAssetUnsupportedReserve.into()); remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( XcmPallet::transfer_assets, expected_result, @@ -2028,11 +1926,7 @@ fn transfer_assets_with_remote_asset_reserve_and_teleported_fee_disallowed() { /// disallowed. #[test] fn reserve_transfer_assets_with_remote_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [23, 0, 0, 0], - message: Some("TooManyReserves"), - })); + let expected_result = Err(crate::Error::::TooManyReserves.into()); remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -2042,11 +1936,7 @@ fn reserve_transfer_assets_with_remote_asset_reserve_and_teleported_fee_disallow /// Test `limited_teleport_assets` with remote asset reserve and teleported fee is disallowed. #[test] fn teleport_assets_with_remote_asset_reserve_and_teleported_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( XcmPallet::limited_teleport_assets, expected_result, @@ -2088,14 +1978,7 @@ fn reserve_transfer_assets_with_teleportable_asset_disallowed() { fee_index as u32, Unlimited, ); - assert_eq!( - res, - Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered") - })) - ); + assert_err!(res, crate::Error::::Filtered); // Alice native asset is still same assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Alice USDT balance is still same @@ -2136,14 +2019,7 @@ fn transfer_assets_with_filtered_teleported_fee_disallowed() { fee_index as u32, Unlimited, ); - assert_eq!( - result, - Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered") - })) - ); + assert_err!(result, crate::Error::::Filtered); }); } @@ -2350,11 +2226,7 @@ fn transfer_assets_with_teleportable_asset_and_local_fee_reserve_works() { /// Test `limited_reserve_transfer_assets` with teleportable asset and local fee reserve disallowed. #[test] fn reserve_transfer_assets_with_teleportable_asset_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); teleport_asset_using_local_fee_reserve_call( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -2364,11 +2236,7 @@ fn reserve_transfer_assets_with_teleportable_asset_and_local_fee_reserve_disallo /// Test `limited_teleport_assets` with teleportable asset and local fee reserve disallowed. #[test] fn teleport_assets_with_teleportable_asset_and_local_fee_reserve_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); teleport_asset_using_local_fee_reserve_call( XcmPallet::limited_teleport_assets, expected_result, @@ -2541,11 +2409,7 @@ fn transfer_teleported_assets_using_destination_reserve_fee_works() { /// disallowed. #[test] fn reserve_transfer_teleported_assets_using_destination_reserve_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); teleported_asset_using_destination_reserve_fee_call( XcmPallet::limited_reserve_transfer_assets, expected_result, @@ -2555,11 +2419,7 @@ fn reserve_transfer_teleported_assets_using_destination_reserve_fee_disallowed() /// Test `limited_teleport_assets` with teleported asset reserve and destination fee disallowed. #[test] fn teleport_assets_using_destination_reserve_fee_disallowed() { - let expected_result = Err(DispatchError::Module(ModuleError { - index: 4, - error: [2, 0, 0, 0], - message: Some("Filtered"), - })); + let expected_result = Err(crate::Error::::Filtered.into()); teleported_asset_using_destination_reserve_fee_call( XcmPallet::limited_teleport_assets, expected_result, diff --git a/polkadot/xcm/pallet-xcm/src/tests/mod.rs b/polkadot/xcm/pallet-xcm/src/tests/mod.rs index 8faf16e0d2a..782c8bed478 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/mod.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/mod.rs @@ -557,11 +557,7 @@ fn incomplete_execute_reverts_side_effects() { ), pays_fee: frame_support::dispatch::Pays::Yes, }, - error: sp_runtime::DispatchError::Module(sp_runtime::ModuleError { - index: 4, - error: [24, 0, 0, 0,], - message: Some("LocalExecutionIncomplete") - }) + error: sp_runtime::DispatchError::from(Error::::LocalExecutionIncomplete) }) ); }); -- GitLab From 0031d49d1ec083c62a4e2b5bf594b7f45f84ab0d Mon Sep 17 00:00:00 2001 From: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Mon, 29 Apr 2024 17:55:45 +0200 Subject: [PATCH 024/170] [Staking] Not allow reap stash for virtual stakers (#4311) Related to https://github.com/paritytech/polkadot-sdk/pull/3905. Since virtual stakers does not have a real balance, they should not be allowed to be reaped. The proper reaping for agents slashed will be done in a separate PR. --- prdoc/pr_4311.prdoc | 9 ++ substrate/frame/staking/src/pallet/impls.rs | 4 +- substrate/frame/staking/src/pallet/mod.rs | 8 ++ substrate/frame/staking/src/tests.rs | 93 +++++++++++++++++++++ 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_4311.prdoc diff --git a/prdoc/pr_4311.prdoc b/prdoc/pr_4311.prdoc new file mode 100644 index 00000000000..cf32acaf008 --- /dev/null +++ b/prdoc/pr_4311.prdoc @@ -0,0 +1,9 @@ +title: Not allow reap stash for virtual stakers. + +doc: + - audience: Runtime Dev + description: | + Add guards to staking dispathables to prevent virtual stakers to be reaped. + +crates: +- name: pallet-staking diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index 4eb24311ab3..5b2a55303e2 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -87,10 +87,12 @@ impl Pallet { StakingLedger::::paired_account(Stash(stash.clone())) } - /// Inspects and returns the corruption state of a ledger and bond, if any. + /// Inspects and returns the corruption state of a ledger and direct bond, if any. /// /// Note: all operations in this method access directly the `Bonded` and `Ledger` storage maps /// instead of using the [`StakingLedger`] API since the bond and/or ledger may be corrupted. + /// It is also meant to check state for direct bonds and may not work as expected for virtual + /// bonds. pub(crate) fn inspect_bond_state( stash: &T::AccountId, ) -> Result> { diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index 9c968d88344..16ad510c562 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -868,6 +868,8 @@ pub mod pallet { RewardDestinationRestricted, /// Not enough funds available to withdraw. NotEnoughFunds, + /// Operation not allowed for virtual stakers. + VirtualStakerNotAllowed, } #[pallet::hooks] @@ -1634,6 +1636,9 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { let _ = ensure_signed(origin)?; + // virtual stakers should not be allowed to be reaped. + ensure!(!Self::is_virtual_staker(&stash), Error::::VirtualStakerNotAllowed); + let ed = T::Currency::minimum_balance(); let reapable = T::Currency::total_balance(&stash) < ed || Self::ledger(Stash(stash.clone())).map(|l| l.total).unwrap_or_default() < ed; @@ -1994,6 +1999,9 @@ pub mod pallet { ) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; + // cannot restore ledger for virtual stakers. + ensure!(!Self::is_virtual_staker(&stash), Error::::VirtualStakerNotAllowed); + let current_lock = T::Currency::balance_locked(crate::STAKING_ID, &stash); let stash_balance = T::Currency::free_balance(&stash); diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index d05752f54be..3cb51604aa6 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -7205,6 +7205,99 @@ mod staking_unchecked { assert_eq!(SlashObserver::get().get(&101).unwrap(), &nominator_share); }) } + + #[test] + fn virtual_stakers_cannot_be_reaped() { + ExtBuilder::default() + // we need enough validators such that disables are allowed. + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + // make 101 only nominate 11. + assert_ok!(Staking::nominate(RuntimeOrigin::signed(101), vec![11])); + + mock::start_active_era(1); + + // slash all stake. + let slash_percent = Perbill::from_percent(100); + let initial_exposure = Staking::eras_stakers(active_era(), &11); + // 101 is a nominator for 11 + assert_eq!(initial_exposure.others.first().unwrap().who, 101); + // make 101 a virtual nominator + ::migrate_to_virtual_staker(&101); + // set payee different to self. + assert_ok!(::update_payee(&101, &102)); + + // cache values + let validator_balance = Balances::free_balance(&11); + let validator_stake = Staking::ledger(11.into()).unwrap().total; + let nominator_balance = Balances::free_balance(&101); + let nominator_stake = Staking::ledger(101.into()).unwrap().total; + + // 11 goes offline + on_offence_now( + &[OffenceDetails { + offender: (11, initial_exposure.clone()), + reporters: vec![], + }], + &[slash_percent], + ); + + // both stakes must have been decreased to 0. + assert_eq!(Staking::ledger(101.into()).unwrap().active, 0); + assert_eq!(Staking::ledger(11.into()).unwrap().active, 0); + + // all validator stake is slashed + assert_eq_error_rate!( + validator_balance - validator_stake, + Balances::free_balance(&11), + 1 + ); + // Because slashing happened. + assert!(is_disabled(11)); + + // Virtual nominator's balance is not slashed. + assert_eq!(Balances::free_balance(&101), nominator_balance); + // Slash is broadcasted to slash observers. + assert_eq!(SlashObserver::get().get(&101).unwrap(), &nominator_stake); + + // validator can be reaped. + assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(10), 11, u32::MAX)); + // nominator is a virtual staker and cannot be reaped. + assert_noop!( + Staking::reap_stash(RuntimeOrigin::signed(10), 101, u32::MAX), + Error::::VirtualStakerNotAllowed + ); + }) + } + + #[test] + fn restore_ledger_not_allowed_for_virtual_stakers() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + // 333 is corrupted + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // migrate to virtual staker. + ::migrate_to_virtual_staker(&333); + + // recover the ledger won't work for virtual staker + assert_noop!( + Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None), + Error::::VirtualStakerNotAllowed + ); + + // migrate 333 back to normal staker + >::remove(333); + + // try restore again + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + }) + } } mod ledger { use super::*; -- GitLab From 4875ea11aeef4f3fc7d724940e5ffb703830619b Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Mon, 29 Apr 2024 17:22:23 -0400 Subject: [PATCH 025/170] Refactor XCM Simulator Example (#4220) This PR does a "developer experience" refactor of the XCM Simulator Example. I was looking for existing code / documentation where developers could better learn about working with and configuring XCM. The XCM Simulator was a natural starting point due to the fact that it can emulate end to end XCM scenarios, without needing to spawn multiple real chains. However, the XCM Simulator Example was just 3 giant files with a ton of configurations, runtime, pallets, and tests mashed together. This PR breaks down the XCM Simulator Example in a way that I believe is more approachable by a new developer who is looking to navigate the various components of the end to end example, and modify it themselves. The basic structure is: - xcm simulator example - lib (tries to only use the xcm simulator macros) - tests - relay-chain - mod (basic runtime that developers should be familiar with) - xcm-config - mod (contains the `XcmConfig` type - various files for each custom configuration - parachain - mock_msg_queue (custom pallet for simulator example) - mod (basic runtime that developers should be familiar with) - xcm-config - mod (contains the `XcmConfig` type - various files for each custom configuration I would like to add more documentation to this too, but I think this is a first step to be accepted which will affect how documentation is added to the example --------- Co-authored-by: Francisco Aguirre Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- polkadot/xcm/xcm-simulator/example/src/lib.rs | 529 +----------------- .../xcm-simulator/example/src/parachain.rs | 470 ---------------- .../example/src/parachain/mock_msg_queue.rs | 185 ++++++ .../example/src/parachain/mod.rs | 182 ++++++ .../parachain/xcm_config/asset_transactor.rs | 39 ++ .../src/parachain/xcm_config/barrier.rs | 20 + .../src/parachain/xcm_config/constants.rs | 30 + .../xcm_config/location_converter.rs | 25 + .../example/src/parachain/xcm_config/mod.rs | 63 +++ .../parachain/xcm_config/origin_converter.rs | 29 + .../src/parachain/xcm_config/reserve.rs | 21 + .../src/parachain/xcm_config/teleporter.rs | 27 + .../src/parachain/xcm_config/weigher.rs | 27 + .../{relay_chain.rs => relay_chain/mod.rs} | 145 +---- .../xcm_config/asset_transactor.rs | 38 ++ .../src/relay_chain/xcm_config/barrier.rs | 20 + .../src/relay_chain/xcm_config/constants.rs | 31 + .../xcm_config/location_converter.rs | 25 + .../example/src/relay_chain/xcm_config/mod.rs | 62 ++ .../xcm_config/origin_converter.rs | 34 ++ .../src/relay_chain/xcm_config/weigher.rs | 27 + .../xcm/xcm-simulator/example/src/tests.rs | 513 +++++++++++++++++ prdoc/pr_4220.prdoc | 11 + 23 files changed, 1435 insertions(+), 1118 deletions(-) delete mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/mock_msg_queue.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/asset_transactor.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/barrier.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/constants.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/location_converter.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/origin_converter.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/reserve.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/teleporter.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/weigher.rs rename polkadot/xcm/xcm-simulator/example/src/{relay_chain.rs => relay_chain/mod.rs} (53%) create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/asset_transactor.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/barrier.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/constants.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/location_converter.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/origin_converter.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/weigher.rs create mode 100644 polkadot/xcm/xcm-simulator/example/src/tests.rs create mode 100644 prdoc/pr_4220.prdoc diff --git a/polkadot/xcm/xcm-simulator/example/src/lib.rs b/polkadot/xcm/xcm-simulator/example/src/lib.rs index 56e204bf571..6fb9a69770e 100644 --- a/polkadot/xcm/xcm-simulator/example/src/lib.rs +++ b/polkadot/xcm/xcm-simulator/example/src/lib.rs @@ -17,13 +17,16 @@ mod parachain; mod relay_chain; +#[cfg(test)] +mod tests; + use sp_runtime::BuildStorage; use sp_tracing; use xcm::prelude::*; use xcm_executor::traits::ConvertLocation; use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain, TestExt}; -pub const ALICE: sp_runtime::AccountId32 = sp_runtime::AccountId32::new([0u8; 32]); +pub const ALICE: sp_runtime::AccountId32 = sp_runtime::AccountId32::new([1u8; 32]); pub const INITIAL_BALANCE: u128 = 1_000_000_000; decl_test_parachain! { @@ -68,27 +71,27 @@ decl_test_network! { pub fn parent_account_id() -> parachain::AccountId { let location = (Parent,); - parachain::LocationToAccountId::convert_location(&location.into()).unwrap() + parachain::location_converter::LocationConverter::convert_location(&location.into()).unwrap() } pub fn child_account_id(para: u32) -> relay_chain::AccountId { let location = (Parachain(para),); - relay_chain::LocationToAccountId::convert_location(&location.into()).unwrap() + relay_chain::location_converter::LocationConverter::convert_location(&location.into()).unwrap() } pub fn child_account_account_id(para: u32, who: sp_runtime::AccountId32) -> relay_chain::AccountId { let location = (Parachain(para), AccountId32 { network: None, id: who.into() }); - relay_chain::LocationToAccountId::convert_location(&location.into()).unwrap() + relay_chain::location_converter::LocationConverter::convert_location(&location.into()).unwrap() } pub fn sibling_account_account_id(para: u32, who: sp_runtime::AccountId32) -> parachain::AccountId { let location = (Parent, Parachain(para), AccountId32 { network: None, id: who.into() }); - parachain::LocationToAccountId::convert_location(&location.into()).unwrap() + parachain::location_converter::LocationConverter::convert_location(&location.into()).unwrap() } pub fn parent_account_account_id(who: sp_runtime::AccountId32) -> parachain::AccountId { let location = (Parent, AccountId32 { network: None, id: who.into() }); - parachain::LocationToAccountId::convert_location(&location.into()).unwrap() + parachain::location_converter::LocationConverter::convert_location(&location.into()).unwrap() } pub fn para_ext(para_id: u32) -> sp_io::TestExternalities { @@ -137,517 +140,3 @@ pub fn relay_ext() -> sp_io::TestExternalities { pub type RelayChainPalletXcm = pallet_xcm::Pallet; pub type ParachainPalletXcm = pallet_xcm::Pallet; - -#[cfg(test)] -mod tests { - use super::*; - - use codec::Encode; - use frame_support::{assert_ok, weights::Weight}; - use xcm::latest::QueryResponseInfo; - use xcm_simulator::TestExt; - - // Helper function for forming buy execution message - fn buy_execution(fees: impl Into) -> Instruction { - BuyExecution { fees: fees.into(), weight_limit: Unlimited } - } - - #[test] - fn remote_account_ids_work() { - child_account_account_id(1, ALICE); - sibling_account_account_id(1, ALICE); - parent_account_account_id(ALICE); - } - - #[test] - fn dmp() { - MockNet::reset(); - - let remark = parachain::RuntimeCall::System( - frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, - ); - Relay::execute_with(|| { - assert_ok!(RelayChainPalletXcm::send_xcm( - Here, - Parachain(1), - Xcm(vec![Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024), - call: remark.encode().into(), - }]), - )); - }); - - ParaA::execute_with(|| { - use parachain::{RuntimeEvent, System}; - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::System(frame_system::Event::Remarked { .. }) - ))); - }); - } - - #[test] - fn ump() { - MockNet::reset(); - - let remark = relay_chain::RuntimeCall::System( - frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, - ); - ParaA::execute_with(|| { - assert_ok!(ParachainPalletXcm::send_xcm( - Here, - Parent, - Xcm(vec![Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024), - call: remark.encode().into(), - }]), - )); - }); - - Relay::execute_with(|| { - use relay_chain::{RuntimeEvent, System}; - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::System(frame_system::Event::Remarked { .. }) - ))); - }); - } - - #[test] - fn xcmp() { - MockNet::reset(); - - let remark = parachain::RuntimeCall::System( - frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, - ); - ParaA::execute_with(|| { - assert_ok!(ParachainPalletXcm::send_xcm( - Here, - (Parent, Parachain(2)), - Xcm(vec![Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024), - call: remark.encode().into(), - }]), - )); - }); - - ParaB::execute_with(|| { - use parachain::{RuntimeEvent, System}; - assert!(System::events().iter().any(|r| matches!( - r.event, - RuntimeEvent::System(frame_system::Event::Remarked { .. }) - ))); - }); - } - - #[test] - fn reserve_transfer() { - MockNet::reset(); - - let withdraw_amount = 123; - - Relay::execute_with(|| { - assert_ok!(RelayChainPalletXcm::limited_reserve_transfer_assets( - relay_chain::RuntimeOrigin::signed(ALICE), - Box::new(Parachain(1).into()), - Box::new(AccountId32 { network: None, id: ALICE.into() }.into()), - Box::new((Here, withdraw_amount).into()), - 0, - Unlimited, - )); - assert_eq!( - relay_chain::Balances::free_balance(&child_account_id(1)), - INITIAL_BALANCE + withdraw_amount - ); - }); - - ParaA::execute_with(|| { - // free execution, full amount received - assert_eq!( - pallet_balances::Pallet::::free_balance(&ALICE), - INITIAL_BALANCE + withdraw_amount - ); - }); - } - - #[test] - fn remote_locking_and_unlocking() { - MockNet::reset(); - - let locked_amount = 100; - - ParaB::execute_with(|| { - let message = Xcm(vec![LockAsset { - asset: (Here, locked_amount).into(), - unlocker: Parachain(1).into(), - }]); - assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone())); - }); - - Relay::execute_with(|| { - use pallet_balances::{BalanceLock, Reasons}; - assert_eq!( - relay_chain::Balances::locks(&child_account_id(2)), - vec![BalanceLock { - id: *b"py/xcmlk", - amount: locked_amount, - reasons: Reasons::All - }] - ); - }); - - ParaA::execute_with(|| { - assert_eq!( - parachain::MsgQueue::received_dmp(), - vec![Xcm(vec![NoteUnlockable { - owner: (Parent, Parachain(2)).into(), - asset: (Parent, locked_amount).into() - }])] - ); - }); - - ParaB::execute_with(|| { - // Request unlocking part of the funds on the relay chain - let message = Xcm(vec![RequestUnlock { - asset: (Parent, locked_amount - 50).into(), - locker: Parent.into(), - }]); - assert_ok!(ParachainPalletXcm::send_xcm(Here, (Parent, Parachain(1)), message)); - }); - - Relay::execute_with(|| { - use pallet_balances::{BalanceLock, Reasons}; - // Lock is reduced - assert_eq!( - relay_chain::Balances::locks(&child_account_id(2)), - vec![BalanceLock { - id: *b"py/xcmlk", - amount: locked_amount - 50, - reasons: Reasons::All - }] - ); - }); - } - - /// Scenario: - /// A parachain transfers an NFT resident on the relay chain to another parachain account. - /// - /// Asserts that the parachain accounts are updated as expected. - #[test] - fn withdraw_and_deposit_nft() { - MockNet::reset(); - - Relay::execute_with(|| { - assert_eq!(relay_chain::Uniques::owner(1, 42), Some(child_account_id(1))); - }); - - ParaA::execute_with(|| { - let message = Xcm(vec![TransferAsset { - assets: (GeneralIndex(1), 42u32).into(), - beneficiary: Parachain(2).into(), - }]); - // Send withdraw and deposit - assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message)); - }); - - Relay::execute_with(|| { - assert_eq!(relay_chain::Uniques::owner(1, 42), Some(child_account_id(2))); - }); - } - - /// Scenario: - /// The relay-chain teleports an NFT to a parachain. - /// - /// Asserts that the parachain accounts are updated as expected. - #[test] - fn teleport_nft() { - MockNet::reset(); - - Relay::execute_with(|| { - // Mint the NFT (1, 69) and give it to our "parachain#1 alias". - assert_ok!(relay_chain::Uniques::mint( - relay_chain::RuntimeOrigin::signed(ALICE), - 1, - 69, - child_account_account_id(1, ALICE), - )); - // The parachain#1 alias of Alice is what must hold it on the Relay-chain for it to be - // withdrawable by Alice on the parachain. - assert_eq!( - relay_chain::Uniques::owner(1, 69), - Some(child_account_account_id(1, ALICE)) - ); - }); - ParaA::execute_with(|| { - assert_ok!(parachain::ForeignUniques::force_create( - parachain::RuntimeOrigin::root(), - (Parent, GeneralIndex(1)).into(), - ALICE, - false, - )); - assert_eq!( - parachain::ForeignUniques::owner((Parent, GeneralIndex(1)).into(), 69u32.into()), - None, - ); - assert_eq!(parachain::Balances::reserved_balance(&ALICE), 0); - - // IRL Alice would probably just execute this locally on the Relay-chain, but we can't - // easily do that here since we only send between chains. - let message = Xcm(vec![ - WithdrawAsset((GeneralIndex(1), 69u32).into()), - InitiateTeleport { - assets: AllCounted(1).into(), - dest: Parachain(1).into(), - xcm: Xcm(vec![DepositAsset { - assets: AllCounted(1).into(), - beneficiary: (AccountId32 { id: ALICE.into(), network: None },).into(), - }]), - }, - ]); - // Send teleport - let alice = AccountId32 { id: ALICE.into(), network: None }; - assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); - }); - ParaA::execute_with(|| { - assert_eq!( - parachain::ForeignUniques::owner((Parent, GeneralIndex(1)).into(), 69u32.into()), - Some(ALICE), - ); - assert_eq!(parachain::Balances::reserved_balance(&ALICE), 1000); - }); - Relay::execute_with(|| { - assert_eq!(relay_chain::Uniques::owner(1, 69), None); - }); - } - - /// Scenario: - /// The relay-chain transfers an NFT into a parachain's sovereign account, who then mints a - /// trustless-backed-derived locally. - /// - /// Asserts that the parachain accounts are updated as expected. - #[test] - fn reserve_asset_transfer_nft() { - sp_tracing::init_for_tests(); - MockNet::reset(); - - Relay::execute_with(|| { - assert_ok!(relay_chain::Uniques::force_create( - relay_chain::RuntimeOrigin::root(), - 2, - ALICE, - false - )); - assert_ok!(relay_chain::Uniques::mint( - relay_chain::RuntimeOrigin::signed(ALICE), - 2, - 69, - child_account_account_id(1, ALICE) - )); - assert_eq!( - relay_chain::Uniques::owner(2, 69), - Some(child_account_account_id(1, ALICE)) - ); - }); - ParaA::execute_with(|| { - assert_ok!(parachain::ForeignUniques::force_create( - parachain::RuntimeOrigin::root(), - (Parent, GeneralIndex(2)).into(), - ALICE, - false, - )); - assert_eq!( - parachain::ForeignUniques::owner((Parent, GeneralIndex(2)).into(), 69u32.into()), - None, - ); - assert_eq!(parachain::Balances::reserved_balance(&ALICE), 0); - - let message = Xcm(vec![ - WithdrawAsset((GeneralIndex(2), 69u32).into()), - DepositReserveAsset { - assets: AllCounted(1).into(), - dest: Parachain(1).into(), - xcm: Xcm(vec![DepositAsset { - assets: AllCounted(1).into(), - beneficiary: (AccountId32 { id: ALICE.into(), network: None },).into(), - }]), - }, - ]); - // Send transfer - let alice = AccountId32 { id: ALICE.into(), network: None }; - assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); - }); - ParaA::execute_with(|| { - log::debug!(target: "xcm-executor", "Hello"); - assert_eq!( - parachain::ForeignUniques::owner((Parent, GeneralIndex(2)).into(), 69u32.into()), - Some(ALICE), - ); - assert_eq!(parachain::Balances::reserved_balance(&ALICE), 1000); - }); - - Relay::execute_with(|| { - assert_eq!(relay_chain::Uniques::owner(2, 69), Some(child_account_id(1))); - }); - } - - /// Scenario: - /// The relay-chain creates an asset class on a parachain and then Alice transfers her NFT into - /// that parachain's sovereign account, who then mints a trustless-backed-derivative locally. - /// - /// Asserts that the parachain accounts are updated as expected. - #[test] - fn reserve_asset_class_create_and_reserve_transfer() { - MockNet::reset(); - - Relay::execute_with(|| { - assert_ok!(relay_chain::Uniques::force_create( - relay_chain::RuntimeOrigin::root(), - 2, - ALICE, - false - )); - assert_ok!(relay_chain::Uniques::mint( - relay_chain::RuntimeOrigin::signed(ALICE), - 2, - 69, - child_account_account_id(1, ALICE) - )); - assert_eq!( - relay_chain::Uniques::owner(2, 69), - Some(child_account_account_id(1, ALICE)) - ); - - let message = Xcm(vec![Transact { - origin_kind: OriginKind::Xcm, - require_weight_at_most: Weight::from_parts(1_000_000_000, 1024 * 1024), - call: parachain::RuntimeCall::from( - pallet_uniques::Call::::create { - collection: (Parent, 2u64).into(), - admin: parent_account_id(), - }, - ) - .encode() - .into(), - }]); - // Send creation. - assert_ok!(RelayChainPalletXcm::send_xcm(Here, Parachain(1), message)); - }); - ParaA::execute_with(|| { - // Then transfer - let message = Xcm(vec![ - WithdrawAsset((GeneralIndex(2), 69u32).into()), - DepositReserveAsset { - assets: AllCounted(1).into(), - dest: Parachain(1).into(), - xcm: Xcm(vec![DepositAsset { - assets: AllCounted(1).into(), - beneficiary: (AccountId32 { id: ALICE.into(), network: None },).into(), - }]), - }, - ]); - let alice = AccountId32 { id: ALICE.into(), network: None }; - assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); - }); - ParaA::execute_with(|| { - assert_eq!(parachain::Balances::reserved_balance(&parent_account_id()), 1000); - assert_eq!( - parachain::ForeignUniques::collection_owner((Parent, 2u64).into()), - Some(parent_account_id()) - ); - }); - } - - /// Scenario: - /// A parachain transfers funds on the relay chain to another parachain account. - /// - /// Asserts that the parachain accounts are updated as expected. - #[test] - fn withdraw_and_deposit() { - MockNet::reset(); - - let send_amount = 10; - - ParaA::execute_with(|| { - let message = Xcm(vec![ - WithdrawAsset((Here, send_amount).into()), - buy_execution((Here, send_amount)), - DepositAsset { assets: AllCounted(1).into(), beneficiary: Parachain(2).into() }, - ]); - // Send withdraw and deposit - assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone())); - }); - - Relay::execute_with(|| { - assert_eq!( - relay_chain::Balances::free_balance(child_account_id(1)), - INITIAL_BALANCE - send_amount - ); - assert_eq!( - relay_chain::Balances::free_balance(child_account_id(2)), - INITIAL_BALANCE + send_amount - ); - }); - } - - /// Scenario: - /// A parachain wants to be notified that a transfer worked correctly. - /// It sends a `QueryHolding` after the deposit to get notified on success. - /// - /// Asserts that the balances are updated correctly and the expected XCM is sent. - #[test] - fn query_holding() { - MockNet::reset(); - - let send_amount = 10; - let query_id_set = 1234; - - // Send a message which fully succeeds on the relay chain - ParaA::execute_with(|| { - let message = Xcm(vec![ - WithdrawAsset((Here, send_amount).into()), - buy_execution((Here, send_amount)), - DepositAsset { assets: AllCounted(1).into(), beneficiary: Parachain(2).into() }, - ReportHolding { - response_info: QueryResponseInfo { - destination: Parachain(1).into(), - query_id: query_id_set, - max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024), - }, - assets: All.into(), - }, - ]); - // Send withdraw and deposit with query holding - assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone(),)); - }); - - // Check that transfer was executed - Relay::execute_with(|| { - // Withdraw executed - assert_eq!( - relay_chain::Balances::free_balance(child_account_id(1)), - INITIAL_BALANCE - send_amount - ); - // Deposit executed - assert_eq!( - relay_chain::Balances::free_balance(child_account_id(2)), - INITIAL_BALANCE + send_amount - ); - }); - - // Check that QueryResponse message was received - ParaA::execute_with(|| { - assert_eq!( - parachain::MsgQueue::received_dmp(), - vec![Xcm(vec![QueryResponse { - query_id: query_id_set, - response: Response::Assets(Assets::new()), - max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024), - querier: Some(Here.into()), - }])], - ); - }); - } -} diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain.rs b/polkadot/xcm/xcm-simulator/example/src/parachain.rs deleted file mode 100644 index 41e62596392..00000000000 --- a/polkadot/xcm/xcm-simulator/example/src/parachain.rs +++ /dev/null @@ -1,470 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Parachain runtime mock. - -use codec::{Decode, Encode}; -use core::marker::PhantomData; -use frame_support::{ - construct_runtime, derive_impl, parameter_types, - traits::{ContainsPair, EnsureOrigin, EnsureOriginWithArg, Everything, EverythingBut, Nothing}, - weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, -}; - -use frame_system::EnsureRoot; -use sp_core::{ConstU32, H256}; -use sp_runtime::{ - traits::{Get, Hash, IdentityLookup}, - AccountId32, -}; -use sp_std::prelude::*; - -use pallet_xcm::XcmPassthrough; -use polkadot_core_primitives::BlockNumber as RelayBlockNumber; -use polkadot_parachain_primitives::primitives::{ - DmpMessageHandler, Id as ParaId, Sibling, XcmpMessageFormat, XcmpMessageHandler, -}; -use xcm::{latest::prelude::*, VersionedXcm}; -use xcm_builder::{ - Account32Hash, AccountId32Aliases, AllowUnpaidExecutionFrom, ConvertedConcreteId, - EnsureDecodableXcm, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, - FrameTransactionalProcessor, FungibleAdapter, IsConcrete, NativeAsset, NoChecking, - NonFungiblesAdapter, ParentIsPreset, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, -}; -use xcm_executor::{ - traits::{ConvertLocation, JustTry}, - Config, XcmExecutor, -}; - -pub type SovereignAccountOf = ( - SiblingParachainConvertsVia, - AccountId32Aliases, - ParentIsPreset, -); - -pub type AccountId = AccountId32; -pub type Balance = u128; - -parameter_types! { - pub const BlockHashCount: u64 = 250; -} - -#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] -impl frame_system::Config for Runtime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockWeights = (); - type BlockLength = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; -} - -parameter_types! { - pub ExistentialDeposit: Balance = 1; - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; -} - -#[cfg(feature = "runtime-benchmarks")] -pub struct UniquesHelper; -#[cfg(feature = "runtime-benchmarks")] -impl pallet_uniques::BenchmarkHelper for UniquesHelper { - fn collection(i: u16) -> Location { - GeneralIndex(i as u128).into() - } - fn item(i: u16) -> AssetInstance { - AssetInstance::Index(i as u128) - } -} - -impl pallet_uniques::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = Location; - type ItemId = AssetInstance; - type Currency = Balances; - type CreateOrigin = ForeignCreators; - type ForceOrigin = frame_system::EnsureRoot; - type CollectionDeposit = frame_support::traits::ConstU128<1_000>; - type ItemDeposit = frame_support::traits::ConstU128<1_000>; - type MetadataDepositBase = frame_support::traits::ConstU128<1_000>; - type AttributeDepositBase = frame_support::traits::ConstU128<1_000>; - type DepositPerByte = frame_support::traits::ConstU128<1>; - type StringLimit = ConstU32<64>; - type KeyLimit = ConstU32<64>; - type ValueLimit = ConstU32<128>; - type Locker = (); - type WeightInfo = (); - #[cfg(feature = "runtime-benchmarks")] - type Helper = UniquesHelper; -} - -// `EnsureOriginWithArg` impl for `CreateOrigin` which allows only XCM origins -// which are locations containing the class location. -pub struct ForeignCreators; -impl EnsureOriginWithArg for ForeignCreators { - type Success = AccountId; - - fn try_origin( - o: RuntimeOrigin, - a: &Location, - ) -> sp_std::result::Result { - let origin_location = pallet_xcm::EnsureXcm::::try_origin(o.clone())?; - if !a.starts_with(&origin_location) { - return Err(o) - } - SovereignAccountOf::convert_location(&origin_location).ok_or(o) - } - - #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin(a: &Location) -> Result { - Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) - } -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_div(4), 0); - pub const ReservedDmpWeight: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_div(4), 0); -} - -parameter_types! { - pub const KsmLocation: Location = Location::parent(); - pub const RelayNetwork: NetworkId = NetworkId::Kusama; - pub UniversalLocation: InteriorLocation = [GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())].into(); -} - -pub type LocationToAccountId = ( - ParentIsPreset, - SiblingParachainConvertsVia, - AccountId32Aliases, - Account32Hash<(), AccountId>, -); - -pub type XcmOriginToCallOrigin = ( - SovereignSignedViaLocation, - SignedAccountId32AsNative, - XcmPassthrough, -); - -parameter_types! { - pub const UnitWeightCost: Weight = Weight::from_parts(1, 1); - pub KsmPerSecondPerByte: (AssetId, u128, u128) = (AssetId(Parent.into()), 1, 1); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub ForeignPrefix: Location = (Parent,).into(); -} - -pub type LocalAssetTransactor = ( - FungibleAdapter, LocationToAccountId, AccountId, ()>, - NonFungiblesAdapter< - ForeignUniques, - ConvertedConcreteId, - SovereignAccountOf, - AccountId, - NoChecking, - (), - >, -); - -pub type XcmRouter = EnsureDecodableXcm>; -pub type Barrier = AllowUnpaidExecutionFrom; - -parameter_types! { - pub NftCollectionOne: AssetFilter - = Wild(AllOf { fun: WildNonFungible, id: AssetId((Parent, GeneralIndex(1)).into()) }); - pub NftCollectionOneForRelay: (AssetFilter, Location) - = (NftCollectionOne::get(), (Parent,).into()); -} -pub type TrustedTeleporters = xcm_builder::Case; -pub type TrustedReserves = EverythingBut>; - -pub struct XcmConfig; -impl Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = LocalAssetTransactor; - type OriginConverter = XcmOriginToCallOrigin; - type IsReserve = (NativeAsset, TrustedReserves); - type IsTeleporter = TrustedTeleporters; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = FixedRateOfFungible; - type ResponseHandler = (); - type AssetTrap = (); - type AssetLocker = PolkadotXcm; - type AssetExchanger = (); - type AssetClaims = (); - type SubscriptionService = (); - type PalletInstancesInfo = (); - type FeeManager = (); - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; - type TransactionalProcessor = FrameTransactionalProcessor; - type HrmpNewChannelOpenRequestHandler = (); - type HrmpChannelAcceptedHandler = (); - type HrmpChannelClosingHandler = (); -} - -#[frame_support::pallet] -pub mod mock_msg_queue { - use super::*; - use frame_support::pallet_prelude::*; - - #[pallet::config] - pub trait Config: frame_system::Config { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type XcmExecutor: ExecuteXcm; - } - - #[pallet::call] - impl Pallet {} - - #[pallet::pallet] - #[pallet::without_storage_info] - pub struct Pallet(_); - - #[pallet::storage] - #[pallet::getter(fn parachain_id)] - pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; - - #[pallet::storage] - #[pallet::getter(fn received_dmp)] - /// A queue of received DMP messages - pub(super) type ReceivedDmp = StorageValue<_, Vec>, ValueQuery>; - - impl Get for Pallet { - fn get() -> ParaId { - Self::parachain_id() - } - } - - pub type MessageId = [u8; 32]; - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - // XCMP - /// Some XCM was executed OK. - Success(Option), - /// Some XCM failed. - Fail(Option, XcmError), - /// Bad XCM version used. - BadVersion(Option), - /// Bad XCM format used. - BadFormat(Option), - - // DMP - /// Downward message is invalid XCM. - InvalidFormat(MessageId), - /// Downward message is unsupported version of XCM. - UnsupportedVersion(MessageId), - /// Downward message executed with the given outcome. - ExecutedDownward(MessageId, Outcome), - } - - impl Pallet { - pub fn set_para_id(para_id: ParaId) { - ParachainId::::put(para_id); - } - - fn handle_xcmp_message( - sender: ParaId, - _sent_at: RelayBlockNumber, - xcm: VersionedXcm, - max_weight: Weight, - ) -> Result { - let hash = Encode::using_encoded(&xcm, T::Hashing::hash); - let mut message_hash = Encode::using_encoded(&xcm, sp_io::hashing::blake2_256); - let (result, event) = match Xcm::::try_from(xcm) { - Ok(xcm) => { - let location = (Parent, Parachain(sender.into())); - match T::XcmExecutor::prepare_and_execute( - location, - xcm, - &mut message_hash, - max_weight, - Weight::zero(), - ) { - Outcome::Error { error } => (Err(error), Event::Fail(Some(hash), error)), - Outcome::Complete { used } => (Ok(used), Event::Success(Some(hash))), - // As far as the caller is concerned, this was dispatched without error, so - // we just report the weight used. - Outcome::Incomplete { used, error } => - (Ok(used), Event::Fail(Some(hash), error)), - } - }, - Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion(Some(hash))), - }; - Self::deposit_event(event); - result - } - } - - impl XcmpMessageHandler for Pallet { - fn handle_xcmp_messages<'a, I: Iterator>( - iter: I, - max_weight: Weight, - ) -> Weight { - for (sender, sent_at, data) in iter { - let mut data_ref = data; - let _ = XcmpMessageFormat::decode(&mut data_ref) - .expect("Simulator encodes with versioned xcm format; qed"); - - let mut remaining_fragments = data_ref; - while !remaining_fragments.is_empty() { - if let Ok(xcm) = - VersionedXcm::::decode(&mut remaining_fragments) - { - let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); - } else { - debug_assert!(false, "Invalid incoming XCMP message data"); - } - } - } - max_weight - } - } - - impl DmpMessageHandler for Pallet { - fn handle_dmp_messages( - iter: impl Iterator)>, - limit: Weight, - ) -> Weight { - for (_i, (_sent_at, data)) in iter.enumerate() { - let mut id = sp_io::hashing::blake2_256(&data[..]); - let maybe_versioned = VersionedXcm::::decode(&mut &data[..]); - match maybe_versioned { - Err(_) => { - Self::deposit_event(Event::InvalidFormat(id)); - }, - Ok(versioned) => match Xcm::try_from(versioned) { - Err(()) => Self::deposit_event(Event::UnsupportedVersion(id)), - Ok(x) => { - let outcome = T::XcmExecutor::prepare_and_execute( - Parent, - x.clone(), - &mut id, - limit, - Weight::zero(), - ); - >::append(x); - Self::deposit_event(Event::ExecutedDownward(id, outcome)); - }, - }, - } - } - limit - } - } -} - -impl mock_msg_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -pub type LocalOriginToLocation = SignedToAccountId32; - -pub struct TrustedLockerCase(PhantomData); -impl> ContainsPair for TrustedLockerCase { - fn contains(origin: &Location, asset: &Asset) -> bool { - let (o, a) = T::get(); - a.matches(asset) && &o == origin - } -} - -parameter_types! { - pub RelayTokenForRelay: (Location, AssetFilter) = (Parent.into(), Wild(AllOf { id: AssetId(Parent.into()), fun: WildFungible })); -} - -pub type TrustedLockers = TrustedLockerCase; - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Everything; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Nothing; - type XcmReserveTransferFilter = Everything; - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = TrustedLockers; - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); - type WeightInfo = pallet_xcm::TestWeightInfo; - type AdminOrigin = EnsureRoot; -} - -type Block = frame_system::mocking::MockBlock; - -construct_runtime!( - pub enum Runtime - { - System: frame_system, - Balances: pallet_balances, - MsgQueue: mock_msg_queue, - PolkadotXcm: pallet_xcm, - ForeignUniques: pallet_uniques, - } -); diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/mock_msg_queue.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/mock_msg_queue.rs new file mode 100644 index 00000000000..17cde921f3e --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/mock_msg_queue.rs @@ -0,0 +1,185 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +pub use pallet::*; +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; +use polkadot_parachain_primitives::primitives::{ + DmpMessageHandler, Id as ParaId, XcmpMessageFormat, XcmpMessageHandler, +}; +use sp_runtime::traits::{Get, Hash}; +use xcm::{latest::prelude::*, VersionedXcm}; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::storage] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + #[pallet::storage] + /// A queue of received DMP messages + pub(super) type ReceivedDmp = StorageValue<_, Vec>, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + /// Get the Parachain Id. + pub fn parachain_id() -> ParaId { + ParachainId::::get() + } + + /// Set the Parachain Id. + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + /// Get the queue of receieved DMP messages. + pub fn received_dmp() -> Vec> { + ReceivedDmp::::get() + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let mut message_hash = Encode::using_encoded(&xcm, sp_io::hashing::blake2_256); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = (Parent, Parachain(sender.into())); + match T::XcmExecutor::prepare_and_execute( + location, + xcm, + &mut message_hash, + max_weight, + Weight::zero(), + ) { + Outcome::Error { error } => (Err(error), Event::Fail(Some(hash), error)), + Outcome::Complete { used } => (Ok(used), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete { used, error } => + (Ok(used), Event::Fail(Some(hash), error)), + } + }, + Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion(Some(hash))), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = data_ref; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let mut id = sp_io::hashing::blake2_256(&data[..]); + let maybe_versioned = VersionedXcm::::decode(&mut &data[..]); + match maybe_versioned { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + }, + Ok(versioned) => match Xcm::try_from(versioned) { + Err(()) => Self::deposit_event(Event::UnsupportedVersion(id)), + Ok(x) => { + let outcome = T::XcmExecutor::prepare_and_execute( + Parent, + x.clone(), + &mut id, + limit, + Weight::zero(), + ); + >::append(x); + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + }, + }, + } + } + limit + } + } +} diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs new file mode 100644 index 00000000000..8021f955165 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs @@ -0,0 +1,182 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Parachain runtime mock. + +mod mock_msg_queue; +mod xcm_config; +pub use xcm_config::*; + +use core::marker::PhantomData; +use frame_support::{ + construct_runtime, derive_impl, parameter_types, + traits::{ConstU128, ContainsPair, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing}, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, +}; +use frame_system::EnsureRoot; +use sp_core::ConstU32; +use sp_runtime::{ + traits::{Get, IdentityLookup}, + AccountId32, +}; +use sp_std::prelude::*; +use xcm::latest::prelude::*; +use xcm_builder::{EnsureXcmOrigin, SignedToAccountId32}; +use xcm_executor::{traits::ConvertLocation, XcmExecutor}; + +pub type AccountId = AccountId32; +pub type Balance = u128; + +parameter_types! { + pub const BlockHashCount: u64 = 250; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Runtime { + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Block = Block; + type AccountData = pallet_balances::AccountData; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for Runtime { + type Balance = Balance; + type ExistentialDeposit = ConstU128<1>; + type AccountStore = System; +} + +#[cfg(feature = "runtime-benchmarks")] +pub struct UniquesHelper; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_uniques::BenchmarkHelper for UniquesHelper { + fn collection(i: u16) -> Location { + GeneralIndex(i as u128).into() + } + fn item(i: u16) -> AssetInstance { + AssetInstance::Index(i as u128) + } +} + +impl pallet_uniques::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type CollectionId = Location; + type ItemId = AssetInstance; + type Currency = Balances; + type CreateOrigin = ForeignCreators; + type ForceOrigin = frame_system::EnsureRoot; + type CollectionDeposit = frame_support::traits::ConstU128<1_000>; + type ItemDeposit = frame_support::traits::ConstU128<1_000>; + type MetadataDepositBase = frame_support::traits::ConstU128<1_000>; + type AttributeDepositBase = frame_support::traits::ConstU128<1_000>; + type DepositPerByte = frame_support::traits::ConstU128<1>; + type StringLimit = ConstU32<64>; + type KeyLimit = ConstU32<64>; + type ValueLimit = ConstU32<128>; + type Locker = (); + type WeightInfo = (); + #[cfg(feature = "runtime-benchmarks")] + type Helper = UniquesHelper; +} + +// `EnsureOriginWithArg` impl for `CreateOrigin` which allows only XCM origins +// which are locations containing the class location. +pub struct ForeignCreators; +impl EnsureOriginWithArg for ForeignCreators { + type Success = AccountId; + + fn try_origin( + o: RuntimeOrigin, + a: &Location, + ) -> sp_std::result::Result { + let origin_location = pallet_xcm::EnsureXcm::::try_origin(o.clone())?; + if !a.starts_with(&origin_location) { + return Err(o); + } + xcm_config::location_converter::LocationConverter::convert_location(&origin_location) + .ok_or(o) + } + + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin(a: &Location) -> Result { + Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) + } +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_div(4), 0); + pub const ReservedDmpWeight: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_div(4), 0); +} + +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +pub type LocalOriginToLocation = + SignedToAccountId32; + +pub struct TrustedLockerCase(PhantomData); +impl> ContainsPair for TrustedLockerCase { + fn contains(origin: &Location, asset: &Asset) -> bool { + let (o, a) = T::get(); + a.matches(asset) && &o == origin + } +} + +parameter_types! { + pub RelayTokenForRelay: (Location, AssetFilter) = (Parent.into(), Wild(AllOf { id: AssetId(Parent.into()), fun: WildFungible })); +} + +pub type TrustedLockers = TrustedLockerCase; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Everything; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = weigher::Weigher; + type UniversalLocation = constants::UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = TrustedLockers; + type SovereignAccountOf = location_converter::LocationConverter; + type MaxLockers = ConstU32<8>; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); + type WeightInfo = pallet_xcm::TestWeightInfo; + type AdminOrigin = EnsureRoot; +} + +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub struct Runtime { + System: frame_system, + Balances: pallet_balances, + MsgQueue: mock_msg_queue, + PolkadotXcm: pallet_xcm, + ForeignUniques: pallet_uniques, + } +); diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/asset_transactor.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/asset_transactor.rs new file mode 100644 index 00000000000..25cffcf8cef --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/asset_transactor.rs @@ -0,0 +1,39 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::parachain::{ + constants::KsmLocation, location_converter::LocationConverter, AccountId, Balances, + ForeignUniques, +}; +use xcm::latest::prelude::*; +use xcm_builder::{ + ConvertedConcreteId, FungibleAdapter, IsConcrete, NoChecking, NonFungiblesAdapter, +}; +use xcm_executor::traits::JustTry; + +type LocalAssetTransactor = ( + FungibleAdapter, LocationConverter, AccountId, ()>, + NonFungiblesAdapter< + ForeignUniques, + ConvertedConcreteId, + LocationConverter, + AccountId, + NoChecking, + (), + >, +); + +pub type AssetTransactor = LocalAssetTransactor; diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/barrier.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/barrier.rs new file mode 100644 index 00000000000..1c7aa2c6d32 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/barrier.rs @@ -0,0 +1,20 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use frame_support::traits::Everything; +use xcm_builder::AllowUnpaidExecutionFrom; + +pub type Barrier = AllowUnpaidExecutionFrom; diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/constants.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/constants.rs new file mode 100644 index 00000000000..f6d0174def8 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/constants.rs @@ -0,0 +1,30 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::parachain::MsgQueue; +use frame_support::parameter_types; +use xcm::latest::prelude::*; + +parameter_types! { + pub KsmPerSecondPerByte: (AssetId, u128, u128) = (AssetId(Parent.into()), 1, 1); + pub const MaxAssetsIntoHolding: u32 = 64; +} + +parameter_types! { + pub const KsmLocation: Location = Location::parent(); + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub UniversalLocation: InteriorLocation = [GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())].into(); +} diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/location_converter.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/location_converter.rs new file mode 100644 index 00000000000..5a54414dd13 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/location_converter.rs @@ -0,0 +1,25 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::parachain::{constants::RelayNetwork, AccountId}; +use xcm_builder::{AccountId32Aliases, DescribeAllTerminal, DescribeFamily, HashedDescription}; + +type LocationToAccountId = ( + HashedDescription>, + AccountId32Aliases, +); + +pub type LocationConverter = LocationToAccountId; diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs new file mode 100644 index 00000000000..0ba02aab9bf --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs @@ -0,0 +1,63 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +pub mod asset_transactor; +pub mod barrier; +pub mod constants; +pub mod location_converter; +pub mod origin_converter; +pub mod reserve; +pub mod teleporter; +pub mod weigher; + +use crate::parachain::{MsgQueue, PolkadotXcm, RuntimeCall}; +use frame_support::traits::{Everything, Nothing}; +use xcm_builder::{EnsureDecodableXcm, FixedRateOfFungible, FrameTransactionalProcessor}; + +// Generated from `decl_test_network!` +pub type XcmRouter = EnsureDecodableXcm>; + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = asset_transactor::AssetTransactor; + type OriginConverter = origin_converter::OriginConverter; + type IsReserve = reserve::TrustedReserves; + type IsTeleporter = teleporter::TrustedTeleporters; + type UniversalLocation = constants::UniversalLocation; + type Barrier = barrier::Barrier; + type Weigher = weigher::Weigher; + type Trader = FixedRateOfFungible; + type ResponseHandler = (); + type AssetTrap = (); + type AssetLocker = PolkadotXcm; + type AssetExchanger = (); + type AssetClaims = (); + type SubscriptionService = (); + type PalletInstancesInfo = (); + type FeeManager = (); + type MaxAssetsIntoHolding = constants::MaxAssetsIntoHolding; + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = RuntimeCall; + type SafeCallFilter = Everything; + type Aliasers = Nothing; + type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); +} diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/origin_converter.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/origin_converter.rs new file mode 100644 index 00000000000..5a60f0e6001 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/origin_converter.rs @@ -0,0 +1,29 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::parachain::{ + constants::RelayNetwork, location_converter::LocationConverter, RuntimeOrigin, +}; +use pallet_xcm::XcmPassthrough; +use xcm_builder::{SignedAccountId32AsNative, SovereignSignedViaLocation}; + +type XcmOriginToCallOrigin = ( + SovereignSignedViaLocation, + SignedAccountId32AsNative, + XcmPassthrough, +); + +pub type OriginConverter = XcmOriginToCallOrigin; diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/reserve.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/reserve.rs new file mode 100644 index 00000000000..8763a2f37cc --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/reserve.rs @@ -0,0 +1,21 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::parachain::teleporter::TrustedTeleporters; +use frame_support::traits::EverythingBut; +use xcm_builder::NativeAsset; + +pub type TrustedReserves = (NativeAsset, EverythingBut); diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/teleporter.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/teleporter.rs new file mode 100644 index 00000000000..41cb7a5eb2d --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/teleporter.rs @@ -0,0 +1,27 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use frame_support::parameter_types; +use xcm::latest::prelude::*; + +parameter_types! { + pub NftCollectionOne: AssetFilter + = Wild(AllOf { fun: WildNonFungible, id: AssetId((Parent, GeneralIndex(1)).into()) }); + pub NftCollectionOneForRelay: (AssetFilter, Location) + = (NftCollectionOne::get(), (Parent,).into()); +} + +pub type TrustedTeleporters = xcm_builder::Case; diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/weigher.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/weigher.rs new file mode 100644 index 00000000000..4bdc98ea3b0 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/weigher.rs @@ -0,0 +1,27 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::parachain::RuntimeCall; +use frame_support::parameter_types; +use xcm::latest::prelude::*; +use xcm_builder::FixedWeightBounds; + +parameter_types! { + pub const UnitWeightCost: Weight = Weight::from_parts(1, 1); + pub const MaxInstructions: u32 = 100; +} + +pub type Weigher = FixedWeightBounds; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs similarity index 53% rename from polkadot/xcm/xcm-simulator/example/src/relay_chain.rs rename to polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs index b41df3cfa2b..f698eba41d4 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs @@ -16,31 +16,29 @@ //! Relay chain runtime mock. +mod xcm_config; +pub use xcm_config::*; + use frame_support::{ construct_runtime, derive_impl, parameter_types, - traits::{AsEnsureOriginWithArg, Everything, Nothing, ProcessMessage, ProcessMessageError}, + traits::{ + AsEnsureOriginWithArg, ConstU128, Everything, Nothing, ProcessMessage, ProcessMessageError, + }, weights::{Weight, WeightMeter}, }; use frame_system::EnsureRoot; -use sp_core::{ConstU32, H256}; +use sp_core::ConstU32; use sp_runtime::{traits::IdentityLookup, AccountId32}; -use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::{ configuration, inclusion::{AggregateMessageOrigin, UmpQueueId}, origin, shared, }; use xcm::latest::prelude::*; -use xcm_builder::{ - Account32Hash, AccountId32Aliases, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, - ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, - ConvertedConcreteId, EnsureDecodableXcm, FixedRateOfFungible, FixedWeightBounds, - FrameTransactionalProcessor, FungibleAdapter, IsConcrete, NoChecking, NonFungiblesAdapter, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, -}; -use xcm_executor::{traits::JustTry, Config, XcmExecutor}; +use xcm_builder::{IsConcrete, SignedToAccountId32}; +use xcm_executor::XcmExecutor; pub type AccountId = AccountId32; pub type Balance = u128; @@ -51,51 +49,17 @@ parameter_types! { #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockWeights = (); - type BlockLength = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; -} - -parameter_types! { - pub ExistentialDeposit: Balance = 1; - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; + type ExistentialDeposit = ConstU128<1>; type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } impl pallet_uniques::Config for Runtime { @@ -127,83 +91,8 @@ impl configuration::Config for Runtime { type WeightInfo = configuration::TestWeightInfo; } -parameter_types! { - pub const TokenLocation: Location = Here.into_location(); - pub RelayNetwork: NetworkId = ByGenesis([0; 32]); - pub const AnyNetwork: Option = None; - pub UniversalLocation: InteriorLocation = RelayNetwork::get().into(); - pub UnitWeightCost: u64 = 1_000; -} - -pub type LocationToAccountId = ( - ChildParachainConvertsVia, - AccountId32Aliases, - Account32Hash<(), AccountId>, -); - -pub type LocalAssetTransactor = ( - FungibleAdapter, LocationToAccountId, AccountId, ()>, - NonFungiblesAdapter< - Uniques, - ConvertedConcreteId, JustTry>, - LocationToAccountId, - AccountId, - NoChecking, - (), - >, -); - -type LocalOriginConverter = ( - SovereignSignedViaLocation, - ChildParachainAsNative, - SignedAccountId32AsNative, - ChildSystemParachainAsSuperuser, -); - -parameter_types! { - pub const BaseXcmWeight: Weight = Weight::from_parts(1_000, 1_000); - pub TokensPerSecondPerByte: (AssetId, u128, u128) = - (AssetId(TokenLocation::get()), 1_000_000_000_000, 1024 * 1024); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -pub type XcmRouter = EnsureDecodableXcm; -pub type Barrier = AllowUnpaidExecutionFrom; - -pub struct XcmConfig; -impl Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = LocalAssetTransactor; - type OriginConverter = LocalOriginConverter; - type IsReserve = (); - type IsTeleporter = (); - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = FixedRateOfFungible; - type ResponseHandler = (); - type AssetTrap = (); - type AssetLocker = XcmPallet; - type AssetExchanger = (); - type AssetClaims = (); - type SubscriptionService = (); - type PalletInstancesInfo = (); - type FeeManager = (); - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; - type TransactionalProcessor = FrameTransactionalProcessor; - type HrmpNewChannelOpenRequestHandler = (); - type HrmpChannelAcceptedHandler = (); - type HrmpChannelClosingHandler = (); -} - -pub type LocalOriginToLocation = SignedToAccountId32; +pub type LocalOriginToLocation = + SignedToAccountId32; impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; @@ -215,16 +104,16 @@ impl pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; + type Weigher = weigher::Weigher; + type UniversalLocation = constants::UniversalLocation; type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; type Currency = Balances; - type CurrencyMatcher = IsConcrete; + type CurrencyMatcher = IsConcrete; type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; + type SovereignAccountOf = location_converter::LocationConverter; type MaxLockers = ConstU32<8>; type MaxRemoteLockConsumers = ConstU32<0>; type RemoteLockConsumerIdentifier = (); diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/asset_transactor.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/asset_transactor.rs new file mode 100644 index 00000000000..c212569d481 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/asset_transactor.rs @@ -0,0 +1,38 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::relay_chain::{ + constants::TokenLocation, location_converter::LocationConverter, AccountId, Balances, Uniques, +}; +use xcm_builder::{ + AsPrefixedGeneralIndex, ConvertedConcreteId, FungibleAdapter, IsConcrete, NoChecking, + NonFungiblesAdapter, +}; +use xcm_executor::traits::JustTry; + +type LocalAssetTransactor = ( + FungibleAdapter, LocationConverter, AccountId, ()>, + NonFungiblesAdapter< + Uniques, + ConvertedConcreteId, JustTry>, + LocationConverter, + AccountId, + NoChecking, + (), + >, +); + +pub type AssetTransactor = LocalAssetTransactor; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/barrier.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/barrier.rs new file mode 100644 index 00000000000..1c7aa2c6d32 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/barrier.rs @@ -0,0 +1,20 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use frame_support::traits::Everything; +use xcm_builder::AllowUnpaidExecutionFrom; + +pub type Barrier = AllowUnpaidExecutionFrom; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/constants.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/constants.rs new file mode 100644 index 00000000000..f590c42990d --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/constants.rs @@ -0,0 +1,31 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use frame_support::parameter_types; +use xcm::latest::prelude::*; + +parameter_types! { + pub TokensPerSecondPerByte: (AssetId, u128, u128) = + (AssetId(TokenLocation::get()), 1_000_000_000_000, 1024 * 1024); + pub const MaxAssetsIntoHolding: u32 = 64; +} + +parameter_types! { + pub const TokenLocation: Location = Here.into_location(); + pub RelayNetwork: NetworkId = ByGenesis([0; 32]); + pub UniversalLocation: InteriorLocation = RelayNetwork::get().into(); + pub UnitWeightCost: u64 = 1_000; +} diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/location_converter.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/location_converter.rs new file mode 100644 index 00000000000..0f5f4e43dc9 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/location_converter.rs @@ -0,0 +1,25 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::relay_chain::{constants::RelayNetwork, AccountId}; +use xcm_builder::{AccountId32Aliases, DescribeAllTerminal, DescribeFamily, HashedDescription}; + +type LocationToAccountId = ( + HashedDescription>, + AccountId32Aliases, +); + +pub type LocationConverter = LocationToAccountId; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs new file mode 100644 index 00000000000..a7a8bae5156 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs @@ -0,0 +1,62 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +pub mod asset_transactor; +pub mod barrier; +pub mod constants; +pub mod location_converter; +pub mod origin_converter; +pub mod weigher; + +use crate::relay_chain::{RuntimeCall, XcmPallet}; +use frame_support::traits::{Everything, Nothing}; +use xcm_builder::{EnsureDecodableXcm, FixedRateOfFungible, FrameTransactionalProcessor}; +use xcm_executor::Config; + +// Generated from `decl_test_network!` +pub type XcmRouter = EnsureDecodableXcm; + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = asset_transactor::AssetTransactor; + type OriginConverter = origin_converter::OriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type UniversalLocation = constants::UniversalLocation; + type Barrier = barrier::Barrier; + type Weigher = weigher::Weigher; + type Trader = FixedRateOfFungible; + type ResponseHandler = (); + type AssetTrap = (); + type AssetLocker = XcmPallet; + type AssetExchanger = (); + type AssetClaims = (); + type SubscriptionService = (); + type PalletInstancesInfo = (); + type FeeManager = (); + type MaxAssetsIntoHolding = constants::MaxAssetsIntoHolding; + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = RuntimeCall; + type SafeCallFilter = Everything; + type Aliasers = Nothing; + type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); +} diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/origin_converter.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/origin_converter.rs new file mode 100644 index 00000000000..3c79912a926 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/origin_converter.rs @@ -0,0 +1,34 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::relay_chain::{ + constants::RelayNetwork, location_converter::LocationConverter, RuntimeOrigin, +}; +use polkadot_parachain_primitives::primitives::Id as ParaId; +use polkadot_runtime_parachains::origin; +use xcm_builder::{ + ChildParachainAsNative, ChildSystemParachainAsSuperuser, SignedAccountId32AsNative, + SovereignSignedViaLocation, +}; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +pub type OriginConverter = LocalOriginConverter; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/weigher.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/weigher.rs new file mode 100644 index 00000000000..5c02565f460 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/weigher.rs @@ -0,0 +1,27 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::relay_chain::RuntimeCall; +use frame_support::parameter_types; +use xcm::latest::prelude::*; +use xcm_builder::FixedWeightBounds; + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(1_000, 1_000); + pub const MaxInstructions: u32 = 100; +} + +pub type Weigher = FixedWeightBounds; diff --git a/polkadot/xcm/xcm-simulator/example/src/tests.rs b/polkadot/xcm/xcm-simulator/example/src/tests.rs new file mode 100644 index 00000000000..6486a849af3 --- /dev/null +++ b/polkadot/xcm/xcm-simulator/example/src/tests.rs @@ -0,0 +1,513 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::*; + +use codec::Encode; +use frame_support::{assert_ok, weights::Weight}; +use xcm::latest::QueryResponseInfo; +use xcm_simulator::TestExt; + +// Helper function for forming buy execution message +fn buy_execution(fees: impl Into) -> Instruction { + BuyExecution { fees: fees.into(), weight_limit: Unlimited } +} + +#[test] +fn remote_account_ids_work() { + child_account_account_id(1, ALICE); + sibling_account_account_id(1, ALICE); + parent_account_account_id(ALICE); +} + +#[test] +fn dmp() { + MockNet::reset(); + + let remark = parachain::RuntimeCall::System( + frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, + ); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::send_xcm( + Here, + Parachain(1), + Xcm(vec![Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024), + call: remark.encode().into(), + }]), + )); + }); + + ParaA::execute_with(|| { + use parachain::{RuntimeEvent, System}; + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::System(frame_system::Event::Remarked { .. }) + ))); + }); +} + +#[test] +fn ump() { + MockNet::reset(); + + let remark = relay_chain::RuntimeCall::System( + frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, + ); + ParaA::execute_with(|| { + assert_ok!(ParachainPalletXcm::send_xcm( + Here, + Parent, + Xcm(vec![Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024), + call: remark.encode().into(), + }]), + )); + }); + + Relay::execute_with(|| { + use relay_chain::{RuntimeEvent, System}; + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::System(frame_system::Event::Remarked { .. }) + ))); + }); +} + +#[test] +fn xcmp() { + MockNet::reset(); + + let remark = parachain::RuntimeCall::System( + frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, + ); + ParaA::execute_with(|| { + assert_ok!(ParachainPalletXcm::send_xcm( + Here, + (Parent, Parachain(2)), + Xcm(vec![Transact { + origin_kind: OriginKind::SovereignAccount, + require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024), + call: remark.encode().into(), + }]), + )); + }); + + ParaB::execute_with(|| { + use parachain::{RuntimeEvent, System}; + assert!(System::events().iter().any(|r| matches!( + r.event, + RuntimeEvent::System(frame_system::Event::Remarked { .. }) + ))); + }); +} + +#[test] +fn reserve_transfer() { + MockNet::reset(); + + let withdraw_amount = 123; + + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::limited_reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(ALICE), + Box::new(Parachain(1).into()), + Box::new(AccountId32 { network: None, id: ALICE.into() }.into()), + Box::new((Here, withdraw_amount).into()), + 0, + Unlimited, + )); + assert_eq!( + relay_chain::Balances::free_balance(&child_account_id(1)), + INITIAL_BALANCE + withdraw_amount + ); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!( + pallet_balances::Pallet::::free_balance(&ALICE), + INITIAL_BALANCE + withdraw_amount + ); + }); +} + +#[test] +fn remote_locking_and_unlocking() { + MockNet::reset(); + + let locked_amount = 100; + + ParaB::execute_with(|| { + let message = Xcm(vec![LockAsset { + asset: (Here, locked_amount).into(), + unlocker: Parachain(1).into(), + }]); + assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone())); + }); + + Relay::execute_with(|| { + use pallet_balances::{BalanceLock, Reasons}; + assert_eq!( + relay_chain::Balances::locks(&child_account_id(2)), + vec![BalanceLock { id: *b"py/xcmlk", amount: locked_amount, reasons: Reasons::All }] + ); + }); + + ParaA::execute_with(|| { + assert_eq!( + parachain::MsgQueue::received_dmp(), + vec![Xcm(vec![NoteUnlockable { + owner: (Parent, Parachain(2)).into(), + asset: (Parent, locked_amount).into() + }])] + ); + }); + + ParaB::execute_with(|| { + // Request unlocking part of the funds on the relay chain + let message = Xcm(vec![RequestUnlock { + asset: (Parent, locked_amount - 50).into(), + locker: Parent.into(), + }]); + assert_ok!(ParachainPalletXcm::send_xcm(Here, (Parent, Parachain(1)), message)); + }); + + Relay::execute_with(|| { + use pallet_balances::{BalanceLock, Reasons}; + // Lock is reduced + assert_eq!( + relay_chain::Balances::locks(&child_account_id(2)), + vec![BalanceLock { + id: *b"py/xcmlk", + amount: locked_amount - 50, + reasons: Reasons::All + }] + ); + }); +} + +/// Scenario: +/// A parachain transfers an NFT resident on the relay chain to another parachain account. +/// +/// Asserts that the parachain accounts are updated as expected. +#[test] +fn withdraw_and_deposit_nft() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_eq!(relay_chain::Uniques::owner(1, 42), Some(child_account_id(1))); + }); + + ParaA::execute_with(|| { + let message = Xcm(vec![TransferAsset { + assets: (GeneralIndex(1), 42u32).into(), + beneficiary: Parachain(2).into(), + }]); + // Send withdraw and deposit + assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message)); + }); + + Relay::execute_with(|| { + assert_eq!(relay_chain::Uniques::owner(1, 42), Some(child_account_id(2))); + }); +} + +/// Scenario: +/// The relay-chain teleports an NFT to a parachain. +/// +/// Asserts that the parachain accounts are updated as expected. +#[test] +fn teleport_nft() { + MockNet::reset(); + + Relay::execute_with(|| { + // Mint the NFT (1, 69) and give it to our "parachain#1 alias". + assert_ok!(relay_chain::Uniques::mint( + relay_chain::RuntimeOrigin::signed(ALICE), + 1, + 69, + child_account_account_id(1, ALICE), + )); + // The parachain#1 alias of Alice is what must hold it on the Relay-chain for it to be + // withdrawable by Alice on the parachain. + assert_eq!(relay_chain::Uniques::owner(1, 69), Some(child_account_account_id(1, ALICE))); + }); + ParaA::execute_with(|| { + assert_ok!(parachain::ForeignUniques::force_create( + parachain::RuntimeOrigin::root(), + (Parent, GeneralIndex(1)).into(), + ALICE, + false, + )); + assert_eq!( + parachain::ForeignUniques::owner((Parent, GeneralIndex(1)).into(), 69u32.into()), + None, + ); + assert_eq!(parachain::Balances::reserved_balance(&ALICE), 0); + + // IRL Alice would probably just execute this locally on the Relay-chain, but we can't + // easily do that here since we only send between chains. + let message = Xcm(vec![ + WithdrawAsset((GeneralIndex(1), 69u32).into()), + InitiateTeleport { + assets: AllCounted(1).into(), + dest: Parachain(1).into(), + xcm: Xcm(vec![DepositAsset { + assets: AllCounted(1).into(), + beneficiary: (AccountId32 { id: ALICE.into(), network: None },).into(), + }]), + }, + ]); + // Send teleport + let alice = AccountId32 { id: ALICE.into(), network: None }; + assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); + }); + ParaA::execute_with(|| { + assert_eq!( + parachain::ForeignUniques::owner((Parent, GeneralIndex(1)).into(), 69u32.into()), + Some(ALICE), + ); + assert_eq!(parachain::Balances::reserved_balance(&ALICE), 1000); + }); + Relay::execute_with(|| { + assert_eq!(relay_chain::Uniques::owner(1, 69), None); + }); +} + +/// Scenario: +/// The relay-chain transfers an NFT into a parachain's sovereign account, who then mints a +/// trustless-backed-derived locally. +/// +/// Asserts that the parachain accounts are updated as expected. +#[test] +fn reserve_asset_transfer_nft() { + sp_tracing::init_for_tests(); + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(relay_chain::Uniques::force_create( + relay_chain::RuntimeOrigin::root(), + 2, + ALICE, + false + )); + assert_ok!(relay_chain::Uniques::mint( + relay_chain::RuntimeOrigin::signed(ALICE), + 2, + 69, + child_account_account_id(1, ALICE) + )); + assert_eq!(relay_chain::Uniques::owner(2, 69), Some(child_account_account_id(1, ALICE))); + }); + ParaA::execute_with(|| { + assert_ok!(parachain::ForeignUniques::force_create( + parachain::RuntimeOrigin::root(), + (Parent, GeneralIndex(2)).into(), + ALICE, + false, + )); + assert_eq!( + parachain::ForeignUniques::owner((Parent, GeneralIndex(2)).into(), 69u32.into()), + None, + ); + assert_eq!(parachain::Balances::reserved_balance(&ALICE), 0); + + let message = Xcm(vec![ + WithdrawAsset((GeneralIndex(2), 69u32).into()), + DepositReserveAsset { + assets: AllCounted(1).into(), + dest: Parachain(1).into(), + xcm: Xcm(vec![DepositAsset { + assets: AllCounted(1).into(), + beneficiary: (AccountId32 { id: ALICE.into(), network: None },).into(), + }]), + }, + ]); + // Send transfer + let alice = AccountId32 { id: ALICE.into(), network: None }; + assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); + }); + ParaA::execute_with(|| { + log::debug!(target: "xcm-executor", "Hello"); + assert_eq!( + parachain::ForeignUniques::owner((Parent, GeneralIndex(2)).into(), 69u32.into()), + Some(ALICE), + ); + assert_eq!(parachain::Balances::reserved_balance(&ALICE), 1000); + }); + + Relay::execute_with(|| { + assert_eq!(relay_chain::Uniques::owner(2, 69), Some(child_account_id(1))); + }); +} + +/// Scenario: +/// The relay-chain creates an asset class on a parachain and then Alice transfers her NFT into +/// that parachain's sovereign account, who then mints a trustless-backed-derivative locally. +/// +/// Asserts that the parachain accounts are updated as expected. +#[test] +fn reserve_asset_class_create_and_reserve_transfer() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(relay_chain::Uniques::force_create( + relay_chain::RuntimeOrigin::root(), + 2, + ALICE, + false + )); + assert_ok!(relay_chain::Uniques::mint( + relay_chain::RuntimeOrigin::signed(ALICE), + 2, + 69, + child_account_account_id(1, ALICE) + )); + assert_eq!(relay_chain::Uniques::owner(2, 69), Some(child_account_account_id(1, ALICE))); + + let message = Xcm(vec![Transact { + origin_kind: OriginKind::Xcm, + require_weight_at_most: Weight::from_parts(1_000_000_000, 1024 * 1024), + call: parachain::RuntimeCall::from( + pallet_uniques::Call::::create { + collection: (Parent, 2u64).into(), + admin: parent_account_id(), + }, + ) + .encode() + .into(), + }]); + // Send creation. + assert_ok!(RelayChainPalletXcm::send_xcm(Here, Parachain(1), message)); + }); + ParaA::execute_with(|| { + // Then transfer + let message = Xcm(vec![ + WithdrawAsset((GeneralIndex(2), 69u32).into()), + DepositReserveAsset { + assets: AllCounted(1).into(), + dest: Parachain(1).into(), + xcm: Xcm(vec![DepositAsset { + assets: AllCounted(1).into(), + beneficiary: (AccountId32 { id: ALICE.into(), network: None },).into(), + }]), + }, + ]); + let alice = AccountId32 { id: ALICE.into(), network: None }; + assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); + }); + ParaA::execute_with(|| { + assert_eq!(parachain::Balances::reserved_balance(&parent_account_id()), 1000); + assert_eq!( + parachain::ForeignUniques::collection_owner((Parent, 2u64).into()), + Some(parent_account_id()) + ); + }); +} + +/// Scenario: +/// A parachain transfers funds on the relay chain to another parachain account. +/// +/// Asserts that the parachain accounts are updated as expected. +#[test] +fn withdraw_and_deposit() { + MockNet::reset(); + + let send_amount = 10; + + ParaA::execute_with(|| { + let message = Xcm(vec![ + WithdrawAsset((Here, send_amount).into()), + buy_execution((Here, send_amount)), + DepositAsset { assets: AllCounted(1).into(), beneficiary: Parachain(2).into() }, + ]); + // Send withdraw and deposit + assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone())); + }); + + Relay::execute_with(|| { + assert_eq!( + relay_chain::Balances::free_balance(child_account_id(1)), + INITIAL_BALANCE - send_amount + ); + assert_eq!( + relay_chain::Balances::free_balance(child_account_id(2)), + INITIAL_BALANCE + send_amount + ); + }); +} + +/// Scenario: +/// A parachain wants to be notified that a transfer worked correctly. +/// It sends a `QueryHolding` after the deposit to get notified on success. +/// +/// Asserts that the balances are updated correctly and the expected XCM is sent. +#[test] +fn query_holding() { + MockNet::reset(); + + let send_amount = 10; + let query_id_set = 1234; + + // Send a message which fully succeeds on the relay chain + ParaA::execute_with(|| { + let message = Xcm(vec![ + WithdrawAsset((Here, send_amount).into()), + buy_execution((Here, send_amount)), + DepositAsset { assets: AllCounted(1).into(), beneficiary: Parachain(2).into() }, + ReportHolding { + response_info: QueryResponseInfo { + destination: Parachain(1).into(), + query_id: query_id_set, + max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024), + }, + assets: All.into(), + }, + ]); + // Send withdraw and deposit with query holding + assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone(),)); + }); + + // Check that transfer was executed + Relay::execute_with(|| { + // Withdraw executed + assert_eq!( + relay_chain::Balances::free_balance(child_account_id(1)), + INITIAL_BALANCE - send_amount + ); + // Deposit executed + assert_eq!( + relay_chain::Balances::free_balance(child_account_id(2)), + INITIAL_BALANCE + send_amount + ); + }); + + // Check that QueryResponse message was received + ParaA::execute_with(|| { + assert_eq!( + parachain::MsgQueue::received_dmp(), + vec![Xcm(vec![QueryResponse { + query_id: query_id_set, + response: Response::Assets(Assets::new()), + max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024), + querier: Some(Here.into()), + }])], + ); + }); +} diff --git a/prdoc/pr_4220.prdoc b/prdoc/pr_4220.prdoc new file mode 100644 index 00000000000..d5688ab325c --- /dev/null +++ b/prdoc/pr_4220.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Refactor XCM Simulator Example + +doc: + - audience: Runtime Dev + description: | + This PR refactors the XCM Simulator Example to improve developer experience when trying to read and understand the example. 3 monolithic files have been broken down into their respective components across various modules. No major logical changes were made. + +crates: [ ] -- GitLab From 1fb058b791276f1ced9c1980e738e968d5dafb45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Andr=C3=A9s=20Dorado=20Su=C3=A1rez?= Date: Tue, 30 Apr 2024 00:06:17 -0500 Subject: [PATCH 026/170] Assets Events for `Deposited` and `Withdrawn` (#4312) Closes #4308 Polkadot address: 12gMhxHw8QjEwLQvnqsmMVY1z5gFa54vND74aMUbhhwN6mJR --------- Co-authored-by: command-bot <> Co-authored-by: Francisco Aguirre --- prdoc/pr_4312.prdoc | 19 +++++++++++++ substrate/frame/assets/src/impl_fungibles.rs | 16 +++++++++++ substrate/frame/assets/src/lib.rs | 4 +++ substrate/frame/assets/src/tests/sets.rs | 12 ++++++++ .../asset-conversion-tx-payment/src/tests.rs | 22 +++++++++++++++ .../asset-tx-payment/src/tests.rs | 28 +++++++++++++++++++ 6 files changed, 101 insertions(+) create mode 100644 prdoc/pr_4312.prdoc diff --git a/prdoc/pr_4312.prdoc b/prdoc/pr_4312.prdoc new file mode 100644 index 00000000000..d773edbd14d --- /dev/null +++ b/prdoc/pr_4312.prdoc @@ -0,0 +1,19 @@ +title: Add `Deposited`/`Withdrawn` events for `pallet-assets` + +doc: + - audience: Runtime Dev + description: | + New events were added to `pallet-assets`: `Deposited` and `Withdrawn`. Make sure + to cover those events on tests if necessary. + - audience: Runtime User + description: | + New events were added to `pallet-assets`: `Deposited` and `Withdrawn`. These indicate + a change in the balance of an account. + +crates: + - name: pallet-assets + bump: minor + - name: pallet-asset-tx-payment + bump: minor + - name: pallet-asset-conversion-tx-payment + bump: minor diff --git a/substrate/frame/assets/src/impl_fungibles.rs b/substrate/frame/assets/src/impl_fungibles.rs index 9f837a60434..30122f6d788 100644 --- a/substrate/frame/assets/src/impl_fungibles.rs +++ b/substrate/frame/assets/src/impl_fungibles.rs @@ -118,6 +118,22 @@ impl, I: 'static> fungibles::Balanced<::AccountI { type OnDropCredit = fungibles::DecreaseIssuance; type OnDropDebt = fungibles::IncreaseIssuance; + + fn done_deposit( + asset_id: Self::AssetId, + who: &::AccountId, + amount: Self::Balance, + ) { + Self::deposit_event(Event::Deposited { asset_id, who: who.clone(), amount }) + } + + fn done_withdraw( + asset_id: Self::AssetId, + who: &::AccountId, + amount: Self::Balance, + ) { + Self::deposit_event(Event::Withdrawn { asset_id, who: who.clone(), amount }) + } } impl, I: 'static> fungibles::Unbalanced for Pallet { diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index 9056b1eefbd..d5214922555 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -571,6 +571,10 @@ pub mod pallet { Touched { asset_id: T::AssetId, who: T::AccountId, depositor: T::AccountId }, /// Some account `who` was blocked. Blocked { asset_id: T::AssetId, who: T::AccountId }, + /// Some assets were deposited (e.g. for transaction fees). + Deposited { asset_id: T::AssetId, who: T::AccountId, amount: T::Balance }, + /// Some assets were withdrawn from the account (e.g. for transaction fees). + Withdrawn { asset_id: T::AssetId, who: T::AccountId, amount: T::Balance }, } #[pallet::error] diff --git a/substrate/frame/assets/src/tests/sets.rs b/substrate/frame/assets/src/tests/sets.rs index f85a736c083..4d75b8aeab2 100644 --- a/substrate/frame/assets/src/tests/sets.rs +++ b/substrate/frame/assets/src/tests/sets.rs @@ -90,6 +90,12 @@ fn deposit_from_set_types_works() { assert_eq!(First::::balance((), &account2), 50); assert_eq!(First::::total_issuance(()), 100); + System::assert_has_event(RuntimeEvent::Assets(crate::Event::Deposited { + asset_id: asset1, + who: account2, + amount: 50, + })); + assert_eq!(imb.peek(), 50); let (imb1, imb2) = imb.split(30); @@ -336,6 +342,12 @@ fn withdraw_from_set_types_works() { assert_eq!(First::::balance((), &account2), 50); assert_eq!(First::::total_issuance(()), 200); + System::assert_has_event(RuntimeEvent::Assets(crate::Event::Withdrawn { + asset_id: asset1, + who: account2, + amount: 50, + })); + assert_eq!(imb.peek(), 50); drop(imb); assert_eq!(First::::total_issuance(()), 150); diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs index 62faed269d3..aa2f26f3a6a 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs @@ -201,6 +201,8 @@ fn transaction_payment_in_asset_possible() { .base_weight(Weight::from_parts(base_weight, 0)) .build() .execute_with(|| { + System::set_block_number(1); + // create the asset let asset_id = 1; let min_balance = 2; @@ -246,6 +248,12 @@ fn transaction_payment_in_asset_possible() { // check that fee was charged in the given asset assert_eq!(Assets::balance(asset_id, caller), balance - fee_in_asset); + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Withdrawn { + asset_id, + who: caller, + amount: fee_in_asset, + })); + assert_ok!(ChargeAssetTxPayment::::post_dispatch( Some(pre), &info_from_weight(WEIGHT_5), // estimated tx weight @@ -385,6 +393,8 @@ fn asset_transaction_payment_with_tip_and_refund() { .base_weight(Weight::from_parts(base_weight, 0)) .build() .execute_with(|| { + System::set_block_number(1); + // create the asset let asset_id = 1; let min_balance = 2; @@ -434,6 +444,12 @@ fn asset_transaction_payment_with_tip_and_refund() { ) .unwrap(); + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Withdrawn { + asset_id, + who: caller, + amount: fee_in_asset, + })); + assert_ok!(ChargeAssetTxPayment::::post_dispatch( Some(pre), &info_from_weight(WEIGHT_100), @@ -451,6 +467,12 @@ fn asset_transaction_payment_with_tip_and_refund() { balance - fee_in_asset + expected_token_refund ); assert_eq!(Balances::free_balance(caller), 20 * balance_factor); + + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Deposited { + asset_id, + who: caller, + amount: expected_token_refund, + })); }); } diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs index 8df98ceda99..098ecf11dd9 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs +++ b/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs @@ -157,6 +157,8 @@ fn transaction_payment_in_asset_possible() { .base_weight(Weight::from_parts(base_weight, 0)) .build() .execute_with(|| { + System::set_block_number(1); + // create the asset let asset_id = 1; let min_balance = 2; @@ -188,6 +190,12 @@ fn transaction_payment_in_asset_possible() { assert_eq!(Assets::balance(asset_id, caller), balance - fee); assert_eq!(Assets::balance(asset_id, BLOCK_AUTHOR), 0); + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Withdrawn { + asset_id, + who: caller, + amount: fee, + })); + assert_ok!(ChargeAssetTxPayment::::post_dispatch( Some(pre), &info_from_weight(Weight::from_parts(weight, 0)), @@ -198,6 +206,12 @@ fn transaction_payment_in_asset_possible() { assert_eq!(Assets::balance(asset_id, caller), balance - fee); // check that the block author gets rewarded assert_eq!(Assets::balance(asset_id, BLOCK_AUTHOR), fee); + + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Deposited { + asset_id, + who: BLOCK_AUTHOR, + amount: fee, + })); }); } @@ -263,6 +277,8 @@ fn asset_transaction_payment_with_tip_and_refund() { .base_weight(Weight::from_parts(base_weight, 0)) .build() .execute_with(|| { + System::set_block_number(1); + // create the asset let asset_id = 1; let min_balance = 2; @@ -292,6 +308,12 @@ fn asset_transaction_payment_with_tip_and_refund() { .unwrap(); assert_eq!(Assets::balance(asset_id, caller), balance - fee_with_tip); + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Withdrawn { + asset_id, + who: caller, + amount: fee_with_tip, + })); + let final_weight = 50; assert_ok!(ChargeAssetTxPayment::::post_dispatch( Some(pre), @@ -304,6 +326,12 @@ fn asset_transaction_payment_with_tip_and_refund() { fee_with_tip - (weight - final_weight) * min_balance / ExistentialDeposit::get(); assert_eq!(Assets::balance(asset_id, caller), balance - (final_fee)); assert_eq!(Assets::balance(asset_id, BLOCK_AUTHOR), final_fee); + + System::assert_has_event(RuntimeEvent::Assets(pallet_assets::Event::Deposited { + asset_id, + who: caller, + amount: fee_with_tip - final_fee, + })); }); } -- GitLab From 31dc8bb1de9a73c57863c4698ea23559ef729f67 Mon Sep 17 00:00:00 2001 From: gupnik Date: Tue, 30 Apr 2024 11:09:08 +0530 Subject: [PATCH 027/170] Improvements in minimal template (#4119) This PR makes a few improvements in the docs for the minimal template. --------- Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- Cargo.lock | 13 +++ Cargo.toml | 1 + .../src/construct_runtime/expand/call.rs | 1 + .../procedural/src/construct_runtime/mod.rs | 2 + .../procedural/src/construct_runtime/parse.rs | 3 + .../src/pallet/expand/tt_default_parts.rs | 4 +- .../procedural/src/runtime/expand/mod.rs | 4 +- .../procedural/src/runtime/parse/pallet.rs | 4 + .../src/runtime/parse/pallet_decl.rs | 7 +- templates/minimal/Cargo.toml | 25 ++++++ templates/minimal/README.md | 13 +++ templates/minimal/runtime/src/lib.rs | 79 +++++++++++++++---- templates/minimal/src/lib.rs | 75 ++++++++++++++++++ 13 files changed, 210 insertions(+), 21 deletions(-) create mode 100644 templates/minimal/Cargo.toml create mode 100644 templates/minimal/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 67b0ad4def2..1fe4012070a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8474,6 +8474,19 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "minimal-template" +version = "0.0.0" +dependencies = [ + "docify", + "minimal-template-node", + "minimal-template-runtime", + "pallet-minimal-template", + "polkadot-sdk-docs", + "polkadot-sdk-frame", + "simple-mermaid", +] + [[package]] name = "minimal-template-node" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index 42a6bc8abe1..1d3f3d8e9ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -513,6 +513,7 @@ members = [ "substrate/utils/substrate-bip39", "substrate/utils/wasm-builder", + "templates/minimal", "templates/minimal/node", "templates/minimal/pallets/template", "templates/minimal/runtime", diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs index b0041ccc075..f055e8ce28e 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs @@ -66,6 +66,7 @@ pub fn expand_outer_dispatch( quote! { #( #query_call_part_macros )* + /// The aggregated runtime call type. #[derive( Clone, PartialEq, Eq, #scrate::__private::codec::Encode, diff --git a/substrate/frame/support/procedural/src/construct_runtime/mod.rs b/substrate/frame/support/procedural/src/construct_runtime/mod.rs index b083abbb2a8..1505d158895 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/mod.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/mod.rs @@ -533,6 +533,7 @@ pub(crate) fn decl_all_pallets<'a>( for pallet_declaration in pallet_declarations { let type_name = &pallet_declaration.name; let pallet = &pallet_declaration.path; + let docs = &pallet_declaration.docs; let mut generics = vec![quote!(#runtime)]; generics.extend(pallet_declaration.instance.iter().map(|name| quote!(#pallet::#name))); let mut attrs = Vec::new(); @@ -541,6 +542,7 @@ pub(crate) fn decl_all_pallets<'a>( attrs.extend(TokenStream2::from_str(&feat).expect("was parsed successfully; qed")); } let type_decl = quote!( + #( #[doc = #docs] )* #(#attrs)* pub type #type_name = #pallet::Pallet <#(#generics),*>; ); diff --git a/substrate/frame/support/procedural/src/construct_runtime/parse.rs b/substrate/frame/support/procedural/src/construct_runtime/parse.rs index 31866c787b0..ded77bed4c8 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/parse.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/parse.rs @@ -605,6 +605,8 @@ pub struct Pallet { pub pallet_parts: Vec, /// Expressions specified inside of a #[cfg] attribute. pub cfg_pattern: Vec, + /// The doc literals + pub docs: Vec, } impl Pallet { @@ -774,6 +776,7 @@ fn convert_pallets(pallets: Vec) -> syn::Result>>()?; diff --git a/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs b/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs index 99364aaa96c..1975f059152 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs @@ -198,9 +198,9 @@ pub fn expand_tt_default_parts(def: &mut Def) -> proc_macro2::TokenStream { macro_rules! #default_parts_unique_id_v2 { { $caller:tt - frame_support = [{ $($frame_support:ident)::* }] + your_tt_return = [{ $my_tt_return:path }] } => { - $($frame_support)*::__private::tt_return! { + $my_tt_return! { $caller tokens = [{ + Pallet #call_part_v2 #storage_part_v2 #event_part_v2 #error_part_v2 #origin_part_v2 #config_part_v2 diff --git a/substrate/frame/support/procedural/src/runtime/expand/mod.rs b/substrate/frame/support/procedural/src/runtime/expand/mod.rs index 011f69f3714..43f11896808 100644 --- a/substrate/frame/support/procedural/src/runtime/expand/mod.rs +++ b/substrate/frame/support/procedural/src/runtime/expand/mod.rs @@ -93,7 +93,7 @@ fn construct_runtime_implicit_to_explicit( let frame_support = generate_access_from_frame_or_crate("frame-support")?; let attr = if legacy_ordering { quote!((legacy_ordering)) } else { quote!() }; let mut expansion = quote::quote!( - #[frame_support::runtime #attr] + #[#frame_support::runtime #attr] #input ); for pallet in definition.pallet_decls.iter() { @@ -103,7 +103,7 @@ fn construct_runtime_implicit_to_explicit( expansion = quote::quote!( #frame_support::__private::tt_call! { macro = [{ #pallet_path::tt_default_parts_v2 }] - frame_support = [{ #frame_support }] + your_tt_return = [{ #frame_support::__private::tt_return }] ~~> #frame_support::match_and_insert! { target = [{ #expansion }] pattern = [{ #pallet_name = #pallet_path #pallet_instance }] diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet.rs index d2f1857fb2b..09f5290541d 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/pallet.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet.rs @@ -16,6 +16,7 @@ // limitations under the License. use crate::construct_runtime::parse::{Pallet, PalletPart, PalletPartKeyword, PalletPath}; +use frame_support_procedural_tools::get_doc_literals; use quote::ToTokens; use syn::{punctuated::Punctuated, spanned::Spanned, token, Error, Ident, PathArguments}; @@ -86,6 +87,8 @@ impl Pallet { let cfg_pattern = vec![]; + let docs = get_doc_literals(&item.attrs); + Ok(Pallet { is_expanded: true, name, @@ -94,6 +97,7 @@ impl Pallet { instance, cfg_pattern, pallet_parts, + docs, }) } } diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs index 437a163cfbc..e167d37d5f1 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs @@ -21,13 +21,14 @@ use syn::{spanned::Spanned, Attribute, Ident, PathArguments}; /// The declaration of a pallet. #[derive(Debug, Clone)] pub struct PalletDeclaration { - /// The name of the pallet, e.g.`System` in `System: frame_system`. + /// The name of the pallet, e.g.`System` in `pub type System = frame_system`. pub name: Ident, /// Optional attributes tagged right above a pallet declaration. pub attrs: Vec, - /// The path of the pallet, e.g. `frame_system` in `System: frame_system`. + /// The path of the pallet, e.g. `frame_system` in `pub type System = frame_system`. pub path: syn::Path, - /// The instance of the pallet, e.g. `Instance1` in `Council: pallet_collective::`. + /// The instance of the pallet, e.g. `Instance1` in `pub type Council = + /// pallet_collective`. pub instance: Option, } diff --git a/templates/minimal/Cargo.toml b/templates/minimal/Cargo.toml new file mode 100644 index 00000000000..6cd28c5a493 --- /dev/null +++ b/templates/minimal/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "minimal-template" +description = "A minimal template built with Substrate, part of Polkadot Sdk." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true +repository.workspace = true +edition.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +minimal-template-node = { path = "./node" } +minimal-template-runtime = { path = "./runtime" } +pallet-minimal-template = { path = "./pallets/template" } +polkadot-sdk-docs = { path = "../../docs/sdk" } + +frame = { package = "polkadot-sdk-frame", path = "../../substrate/frame" } + +# How we build docs in rust-docs +simple-mermaid = "0.1.1" +docify = "0.2.7" diff --git a/templates/minimal/README.md b/templates/minimal/README.md index e69de29bb2d..0541e393db9 100644 --- a/templates/minimal/README.md +++ b/templates/minimal/README.md @@ -0,0 +1,13 @@ +# Minimal Template + +This is a minimal template for creating a blockchain using the Polkadot SDK. + +# Docs + +You can generate and view the [Rust +Docs](https://doc.rust-lang.org/cargo/commands/cargo-doc.html) for this template +with this command: + +```sh +cargo doc -p minimal-template --open +``` diff --git a/templates/minimal/runtime/src/lib.rs b/templates/minimal/runtime/src/lib.rs index 794f30a054a..d2debbf5689 100644 --- a/templates/minimal/runtime/src/lib.rs +++ b/templates/minimal/runtime/src/lib.rs @@ -15,6 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +//! A minimal runtime that includes the template [`pallet`](`pallet_minimal_template`). + #![cfg_attr(not(feature = "std"), no_std)] // Make the WASM binary available. @@ -24,6 +26,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); use frame::{ deps::frame_support::{ genesis_builder_helper::{build_state, get_preset}, + runtime, weights::{FixedFee, NoFee}, }, prelude::*, @@ -36,6 +39,7 @@ use frame::{ }, }; +/// The runtime version. #[runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("minimal-template-runtime"), @@ -54,61 +58,108 @@ pub fn native_version() -> NativeVersion { NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } } +/// The signed extensions that are added to the runtime. type SignedExtra = ( + // Checks that the sender is not the zero address. frame_system::CheckNonZeroSender, + // Checks that the runtime version is correct. frame_system::CheckSpecVersion, + // Checks that the transaction version is correct. frame_system::CheckTxVersion, + // Checks that the genesis hash is correct. frame_system::CheckGenesis, + // Checks that the era is valid. frame_system::CheckEra, + // Checks that the nonce is valid. frame_system::CheckNonce, + // Checks that the weight is valid. frame_system::CheckWeight, + // Ensures that the sender has enough funds to pay for the transaction + // and deducts the fee from the sender's account. pallet_transaction_payment::ChargeTransactionPayment, ); -construct_runtime!( - pub enum Runtime { - System: frame_system, - Timestamp: pallet_timestamp, - - Balances: pallet_balances, - Sudo: pallet_sudo, - TransactionPayment: pallet_transaction_payment, - - // our local pallet - Template: pallet_minimal_template, - } -); +// Composes the runtime by adding all the used pallets and deriving necessary types. +#[runtime] +mod runtime { + /// The main runtime type. + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + /// Mandatory system pallet that should always be included in a FRAME runtime. + #[runtime::pallet_index(0)] + pub type System = frame_system; + + /// Provides a way for consensus systems to set and check the onchain time. + #[runtime::pallet_index(1)] + pub type Timestamp = pallet_timestamp; + + /// Provides the ability to keep track of balances. + #[runtime::pallet_index(2)] + pub type Balances = pallet_balances; + + /// Provides a way to execute privileged functions. + #[runtime::pallet_index(3)] + pub type Sudo = pallet_sudo; + + /// Provides the ability to charge for extrinsic execution. + #[runtime::pallet_index(4)] + pub type TransactionPayment = pallet_transaction_payment; + + /// A minimal pallet template. + #[runtime::pallet_index(5)] + pub type Template = pallet_minimal_template; +} parameter_types! { pub const Version: RuntimeVersion = VERSION; } +/// Implements the types required for the system pallet. #[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type Version = Version; - type BlockHashCount = ConstU32<1024>; + // Use the account data from the balances pallet type AccountData = pallet_balances::AccountData<::Balance>; } +// Implements the types required for the balances pallet. #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { type AccountStore = System; } +// Implements the types required for the sudo pallet. #[derive_impl(pallet_sudo::config_preludes::TestDefaultConfig)] impl pallet_sudo::Config for Runtime {} +// Implements the types required for the sudo pallet. #[derive_impl(pallet_timestamp::config_preludes::TestDefaultConfig)] impl pallet_timestamp::Config for Runtime {} +// Implements the types required for the transaction payment pallet. #[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)] impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; + // Setting fee as independent of the weight of the extrinsic for demo purposes type WeightToFee = NoFee<::Balance>; + // Setting fee as fixed for any length of the call data for demo purposes type LengthToFee = FixedFee<1, ::Balance>; } +// Implements the types required for the template pallet. impl pallet_minimal_template::Config for Runtime {} type Block = frame::runtime::types_common::BlockOf; diff --git a/templates/minimal/src/lib.rs b/templates/minimal/src/lib.rs new file mode 100644 index 00000000000..68825d190bb --- /dev/null +++ b/templates/minimal/src/lib.rs @@ -0,0 +1,75 @@ +//! # Minimal Template +//! +//! This is a minimal template for creating a blockchain using the Polkadot SDK. +//! +//! ## Components +//! +//! The template consists of the following components: +//! +//! ### Node +//! +//! A minimal blockchain [`node`](`minimal_template_node`) that is capable of running a +//! runtime. It uses a simple chain specification, provides an option to choose Manual or +//! InstantSeal for consensus and exposes a few commands to interact with the node. +//! +//! ### Runtime +//! +//! A minimal [`runtime`](`minimal_template_runtime`) (or a state transition function) that +//! is capable of being run on the node. It is built using the [`FRAME`](`frame`) framework +//! that enables the composition of the core logic via separate modules called "pallets". +//! FRAME defines a complete DSL for building such pallets and the runtime itself. +//! +//! #### Transaction Fees +//! +//! The runtime charges a transaction fee for every transaction that is executed. The fee is +//! calculated based on the weight of the transaction (accouting for the execution time) and +//! length of the call data. Please refer to +//! [`benchmarking docs`](`polkadot_sdk_docs::reference_docs::frame_benchmarking_weight`) for +//! more information on how the weight is calculated. +//! +//! This template sets the fee as independent of the weight of the extrinsic and fixed for any +//! length of the call data for demo purposes. +//! +//! ### Pallet +//! +//! A minimal [`pallet`](`pallet_minimal_template`) that is built using FRAME. It is a unit of +//! encapsulated logic that has a clearly defined responsibility and can be linked to other pallets. +//! +//! ## Getting Started +//! +//! To get started with the template, follow the steps below: +//! +//! ### Build the Node +//! +//! Build the node using the following command: +//! +//! ```bash +//! cargo build -p minimal-template-node --release +//! ``` +//! +//! ### Run the Node +//! +//! Run the node using the following command: +//! +//! ```bash +//! ./target/release/minimal-template-node --dev +//! ``` +//! +//! ### CLI Options +//! +//! The node exposes a few options that can be used to interact with the node. To see the list of +//! available options, run the following command: +//! +//! ```bash +//! ./target/release/minimal-template-node --help +//! ``` +//! +//! #### Consensus Algorithm +//! +//! In order to run the node with a specific consensus algorithm, use the `--consensus` flag. For +//! example, to run the node with ManualSeal consensus with a block time of 5000ms, use the +//! following command: +//! +//! ```bash +//! ./target/release/minimal-template-node --dev --consensus manual-seal-5000 +//! ``` -- GitLab From b8593ccd1bddacc87a11559fe845db43b7f4ec6d Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Tue, 30 Apr 2024 16:42:50 +0300 Subject: [PATCH 028/170] BEEFY: Define basic fisherman (#4328) Related to https://github.com/paritytech/polkadot-sdk/pull/1903 For #1903 we will need to add a Fisherman struct. This PR: - defines a basic version of `Fisherman` and moves into it the logic that we have now for reporting double voting equivocations - splits the logic for generating the key ownership proofs into a more generic separate method - renames `EquivocationProof` to `DoubleVotingProof` since later we will introduce a new type of equivocation The PR doesn't contain any functional changes --- polkadot/node/service/src/fake_runtime_api.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 2 +- polkadot/runtime/test-runtime/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 2 +- substrate/bin/node/runtime/src/lib.rs | 2 +- substrate/client/consensus/beefy/Cargo.toml | 2 +- .../client/consensus/beefy/src/fisherman.rs | 162 ++++++++++++++++++ substrate/client/consensus/beefy/src/lib.rs | 19 +- substrate/client/consensus/beefy/src/round.rs | 10 +- substrate/client/consensus/beefy/src/tests.rs | 6 +- .../client/consensus/beefy/src/worker.rs | 93 +++------- substrate/frame/beefy/src/equivocation.rs | 4 +- substrate/frame/beefy/src/lib.rs | 8 +- .../primitives/consensus/beefy/src/lib.rs | 8 +- .../consensus/beefy/src/test_utils.rs | 6 +- 15 files changed, 225 insertions(+), 103 deletions(-) create mode 100644 substrate/client/consensus/beefy/src/fisherman.rs diff --git a/polkadot/node/service/src/fake_runtime_api.rs b/polkadot/node/service/src/fake_runtime_api.rs index c6cfb7a27d0..89613040dca 100644 --- a/polkadot/node/service/src/fake_runtime_api.rs +++ b/polkadot/node/service/src/fake_runtime_api.rs @@ -242,7 +242,7 @@ sp_api::impl_runtime_apis! { } fn submit_report_equivocation_unsigned_extrinsic( - _: beefy_primitives::EquivocationProof< + _: beefy_primitives::DoubleVotingProof< BlockNumber, BeefyId, BeefySignature, diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 1cfe9adfe13..287ae9937da 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -2018,7 +2018,7 @@ sp_api::impl_runtime_apis! { } fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: beefy_primitives::EquivocationProof< + equivocation_proof: beefy_primitives::DoubleVotingProof< BlockNumber, BeefyId, BeefySignature, diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index d0f1ff0035f..87becf73cb7 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -1009,7 +1009,7 @@ sp_api::impl_runtime_apis! { } fn submit_report_equivocation_unsigned_extrinsic( - _equivocation_proof: beefy_primitives::EquivocationProof< + _equivocation_proof: beefy_primitives::DoubleVotingProof< BlockNumber, BeefyId, BeefySignature, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index de961bb4c39..7125f5d34c4 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -1966,7 +1966,7 @@ sp_api::impl_runtime_apis! { } fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: beefy_primitives::EquivocationProof< + equivocation_proof: beefy_primitives::DoubleVotingProof< BlockNumber, BeefyId, BeefySignature, diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 5d8016532a5..18b0d0c31a4 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -3053,7 +3053,7 @@ impl_runtime_apis! { } fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: sp_consensus_beefy::EquivocationProof< + equivocation_proof: sp_consensus_beefy::DoubleVotingProof< BlockNumber, BeefyId, BeefySignature, diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 7b61b3c6c01..435604a9473 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -39,7 +39,6 @@ sp-consensus-beefy = { path = "../../../primitives/consensus/beefy" } sp-core = { path = "../../../primitives/core" } sp-crypto-hashing = { path = "../../../primitives/crypto/hashing" } sp-keystore = { path = "../../../primitives/keystore" } -sp-mmr-primitives = { path = "../../../primitives/merkle-mountain-range" } sp-runtime = { path = "../../../primitives/runtime" } tokio = "1.37" @@ -51,6 +50,7 @@ sc-block-builder = { path = "../../block-builder" } sc-network-test = { path = "../../network/test" } sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa" } sp-keyring = { path = "../../../primitives/keyring" } +sp-mmr-primitives = { path = "../../../primitives/merkle-mountain-range" } sp-tracing = { path = "../../../primitives/tracing" } substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" } diff --git a/substrate/client/consensus/beefy/src/fisherman.rs b/substrate/client/consensus/beefy/src/fisherman.rs new file mode 100644 index 00000000000..a2b4c8f945d --- /dev/null +++ b/substrate/client/consensus/beefy/src/fisherman.rs @@ -0,0 +1,162 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::{error::Error, keystore::BeefyKeystore, round::Rounds, LOG_TARGET}; +use log::{debug, error, warn}; +use sc_client_api::Backend; +use sp_api::ProvideRuntimeApi; +use sp_blockchain::HeaderBackend; +use sp_consensus_beefy::{ + check_equivocation_proof, + ecdsa_crypto::{AuthorityId, Signature}, + BeefyApi, BeefySignatureHasher, DoubleVotingProof, OpaqueKeyOwnershipProof, ValidatorSetId, +}; +use sp_runtime::{ + generic::BlockId, + traits::{Block, NumberFor}, +}; +use std::{marker::PhantomData, sync::Arc}; + +/// Helper struct containing the id and the key ownership proof for a validator. +pub struct ProvedValidator<'a> { + pub id: &'a AuthorityId, + pub key_owner_proof: OpaqueKeyOwnershipProof, +} + +/// Helper used to check and report equivocations. +pub struct Fisherman { + backend: Arc, + runtime: Arc, + key_store: Arc>, + + _phantom: PhantomData, +} + +impl, RuntimeApi: ProvideRuntimeApi> Fisherman +where + RuntimeApi::Api: BeefyApi, +{ + pub fn new( + backend: Arc, + runtime: Arc, + keystore: Arc>, + ) -> Self { + Self { backend, runtime, key_store: keystore, _phantom: Default::default() } + } + + fn prove_offenders<'a>( + &self, + at: BlockId, + offender_ids: impl Iterator, + validator_set_id: ValidatorSetId, + ) -> Result>, Error> { + let hash = match at { + BlockId::Hash(hash) => hash, + BlockId::Number(number) => self + .backend + .blockchain() + .expect_block_hash_from_id(&BlockId::Number(number)) + .map_err(|err| { + Error::Backend(format!( + "Couldn't get hash for block #{:?} (error: {:?}). \ + Skipping report for equivocation", + at, err + )) + })?, + }; + + let runtime_api = self.runtime.runtime_api(); + let mut proved_offenders = vec![]; + for offender_id in offender_ids { + match runtime_api.generate_key_ownership_proof( + hash, + validator_set_id, + offender_id.clone(), + ) { + Ok(Some(key_owner_proof)) => { + proved_offenders.push(ProvedValidator { id: offender_id, key_owner_proof }); + }, + Ok(None) => { + debug!( + target: LOG_TARGET, + "🥩 Equivocation offender {} not part of the authority set {}.", + offender_id, validator_set_id + ); + }, + Err(e) => { + error!( + target: LOG_TARGET, + "🥩 Error generating key ownership proof for equivocation offender {} \ + in authority set {}: {}", + offender_id, validator_set_id, e + ); + }, + }; + } + + Ok(proved_offenders) + } + + /// Report the given equivocation to the BEEFY runtime module. This method + /// generates a session membership proof of the offender and then submits an + /// extrinsic to report the equivocation. In particular, the session membership + /// proof must be generated at the block at which the given set was active which + /// isn't necessarily the best block if there are pending authority set changes. + pub fn report_double_voting( + &self, + proof: DoubleVotingProof, AuthorityId, Signature>, + active_rounds: &Rounds, + ) -> Result<(), Error> { + let (validators, validator_set_id) = + (active_rounds.validators(), active_rounds.validator_set_id()); + let offender_id = proof.offender_id(); + + if !check_equivocation_proof::<_, _, BeefySignatureHasher>(&proof) { + debug!(target: LOG_TARGET, "🥩 Skipping report for bad equivocation {:?}", proof); + return Ok(()) + } + + if let Some(local_id) = self.key_store.authority_id(validators) { + if offender_id == &local_id { + warn!(target: LOG_TARGET, "🥩 Skipping report for own equivocation"); + return Ok(()) + } + } + + let key_owner_proofs = self.prove_offenders( + BlockId::Number(*proof.round_number()), + vec![offender_id].into_iter(), + validator_set_id, + )?; + + // submit equivocation report at **best** block + let best_block_hash = self.backend.blockchain().info().best_hash; + for ProvedValidator { key_owner_proof, .. } in key_owner_proofs { + self.runtime + .runtime_api() + .submit_report_equivocation_unsigned_extrinsic( + best_block_hash, + proof.clone(), + key_owner_proof, + ) + .map_err(Error::RuntimeApi)?; + } + + Ok(()) + } +} diff --git a/substrate/client/consensus/beefy/src/lib.rs b/substrate/client/consensus/beefy/src/lib.rs index 2637481fbf3..0e49839f0fd 100644 --- a/substrate/client/consensus/beefy/src/lib.rs +++ b/substrate/client/consensus/beefy/src/lib.rs @@ -43,11 +43,10 @@ use sp_api::ProvideRuntimeApi; use sp_blockchain::{Backend as BlockchainBackend, HeaderBackend}; use sp_consensus::{Error as ConsensusError, SyncOracle}; use sp_consensus_beefy::{ - ecdsa_crypto::AuthorityId, BeefyApi, ConsensusLog, MmrRootHash, PayloadProvider, ValidatorSet, + ecdsa_crypto::AuthorityId, BeefyApi, ConsensusLog, PayloadProvider, ValidatorSet, BEEFY_ENGINE_ID, }; use sp_keystore::KeystorePtr; -use sp_mmr_primitives::MmrApi; use sp_runtime::traits::{Block, Header as HeaderT, NumberFor, Zero}; use std::{ collections::{BTreeMap, VecDeque}, @@ -69,6 +68,7 @@ pub mod justification; use crate::{ communication::gossip::GossipValidator, + fisherman::Fisherman, justification::BeefyVersionedFinalityProof, keystore::BeefyKeystore, metrics::VoterMetrics, @@ -80,6 +80,7 @@ pub use communication::beefy_protocol_name::{ }; use sp_runtime::generic::OpaqueDigestItemId; +mod fisherman; #[cfg(test)] mod tests; @@ -305,14 +306,16 @@ where pending_justifications: BTreeMap, BeefyVersionedFinalityProof>, is_authority: bool, ) -> BeefyWorker { + let key_store = Arc::new(self.key_store); BeefyWorker { - backend: self.backend, - runtime: self.runtime, - key_store: self.key_store, - metrics: self.metrics, - persisted_state: self.persisted_state, + backend: self.backend.clone(), + runtime: self.runtime.clone(), + key_store: key_store.clone(), payload_provider, sync, + fisherman: Arc::new(Fisherman::new(self.backend, self.runtime, key_store)), + metrics: self.metrics, + persisted_state: self.persisted_state, comms, links, pending_justifications, @@ -487,7 +490,7 @@ pub async fn start_beefy_gadget( C: Client + BlockBackend, P: PayloadProvider + Clone, R: ProvideRuntimeApi, - R::Api: BeefyApi + MmrApi>, + R::Api: BeefyApi, N: GossipNetwork + NetworkRequest + Send + Sync + 'static, S: GossipSyncing + SyncOracle + 'static, { diff --git a/substrate/client/consensus/beefy/src/round.rs b/substrate/client/consensus/beefy/src/round.rs index 0045dc70c26..5dae80cb183 100644 --- a/substrate/client/consensus/beefy/src/round.rs +++ b/substrate/client/consensus/beefy/src/round.rs @@ -22,7 +22,7 @@ use codec::{Decode, Encode}; use log::{debug, info}; use sp_consensus_beefy::{ ecdsa_crypto::{AuthorityId, Signature}, - Commitment, EquivocationProof, SignedCommitment, ValidatorSet, ValidatorSetId, VoteMessage, + Commitment, DoubleVotingProof, SignedCommitment, ValidatorSet, ValidatorSetId, VoteMessage, }; use sp_runtime::traits::{Block, NumberFor}; use std::collections::BTreeMap; @@ -61,7 +61,7 @@ pub fn threshold(authorities: usize) -> usize { pub enum VoteImportResult { Ok, RoundConcluded(SignedCommitment, Signature>), - Equivocation(EquivocationProof, AuthorityId, Signature>), + DoubleVoting(DoubleVotingProof, AuthorityId, Signature>), Invalid, Stale, } @@ -153,7 +153,7 @@ where target: LOG_TARGET, "🥩 detected equivocated vote: 1st: {:?}, 2nd: {:?}", previous_vote, vote ); - return VoteImportResult::Equivocation(EquivocationProof { + return VoteImportResult::DoubleVoting(DoubleVotingProof { first: previous_vote.clone(), second: vote, }) @@ -207,7 +207,7 @@ mod tests { use sc_network_test::Block; use sp_consensus_beefy::{ - known_payloads::MMR_ROOT_ID, test_utils::Keyring, Commitment, EquivocationProof, Payload, + known_payloads::MMR_ROOT_ID, test_utils::Keyring, Commitment, DoubleVotingProof, Payload, SignedCommitment, ValidatorSet, VoteMessage, }; @@ -494,7 +494,7 @@ mod tests { let mut alice_vote2 = alice_vote1.clone(); alice_vote2.commitment = commitment2; - let expected_result = VoteImportResult::Equivocation(EquivocationProof { + let expected_result = VoteImportResult::DoubleVoting(DoubleVotingProof { first: alice_vote1.clone(), second: alice_vote2.clone(), }); diff --git a/substrate/client/consensus/beefy/src/tests.rs b/substrate/client/consensus/beefy/src/tests.rs index 9b13d1da6d7..2bb145d660d 100644 --- a/substrate/client/consensus/beefy/src/tests.rs +++ b/substrate/client/consensus/beefy/src/tests.rs @@ -59,7 +59,7 @@ use sp_consensus_beefy::{ known_payloads, mmr::{find_mmr_root_digest, MmrRootProvider}, test_utils::Keyring as BeefyKeyring, - BeefyApi, Commitment, ConsensusLog, EquivocationProof, MmrRootHash, OpaqueKeyOwnershipProof, + BeefyApi, Commitment, ConsensusLog, DoubleVotingProof, MmrRootHash, OpaqueKeyOwnershipProof, Payload, SignedCommitment, ValidatorSet, ValidatorSetId, VersionedFinalityProof, VoteMessage, BEEFY_ENGINE_ID, }; @@ -259,7 +259,7 @@ pub(crate) struct TestApi { pub validator_set: Option, pub mmr_root_hash: MmrRootHash, pub reported_equivocations: - Option, AuthorityId, Signature>>>>>, + Option, AuthorityId, Signature>>>>>, } impl TestApi { @@ -313,7 +313,7 @@ sp_api::mock_impl_runtime_apis! { } fn submit_report_equivocation_unsigned_extrinsic( - proof: EquivocationProof, AuthorityId, Signature>, + proof: DoubleVotingProof, AuthorityId, Signature>, _dummy: OpaqueKeyOwnershipProof, ) -> Option<()> { if let Some(equivocations_buf) = self.inner.reported_equivocations.as_ref() { diff --git a/substrate/client/consensus/beefy/src/worker.rs b/substrate/client/consensus/beefy/src/worker.rs index 05575ae01c3..cfbb3d63aea 100644 --- a/substrate/client/consensus/beefy/src/worker.rs +++ b/substrate/client/consensus/beefy/src/worker.rs @@ -23,6 +23,7 @@ use crate::{ }, error::Error, find_authorities_change, + fisherman::Fisherman, justification::BeefyVersionedFinalityProof, keystore::BeefyKeystore, metric_inc, metric_set, @@ -39,10 +40,9 @@ use sp_api::ProvideRuntimeApi; use sp_arithmetic::traits::{AtLeast32Bit, Saturating}; use sp_consensus::SyncOracle; use sp_consensus_beefy::{ - check_equivocation_proof, ecdsa_crypto::{AuthorityId, Signature}, - BeefyApi, BeefySignatureHasher, Commitment, EquivocationProof, PayloadProvider, ValidatorSet, - VersionedFinalityProof, VoteMessage, BEEFY_ENGINE_ID, + BeefyApi, Commitment, DoubleVotingProof, PayloadProvider, ValidatorSet, VersionedFinalityProof, + VoteMessage, BEEFY_ENGINE_ID, }; use sp_runtime::{ generic::BlockId, @@ -377,9 +377,10 @@ pub(crate) struct BeefyWorker { // utilities pub backend: Arc, pub runtime: Arc, - pub key_store: BeefyKeystore, + pub key_store: Arc>, pub payload_provider: P, pub sync: Arc, + pub fisherman: Arc>, // communication (created once, but returned and reused if worker is restarted/reinitialized) pub comms: BeefyComms, @@ -590,9 +591,9 @@ where } metric_inc!(self.metrics, beefy_good_votes_processed); }, - VoteImportResult::Equivocation(proof) => { + VoteImportResult::DoubleVoting(proof) => { metric_inc!(self.metrics, beefy_equivocation_votes); - self.report_equivocation(proof)?; + self.report_double_voting(proof)?; }, VoteImportResult::Invalid => metric_inc!(self.metrics, beefy_invalid_votes), VoteImportResult::Stale => metric_inc!(self.metrics, beefy_stale_votes), @@ -941,64 +942,13 @@ where (error, self.comms) } - /// Report the given equivocation to the BEEFY runtime module. This method - /// generates a session membership proof of the offender and then submits an - /// extrinsic to report the equivocation. In particular, the session membership - /// proof must be generated at the block at which the given set was active which - /// isn't necessarily the best block if there are pending authority set changes. - pub(crate) fn report_equivocation( + /// Report the given equivocation to the BEEFY runtime module. + fn report_double_voting( &self, - proof: EquivocationProof, AuthorityId, Signature>, + proof: DoubleVotingProof, AuthorityId, Signature>, ) -> Result<(), Error> { let rounds = self.persisted_state.voting_oracle.active_rounds()?; - let (validators, validator_set_id) = (rounds.validators(), rounds.validator_set_id()); - let offender_id = proof.offender_id().clone(); - - if !check_equivocation_proof::<_, _, BeefySignatureHasher>(&proof) { - debug!(target: LOG_TARGET, "🥩 Skip report for bad equivocation {:?}", proof); - return Ok(()) - } else if let Some(local_id) = self.key_store.authority_id(validators) { - if offender_id == local_id { - warn!(target: LOG_TARGET, "🥩 Skip equivocation report for own equivocation"); - return Ok(()) - } - } - - let number = *proof.round_number(); - let hash = self - .backend - .blockchain() - .expect_block_hash_from_id(&BlockId::Number(number)) - .map_err(|err| { - let err_msg = format!( - "Couldn't get hash for block #{:?} (error: {:?}), skipping report for equivocation", - number, err - ); - Error::Backend(err_msg) - })?; - let runtime_api = self.runtime.runtime_api(); - // generate key ownership proof at that block - let key_owner_proof = match runtime_api - .generate_key_ownership_proof(hash, validator_set_id, offender_id) - .map_err(Error::RuntimeApi)? - { - Some(proof) => proof, - None => { - debug!( - target: LOG_TARGET, - "🥩 Equivocation offender not part of the authority set." - ); - return Ok(()) - }, - }; - - // submit equivocation report at **best** block - let best_block_hash = self.backend.blockchain().info().best_hash; - runtime_api - .submit_report_equivocation_unsigned_extrinsic(best_block_hash, proof, key_owner_proof) - .map_err(Error::RuntimeApi)?; - - Ok(()) + self.fisherman.report_double_voting(proof, rounds) } } @@ -1165,13 +1115,15 @@ pub(crate) mod tests { .unwrap(); let payload_provider = MmrRootProvider::new(api.clone()); let comms = BeefyComms { gossip_engine, gossip_validator, on_demand_justifications }; + let key_store: Arc> = Arc::new(Some(keystore).into()); BeefyWorker { - backend, - runtime: api, - key_store: Some(keystore).into(), + backend: backend.clone(), + runtime: api.clone(), + key_store: key_store.clone(), metrics, payload_provider, sync: Arc::new(sync), + fisherman: Arc::new(Fisherman::new(backend, api, key_store)), links, comms, pending_justifications: BTreeMap::new(), @@ -1590,6 +1542,11 @@ pub(crate) mod tests { let mut net = BeefyTestNet::new(1); let mut worker = create_beefy_worker(net.peer(0), &keys[0], 1, validator_set.clone()); worker.runtime = api_alice.clone(); + worker.fisherman = Arc::new(Fisherman::new( + worker.backend.clone(), + worker.runtime.clone(), + worker.key_store.clone(), + )); // let there be a block with num = 1: let _ = net.peer(0).push_blocks(1, false); @@ -1604,7 +1561,7 @@ pub(crate) mod tests { ); { // expect voter (Alice) to successfully report it - assert_eq!(worker.report_equivocation(good_proof.clone()), Ok(())); + assert_eq!(worker.report_double_voting(good_proof.clone()), Ok(())); // verify Alice reports Bob equivocation to runtime let reported = api_alice.reported_equivocations.as_ref().unwrap().lock(); assert_eq!(reported.len(), 1); @@ -1616,7 +1573,7 @@ pub(crate) mod tests { let mut bad_proof = good_proof.clone(); bad_proof.first.id = Keyring::Charlie.public(); // bad proofs are simply ignored - assert_eq!(worker.report_equivocation(bad_proof), Ok(())); + assert_eq!(worker.report_double_voting(bad_proof), Ok(())); // verify nothing reported to runtime assert!(api_alice.reported_equivocations.as_ref().unwrap().lock().is_empty()); @@ -1625,7 +1582,7 @@ pub(crate) mod tests { old_proof.first.commitment.validator_set_id = 0; old_proof.second.commitment.validator_set_id = 0; // old proofs are simply ignored - assert_eq!(worker.report_equivocation(old_proof), Ok(())); + assert_eq!(worker.report_double_voting(old_proof), Ok(())); // verify nothing reported to runtime assert!(api_alice.reported_equivocations.as_ref().unwrap().lock().is_empty()); @@ -1635,7 +1592,7 @@ pub(crate) mod tests { (block_num, payload2.clone(), set_id, &Keyring::Alice), ); // equivocations done by 'self' are simply ignored (not reported) - assert_eq!(worker.report_equivocation(self_proof), Ok(())); + assert_eq!(worker.report_double_voting(self_proof), Ok(())); // verify nothing reported to runtime assert!(api_alice.reported_equivocations.as_ref().unwrap().lock().is_empty()); } diff --git a/substrate/frame/beefy/src/equivocation.rs b/substrate/frame/beefy/src/equivocation.rs index bbc6eae6af2..aecc9e721d5 100644 --- a/substrate/frame/beefy/src/equivocation.rs +++ b/substrate/frame/beefy/src/equivocation.rs @@ -38,7 +38,7 @@ use codec::{self as codec, Decode, Encode}; use frame_support::traits::{Get, KeyOwnerProofSystem}; use frame_system::pallet_prelude::BlockNumberFor; use log::{error, info}; -use sp_consensus_beefy::{EquivocationProof, ValidatorSetId, KEY_TYPE as BEEFY_KEY_TYPE}; +use sp_consensus_beefy::{DoubleVotingProof, ValidatorSetId, KEY_TYPE as BEEFY_KEY_TYPE}; use sp_runtime::{ transaction_validity::{ InvalidTransaction, TransactionPriority, TransactionSource, TransactionValidity, @@ -123,7 +123,7 @@ pub struct EquivocationReportSystem(sp_std::marker::PhantomData<(T, /// Equivocation evidence convenience alias. pub type EquivocationEvidenceFor = ( - EquivocationProof< + DoubleVotingProof< BlockNumberFor, ::BeefyId, <::BeefyId as RuntimeAppPublic>::Signature, diff --git a/substrate/frame/beefy/src/lib.rs b/substrate/frame/beefy/src/lib.rs index 09cd13ab70a..63f3e9bb309 100644 --- a/substrate/frame/beefy/src/lib.rs +++ b/substrate/frame/beefy/src/lib.rs @@ -41,7 +41,7 @@ use sp_staking::{offence::OffenceReportSystem, SessionIndex}; use sp_std::prelude::*; use sp_consensus_beefy::{ - AuthorityIndex, BeefyAuthorityId, ConsensusLog, EquivocationProof, OnNewValidatorSet, + AuthorityIndex, BeefyAuthorityId, ConsensusLog, DoubleVotingProof, OnNewValidatorSet, ValidatorSet, BEEFY_ENGINE_ID, GENESIS_AUTHORITY_SET_ID, }; @@ -210,7 +210,7 @@ pub mod pallet { pub fn report_equivocation( origin: OriginFor, equivocation_proof: Box< - EquivocationProof< + DoubleVotingProof< BlockNumberFor, T::BeefyId, ::Signature, @@ -245,7 +245,7 @@ pub mod pallet { pub fn report_equivocation_unsigned( origin: OriginFor, equivocation_proof: Box< - EquivocationProof< + DoubleVotingProof< BlockNumberFor, T::BeefyId, ::Signature, @@ -368,7 +368,7 @@ impl Pallet { /// an unsigned extrinsic with a call to `report_equivocation_unsigned` and /// will push the transaction to the pool. Only useful in an offchain context. pub fn submit_unsigned_equivocation_report( - equivocation_proof: EquivocationProof< + equivocation_proof: DoubleVotingProof< BlockNumberFor, T::BeefyId, ::Signature, diff --git a/substrate/primitives/consensus/beefy/src/lib.rs b/substrate/primitives/consensus/beefy/src/lib.rs index 6f644c5f790..390c0ff7127 100644 --- a/substrate/primitives/consensus/beefy/src/lib.rs +++ b/substrate/primitives/consensus/beefy/src/lib.rs @@ -306,14 +306,14 @@ pub struct VoteMessage { /// BEEFY happens when a voter votes on the same round/block for different payloads. /// Proving is achieved by collecting the signed commitments of conflicting votes. #[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] -pub struct EquivocationProof { +pub struct DoubleVotingProof { /// The first vote in the equivocation. pub first: VoteMessage, /// The second vote in the equivocation. pub second: VoteMessage, } -impl EquivocationProof { +impl DoubleVotingProof { /// Returns the authority id of the equivocator. pub fn offender_id(&self) -> &Id { &self.first.id @@ -347,7 +347,7 @@ where /// Verifies the equivocation proof by making sure that both votes target /// different blocks and that its signatures are valid. pub fn check_equivocation_proof( - report: &EquivocationProof::Signature>, + report: &DoubleVotingProof::Signature>, ) -> bool where Id: BeefyAuthorityId + PartialEq, @@ -437,7 +437,7 @@ sp_api::decl_runtime_apis! { /// hardcoded to return `None`). Only useful in an offchain context. fn submit_report_equivocation_unsigned_extrinsic( equivocation_proof: - EquivocationProof, AuthorityId, ::Signature>, + DoubleVotingProof, AuthorityId, ::Signature>, key_owner_proof: OpaqueKeyOwnershipProof, ) -> Option<()>; diff --git a/substrate/primitives/consensus/beefy/src/test_utils.rs b/substrate/primitives/consensus/beefy/src/test_utils.rs index ec13c9c6900..d7fd49214f1 100644 --- a/substrate/primitives/consensus/beefy/src/test_utils.rs +++ b/substrate/primitives/consensus/beefy/src/test_utils.rs @@ -18,7 +18,7 @@ #[cfg(feature = "bls-experimental")] use crate::ecdsa_bls_crypto; use crate::{ - ecdsa_crypto, AuthorityIdBound, BeefySignatureHasher, Commitment, EquivocationProof, Payload, + ecdsa_crypto, AuthorityIdBound, BeefySignatureHasher, Commitment, DoubleVotingProof, Payload, ValidatorSetId, VoteMessage, }; use sp_application_crypto::{AppCrypto, AppPair, RuntimeAppPublic, Wraps}; @@ -140,7 +140,7 @@ impl From> for ecdsa_crypto::Public { pub fn generate_equivocation_proof( vote1: (u64, Payload, ValidatorSetId, &Keyring), vote2: (u64, Payload, ValidatorSetId, &Keyring), -) -> EquivocationProof { +) -> DoubleVotingProof { let signed_vote = |block_number: u64, payload: Payload, validator_set_id: ValidatorSetId, @@ -151,5 +151,5 @@ pub fn generate_equivocation_proof( }; let first = signed_vote(vote1.0, vote1.1, vote1.2, vote1.3); let second = signed_vote(vote2.0, vote2.1, vote2.2, vote2.3); - EquivocationProof { first, second } + DoubleVotingProof { first, second } } -- GitLab From c973fe86f8c668462186c95655a58fda04508e9a Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Tue, 30 Apr 2024 16:29:14 +0200 Subject: [PATCH 029/170] Contracts: revert reverted changes from 4266 (#4277) revert some reverted changes from #4266 --- .../src/parachain/contracts_config.rs | 14 ++------ .../frame/contracts/mock-network/src/tests.rs | 25 +------------- substrate/frame/contracts/src/lib.rs | 3 ++ substrate/frame/contracts/src/wasm/runtime.rs | 33 ++----------------- 4 files changed, 9 insertions(+), 66 deletions(-) diff --git a/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs b/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs index 20fdd9a243d..bf3c00b3ff1 100644 --- a/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs +++ b/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs @@ -14,8 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use super::{Balances, Runtime, RuntimeCall, RuntimeEvent, RuntimeHoldReason}; -use frame_support::{derive_impl, parameter_types, traits::Contains}; +use super::{Balances, Runtime, RuntimeCall, RuntimeEvent}; +use crate::parachain::RuntimeHoldReason; +use frame_support::{derive_impl, parameter_types}; parameter_types! { pub Schedule: pallet_contracts::Schedule = Default::default(); @@ -28,14 +29,5 @@ impl pallet_contracts::Config for Runtime { type Currency = Balances; type Schedule = Schedule; type Time = super::Timestamp; - type CallFilter = CallFilter; type Xcm = pallet_xcm::Pallet; } - -/// In this mock, we only allow other contract calls via XCM. -pub struct CallFilter; -impl Contains for CallFilter { - fn contains(call: &RuntimeCall) -> bool { - matches!(call, RuntimeCall::Contracts(pallet_contracts::Call::call { .. })) - } -} diff --git a/substrate/frame/contracts/mock-network/src/tests.rs b/substrate/frame/contracts/mock-network/src/tests.rs index e7d1f6279aa..48a94e172a0 100644 --- a/substrate/frame/contracts/mock-network/src/tests.rs +++ b/substrate/frame/contracts/mock-network/src/tests.rs @@ -22,10 +22,7 @@ use crate::{ relay_chain, MockNet, ParaA, ParachainBalances, Relay, ALICE, BOB, INITIAL_BALANCE, }; use codec::{Decode, Encode}; -use frame_support::{ - assert_err, - traits::{fungibles::Mutate, Currency}, -}; +use frame_support::traits::{fungibles::Mutate, Currency}; use pallet_contracts::{test_utils::builder::*, Code}; use pallet_contracts_fixtures::compile_module; use pallet_contracts_uapi::ReturnErrorCode; @@ -132,26 +129,6 @@ fn test_xcm_execute_incomplete() { }); } -#[test] -fn test_xcm_execute_filtered_call() { - MockNet::reset(); - - let contract_addr = instantiate_test_contract("xcm_execute"); - - ParaA::execute_with(|| { - // `remark` should be rejected, as it is not allowed by our CallFilter. - let call = parachain::RuntimeCall::System(frame_system::Call::remark { remark: vec![] }); - let message: Xcm = Xcm::builder_unsafe() - .transact(OriginKind::Native, Weight::MAX, call.encode()) - .build(); - let result = bare_call(contract_addr.clone()) - .data(VersionedXcm::V4(message).encode()) - .build() - .result; - assert_err!(result, frame_system::Error::::CallFiltered); - }); -} - #[test] fn test_xcm_execute_reentrant_call() { MockNet::reset(); diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index 0045d72141c..3e87eb9f37e 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -307,6 +307,9 @@ pub mod pallet { /// Therefore please make sure to be restrictive about which dispatchables are allowed /// in order to not introduce a new DoS vector like memory allocation patterns that can /// be exploited to drive the runtime into a panic. + /// + /// This filter does not apply to XCM transact calls. To impose restrictions on XCM transact + /// calls, you must configure them separately within the XCM pallet itself. #[pallet::no_default_bounds] type CallFilter: Contains<::RuntimeCall>; diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 52ceda99edb..3212aff3126 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -25,12 +25,8 @@ use crate::{ }; use codec::{Decode, DecodeLimit, Encode, MaxEncodedLen}; use frame_support::{ - dispatch::DispatchInfo, - ensure, - pallet_prelude::{DispatchResult, DispatchResultWithPostInfo}, - parameter_types, - traits::Get, - weights::Weight, + dispatch::DispatchInfo, ensure, pallet_prelude::DispatchResultWithPostInfo, parameter_types, + traits::Get, weights::Weight, }; use pallet_contracts_proc_macro::define_env; use pallet_contracts_uapi::{CallFlags, ReturnFlags}; @@ -41,7 +37,6 @@ use sp_runtime::{ }; use sp_std::{fmt, prelude::*}; use wasmi::{core::HostError, errors::LinkerError, Linker, Memory, Store}; -use xcm::VersionedXcm; type CallOf = ::RuntimeCall; @@ -378,29 +373,6 @@ fn already_charged(_: u32) -> Option { None } -/// Ensure that the XCM program is executable, by checking that it does not contain any [`Transact`] -/// instruction with a call that is not allowed by the CallFilter. -fn ensure_executable(message: &VersionedXcm>) -> DispatchResult { - use frame_support::traits::Contains; - use xcm::prelude::{Transact, Xcm}; - - let mut message: Xcm> = - message.clone().try_into().map_err(|_| Error::::XCMDecodeFailed)?; - - message.iter_mut().try_for_each(|inst| -> DispatchResult { - let Transact { ref mut call, .. } = inst else { return Ok(()) }; - let call = call.ensure_decoded().map_err(|_| Error::::XCMDecodeFailed)?; - - if !::CallFilter::contains(call) { - return Err(frame_system::Error::::CallFiltered.into()) - } - - Ok(()) - })?; - - Ok(()) -} - /// Can only be used for one call. pub struct Runtime<'a, E: Ext + 'a> { ext: &'a mut E, @@ -2117,7 +2089,6 @@ pub mod env { ctx.charge_gas(RuntimeCosts::CopyFromContract(msg_len))?; let message: VersionedXcm> = ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?; - ensure_executable::(&message)?; let execute_weight = <::Xcm as ExecuteController<_, _>>::WeightInfo::execute(); -- GitLab From 6d392c7eea496e0874a9ea37f4a8ea447ebc330e Mon Sep 17 00:00:00 2001 From: Maciej Date: Wed, 1 May 2024 18:17:55 +0100 Subject: [PATCH 030/170] Statement Distribution Per Peer Rate Limit (#3444) - [x] Drop requests from a PeerID that is already being served by us. - [x] Don't sent requests to a PeerID if we already are requesting something from them at that moment (prioritise other requests or wait). - [x] Tests - [ ] ~~Add a small rep update for unsolicited requests (same peer request)~~ not included in original PR due to potential issues with nodes slowly updating - [x] Add a metric to track the amount of dropped requests due to peer rate limiting - [x] Add a metric to track how many time a node reaches the max parallel requests limit in v2+ Helps with but does not close yet: https://github.com/paritytech-secops/srlabs_findings/issues/303 --- .gitlab/pipeline/zombienet/polkadot.yml | 8 + Cargo.lock | 1 + polkadot/node/malus/Cargo.toml | 1 + polkadot/node/malus/src/malus.rs | 7 + polkadot/node/malus/src/variants/mod.rs | 2 + .../src/variants/spam_statement_requests.rs | 155 ++++++++++++++ .../network/statement-distribution/src/lib.rs | 1 + .../statement-distribution/src/metrics.rs | 40 +++- .../statement-distribution/src/v2/mod.rs | 75 +++++-- .../statement-distribution/src/v2/requests.rs | 200 ++++++++++++++++-- .../src/v2/tests/requests.rs | 2 +- ...-spam-statement-distribution-requests.toml | 43 ++++ ...spam-statement-distribution-requests.zndsl | 27 +++ prdoc/pr_3444.prdoc | 25 +++ 14 files changed, 539 insertions(+), 48 deletions(-) create mode 100644 polkadot/node/malus/src/variants/spam_statement_requests.rs create mode 100644 polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.toml create mode 100644 polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.zndsl create mode 100644 prdoc/pr_3444.prdoc diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index 6b72075c513..38c5332f309 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -176,6 +176,14 @@ zombienet-polkadot-elastic-scaling-0002-elastic-scaling-doesnt-break-parachains: --local-dir="${LOCAL_DIR}/elastic_scaling" --test="0002-elastic-scaling-doesnt-break-parachains.zndsl" +zombienet-polkadot-functional-0012-spam-statement-distribution-requests: + extends: + - .zombienet-polkadot-common + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/functional" + --test="0012-spam-statement-distribution-requests.zndsl" + zombienet-polkadot-smoke-0001-parachains-smoke-test: extends: - .zombienet-polkadot-common diff --git a/Cargo.lock b/Cargo.lock index 1fe4012070a..c3bf3f26385 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14272,6 +14272,7 @@ dependencies = [ "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", + "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 2f63c2f0938..750074fa9b3 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -37,6 +37,7 @@ polkadot-node-core-dispute-coordinator = { path = "../core/dispute-coordinator" polkadot-node-core-candidate-validation = { path = "../core/candidate-validation" } polkadot-node-core-backing = { path = "../core/backing" } polkadot-node-primitives = { path = "../primitives" } +polkadot-node-network-protocol = { path = "../network/protocol" } polkadot-primitives = { path = "../../primitives" } color-eyre = { version = "0.6.1", default-features = false } assert_matches = "1.5" diff --git a/polkadot/node/malus/src/malus.rs b/polkadot/node/malus/src/malus.rs index 7a9e320e273..6257201537c 100644 --- a/polkadot/node/malus/src/malus.rs +++ b/polkadot/node/malus/src/malus.rs @@ -40,6 +40,8 @@ enum NemesisVariant { DisputeAncestor(DisputeAncestorOptions), /// Delayed disputing of finalized candidates. DisputeFinalizedCandidates(DisputeFinalizedCandidatesOptions), + /// Spam many request statements instead of sending a single one. + SpamStatementRequests(SpamStatementRequestsOptions), } #[derive(Debug, Parser)] @@ -98,6 +100,11 @@ impl MalusCli { finality_delay, )? }, + NemesisVariant::SpamStatementRequests(opts) => { + let SpamStatementRequestsOptions { spam_factor, cli } = opts; + + polkadot_cli::run_node(cli, SpamStatementRequests { spam_factor }, finality_delay)? + }, } Ok(()) } diff --git a/polkadot/node/malus/src/variants/mod.rs b/polkadot/node/malus/src/variants/mod.rs index 3ca1bf4b469..ec945ae1945 100644 --- a/polkadot/node/malus/src/variants/mod.rs +++ b/polkadot/node/malus/src/variants/mod.rs @@ -20,6 +20,7 @@ mod back_garbage_candidate; mod common; mod dispute_finalized_candidates; mod dispute_valid_candidates; +mod spam_statement_requests; mod suggest_garbage_candidate; mod support_disabled; @@ -27,6 +28,7 @@ pub(crate) use self::{ back_garbage_candidate::{BackGarbageCandidateOptions, BackGarbageCandidates}, dispute_finalized_candidates::{DisputeFinalizedCandidates, DisputeFinalizedCandidatesOptions}, dispute_valid_candidates::{DisputeAncestorOptions, DisputeValidCandidates}, + spam_statement_requests::{SpamStatementRequests, SpamStatementRequestsOptions}, suggest_garbage_candidate::{SuggestGarbageCandidateOptions, SuggestGarbageCandidates}, support_disabled::{SupportDisabled, SupportDisabledOptions}, }; diff --git a/polkadot/node/malus/src/variants/spam_statement_requests.rs b/polkadot/node/malus/src/variants/spam_statement_requests.rs new file mode 100644 index 00000000000..c5970c988ac --- /dev/null +++ b/polkadot/node/malus/src/variants/spam_statement_requests.rs @@ -0,0 +1,155 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A malicious node variant that attempts spam statement requests. +//! +//! This malus variant behaves honestly in everything except when propagating statement distribution +//! requests through the network bridge subsystem. Instead of sending a single request when it needs +//! something it attempts to spam the peer with multiple requests. +//! +//! Attention: For usage with `zombienet` only! + +#![allow(missing_docs)] + +use polkadot_cli::{ + service::{ + AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen, + OverseerGenArgs, OverseerHandle, + }, + validator_overseer_builder, Cli, +}; +use polkadot_node_network_protocol::request_response::{outgoing::Requests, OutgoingRequest}; +use polkadot_node_subsystem::{messages::NetworkBridgeTxMessage, SpawnGlue}; +use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient}; +use sp_core::traits::SpawnNamed; + +// Filter wrapping related types. +use crate::{interceptor::*, shared::MALUS}; + +use std::sync::Arc; + +/// Wraps around network bridge and replaces it. +#[derive(Clone)] +struct RequestSpammer { + spam_factor: u32, // How many statement distribution requests to send. +} + +impl MessageInterceptor for RequestSpammer +where + Sender: overseer::NetworkBridgeTxSenderTrait + Clone + Send + 'static, +{ + type Message = NetworkBridgeTxMessage; + + /// Intercept NetworkBridgeTxMessage::SendRequests with Requests::AttestedCandidateV2 inside and + /// duplicate that request + fn intercept_incoming( + &self, + _subsystem_sender: &mut Sender, + msg: FromOrchestra, + ) -> Option> { + match msg { + FromOrchestra::Communication { + msg: NetworkBridgeTxMessage::SendRequests(requests, if_disconnected), + } => { + let mut new_requests = Vec::new(); + + for request in requests { + match request { + Requests::AttestedCandidateV2(ref req) => { + // Temporarily store peer and payload for duplication + let peer_to_duplicate = req.peer.clone(); + let payload_to_duplicate = req.payload.clone(); + // Push the original request + new_requests.push(request); + + // Duplicate for spam purposes + gum::info!( + target: MALUS, + "😈 Duplicating AttestedCandidateV2 request extra {:?} times to peer: {:?}.", self.spam_factor, peer_to_duplicate, + ); + new_requests.extend((0..self.spam_factor - 1).map(|_| { + let (new_outgoing_request, _) = OutgoingRequest::new( + peer_to_duplicate.clone(), + payload_to_duplicate.clone(), + ); + Requests::AttestedCandidateV2(new_outgoing_request) + })); + }, + _ => { + new_requests.push(request); + }, + } + } + + // Passthrough the message with a potentially modified number of requests + Some(FromOrchestra::Communication { + msg: NetworkBridgeTxMessage::SendRequests(new_requests, if_disconnected), + }) + }, + FromOrchestra::Communication { msg } => Some(FromOrchestra::Communication { msg }), + FromOrchestra::Signal(signal) => Some(FromOrchestra::Signal(signal)), + } + } +} + +//---------------------------------------------------------------------------------- + +#[derive(Debug, clap::Parser)] +#[clap(rename_all = "kebab-case")] +#[allow(missing_docs)] +pub struct SpamStatementRequestsOptions { + /// How many statement distribution requests to send. + #[clap(long, ignore_case = true, default_value_t = 1000, value_parser = clap::value_parser!(u32).range(0..=10000000))] + pub spam_factor: u32, + + #[clap(flatten)] + pub cli: Cli, +} + +/// SpamStatementRequests implementation wrapper which implements `OverseerGen` glue. +pub(crate) struct SpamStatementRequests { + /// How many statement distribution requests to send. + pub spam_factor: u32, +} + +impl OverseerGen for SpamStatementRequests { + fn generate( + &self, + connector: OverseerConnector, + args: OverseerGenArgs<'_, Spawner, RuntimeClient>, + ext_args: Option, + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> + where + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, + Spawner: 'static + SpawnNamed + Clone + Unpin, + { + gum::info!( + target: MALUS, + "😈 Started Malus node that duplicates each statement distribution request spam_factor = {:?} times.", + &self.spam_factor, + ); + + let request_spammer = RequestSpammer { spam_factor: self.spam_factor }; + + validator_overseer_builder( + args, + ext_args.expect("Extended arguments required to build validator overseer are provided"), + )? + .replace_network_bridge_tx(move |cb| InterceptedSubsystem::new(cb, request_spammer)) + .build_with_connector(connector) + .map_err(|e| e.into()) + } +} diff --git a/polkadot/node/network/statement-distribution/src/lib.rs b/polkadot/node/network/statement-distribution/src/lib.rs index 7e91d284912..4ca199c3378 100644 --- a/polkadot/node/network/statement-distribution/src/lib.rs +++ b/polkadot/node/network/statement-distribution/src/lib.rs @@ -207,6 +207,7 @@ impl StatementDistributionSubsystem { v2::respond_task( self.req_receiver.take().expect("Mandatory argument to new. qed"), res_sender.clone(), + self.metrics.clone(), ) .boxed(), ) diff --git a/polkadot/node/network/statement-distribution/src/metrics.rs b/polkadot/node/network/statement-distribution/src/metrics.rs index b9a51dc89d6..1bc99417426 100644 --- a/polkadot/node/network/statement-distribution/src/metrics.rs +++ b/polkadot/node/network/statement-distribution/src/metrics.rs @@ -24,14 +24,19 @@ const HISTOGRAM_LATENCY_BUCKETS: &[f64] = &[ #[derive(Clone)] struct MetricsInner { + // V1 statements_distributed: prometheus::Counter, sent_requests: prometheus::Counter, received_responses: prometheus::CounterVec, - active_leaves_update: prometheus::Histogram, - share: prometheus::Histogram, network_bridge_update: prometheus::HistogramVec, statements_unexpected: prometheus::CounterVec, created_message_size: prometheus::Gauge, + // V1+ + active_leaves_update: prometheus::Histogram, + share: prometheus::Histogram, + // V2+ + peer_rate_limit_request_drop: prometheus::Counter, + max_parallel_requests_reached: prometheus::Counter, } /// Statement Distribution metrics. @@ -114,6 +119,23 @@ impl Metrics { metrics.created_message_size.set(size as u64); } } + + /// Update sent dropped requests counter when request dropped because + /// of peer rate limit + pub fn on_request_dropped_peer_rate_limit(&self) { + if let Some(metrics) = &self.0 { + metrics.peer_rate_limit_request_drop.inc(); + } + } + + /// Update max parallel requests reached counter + /// This counter is updated when the maximum number of parallel requests is reached + /// and we are waiting for one of the requests to finish + pub fn on_max_parallel_requests_reached(&self) { + if let Some(metrics) = &self.0 { + metrics.max_parallel_requests_reached.inc(); + } + } } impl metrics::Metrics for Metrics { @@ -193,6 +215,20 @@ impl metrics::Metrics for Metrics { ))?, registry, )?, + peer_rate_limit_request_drop: prometheus::register( + prometheus::Counter::new( + "polkadot_parachain_statement_distribution_peer_rate_limit_request_drop_total", + "Number of statement distribution requests dropped because of the peer rate limiting.", + )?, + registry, + )?, + max_parallel_requests_reached: prometheus::register( + prometheus::Counter::new( + "polkadot_parachain_statement_distribution_max_parallel_requests_reached_total", + "Number of times the maximum number of parallel requests was reached.", + )?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 118e34e9206..8579ac15cbc 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -59,6 +59,8 @@ use sp_keystore::KeystorePtr; use fatality::Nested; use futures::{ channel::{mpsc, oneshot}, + future::FutureExt, + select, stream::FuturesUnordered, SinkExt, StreamExt, }; @@ -73,6 +75,7 @@ use std::{ use crate::{ error::{JfyiError, JfyiErrorResult}, + metrics::Metrics, LOG_TARGET, }; use candidates::{BadAdvertisement, Candidates, PostConfirmation}; @@ -3423,35 +3426,61 @@ pub(crate) struct ResponderMessage { pub(crate) async fn respond_task( mut receiver: IncomingRequestReceiver, mut sender: mpsc::Sender, + metrics: Metrics, ) { let mut pending_out = FuturesUnordered::new(); + let mut active_peers = HashSet::new(); + loop { - // Ensure we are not handling too many requests in parallel. - if pending_out.len() >= MAX_PARALLEL_ATTESTED_CANDIDATE_REQUESTS as usize { - // Wait for one to finish: - pending_out.next().await; - } + select! { + // New request + request_result = receiver.recv(|| vec![COST_INVALID_REQUEST]).fuse() => { + let request = match request_result.into_nested() { + Ok(Ok(v)) => v, + Err(fatal) => { + gum::debug!(target: LOG_TARGET, error = ?fatal, "Shutting down request responder"); + return + }, + Ok(Err(jfyi)) => { + gum::debug!(target: LOG_TARGET, error = ?jfyi, "Decoding request failed"); + continue + }, + }; - let req = match receiver.recv(|| vec![COST_INVALID_REQUEST]).await.into_nested() { - Ok(Ok(v)) => v, - Err(fatal) => { - gum::debug!(target: LOG_TARGET, error = ?fatal, "Shutting down request responder"); - return + // If peer currently being served drop request + if active_peers.contains(&request.peer) { + gum::trace!(target: LOG_TARGET, "Peer already being served, dropping request"); + metrics.on_request_dropped_peer_rate_limit(); + continue + } + + // If we are over parallel limit wait for one to finish + if pending_out.len() >= MAX_PARALLEL_ATTESTED_CANDIDATE_REQUESTS as usize { + gum::trace!(target: LOG_TARGET, "Over max parallel requests, waiting for one to finish"); + metrics.on_max_parallel_requests_reached(); + let (_, peer) = pending_out.select_next_some().await; + active_peers.remove(&peer); + } + + // Start serving the request + let (pending_sent_tx, pending_sent_rx) = oneshot::channel(); + let peer = request.peer; + if let Err(err) = sender + .feed(ResponderMessage { request, sent_feedback: pending_sent_tx }) + .await + { + gum::debug!(target: LOG_TARGET, ?err, "Shutting down responder"); + return + } + let future_with_peer = pending_sent_rx.map(move |result| (result, peer)); + pending_out.push(future_with_peer); + active_peers.insert(peer); }, - Ok(Err(jfyi)) => { - gum::debug!(target: LOG_TARGET, error = ?jfyi, "Decoding request failed"); - continue + // Request served/finished + result = pending_out.select_next_some() => { + let (_, peer) = result; + active_peers.remove(&peer); }, - }; - - let (pending_sent_tx, pending_sent_rx) = oneshot::channel(); - if let Err(err) = sender - .feed(ResponderMessage { request: req, sent_feedback: pending_sent_tx }) - .await - { - gum::debug!(target: LOG_TARGET, ?err, "Shutting down responder"); - return } - pending_out.push(pending_sent_rx); } } diff --git a/polkadot/node/network/statement-distribution/src/v2/requests.rs b/polkadot/node/network/statement-distribution/src/v2/requests.rs index 1ed18ffd42a..b8ed34d26c8 100644 --- a/polkadot/node/network/statement-distribution/src/v2/requests.rs +++ b/polkadot/node/network/statement-distribution/src/v2/requests.rs @@ -366,6 +366,7 @@ impl RequestManager { id, &props, &peer_advertised, + &response_manager, ) { None => continue, Some(t) => t, @@ -387,14 +388,17 @@ impl RequestManager { ); let stored_id = id.clone(); - response_manager.push(Box::pin(async move { - TaggedResponse { - identifier: stored_id, - requested_peer: target, - props, - response: response_fut.await, - } - })); + response_manager.push( + Box::pin(async move { + TaggedResponse { + identifier: stored_id, + requested_peer: target, + props, + response: response_fut.await, + } + }), + target, + ); entry.in_flight = true; @@ -422,28 +426,35 @@ impl RequestManager { /// A manager for pending responses. pub struct ResponseManager { pending_responses: FuturesUnordered>, + active_peers: HashSet, } impl ResponseManager { pub fn new() -> Self { - Self { pending_responses: FuturesUnordered::new() } + Self { pending_responses: FuturesUnordered::new(), active_peers: HashSet::new() } } /// Await the next incoming response to a sent request, or immediately /// return `None` if there are no pending responses. pub async fn incoming(&mut self) -> Option { - self.pending_responses - .next() - .await - .map(|response| UnhandledResponse { response }) + self.pending_responses.next().await.map(|response| { + self.active_peers.remove(&response.requested_peer); + UnhandledResponse { response } + }) } fn len(&self) -> usize { self.pending_responses.len() } - fn push(&mut self, response: BoxFuture<'static, TaggedResponse>) { + fn push(&mut self, response: BoxFuture<'static, TaggedResponse>, target: PeerId) { self.pending_responses.push(response); + self.active_peers.insert(target); + } + + /// Returns true if we are currently sending a request to the peer. + fn is_sending_to(&self, peer: &PeerId) -> bool { + self.active_peers.contains(peer) } } @@ -471,10 +482,16 @@ fn find_request_target_with_update( candidate_identifier: &CandidateIdentifier, props: &RequestProperties, peer_advertised: impl Fn(&CandidateIdentifier, &PeerId) -> Option, + response_manager: &ResponseManager, ) -> Option { let mut prune = Vec::new(); let mut target = None; for (i, p) in known_by.iter().enumerate() { + // If we are already sending to that peer, skip for now + if response_manager.is_sending_to(p) { + continue + } + let mut filter = match peer_advertised(candidate_identifier, p) { None => { prune.push(i); @@ -1002,7 +1019,8 @@ mod tests { candidate_receipt.descriptor.persisted_validation_data_hash = persisted_validation_data.hash(); let candidate = candidate_receipt.hash(); - let requested_peer = PeerId::random(); + let requested_peer_1 = PeerId::random(); + let requested_peer_2 = PeerId::random(); let identifier1 = request_manager .get_or_insert(relay_parent, candidate, 1.into()) @@ -1010,14 +1028,14 @@ mod tests { .clone(); request_manager .get_or_insert(relay_parent, candidate, 1.into()) - .add_peer(requested_peer); + .add_peer(requested_peer_1); let identifier2 = request_manager .get_or_insert(relay_parent, candidate, 2.into()) .identifier .clone(); request_manager .get_or_insert(relay_parent, candidate, 2.into()) - .add_peer(requested_peer); + .add_peer(requested_peer_2); assert_ne!(identifier1, identifier2); assert_eq!(request_manager.requests.len(), 2); @@ -1053,7 +1071,7 @@ mod tests { let response = UnhandledResponse { response: TaggedResponse { identifier: identifier1, - requested_peer, + requested_peer: requested_peer_1, props: request_properties.clone(), response: Ok(AttestedCandidateResponse { candidate_receipt: candidate_receipt.clone(), @@ -1076,13 +1094,13 @@ mod tests { assert_eq!( output, ResponseValidationOutput { - requested_peer, + requested_peer: requested_peer_1, request_status: CandidateRequestStatus::Complete { candidate: candidate_receipt.clone(), persisted_validation_data: persisted_validation_data.clone(), statements, }, - reputation_changes: vec![(requested_peer, BENEFIT_VALID_RESPONSE)], + reputation_changes: vec![(requested_peer_1, BENEFIT_VALID_RESPONSE)], } ); } @@ -1093,7 +1111,7 @@ mod tests { let response = UnhandledResponse { response: TaggedResponse { identifier: identifier2, - requested_peer, + requested_peer: requested_peer_2, props: request_properties, response: Ok(AttestedCandidateResponse { candidate_receipt: candidate_receipt.clone(), @@ -1115,12 +1133,14 @@ mod tests { assert_eq!( output, ResponseValidationOutput { - requested_peer, + requested_peer: requested_peer_2, request_status: CandidateRequestStatus::Outdated, reputation_changes: vec![], } ); } + + assert_eq!(request_manager.requests.len(), 0); } // Test case where we had a request in-flight and the request entry was garbage-collected on @@ -1293,4 +1313,140 @@ mod tests { assert_eq!(request_manager.requests.len(), 0); assert_eq!(request_manager.by_priority.len(), 0); } + + // Test case where we queue 2 requests to be sent to the same peer and 1 request to another + // peer. Same peer requests should be served one at a time but they should not block the other + // peer request. + #[test] + fn rate_limit_requests_to_same_peer() { + let mut request_manager = RequestManager::new(); + let mut response_manager = ResponseManager::new(); + + let relay_parent = Hash::from_low_u64_le(1); + + // Create 3 candidates + let mut candidate_receipt_1 = test_helpers::dummy_committed_candidate_receipt(relay_parent); + let persisted_validation_data_1 = dummy_pvd(); + candidate_receipt_1.descriptor.persisted_validation_data_hash = + persisted_validation_data_1.hash(); + let candidate_1 = candidate_receipt_1.hash(); + + let mut candidate_receipt_2 = test_helpers::dummy_committed_candidate_receipt(relay_parent); + let persisted_validation_data_2 = dummy_pvd(); + candidate_receipt_2.descriptor.persisted_validation_data_hash = + persisted_validation_data_2.hash(); + let candidate_2 = candidate_receipt_2.hash(); + + let mut candidate_receipt_3 = test_helpers::dummy_committed_candidate_receipt(relay_parent); + let persisted_validation_data_3 = dummy_pvd(); + candidate_receipt_3.descriptor.persisted_validation_data_hash = + persisted_validation_data_3.hash(); + let candidate_3 = candidate_receipt_3.hash(); + + // Create 2 peers + let requested_peer_1 = PeerId::random(); + let requested_peer_2 = PeerId::random(); + + let group_size = 3; + let group = &[ValidatorIndex(0), ValidatorIndex(1), ValidatorIndex(2)]; + let unwanted_mask = StatementFilter::blank(group_size); + let disabled_mask: BitVec = Default::default(); + let request_properties = RequestProperties { unwanted_mask, backing_threshold: None }; + let request_props = |_identifier: &CandidateIdentifier| Some((&request_properties).clone()); + let peer_advertised = + |_identifier: &CandidateIdentifier, _peer: &_| Some(StatementFilter::full(group_size)); + + // Add request for candidate 1 from peer 1 + let identifier1 = request_manager + .get_or_insert(relay_parent, candidate_1, 1.into()) + .identifier + .clone(); + request_manager + .get_or_insert(relay_parent, candidate_1, 1.into()) + .add_peer(requested_peer_1); + + // Add request for candidate 3 from peer 2 (this one can be served in parallel) + let _identifier3 = request_manager + .get_or_insert(relay_parent, candidate_3, 1.into()) + .identifier + .clone(); + request_manager + .get_or_insert(relay_parent, candidate_3, 1.into()) + .add_peer(requested_peer_2); + + // Successfully dispatch request for candidate 1 from peer 1 and candidate 3 from peer 2 + for _ in 0..2 { + let outgoing = + request_manager.next_request(&mut response_manager, request_props, peer_advertised); + assert!(outgoing.is_some()); + } + assert_eq!(response_manager.active_peers.len(), 2); + assert!(response_manager.is_sending_to(&requested_peer_1)); + assert!(response_manager.is_sending_to(&requested_peer_2)); + assert_eq!(request_manager.requests.len(), 2); + + // Add request for candidate 2 from peer 1 + let _identifier2 = request_manager + .get_or_insert(relay_parent, candidate_2, 1.into()) + .identifier + .clone(); + request_manager + .get_or_insert(relay_parent, candidate_2, 1.into()) + .add_peer(requested_peer_1); + + // Do not dispatch the request for the second candidate from peer 1 (already serving that + // peer) + let outgoing = + request_manager.next_request(&mut response_manager, request_props, peer_advertised); + assert!(outgoing.is_none()); + assert_eq!(response_manager.active_peers.len(), 2); + assert!(response_manager.is_sending_to(&requested_peer_1)); + assert!(response_manager.is_sending_to(&requested_peer_2)); + assert_eq!(request_manager.requests.len(), 3); + + // Manually mark response received (response future resolved) + response_manager.active_peers.remove(&requested_peer_1); + response_manager.pending_responses = FuturesUnordered::new(); + + // Validate first response (candidate 1 from peer 1) + { + let statements = vec![]; + let response = UnhandledResponse { + response: TaggedResponse { + identifier: identifier1, + requested_peer: requested_peer_1, + props: request_properties.clone(), + response: Ok(AttestedCandidateResponse { + candidate_receipt: candidate_receipt_1.clone(), + persisted_validation_data: persisted_validation_data_1.clone(), + statements, + }), + }, + }; + let validator_key_lookup = |_v| None; + let allowed_para_lookup = |_para, _g_index| true; + let _output = response.validate_response( + &mut request_manager, + group, + 0, + validator_key_lookup, + allowed_para_lookup, + disabled_mask.clone(), + ); + + // First request served successfully + assert_eq!(request_manager.requests.len(), 2); + assert_eq!(response_manager.active_peers.len(), 1); + assert!(response_manager.is_sending_to(&requested_peer_2)); + } + + // Check if the request that was ignored previously will be served now + let outgoing = + request_manager.next_request(&mut response_manager, request_props, peer_advertised); + assert!(outgoing.is_some()); + assert_eq!(response_manager.active_peers.len(), 2); + assert!(response_manager.is_sending_to(&requested_peer_1)); + assert!(response_manager.is_sending_to(&requested_peer_2)); + assert_eq!(request_manager.requests.len(), 2); + } } diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs b/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs index 8cf13980214..c9de42d2c46 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs @@ -1891,7 +1891,7 @@ fn local_node_sanity_checks_incoming_requests() { let mask = StatementFilter::blank(state.config.group_size + 1); let response = state .send_request( - peer_c, + peer_a, request_v2::AttestedCandidateRequest { candidate_hash: candidate.hash(), mask }, ) .await diff --git a/polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.toml b/polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.toml new file mode 100644 index 00000000000..14208425d62 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.toml @@ -0,0 +1,43 @@ +[settings] +timeout = 1000 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config] + needed_approvals = 2 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 5 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +default_command = "polkadot" + +[relaychain.default_resources] +limits = { memory = "4G", cpu = "2" } +requests = { memory = "2G", cpu = "1" } + + [[relaychain.node_groups]] + name = "honest" + count = 4 + args = ["-lparachain=debug,parachain::statement-distribution=trace"] + + [[relaychain.nodes]] + image = "{{MALUS_IMAGE}}" + name = "malus" + command = "malus spam-statement-requests" + args = [ "--alice", "-lparachain=debug,MALUS=trace", "--spam-factor=1000" ] + +{% for id in range(2000,2001) %} +[[parachains]] +id = {{id}} + [parachains.collator] + image = "{{COL_IMAGE}}" + name = "collator" + command = "undying-collator" + args = ["-lparachain=debug"] +{% endfor %} + +[types.Header] +number = "u64" +parent_hash = "Hash" +post_state = "Hash" diff --git a/polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.zndsl b/polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.zndsl new file mode 100644 index 00000000000..9985dd24ee3 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0012-spam-statement-distribution-requests.zndsl @@ -0,0 +1,27 @@ +Description: Test if parachains progress when group is getting spammed by statement distribution requests. +Network: ./0012-spam-statement-distribution-requests.toml +Creds: config + +# Check authority status and peers. +malus: reports node_roles is 4 +honest: reports node_roles is 4 + +# Ensure parachains are registered. +honest: parachain 2000 is registered within 60 seconds + +# Ensure that malus is already attempting to DoS +malus: log line contains "😈 Duplicating AttestedCandidateV2 request" within 90 seconds + +# Ensure parachains made progress. +honest: parachain 2000 block height is at least 10 within 200 seconds + +# Ensure that honest nodes drop extra requests +honest: log line contains "Peer already being served, dropping request" within 60 seconds + +# Check lag - approval +honest: reports polkadot_parachain_approval_checking_finality_lag is 0 + +# Check lag - dispute conclusion +honest: reports polkadot_parachain_disputes_finality_lag is 0 + + diff --git a/prdoc/pr_3444.prdoc b/prdoc/pr_3444.prdoc new file mode 100644 index 00000000000..3afb3810641 --- /dev/null +++ b/prdoc/pr_3444.prdoc @@ -0,0 +1,25 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Rate-limiting of statement distribution v2 requests to 1 per peer + +doc: + - audience: Node Dev + description: | + A new malicious node variant that sends duplicate statement + distribution messages to spam other peers. + + - audience: Node Operator + description: | + Added rate-limiting in the statement distribution request-response + protocol. Requesters will not issue another request to a peer if one + is already pending with that peer and receiving nodes will reject + requests from peers that they are currently serving. + This should reduce the risk of validator-validator DoS attacks and + better load-balance statement distribution. + +crates: + - name: polkadot-test-malus + bump: minor + - name: polkadot-statement-distribution + bump: minor -- GitLab From e5a93fbcd4a6acec7ab83865708e5c5df3534a7b Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 1 May 2024 22:01:55 +0200 Subject: [PATCH 031/170] HRMP - set `DefaultChannelSizeAndCapacityWithSystem` with dynamic values according to the `ActiveConfig` (#4332) ## Summary This PR enhances the capability to set `DefaultChannelSizeAndCapacityWithSystem` for HRMP. Currently, all testnets (Rococo, Westend) have a hard-coded value set as 'half of the maximum' determined by the live `ActiveConfig`. While this approach appears satisfactory, potential issues could arise if the live `ActiveConfig` are adjusted below these hard-coded values, necessitating a new runtime release with updated values. Additionally, hard-coded values have consequences, such as Rococo's benchmarks not functioning: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6082656. ## Solution The proposed solution here is to utilize `ActiveConfigHrmpChannelSizeAndCapacityRatio`, which reads the current `ActiveConfig` and calculates `DefaultChannelSizeAndCapacityWithSystem`, for example, "half of the maximum" based on live data. This way, whenever `ActiveConfig` is modified, `ActiveConfigHrmpChannelSizeAndCapacityRatio` automatically returns adjusted values with the appropriate ratio. Thus, manual adjustments and new runtime releases become unnecessary. Relates to a comment/discussion: https://github.com/paritytech/polkadot-sdk/pull/3721/files#r1541001420 Relates to a comment/discussion: https://github.com/paritytech/polkadot-sdk/pull/3721/files#r1549291588 --------- Co-authored-by: command-bot <> --- .../runtime/parachains/src/configuration.rs | 15 +- .../parachains/src/configuration/tests.rs | 50 +- polkadot/runtime/rococo/src/lib.rs | 8 +- .../src/weights/runtime_parachains_hrmp.rs | 429 +++++++++--------- polkadot/runtime/test-runtime/src/lib.rs | 13 +- polkadot/runtime/westend/src/lib.rs | 8 +- .../src/weights/runtime_parachains_hrmp.rs | 412 +++++++++-------- 7 files changed, 521 insertions(+), 414 deletions(-) diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index b5dad6c6e86..34923897f02 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -30,7 +30,7 @@ use primitives::{ NodeFeatures, SessionIndex, LEGACY_MIN_BACKING_VOTES, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE, ON_DEMAND_MAX_QUEUE_MAX_SIZE, }; -use sp_runtime::{traits::Zero, Perbill}; +use sp_runtime::{traits::Zero, Perbill, Percent}; use sp_std::prelude::*; #[cfg(test)] @@ -1460,3 +1460,16 @@ impl Pallet { Ok(()) } } + +/// The implementation of `Get<(u32, u32)>` which reads `ActiveConfig` and returns `P` percent of +/// `hrmp_channel_max_message_size` / `hrmp_channel_max_capacity`. +pub struct ActiveConfigHrmpChannelSizeAndCapacityRatio(sp_std::marker::PhantomData<(T, P)>); +impl> Get<(u32, u32)> + for ActiveConfigHrmpChannelSizeAndCapacityRatio +{ + fn get() -> (u32, u32) { + let config = ActiveConfig::::get(); + let percent = P::get(); + (percent * config.hrmp_channel_max_message_size, percent * config.hrmp_channel_max_capacity) + } +} diff --git a/polkadot/runtime/parachains/src/configuration/tests.rs b/polkadot/runtime/parachains/src/configuration/tests.rs index 239b466fde3..64bbb8481fc 100644 --- a/polkadot/runtime/parachains/src/configuration/tests.rs +++ b/polkadot/runtime/parachains/src/configuration/tests.rs @@ -17,7 +17,7 @@ use super::*; use crate::{ configuration, - mock::{new_test_ext, Configuration, ParasShared, RuntimeOrigin, Test}, + mock::{new_test_ext, Configuration, MockGenesisConfig, ParasShared, RuntimeOrigin, Test}, }; use bitvec::{bitvec, prelude::Lsb0}; use frame_support::{assert_err, assert_noop, assert_ok}; @@ -547,3 +547,51 @@ fn verify_externally_accessible() { ); }); } + +#[test] +fn active_config_hrmp_channel_size_and_capacity_ratio_works() { + frame_support::parameter_types! { + pub Ratio100: Percent = Percent::from_percent(100); + pub Ratio50: Percent = Percent::from_percent(50); + } + + let mut genesis: MockGenesisConfig = Default::default(); + genesis.configuration.config.hrmp_channel_max_message_size = 1024; + genesis.configuration.config.hrmp_channel_max_capacity = 100; + + new_test_ext(genesis).execute_with(|| { + let active_config = configuration::ActiveConfig::::get(); + assert_eq!(active_config.hrmp_channel_max_message_size, 1024); + assert_eq!(active_config.hrmp_channel_max_capacity, 100); + + assert_eq!( + ActiveConfigHrmpChannelSizeAndCapacityRatio::::get(), + (1024, 100) + ); + assert_eq!(ActiveConfigHrmpChannelSizeAndCapacityRatio::::get(), (512, 50)); + + // change ActiveConfig + assert_ok!(Configuration::set_hrmp_channel_max_message_size( + RuntimeOrigin::root(), + active_config.hrmp_channel_max_message_size * 4 + )); + assert_ok!(Configuration::set_hrmp_channel_max_capacity( + RuntimeOrigin::root(), + active_config.hrmp_channel_max_capacity * 4 + )); + on_new_session(1); + on_new_session(2); + let active_config = configuration::ActiveConfig::::get(); + assert_eq!(active_config.hrmp_channel_max_message_size, 4096); + assert_eq!(active_config.hrmp_channel_max_capacity, 400); + + assert_eq!( + ActiveConfigHrmpChannelSizeAndCapacityRatio::::get(), + (4096, 400) + ); + assert_eq!( + ActiveConfigHrmpChannelSizeAndCapacityRatio::::get(), + (2048, 200) + ); + }) +} diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 287ae9937da..a52d800ad38 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -53,6 +53,7 @@ use runtime_common::{ use runtime_parachains::{ assigner_coretime as parachains_assigner_coretime, assigner_on_demand as parachains_assigner_on_demand, configuration as parachains_configuration, + configuration::ActiveConfigHrmpChannelSizeAndCapacityRatio, coretime, disputes as parachains_disputes, disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, @@ -1033,7 +1034,7 @@ impl pallet_message_queue::Config for Runtime { impl parachains_dmp::Config for Runtime {} parameter_types! { - pub const DefaultChannelSizeAndCapacityWithSystem: (u32, u32) = (51200, 500); + pub const HrmpChannelSizeAndCapacityWithSystemRatio: Percent = Percent::from_percent(100); } impl parachains_hrmp::Config for Runtime { @@ -1041,7 +1042,10 @@ impl parachains_hrmp::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ChannelManager = EnsureRoot; type Currency = Balances; - type DefaultChannelSizeAndCapacityWithSystem = DefaultChannelSizeAndCapacityWithSystem; + type DefaultChannelSizeAndCapacityWithSystem = ActiveConfigHrmpChannelSizeAndCapacityRatio< + Runtime, + HrmpChannelSizeAndCapacityWithSystemRatio, + >; type WeightInfo = weights::runtime_parachains_hrmp::WeightInfo; } diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs index 97b84155b36..1d83e97ef0e 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs @@ -16,25 +16,26 @@ //! Autogenerated weights for `runtime_parachains::hrmp` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // pallet -// --chain=rococo-dev // --steps=50 // --repeat=20 -// --pallet=runtime_parachains::hrmp // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled -// --header=./file_header.txt -// --output=./runtime/rococo/src/weights/runtime_parachains_hrmp.rs +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=runtime_parachains::hrmp +// --chain=rococo-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/rococo/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,105 +48,97 @@ use core::marker::PhantomData; /// Weight functions for `runtime_parachains::hrmp`. pub struct WeightInfo(PhantomData); impl runtime_parachains::hrmp::WeightInfo for WeightInfo { - /// Storage: Paras ParaLifecycles (r:2 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Configuration ActiveConfig (r:1 w:0) - /// Proof Skipped: Configuration ActiveConfig (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:1 w:0) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn hrmp_init_open_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `704` - // Estimated: `6644` - // Minimum execution time: 41_564_000 picoseconds. - Weight::from_parts(42_048_000, 0) - .saturating_add(Weight::from_parts(0, 6644)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `488` + // Estimated: `3953` + // Minimum execution time: 34_034_000 picoseconds. + Weight::from_parts(35_191_000, 0) + .saturating_add(Weight::from_parts(0, 3953)) + .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) } - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Configuration ActiveConfig (r:1 w:0) - /// Proof Skipped: Configuration ActiveConfig (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Paras ParaLifecycles (r:1 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn hrmp_accept_open_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `936` - // Estimated: `4401` - // Minimum execution time: 43_570_000 picoseconds. - Weight::from_parts(44_089_000, 0) - .saturating_add(Weight::from_parts(0, 4401)) - .saturating_add(T::DbWeight::get().reads(7)) + // Measured: `478` + // Estimated: `3943` + // Minimum execution time: 30_115_000 picoseconds. + Weight::from_parts(31_060_000, 0) + .saturating_add(Weight::from_parts(0, 3943)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: Hrmp HrmpChannels (r:1 w:0) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpCloseChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpCloseChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpCloseChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpCloseChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Configuration ActiveConfig (r:1 w:0) - /// Proof Skipped: Configuration ActiveConfig (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpCloseChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn hrmp_close_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `807` - // Estimated: `4272` - // Minimum execution time: 36_594_000 picoseconds. - Weight::from_parts(37_090_000, 0) - .saturating_add(Weight::from_parts(0, 4272)) - .saturating_add(T::DbWeight::get().reads(6)) + // Measured: `591` + // Estimated: `4056` + // Minimum execution time: 30_982_000 picoseconds. + Weight::from_parts(32_034_000, 0) + .saturating_add(Weight::from_parts(0, 4056)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: Hrmp HrmpIngressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:254 w:254) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:0 w:1) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelContents (r:0 w:254) - /// Proof Skipped: Hrmp HrmpChannelContents (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:0 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:254 w:254) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:0 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelContents` (r:0 w:254) + /// Proof: `Hrmp::HrmpChannelContents` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:0 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 127]`. /// The range of component `e` is `[0, 127]`. fn force_clean_hrmp(i: u32, e: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `264 + e * (100 ±0) + i * (100 ±0)` - // Estimated: `3726 + e * (2575 ±0) + i * (2575 ±0)` - // Minimum execution time: 1_085_140_000 picoseconds. - Weight::from_parts(1_100_901_000, 0) - .saturating_add(Weight::from_parts(0, 3726)) - // Standard Error: 98_982 - .saturating_add(Weight::from_parts(3_229_112, 0).saturating_mul(i.into())) - // Standard Error: 98_982 - .saturating_add(Weight::from_parts(3_210_944, 0).saturating_mul(e.into())) + // Measured: `297 + e * (100 ±0) + i * (100 ±0)` + // Estimated: `3759 + e * (2575 ±0) + i * (2575 ±0)` + // Minimum execution time: 1_158_665_000 picoseconds. + Weight::from_parts(1_164_378_000, 0) + .saturating_add(Weight::from_parts(0, 3759)) + // Standard Error: 103_726 + .saturating_add(Weight::from_parts(3_444_855, 0).saturating_mul(i.into())) + // Standard Error: 103_726 + .saturating_add(Weight::from_parts(3_527_628, 0).saturating_mul(e.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(e.into()))) @@ -155,139 +148,139 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf .saturating_add(Weight::from_parts(0, 2575).saturating_mul(e.into())) .saturating_add(Weight::from_parts(0, 2575).saturating_mul(i.into())) } - /// Storage: Configuration ActiveConfig (r:1 w:0) - /// Proof Skipped: Configuration ActiveConfig (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:128 w:128) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras ParaLifecycles (r:256 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:128 w:128) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:128 w:128) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:0 w:128) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:128 w:128) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:256 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:128 w:128) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:128 w:128) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:0 w:128) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn force_process_hrmp_open(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `779 + c * (136 ±0)` - // Estimated: `2234 + c * (5086 ±0)` - // Minimum execution time: 10_497_000 picoseconds. - Weight::from_parts(6_987_455, 0) - .saturating_add(Weight::from_parts(0, 2234)) - // Standard Error: 18_540 - .saturating_add(Weight::from_parts(18_788_534, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `525 + c * (136 ±0)` + // Estimated: `1980 + c * (5086 ±0)` + // Minimum execution time: 5_870_000 picoseconds. + Weight::from_parts(2_363_864, 0) + .saturating_add(Weight::from_parts(0, 1980)) + // Standard Error: 16_657 + .saturating_add(Weight::from_parts(20_507_232, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((6_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 5086).saturating_mul(c.into())) } - /// Storage: Hrmp HrmpCloseChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpCloseChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:128 w:128) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpCloseChannelRequests (r:0 w:128) - /// Proof Skipped: Hrmp HrmpCloseChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelContents (r:0 w:128) - /// Proof Skipped: Hrmp HrmpChannelContents (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:128 w:128) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpCloseChannelRequests` (r:0 w:128) + /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelContents` (r:0 w:128) + /// Proof: `Hrmp::HrmpChannelContents` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn force_process_hrmp_close(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `335 + c * (124 ±0)` - // Estimated: `1795 + c * (2600 ±0)` - // Minimum execution time: 6_575_000 picoseconds. - Weight::from_parts(1_228_642, 0) - .saturating_add(Weight::from_parts(0, 1795)) - // Standard Error: 14_826 - .saturating_add(Weight::from_parts(11_604_038, 0).saturating_mul(c.into())) + // Measured: `368 + c * (124 ±0)` + // Estimated: `1828 + c * (2600 ±0)` + // Minimum execution time: 4_766_000 picoseconds. + Weight::from_parts(4_988_812, 0) + .saturating_add(Weight::from_parts(0, 1828)) + // Standard Error: 10_606 + .saturating_add(Weight::from_parts(12_579_429, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2600).saturating_mul(c.into())) } - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn hrmp_cancel_open_request(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1026 + c * (13 ±0)` - // Estimated: `4295 + c * (15 ±0)` - // Minimum execution time: 22_301_000 picoseconds. - Weight::from_parts(26_131_473, 0) - .saturating_add(Weight::from_parts(0, 4295)) - // Standard Error: 830 - .saturating_add(Weight::from_parts(49_448, 0).saturating_mul(c.into())) + // Measured: `1059 + c * (13 ±0)` + // Estimated: `4328 + c * (15 ±0)` + // Minimum execution time: 17_228_000 picoseconds. + Weight::from_parts(27_236_563, 0) + .saturating_add(Weight::from_parts(0, 4328)) + // Standard Error: 2_419 + .saturating_add(Weight::from_parts(102_107, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 15).saturating_mul(c.into())) } - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:128 w:128) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:128 w:128) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn clean_open_channel_requests(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `243 + c * (63 ±0)` - // Estimated: `1722 + c * (2538 ±0)` - // Minimum execution time: 5_234_000 picoseconds. - Weight::from_parts(7_350_270, 0) - .saturating_add(Weight::from_parts(0, 1722)) - // Standard Error: 3_105 - .saturating_add(Weight::from_parts(2_981_935, 0).saturating_mul(c.into())) + // Measured: `276 + c * (63 ±0)` + // Estimated: `1755 + c * (2538 ±0)` + // Minimum execution time: 3_549_000 picoseconds. + Weight::from_parts(5_799_542, 0) + .saturating_add(Weight::from_parts(0, 1755)) + // Standard Error: 3_025 + .saturating_add(Weight::from_parts(3_173_294, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2538).saturating_mul(c.into())) } - /// Storage: Paras ParaLifecycles (r:2 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Configuration ActiveConfig (r:1 w:0) - /// Proof Skipped: Configuration ActiveConfig (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:1 w:0) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:2 w:2) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:2 w:2) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - fn force_open_hrmp_channel(_c: u32, ) -> Weight { + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `c` is `[0, 1]`. + fn force_open_hrmp_channel(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `704` - // Estimated: `6644` - // Minimum execution time: 55_611_000 picoseconds. - Weight::from_parts(56_488_000, 0) - .saturating_add(Weight::from_parts(0, 6644)) - .saturating_add(T::DbWeight::get().reads(14)) + // Measured: `488 + c * (235 ±0)` + // Estimated: `6428 + c * (235 ±0)` + // Minimum execution time: 48_392_000 picoseconds. + Weight::from_parts(50_509_977, 0) + .saturating_add(Weight::from_parts(0, 6428)) + // Standard Error: 133_658 + .saturating_add(Weight::from_parts(10_215_322, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) + .saturating_add(Weight::from_parts(0, 235).saturating_mul(c.into())) } /// Storage: `Paras::ParaLifecycles` (r:1 w:0) /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -311,11 +304,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) fn establish_system_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `417` - // Estimated: `6357` - // Minimum execution time: 629_674_000 picoseconds. - Weight::from_parts(640_174_000, 0) - .saturating_add(Weight::from_parts(0, 6357)) + // Measured: `488` + // Estimated: `6428` + // Minimum execution time: 48_465_000 picoseconds. + Weight::from_parts(50_433_000, 0) + .saturating_add(Weight::from_parts(0, 6428)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) } @@ -323,22 +316,42 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) fn poke_channel_deposits() -> Weight { // Proof Size summary in bytes: - // Measured: `263` - // Estimated: `3728` - // Minimum execution time: 173_371_000 picoseconds. - Weight::from_parts(175_860_000, 0) - .saturating_add(Weight::from_parts(0, 3728)) + // Measured: `296` + // Estimated: `3761` + // Minimum execution time: 11_835_000 picoseconds. + Weight::from_parts(12_380_000, 0) + .saturating_add(Weight::from_parts(0, 3761)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Paras::ParaLifecycles` (r:2 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:2 w:2) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:2 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:2 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:2 w:2) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:2 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:2 w:2) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) fn establish_channel_with_system() -> Weight { // Proof Size summary in bytes: - // Measured: `417` - // Estimated: `6357` - // Minimum execution time: 629_674_000 picoseconds. - Weight::from_parts(640_174_000, 0) - .saturating_add(Weight::from_parts(0, 6357)) - .saturating_add(T::DbWeight::get().reads(12)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `488` + // Estimated: `6428` + // Minimum execution time: 79_633_000 picoseconds. + Weight::from_parts(80_846_000, 0) + .saturating_add(Weight::from_parts(0, 6428)) + .saturating_add(T::DbWeight::get().reads(19)) + .saturating_add(T::DbWeight::get().writes(11)) } } diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 87becf73cb7..b56e2f52f5f 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -29,7 +29,9 @@ use sp_std::{ use polkadot_runtime_parachains::{ assigner_parachains as parachains_assigner_parachains, - configuration as parachains_configuration, disputes as parachains_disputes, + configuration as parachains_configuration, + configuration::ActiveConfigHrmpChannelSizeAndCapacityRatio, + disputes as parachains_disputes, disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras, @@ -78,7 +80,7 @@ use sp_runtime::{ SaturatedConversion, StaticLookup, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, + ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, }; use sp_staking::SessionIndex; #[cfg(any(feature = "std", test))] @@ -557,7 +559,7 @@ impl parachains_dmp::Config for Runtime {} parameter_types! { pub const FirstMessageFactorPercent: u64 = 100; - pub const DefaultChannelSizeAndCapacityWithSystem: (u32, u32) = (51200, 500); + pub const HrmpChannelSizeAndCapacityWithSystemRatio: Percent = Percent::from_percent(100); } impl parachains_hrmp::Config for Runtime { @@ -565,7 +567,10 @@ impl parachains_hrmp::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ChannelManager = frame_system::EnsureRoot; type Currency = Balances; - type DefaultChannelSizeAndCapacityWithSystem = DefaultChannelSizeAndCapacityWithSystem; + type DefaultChannelSizeAndCapacityWithSystem = ActiveConfigHrmpChannelSizeAndCapacityRatio< + Runtime, + HrmpChannelSizeAndCapacityWithSystemRatio, + >; type WeightInfo = parachains_hrmp::TestWeightInfo; } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 7125f5d34c4..f51233cabf0 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -68,6 +68,7 @@ use runtime_common::{ use runtime_parachains::{ assigner_coretime as parachains_assigner_coretime, assigner_on_demand as parachains_assigner_on_demand, configuration as parachains_configuration, + configuration::ActiveConfigHrmpChannelSizeAndCapacityRatio, coretime, disputes as parachains_disputes, disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, @@ -1163,7 +1164,7 @@ impl pallet_message_queue::Config for Runtime { impl parachains_dmp::Config for Runtime {} parameter_types! { - pub const DefaultChannelSizeAndCapacityWithSystem: (u32, u32) = (4096, 4); + pub const HrmpChannelSizeAndCapacityWithSystemRatio: Percent = Percent::from_percent(100); } impl parachains_hrmp::Config for Runtime { @@ -1171,7 +1172,10 @@ impl parachains_hrmp::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ChannelManager = EnsureRoot; type Currency = Balances; - type DefaultChannelSizeAndCapacityWithSystem = DefaultChannelSizeAndCapacityWithSystem; + type DefaultChannelSizeAndCapacityWithSystem = ActiveConfigHrmpChannelSizeAndCapacityRatio< + Runtime, + HrmpChannelSizeAndCapacityWithSystemRatio, + >; type WeightInfo = weights::runtime_parachains_hrmp::WeightInfo; } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs index 3d2ab827b8f..529bdf76105 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs @@ -16,28 +16,26 @@ //! Autogenerated weights for `runtime_parachains::hrmp` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner--ss9ysm1-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // pallet -// --chain=westend-dev // --steps=50 // --repeat=20 -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --pallet=runtime_parachains::hrmp // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled -// --header=./file_header.txt -// --output=./runtime/westend/src/weights/runtime_parachains_hrmp.rs +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=runtime_parachains::hrmp +// --chain=westend-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,99 +48,97 @@ use core::marker::PhantomData; /// Weight functions for `runtime_parachains::hrmp`. pub struct WeightInfo(PhantomData); impl runtime_parachains::hrmp::WeightInfo for WeightInfo { - /// Storage: Paras ParaLifecycles (r:2 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:1 w:0) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn hrmp_init_open_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `307` - // Estimated: `6247` - // Minimum execution time: 35_676_000 picoseconds. - Weight::from_parts(36_608_000, 0) - .saturating_add(Weight::from_parts(0, 6247)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `455` + // Estimated: `3920` + // Minimum execution time: 32_195_000 picoseconds. + Weight::from_parts(33_340_000, 0) + .saturating_add(Weight::from_parts(0, 3920)) + .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) } - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras ParaLifecycles (r:1 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn hrmp_accept_open_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `421` - // Estimated: `3886` - // Minimum execution time: 32_773_000 picoseconds. - Weight::from_parts(33_563_000, 0) - .saturating_add(Weight::from_parts(0, 3886)) - .saturating_add(T::DbWeight::get().reads(6)) + // Measured: `445` + // Estimated: `3910` + // Minimum execution time: 28_644_000 picoseconds. + Weight::from_parts(29_581_000, 0) + .saturating_add(Weight::from_parts(0, 3910)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: Hrmp HrmpChannels (r:1 w:0) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpCloseChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpCloseChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpCloseChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpCloseChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpCloseChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn hrmp_close_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `238` - // Estimated: `3703` - // Minimum execution time: 28_134_000 picoseconds. - Weight::from_parts(29_236_000, 0) - .saturating_add(Weight::from_parts(0, 3703)) + // Measured: `558` + // Estimated: `4023` + // Minimum execution time: 31_824_000 picoseconds. + Weight::from_parts(33_207_000, 0) + .saturating_add(Weight::from_parts(0, 4023)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: Hrmp HrmpIngressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:254 w:254) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:0 w:1) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelContents (r:0 w:254) - /// Proof Skipped: Hrmp HrmpChannelContents (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:0 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:254 w:254) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:0 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelContents` (r:0 w:254) + /// Proof: `Hrmp::HrmpChannelContents` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:0 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 127]`. /// The range of component `e` is `[0, 127]`. fn force_clean_hrmp(i: u32, e: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `158 + e * (100 ±0) + i * (100 ±0)` - // Estimated: `3620 + e * (2575 ±0) + i * (2575 ±0)` - // Minimum execution time: 1_217_145_000 picoseconds. - Weight::from_parts(1_251_187_000, 0) - .saturating_add(Weight::from_parts(0, 3620)) - // Standard Error: 118_884 - .saturating_add(Weight::from_parts(4_002_678, 0).saturating_mul(i.into())) - // Standard Error: 118_884 - .saturating_add(Weight::from_parts(3_641_596, 0).saturating_mul(e.into())) + // Measured: `264 + e * (100 ±0) + i * (100 ±0)` + // Estimated: `3726 + e * (2575 ±0) + i * (2575 ±0)` + // Minimum execution time: 1_213_331_000 picoseconds. + Weight::from_parts(1_217_120_000, 0) + .saturating_add(Weight::from_parts(0, 3726)) + // Standard Error: 108_190 + .saturating_add(Weight::from_parts(3_485_701, 0).saturating_mul(i.into())) + // Standard Error: 108_190 + .saturating_add(Weight::from_parts(3_564_287, 0).saturating_mul(e.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(e.into()))) @@ -152,135 +148,139 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf .saturating_add(Weight::from_parts(0, 2575).saturating_mul(e.into())) .saturating_add(Weight::from_parts(0, 2575).saturating_mul(i.into())) } - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:128 w:128) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras ParaLifecycles (r:256 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:128 w:128) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:128 w:128) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:0 w:128) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:128 w:128) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:256 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:128 w:128) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:128 w:128) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:0 w:128) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn force_process_hrmp_open(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `386 + c * (136 ±0)` - // Estimated: `1841 + c * (5086 ±0)` - // Minimum execution time: 6_277_000 picoseconds. - Weight::from_parts(6_357_000, 0) - .saturating_add(Weight::from_parts(0, 1841)) - // Standard Error: 41_189 - .saturating_add(Weight::from_parts(22_159_709, 0).saturating_mul(c.into())) + // Measured: `492 + c * (136 ±0)` + // Estimated: `1947 + c * (5086 ±0)` + // Minimum execution time: 6_040_000 picoseconds. + Weight::from_parts(5_644_307, 0) + .saturating_add(Weight::from_parts(0, 1947)) + // Standard Error: 12_852 + .saturating_add(Weight::from_parts(21_031_626, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((6_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 5086).saturating_mul(c.into())) } - /// Storage: Hrmp HrmpCloseChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpCloseChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:128 w:128) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:128 w:128) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpCloseChannelRequests (r:0 w:128) - /// Proof Skipped: Hrmp HrmpCloseChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelContents (r:0 w:128) - /// Proof Skipped: Hrmp HrmpChannelContents (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:128 w:128) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpCloseChannelRequests` (r:0 w:128) + /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelContents` (r:0 w:128) + /// Proof: `Hrmp::HrmpChannelContents` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn force_process_hrmp_close(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `229 + c * (124 ±0)` - // Estimated: `1689 + c * (2600 ±0)` - // Minimum execution time: 5_070_000 picoseconds. - Weight::from_parts(5_225_000, 0) - .saturating_add(Weight::from_parts(0, 1689)) - // Standard Error: 24_173 - .saturating_add(Weight::from_parts(13_645_307, 0).saturating_mul(c.into())) + // Measured: `335 + c * (124 ±0)` + // Estimated: `1795 + c * (2600 ±0)` + // Minimum execution time: 4_950_000 picoseconds. + Weight::from_parts(5_215_558, 0) + .saturating_add(Weight::from_parts(0, 1795)) + // Standard Error: 9_231 + .saturating_add(Weight::from_parts(12_770_147, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2600).saturating_mul(c.into())) } - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn hrmp_cancel_open_request(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `920 + c * (13 ±0)` - // Estimated: `4189 + c * (15 ±0)` - // Minimum execution time: 20_449_000 picoseconds. - Weight::from_parts(30_861_799, 0) - .saturating_add(Weight::from_parts(0, 4189)) - // Standard Error: 6_642 - .saturating_add(Weight::from_parts(236_293, 0).saturating_mul(c.into())) + // Measured: `1026 + c * (13 ±0)` + // Estimated: `4295 + c * (15 ±0)` + // Minimum execution time: 17_550_000 picoseconds. + Weight::from_parts(25_522_933, 0) + .saturating_add(Weight::from_parts(0, 4295)) + // Standard Error: 2_332 + .saturating_add(Weight::from_parts(121_128, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 15).saturating_mul(c.into())) } - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:128 w:128) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:128 w:128) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `c` is `[0, 128]`. fn clean_open_channel_requests(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `137 + c * (63 ±0)` - // Estimated: `1616 + c * (2538 ±0)` - // Minimum execution time: 3_911_000 picoseconds. - Weight::from_parts(5_219_837, 0) - .saturating_add(Weight::from_parts(0, 1616)) - // Standard Error: 10_219 - .saturating_add(Weight::from_parts(3_647_782, 0).saturating_mul(c.into())) + // Measured: `243 + c * (63 ±0)` + // Estimated: `1722 + c * (2538 ±0)` + // Minimum execution time: 3_782_000 picoseconds. + Weight::from_parts(5_263_610, 0) + .saturating_add(Weight::from_parts(0, 1722)) + // Standard Error: 3_152 + .saturating_add(Weight::from_parts(3_309_777, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2538).saturating_mul(c.into())) } - /// Storage: Paras ParaLifecycles (r:2 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequests (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannels (r:1 w:0) - /// Proof Skipped: Hrmp HrmpChannels (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpEgressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpEgressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestCount (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpOpenChannelRequestsList (r:1 w:1) - /// Proof Skipped: Hrmp HrmpOpenChannelRequestsList (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:2 w:2) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueueHeads (r:2 w:2) - /// Proof Skipped: Dmp DownwardMessageQueueHeads (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpIngressChannelsIndex (r:1 w:0) - /// Proof Skipped: Hrmp HrmpIngressChannelsIndex (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpAcceptedChannelRequestCount (r:1 w:1) - /// Proof Skipped: Hrmp HrmpAcceptedChannelRequestCount (max_values: None, max_size: None, mode: Measured) - fn force_open_hrmp_channel(_c: u32, ) -> Weight { + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `c` is `[0, 1]`. + fn force_open_hrmp_channel(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `307` - // Estimated: `6247` - // Minimum execution time: 50_870_000 picoseconds. - Weight::from_parts(53_335_000, 0) - .saturating_add(Weight::from_parts(0, 6247)) - .saturating_add(T::DbWeight::get().reads(13)) + // Measured: `455 + c * (235 ±0)` + // Estimated: `6395 + c * (235 ±0)` + // Minimum execution time: 46_445_000 picoseconds. + Weight::from_parts(48_376_448, 0) + .saturating_add(Weight::from_parts(0, 6395)) + // Standard Error: 130_148 + .saturating_add(Weight::from_parts(13_606_551, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) + .saturating_add(Weight::from_parts(0, 235).saturating_mul(c.into())) } /// Storage: `Paras::ParaLifecycles` (r:1 w:0) /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -304,11 +304,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) fn establish_system_channel() -> Weight { // Proof Size summary in bytes: - // Measured: `417` - // Estimated: `6357` - // Minimum execution time: 629_674_000 picoseconds. - Weight::from_parts(640_174_000, 0) - .saturating_add(Weight::from_parts(0, 6357)) + // Measured: `455` + // Estimated: `6395` + // Minimum execution time: 46_563_000 picoseconds. + Weight::from_parts(48_015_000, 0) + .saturating_add(Weight::from_parts(0, 6395)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) } @@ -318,20 +318,40 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `263` // Estimated: `3728` - // Minimum execution time: 173_371_000 picoseconds. - Weight::from_parts(175_860_000, 0) + // Minimum execution time: 12_252_000 picoseconds. + Weight::from_parts(12_550_000, 0) .saturating_add(Weight::from_parts(0, 3728)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Paras::ParaLifecycles` (r:2 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:2 w:2) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:2 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:2 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:2 w:2) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:2 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:2 w:2) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) fn establish_channel_with_system() -> Weight { // Proof Size summary in bytes: - // Measured: `417` - // Estimated: `6357` - // Minimum execution time: 629_674_000 picoseconds. - Weight::from_parts(640_174_000, 0) - .saturating_add(Weight::from_parts(0, 6357)) - .saturating_add(T::DbWeight::get().reads(12)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `455` + // Estimated: `6395` + // Minimum execution time: 79_503_000 picoseconds. + Weight::from_parts(81_630_000, 0) + .saturating_add(Weight::from_parts(0, 6395)) + .saturating_add(T::DbWeight::get().reads(19)) + .saturating_add(T::DbWeight::get().writes(11)) } } -- GitLab From 14c4afc5382dcb18095af5c090e2aa1af65ecae6 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Thu, 2 May 2024 09:21:11 +0200 Subject: [PATCH 032/170] [Backport] Version bumps and reorg prdocs from 1.11.0 (#4336) This PR backports version bumps and reorganization of the `prdocs` from `1.11.0` release branch back to master --- .../parachains/runtimes/assets/asset-hub-rococo/src/lib.rs | 4 ++-- .../parachains/runtimes/assets/asset-hub-westend/src/lib.rs | 4 ++-- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 4 ++-- .../runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs | 4 ++-- .../runtimes/collectives/collectives-westend/src/lib.rs | 4 ++-- .../parachains/runtimes/contracts/contracts-rococo/src/lib.rs | 4 ++-- .../parachains/runtimes/coretime/coretime-rococo/src/lib.rs | 4 ++-- .../parachains/runtimes/coretime/coretime-westend/src/lib.rs | 4 ++-- .../parachains/runtimes/glutton/glutton-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-rococo/src/lib.rs | 4 ++-- cumulus/parachains/runtimes/people/people-westend/src/lib.rs | 4 ++-- .../parachains/runtimes/testing/rococo-parachain/src/lib.rs | 2 +- polkadot/node/primitives/src/lib.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 4 ++-- polkadot/runtime/westend/src/lib.rs | 4 ++-- prdoc/{ => 1.11.0}/pr_2119.prdoc | 0 prdoc/{ => 1.11.0}/pr_2292.prdoc | 0 prdoc/{ => 1.11.0}/pr_2714.prdoc | 0 prdoc/{ => 1.11.0}/pr_2944.prdoc | 0 prdoc/{ => 1.11.0}/pr_3250.prdoc | 0 prdoc/{ => 1.11.0}/pr_3251.prdoc | 0 prdoc/{ => 1.11.0}/pr_3455.prdoc | 0 prdoc/{ => 1.11.0}/pr_3485.prdoc | 0 prdoc/{ => 1.11.0}/pr_3512.prdoc | 0 prdoc/{ => 1.11.0}/pr_3630.prdoc | 0 prdoc/{ => 1.11.0}/pr_3659.prdoc | 0 prdoc/{ => 1.11.0}/pr_3660.prdoc | 0 prdoc/{ => 1.11.0}/pr_3695.prdoc | 0 prdoc/{ => 1.11.0}/pr_3708.prdoc | 0 prdoc/{ => 1.11.0}/pr_3721.prdoc | 0 prdoc/{ => 1.11.0}/pr_3789.prdoc | 0 prdoc/{ => 1.11.0}/pr_3801.prdoc | 0 prdoc/{ => 1.11.0}/pr_3813.prdoc | 0 prdoc/{ => 1.11.0}/pr_3852.prdoc | 0 prdoc/{ => 1.11.0}/pr_3875.prdoc | 0 prdoc/{ => 1.11.0}/pr_3889.prdoc | 0 prdoc/{ => 1.11.0}/pr_3915.prdoc | 0 prdoc/{ => 1.11.0}/pr_3930.prdoc | 0 prdoc/{ => 1.11.0}/pr_3934.prdoc | 0 prdoc/{ => 1.11.0}/pr_3953.prdoc | 0 prdoc/{ => 1.11.0}/pr_3959.prdoc | 0 prdoc/{ => 1.11.0}/pr_3976.prdoc | 0 prdoc/{ => 1.11.0}/pr_3979.prdoc | 0 prdoc/{ => 1.11.0}/pr_3983.prdoc | 0 prdoc/{ => 1.11.0}/pr_3997.prdoc | 0 prdoc/{ => 1.11.0}/pr_4006.prdoc | 0 prdoc/{ => 1.11.0}/pr_4015.prdoc | 0 prdoc/{ => 1.11.0}/pr_4017.prdoc | 0 prdoc/{ => 1.11.0}/pr_4021.prdoc | 0 prdoc/{ => 1.11.0}/pr_4027.prdoc | 0 prdoc/{ => 1.11.0}/pr_4037.prdoc | 0 prdoc/{ => 1.11.0}/pr_4059.prdoc | 0 prdoc/{ => 1.11.0}/pr_4060.prdoc | 0 prdoc/{ => 1.11.0}/pr_4070.prdoc | 0 prdoc/{ => 1.11.0}/pr_4072.prdoc | 0 prdoc/{ => 1.11.0}/pr_4075.prdoc | 0 prdoc/{ => 1.11.0}/pr_4089.prdoc | 0 prdoc/{ => 1.11.0}/pr_4118.prdoc | 0 prdoc/{ => 1.11.0}/pr_4151.prdoc | 0 prdoc/{ => 1.11.0}/pr_4156.prdoc | 0 prdoc/{ => 1.11.0}/pr_4168.prdoc | 0 prdoc/{ => 1.11.0}/pr_4169.prdoc | 0 prdoc/{ => 1.11.0}/pr_4171.prdoc | 0 prdoc/{ => 1.11.0}/pr_4177.prdoc | 0 prdoc/{ => 1.11.0}/pr_4189.prdoc | 0 prdoc/{ => 1.11.0}/pr_4199.prdoc | 0 prdoc/{ => 1.11.0}/pr_4208.prdoc | 0 prdoc/{ => 1.11.0}/pr_4221.prdoc | 0 prdoc/{ => 1.11.0}/pr_4229.prdoc | 0 prdoc/{ => 1.11.0}/pr_4252.prdoc | 0 70 files changed, 27 insertions(+), 27 deletions(-) rename prdoc/{ => 1.11.0}/pr_2119.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_2292.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_2714.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_2944.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3250.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3251.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3455.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3485.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3512.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3630.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3659.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3660.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3695.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3708.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3721.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3789.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3801.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3813.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3852.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3875.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3889.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3915.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3930.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3934.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3953.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3959.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3976.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3979.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3983.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_3997.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4006.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4015.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4017.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4021.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4027.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4037.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4059.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4060.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4070.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4072.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4075.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4089.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4118.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4151.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4156.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4168.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4169.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4171.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4177.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4189.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4199.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4208.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4221.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4229.prdoc (100%) rename prdoc/{ => 1.11.0}/pr_4252.prdoc (100%) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 15173480463..c4f4bd4c1ee 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -112,10 +112,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 14, + transaction_version: 15, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 64127c80b6d..a3593732f31 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -110,10 +110,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 14, + transaction_version: 15, state_version: 0, }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 7c2aa490886..2a7f46feee6 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -209,10 +209,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 4, + transaction_version: 5, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 640eaf881a5..4c467010c7c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -183,10 +183,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-westend"), impl_name: create_runtime_str!("bridge-hub-westend"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 4, + transaction_version: 5, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 7274e9acdcd..d9839060408 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -117,10 +117,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives-westend"), impl_name: create_runtime_str!("collectives-westend"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 5, + transaction_version: 6, state_version: 0, }; diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 988195d88d8..df39cd811d1 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -136,10 +136,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 6, + transaction_version: 7, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 895890da7dd..ab925b04eb7 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -136,10 +136,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 0, + transaction_version: 1, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 9d080087d5d..61c7b6e4958 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -136,10 +136,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-westend"), impl_name: create_runtime_str!("coretime-westend"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 0, + transaction_version: 1, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index 996f7655c03..424fa9cb7e7 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -100,7 +100,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton-westend"), impl_name: create_runtime_str!("glutton-westend"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index 4a57bad01c8..544b2e78a46 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -128,10 +128,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-rococo"), impl_name: create_runtime_str!("people-rococo"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 0, + transaction_version: 1, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index 22e8fd57d3c..50c818a2022 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -128,10 +128,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-westend"), impl_name: create_runtime_str!("people-westend"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 0, + transaction_version: 1, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 11da6adb819..e762cec9093 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -107,7 +107,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index 375aacd5832..0f97250a934 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -58,7 +58,7 @@ pub use disputes::{ /// relatively rare. /// /// The associated worker binaries should use the same version as the node that spawns them. -pub const NODE_VERSION: &'static str = "1.10.0"; +pub const NODE_VERSION: &'static str = "1.11.0"; // For a 16-ary Merkle Prefix Trie, we can expect at most 16 32-byte hashes per node // plus some overhead: diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index a52d800ad38..56f4aa40ef1 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -162,10 +162,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 24, + transaction_version: 25, state_version: 1, }; diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index f51233cabf0..0a5312b538b 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -154,10 +154,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 1_010_000, + spec_version: 1_011_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 24, + transaction_version: 25, state_version: 1, }; diff --git a/prdoc/pr_2119.prdoc b/prdoc/1.11.0/pr_2119.prdoc similarity index 100% rename from prdoc/pr_2119.prdoc rename to prdoc/1.11.0/pr_2119.prdoc diff --git a/prdoc/pr_2292.prdoc b/prdoc/1.11.0/pr_2292.prdoc similarity index 100% rename from prdoc/pr_2292.prdoc rename to prdoc/1.11.0/pr_2292.prdoc diff --git a/prdoc/pr_2714.prdoc b/prdoc/1.11.0/pr_2714.prdoc similarity index 100% rename from prdoc/pr_2714.prdoc rename to prdoc/1.11.0/pr_2714.prdoc diff --git a/prdoc/pr_2944.prdoc b/prdoc/1.11.0/pr_2944.prdoc similarity index 100% rename from prdoc/pr_2944.prdoc rename to prdoc/1.11.0/pr_2944.prdoc diff --git a/prdoc/pr_3250.prdoc b/prdoc/1.11.0/pr_3250.prdoc similarity index 100% rename from prdoc/pr_3250.prdoc rename to prdoc/1.11.0/pr_3250.prdoc diff --git a/prdoc/pr_3251.prdoc b/prdoc/1.11.0/pr_3251.prdoc similarity index 100% rename from prdoc/pr_3251.prdoc rename to prdoc/1.11.0/pr_3251.prdoc diff --git a/prdoc/pr_3455.prdoc b/prdoc/1.11.0/pr_3455.prdoc similarity index 100% rename from prdoc/pr_3455.prdoc rename to prdoc/1.11.0/pr_3455.prdoc diff --git a/prdoc/pr_3485.prdoc b/prdoc/1.11.0/pr_3485.prdoc similarity index 100% rename from prdoc/pr_3485.prdoc rename to prdoc/1.11.0/pr_3485.prdoc diff --git a/prdoc/pr_3512.prdoc b/prdoc/1.11.0/pr_3512.prdoc similarity index 100% rename from prdoc/pr_3512.prdoc rename to prdoc/1.11.0/pr_3512.prdoc diff --git a/prdoc/pr_3630.prdoc b/prdoc/1.11.0/pr_3630.prdoc similarity index 100% rename from prdoc/pr_3630.prdoc rename to prdoc/1.11.0/pr_3630.prdoc diff --git a/prdoc/pr_3659.prdoc b/prdoc/1.11.0/pr_3659.prdoc similarity index 100% rename from prdoc/pr_3659.prdoc rename to prdoc/1.11.0/pr_3659.prdoc diff --git a/prdoc/pr_3660.prdoc b/prdoc/1.11.0/pr_3660.prdoc similarity index 100% rename from prdoc/pr_3660.prdoc rename to prdoc/1.11.0/pr_3660.prdoc diff --git a/prdoc/pr_3695.prdoc b/prdoc/1.11.0/pr_3695.prdoc similarity index 100% rename from prdoc/pr_3695.prdoc rename to prdoc/1.11.0/pr_3695.prdoc diff --git a/prdoc/pr_3708.prdoc b/prdoc/1.11.0/pr_3708.prdoc similarity index 100% rename from prdoc/pr_3708.prdoc rename to prdoc/1.11.0/pr_3708.prdoc diff --git a/prdoc/pr_3721.prdoc b/prdoc/1.11.0/pr_3721.prdoc similarity index 100% rename from prdoc/pr_3721.prdoc rename to prdoc/1.11.0/pr_3721.prdoc diff --git a/prdoc/pr_3789.prdoc b/prdoc/1.11.0/pr_3789.prdoc similarity index 100% rename from prdoc/pr_3789.prdoc rename to prdoc/1.11.0/pr_3789.prdoc diff --git a/prdoc/pr_3801.prdoc b/prdoc/1.11.0/pr_3801.prdoc similarity index 100% rename from prdoc/pr_3801.prdoc rename to prdoc/1.11.0/pr_3801.prdoc diff --git a/prdoc/pr_3813.prdoc b/prdoc/1.11.0/pr_3813.prdoc similarity index 100% rename from prdoc/pr_3813.prdoc rename to prdoc/1.11.0/pr_3813.prdoc diff --git a/prdoc/pr_3852.prdoc b/prdoc/1.11.0/pr_3852.prdoc similarity index 100% rename from prdoc/pr_3852.prdoc rename to prdoc/1.11.0/pr_3852.prdoc diff --git a/prdoc/pr_3875.prdoc b/prdoc/1.11.0/pr_3875.prdoc similarity index 100% rename from prdoc/pr_3875.prdoc rename to prdoc/1.11.0/pr_3875.prdoc diff --git a/prdoc/pr_3889.prdoc b/prdoc/1.11.0/pr_3889.prdoc similarity index 100% rename from prdoc/pr_3889.prdoc rename to prdoc/1.11.0/pr_3889.prdoc diff --git a/prdoc/pr_3915.prdoc b/prdoc/1.11.0/pr_3915.prdoc similarity index 100% rename from prdoc/pr_3915.prdoc rename to prdoc/1.11.0/pr_3915.prdoc diff --git a/prdoc/pr_3930.prdoc b/prdoc/1.11.0/pr_3930.prdoc similarity index 100% rename from prdoc/pr_3930.prdoc rename to prdoc/1.11.0/pr_3930.prdoc diff --git a/prdoc/pr_3934.prdoc b/prdoc/1.11.0/pr_3934.prdoc similarity index 100% rename from prdoc/pr_3934.prdoc rename to prdoc/1.11.0/pr_3934.prdoc diff --git a/prdoc/pr_3953.prdoc b/prdoc/1.11.0/pr_3953.prdoc similarity index 100% rename from prdoc/pr_3953.prdoc rename to prdoc/1.11.0/pr_3953.prdoc diff --git a/prdoc/pr_3959.prdoc b/prdoc/1.11.0/pr_3959.prdoc similarity index 100% rename from prdoc/pr_3959.prdoc rename to prdoc/1.11.0/pr_3959.prdoc diff --git a/prdoc/pr_3976.prdoc b/prdoc/1.11.0/pr_3976.prdoc similarity index 100% rename from prdoc/pr_3976.prdoc rename to prdoc/1.11.0/pr_3976.prdoc diff --git a/prdoc/pr_3979.prdoc b/prdoc/1.11.0/pr_3979.prdoc similarity index 100% rename from prdoc/pr_3979.prdoc rename to prdoc/1.11.0/pr_3979.prdoc diff --git a/prdoc/pr_3983.prdoc b/prdoc/1.11.0/pr_3983.prdoc similarity index 100% rename from prdoc/pr_3983.prdoc rename to prdoc/1.11.0/pr_3983.prdoc diff --git a/prdoc/pr_3997.prdoc b/prdoc/1.11.0/pr_3997.prdoc similarity index 100% rename from prdoc/pr_3997.prdoc rename to prdoc/1.11.0/pr_3997.prdoc diff --git a/prdoc/pr_4006.prdoc b/prdoc/1.11.0/pr_4006.prdoc similarity index 100% rename from prdoc/pr_4006.prdoc rename to prdoc/1.11.0/pr_4006.prdoc diff --git a/prdoc/pr_4015.prdoc b/prdoc/1.11.0/pr_4015.prdoc similarity index 100% rename from prdoc/pr_4015.prdoc rename to prdoc/1.11.0/pr_4015.prdoc diff --git a/prdoc/pr_4017.prdoc b/prdoc/1.11.0/pr_4017.prdoc similarity index 100% rename from prdoc/pr_4017.prdoc rename to prdoc/1.11.0/pr_4017.prdoc diff --git a/prdoc/pr_4021.prdoc b/prdoc/1.11.0/pr_4021.prdoc similarity index 100% rename from prdoc/pr_4021.prdoc rename to prdoc/1.11.0/pr_4021.prdoc diff --git a/prdoc/pr_4027.prdoc b/prdoc/1.11.0/pr_4027.prdoc similarity index 100% rename from prdoc/pr_4027.prdoc rename to prdoc/1.11.0/pr_4027.prdoc diff --git a/prdoc/pr_4037.prdoc b/prdoc/1.11.0/pr_4037.prdoc similarity index 100% rename from prdoc/pr_4037.prdoc rename to prdoc/1.11.0/pr_4037.prdoc diff --git a/prdoc/pr_4059.prdoc b/prdoc/1.11.0/pr_4059.prdoc similarity index 100% rename from prdoc/pr_4059.prdoc rename to prdoc/1.11.0/pr_4059.prdoc diff --git a/prdoc/pr_4060.prdoc b/prdoc/1.11.0/pr_4060.prdoc similarity index 100% rename from prdoc/pr_4060.prdoc rename to prdoc/1.11.0/pr_4060.prdoc diff --git a/prdoc/pr_4070.prdoc b/prdoc/1.11.0/pr_4070.prdoc similarity index 100% rename from prdoc/pr_4070.prdoc rename to prdoc/1.11.0/pr_4070.prdoc diff --git a/prdoc/pr_4072.prdoc b/prdoc/1.11.0/pr_4072.prdoc similarity index 100% rename from prdoc/pr_4072.prdoc rename to prdoc/1.11.0/pr_4072.prdoc diff --git a/prdoc/pr_4075.prdoc b/prdoc/1.11.0/pr_4075.prdoc similarity index 100% rename from prdoc/pr_4075.prdoc rename to prdoc/1.11.0/pr_4075.prdoc diff --git a/prdoc/pr_4089.prdoc b/prdoc/1.11.0/pr_4089.prdoc similarity index 100% rename from prdoc/pr_4089.prdoc rename to prdoc/1.11.0/pr_4089.prdoc diff --git a/prdoc/pr_4118.prdoc b/prdoc/1.11.0/pr_4118.prdoc similarity index 100% rename from prdoc/pr_4118.prdoc rename to prdoc/1.11.0/pr_4118.prdoc diff --git a/prdoc/pr_4151.prdoc b/prdoc/1.11.0/pr_4151.prdoc similarity index 100% rename from prdoc/pr_4151.prdoc rename to prdoc/1.11.0/pr_4151.prdoc diff --git a/prdoc/pr_4156.prdoc b/prdoc/1.11.0/pr_4156.prdoc similarity index 100% rename from prdoc/pr_4156.prdoc rename to prdoc/1.11.0/pr_4156.prdoc diff --git a/prdoc/pr_4168.prdoc b/prdoc/1.11.0/pr_4168.prdoc similarity index 100% rename from prdoc/pr_4168.prdoc rename to prdoc/1.11.0/pr_4168.prdoc diff --git a/prdoc/pr_4169.prdoc b/prdoc/1.11.0/pr_4169.prdoc similarity index 100% rename from prdoc/pr_4169.prdoc rename to prdoc/1.11.0/pr_4169.prdoc diff --git a/prdoc/pr_4171.prdoc b/prdoc/1.11.0/pr_4171.prdoc similarity index 100% rename from prdoc/pr_4171.prdoc rename to prdoc/1.11.0/pr_4171.prdoc diff --git a/prdoc/pr_4177.prdoc b/prdoc/1.11.0/pr_4177.prdoc similarity index 100% rename from prdoc/pr_4177.prdoc rename to prdoc/1.11.0/pr_4177.prdoc diff --git a/prdoc/pr_4189.prdoc b/prdoc/1.11.0/pr_4189.prdoc similarity index 100% rename from prdoc/pr_4189.prdoc rename to prdoc/1.11.0/pr_4189.prdoc diff --git a/prdoc/pr_4199.prdoc b/prdoc/1.11.0/pr_4199.prdoc similarity index 100% rename from prdoc/pr_4199.prdoc rename to prdoc/1.11.0/pr_4199.prdoc diff --git a/prdoc/pr_4208.prdoc b/prdoc/1.11.0/pr_4208.prdoc similarity index 100% rename from prdoc/pr_4208.prdoc rename to prdoc/1.11.0/pr_4208.prdoc diff --git a/prdoc/pr_4221.prdoc b/prdoc/1.11.0/pr_4221.prdoc similarity index 100% rename from prdoc/pr_4221.prdoc rename to prdoc/1.11.0/pr_4221.prdoc diff --git a/prdoc/pr_4229.prdoc b/prdoc/1.11.0/pr_4229.prdoc similarity index 100% rename from prdoc/pr_4229.prdoc rename to prdoc/1.11.0/pr_4229.prdoc diff --git a/prdoc/pr_4252.prdoc b/prdoc/1.11.0/pr_4252.prdoc similarity index 100% rename from prdoc/pr_4252.prdoc rename to prdoc/1.11.0/pr_4252.prdoc -- GitLab From 16d8205770e5fcb334a8324247a36f5737544ed1 Mon Sep 17 00:00:00 2001 From: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Date: Thu, 2 May 2024 11:30:27 +0200 Subject: [PATCH 033/170] Make parachain template great again (and async backing ready) (#4295) Closes #4272. It turned out that not only the node part but also the runtime wasn't async backing ready. Now, both of them are using proper APIs and producing 6-second blocks out of the box. --- Cargo.lock | 1 + prdoc/pr_4295.prdoc | 14 ++++++++ templates/parachain/node/src/service.rs | 35 +++++++++++-------- templates/parachain/runtime/Cargo.toml | 2 ++ templates/parachain/runtime/src/apis.rs | 16 +++++++-- .../parachain/runtime/src/configs/mod.rs | 28 ++++++--------- templates/parachain/runtime/src/lib.rs | 16 ++++++--- 7 files changed, 73 insertions(+), 39 deletions(-) create mode 100644 prdoc/pr_4295.prdoc diff --git a/Cargo.lock b/Cargo.lock index c3bf3f26385..14a91049921 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11838,6 +11838,7 @@ dependencies = [ "cumulus-pallet-session-benchmarking", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", + "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", diff --git a/prdoc/pr_4295.prdoc b/prdoc/pr_4295.prdoc new file mode 100644 index 00000000000..e8b2010a849 --- /dev/null +++ b/prdoc/pr_4295.prdoc @@ -0,0 +1,14 @@ +title: "Make parachain template async backing ready" + +doc: + - audience: Node Dev + description: | + Promotes the parachain template (both node and runtime) to use async backing APIs so that + developers starting a new project from the template could get async backing integrated out + of the box. + +crates: + - name: parachain-template-node + bump: major + - name: parachain-template-runtime + bump: major diff --git a/templates/parachain/node/src/service.rs b/templates/parachain/node/src/service.rs index 373df01b0c4..20e5b37b41b 100644 --- a/templates/parachain/node/src/service.rs +++ b/templates/parachain/node/src/service.rs @@ -12,6 +12,7 @@ use parachain_template_runtime::{ // Cumulus Imports use cumulus_client_collator::service::CollatorService; +use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImport; use cumulus_client_consensus_proposer::Proposer; use cumulus_client_service::{ @@ -19,7 +20,10 @@ use cumulus_client_service::{ BuildNetworkParams, CollatorSybilResistance, DARecoveryProfile, ParachainHostFunctions, StartRelayChainTasksParams, }; -use cumulus_primitives_core::{relay_chain::CollatorPair, ParaId}; +use cumulus_primitives_core::{ + relay_chain::{CollatorPair, ValidationCode}, + ParaId, +}; use cumulus_relay_chain_interface::{OverseerHandle, RelayChainInterface}; // Substrate Imports @@ -156,6 +160,7 @@ fn build_import_queue( fn start_consensus( client: Arc, + backend: Arc, block_import: ParachainBlockImport, prometheus_registry: Option<&Registry>, telemetry: Option, @@ -170,10 +175,6 @@ fn start_consensus( overseer_handle: OverseerHandle, announce_block: Arc>) + Send + Sync>, ) -> Result<(), sc_service::Error> { - use cumulus_client_consensus_aura::collators::basic::{ - self as basic_aura, Params as BasicAuraParams, - }; - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( task_manager.spawn_handle(), client.clone(), @@ -191,11 +192,15 @@ fn start_consensus( client.clone(), ); - let params = BasicAuraParams { + let params = AuraParams { create_inherent_data_providers: move |_, ()| async move { Ok(()) }, block_import, - para_client: client, + para_client: client.clone(), + para_backend: backend, relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + }, sync_oracle, keystore, collator_key, @@ -204,13 +209,12 @@ fn start_consensus( relay_chain_slot_duration, proposer, collator_service, - // Very limited proposal time. - authoring_duration: Duration::from_millis(500), - collation_request_receiver: None, + authoring_duration: Duration::from_millis(2000), + reinitialize: false, }; let fut = - basic_aura::run::( + aura::run::( params, ); task_manager.spawn_essential_handle().spawn("aura", None, fut); @@ -318,8 +322,8 @@ pub async fn start_parachain_node( task_manager: &mut task_manager, config: parachain_config, keystore: params.keystore_container.keystore(), - backend, - network: network.clone(), + backend: backend.clone(), + network, sync_service: sync_service.clone(), system_rpc_tx, tx_handler_controller, @@ -382,13 +386,14 @@ pub async fn start_parachain_node( if validator { start_consensus( client.clone(), + backend, block_import, prometheus_registry.as_ref(), telemetry.as_ref().map(|t| t.handle()), &task_manager, - relay_chain_interface.clone(), + relay_chain_interface, transaction_pool, - sync_service.clone(), + sync_service, params.keystore_container.keystore(), relay_chain_slot_duration, para_id, diff --git a/templates/parachain/runtime/Cargo.toml b/templates/parachain/runtime/Cargo.toml index 0d985796a11..9cd5b7ca599 100644 --- a/templates/parachain/runtime/Cargo.toml +++ b/templates/parachain/runtime/Cargo.toml @@ -82,6 +82,7 @@ cumulus-pallet-parachain-system = { path = "../../../cumulus/pallets/parachain-s cumulus-pallet-session-benchmarking = { path = "../../../cumulus/pallets/session-benchmarking", default-features = false } cumulus-pallet-xcm = { path = "../../../cumulus/pallets/xcm", default-features = false } cumulus-pallet-xcmp-queue = { path = "../../../cumulus/pallets/xcmp-queue", default-features = false } +cumulus-primitives-aura = { path = "../../../cumulus/primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../cumulus/primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../cumulus/primitives/utility", default-features = false } cumulus-primitives-storage-weight-reclaim = { path = "../../../cumulus/primitives/storage-weight-reclaim", default-features = false } @@ -98,6 +99,7 @@ std = [ "cumulus-pallet-session-benchmarking/std", "cumulus-pallet-xcm/std", "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-aura/std", "cumulus-primitives-core/std", "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", diff --git a/templates/parachain/runtime/src/apis.rs b/templates/parachain/runtime/src/apis.rs index b13ba278fae..107956ded41 100644 --- a/templates/parachain/runtime/src/apis.rs +++ b/templates/parachain/runtime/src/apis.rs @@ -42,14 +42,15 @@ use sp_version::RuntimeVersion; // Local module imports use super::{ - AccountId, Aura, Balance, Block, Executive, InherentDataExt, Nonce, ParachainSystem, Runtime, - RuntimeCall, RuntimeGenesisConfig, SessionKeys, System, TransactionPayment, VERSION, + AccountId, Balance, Block, ConsensusHook, Executive, InherentDataExt, Nonce, ParachainSystem, + Runtime, RuntimeCall, RuntimeGenesisConfig, SessionKeys, System, TransactionPayment, + SLOT_DURATION, VERSION, }; impl_runtime_apis! { impl sp_consensus_aura::AuraApi for Runtime { fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + sp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION) } fn authorities() -> Vec { @@ -57,6 +58,15 @@ impl_runtime_apis! { } } + impl cumulus_primitives_aura::AuraUnincludedSegmentApi for Runtime { + fn can_build_upon( + included_hash: ::Hash, + slot: cumulus_primitives_aura::Slot, + ) -> bool { + ConsensusHook::can_build_upon(included_hash, slot) + } + } + impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { VERSION diff --git a/templates/parachain/runtime/src/configs/mod.rs b/templates/parachain/runtime/src/configs/mod.rs index f1aea481ee2..0aec332feaf 100644 --- a/templates/parachain/runtime/src/configs/mod.rs +++ b/templates/parachain/runtime/src/configs/mod.rs @@ -26,7 +26,7 @@ mod xcm_config; // Substrate and Polkadot dependencies -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ derive_impl, @@ -53,12 +53,11 @@ use xcm::latest::prelude::BodyId; // Local module imports use super::{ weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}, - AccountId, Aura, Balance, Balances, Block, BlockNumber, CollatorSelection, Hash, MessageQueue, - Nonce, PalletInfo, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent, RuntimeFreezeReason, - RuntimeHoldReason, RuntimeOrigin, RuntimeTask, Session, SessionKeys, System, WeightToFee, - XcmpQueue, AVERAGE_ON_INITIALIZE_RATIO, BLOCK_PROCESSING_VELOCITY, EXISTENTIAL_DEPOSIT, HOURS, - MAXIMUM_BLOCK_WEIGHT, MICROUNIT, NORMAL_DISPATCH_RATIO, RELAY_CHAIN_SLOT_DURATION_MILLIS, - SLOT_DURATION, UNINCLUDED_SEGMENT_CAPACITY, VERSION, + AccountId, Aura, Balance, Balances, Block, BlockNumber, CollatorSelection, ConsensusHook, Hash, + MessageQueue, Nonce, PalletInfo, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent, + RuntimeFreezeReason, RuntimeHoldReason, RuntimeOrigin, RuntimeTask, Session, SessionKeys, + System, WeightToFee, XcmpQueue, AVERAGE_ON_INITIALIZE_RATIO, EXISTENTIAL_DEPOSIT, HOURS, + MAXIMUM_BLOCK_WEIGHT, MICROUNIT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, VERSION, }; use xcm_config::{RelayLocation, XcmOriginToTransactDispatchOrigin}; @@ -128,7 +127,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type MinimumPeriod = ConstU64<0>; type WeightInfo = (); } @@ -195,13 +194,8 @@ impl cumulus_pallet_parachain_system::Config for Runtime { type ReservedDmpWeight = ReservedDmpWeight; type XcmpMessageHandler = XcmpQueue; type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; - type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< - Runtime, - RELAY_CHAIN_SLOT_DURATION_MILLIS, - BLOCK_PROCESSING_VELOCITY, - UNINCLUDED_SEGMENT_CAPACITY, - >; + type CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases; + type ConsensusHook = ConsensusHook; } impl parachain_info::Config for Runtime {} @@ -271,8 +265,8 @@ impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; - type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; + type AllowMultipleBlocksPerSlot = ConstBool; + type SlotDuration = ConstU64; } parameter_types! { diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs index 5bfd6f290c1..14af00f9b2c 100644 --- a/templates/parachain/runtime/src/lib.rs +++ b/templates/parachain/runtime/src/lib.rs @@ -173,7 +173,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { /// up by `pallet_aura` to implement `fn slot_duration()`. /// /// Change this to adjust the block time. -pub const MILLISECS_PER_BLOCK: u64 = 12000; +pub const MILLISECS_PER_BLOCK: u64 = 6000; // NOTE: Currently it is not possible to change the slot duration after the chain has started. // Attempting to do so will brick block production. @@ -200,21 +200,29 @@ const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); /// `Operational` extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for 0.5 of a second of compute with a 12 second average block time. +/// We allow for 2 seconds of compute with a 6 second average block time. const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), + WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2), cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, ); /// Maximum number of blocks simultaneously accepted by the Runtime, not yet included /// into the relay chain. -const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1; +const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3; /// How many parachain blocks are processed by the relay chain per parent. Limits the /// number of blocks authored per slot. const BLOCK_PROCESSING_VELOCITY: u32 = 1; /// Relay chain slot duration, in milliseconds. const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; +/// Aura consensus hook +type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, +>; + /// The version information used to identify this runtime when compiled natively. #[cfg(feature = "std")] pub fn native_version() -> NativeVersion { -- GitLab From 171bedc2b319e18d51a7b510d8bd4cfd2e645c31 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 2 May 2024 13:02:59 +0300 Subject: [PATCH 034/170] Bridge: ignore client errors when calling recently added `*_free_headers_interval` methods (#4350) see https://github.com/paritytech/parity-bridges-common/issues/2974 : we still need to support unupgraded chains (BHK and BHP) in relay We may need to revert this change when all chains are upgraded --- .../lib-substrate-relay/src/finality/target.rs | 13 ++++++++++++- .../lib-substrate-relay/src/parachains/target.rs | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/bridges/relays/lib-substrate-relay/src/finality/target.rs b/bridges/relays/lib-substrate-relay/src/finality/target.rs index adbcfe0096d..0874fa53549 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/target.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/target.rs @@ -107,13 +107,24 @@ impl TargetClient Result>, Self::Error> { - self.client + Ok(self + .client .typed_state_call( P::SourceChain::FREE_HEADERS_INTERVAL_METHOD.into(), (), Some(self.client.best_header().await?.hash()), ) .await + .unwrap_or_else(|e| { + log::info!( + target: "bridge", + "Call of {} at {} has failed with an error: {:?}. Treating as `None`", + P::SourceChain::FREE_HEADERS_INTERVAL_METHOD, + P::TargetChain::NAME, + e, + ); + None + })) } async fn submit_finality_proof( diff --git a/bridges/relays/lib-substrate-relay/src/parachains/target.rs b/bridges/relays/lib-substrate-relay/src/parachains/target.rs index e10d15b6edf..531d55b5322 100644 --- a/bridges/relays/lib-substrate-relay/src/parachains/target.rs +++ b/bridges/relays/lib-substrate-relay/src/parachains/target.rs @@ -122,9 +122,20 @@ where async fn free_source_relay_headers_interval( &self, ) -> Result>, Self::Error> { - self.target_client + Ok(self + .target_client .typed_state_call(P::SourceRelayChain::FREE_HEADERS_INTERVAL_METHOD.into(), (), None) .await + .unwrap_or_else(|e| { + log::info!( + target: "bridge", + "Call of {} at {} has failed with an error: {:?}. Treating as `None`", + P::SourceRelayChain::FREE_HEADERS_INTERVAL_METHOD, + P::TargetChain::NAME, + e, + ); + None + })) } async fn parachain_head( -- GitLab From 877617c44629e84ee36ac7194f4fe00fe3fa0b71 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Thu, 2 May 2024 13:54:57 +0300 Subject: [PATCH 035/170] cargo: Update experimental litep2p to latest version (#4344) This PR updates the litep2p crate to the latest version. This fixes the build for developers that want to perform `cargo update` on all their dependencies: https://github.com/paritytech/polkadot-sdk/pull/4343, by porting the latest changes. The peer records were introduced to litep2p to be able to distinguish and update peers with outdated records. It is going to be properly used in substrate via: https://github.com/paritytech/polkadot-sdk/pull/3786, however that is pending the commit to merge on litep2p master: https://github.com/paritytech/litep2p/pull/96. Closes: https://github.com/paritytech/polkadot-sdk/pull/4343 --------- Signed-off-by: Alexandru Vasile --- Cargo.lock | 52 +++++++++---------- substrate/client/network/Cargo.toml | 2 +- .../client/network/src/litep2p/discovery.rs | 5 +- substrate/client/network/types/Cargo.toml | 2 +- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14a91049921..f5b2ee855f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1358,7 +1358,7 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", "ring 0.1.0", - "sha2 0.10.7", + "sha2 0.10.8", "sp-ark-bls12-381", "sp-ark-ed-on-bls12-381-bandersnatch", "zeroize", @@ -5009,7 +5009,7 @@ dependencies = [ "ed25519 2.2.2", "rand_core 0.6.4", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "subtle 2.5.0", "zeroize", ] @@ -5039,7 +5039,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core 0.6.4", - "sha2 0.10.7", + "sha2 0.10.8", "zeroize", ] @@ -7267,7 +7267,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] @@ -7698,7 +7698,7 @@ dependencies = [ "multihash 0.17.0", "quick-protobuf", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", "zeroize", ] @@ -7723,7 +7723,7 @@ dependencies = [ "log", "quick-protobuf", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "thiserror", "uint", @@ -7781,7 +7781,7 @@ dependencies = [ "once_cell", "quick-protobuf", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "snow", "static_assertions", "thiserror", @@ -8116,7 +8116,7 @@ dependencies = [ [[package]] name = "litep2p" version = "0.3.0" -source = "git+https://github.com/paritytech/litep2p?branch=master#b142c9eb611fb2fe78d2830266a3675b37299ceb" +source = "git+https://github.com/paritytech/litep2p?rev=e03a6023882db111beeb24d8c0ceaac0721d3f0f#e03a6023882db111beeb24d8c0ceaac0721d3f0f" dependencies = [ "async-trait", "bs58 0.4.0", @@ -8143,7 +8143,7 @@ dependencies = [ "ring 0.16.20", "rustls 0.20.8", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "simple-dns", "smallvec", "snow", @@ -8692,7 +8692,7 @@ dependencies = [ "core2", "digest 0.10.7", "multihash-derive 0.8.0", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "unsigned-varint", ] @@ -8709,7 +8709,7 @@ dependencies = [ "core2", "digest 0.10.7", "multihash-derive 0.8.0", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "unsigned-varint", ] @@ -8739,7 +8739,7 @@ dependencies = [ "ripemd", "serde", "sha1", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "strobe-rs", ] @@ -11972,7 +11972,7 @@ checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" dependencies = [ "bitcoin_hashes 0.13.0", "rand 0.8.5", - "rand_core 0.5.1", + "rand_core 0.6.4", "serde", "unicode-normalization", ] @@ -12494,7 +12494,7 @@ checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" dependencies = [ "once_cell", "pest", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] @@ -17816,7 +17816,7 @@ dependencies = [ "merlin", "rand_core 0.6.4", "serde_bytes", - "sha2 0.10.7", + "sha2 0.10.8", "subtle 2.5.0", "zeroize", ] @@ -18229,9 +18229,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -18489,7 +18489,7 @@ dependencies = [ "schnorrkel 0.10.2", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "siphasher", "slab", @@ -18556,7 +18556,7 @@ dependencies = [ "rand_core 0.6.4", "ring 0.17.7", "rustc_version 0.4.0", - "sha2 0.10.7", + "sha2 0.10.8", "subtle 2.5.0", ] @@ -19404,7 +19404,7 @@ dependencies = [ "byteorder", "criterion 0.4.0", "digest 0.10.7", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "sp-crypto-hashing-proc-macro", "twox-hash", @@ -19825,7 +19825,7 @@ dependencies = [ "parity-scale-codec", "rand 0.8.5", "scale-info", - "sha2 0.10.7", + "sha2 0.10.8", "sp-api", "sp-application-crypto", "sp-core", @@ -20369,9 +20369,9 @@ dependencies = [ [[package]] name = "str0m" -version = "0.2.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48572247f422dcbe68630c973f8296fbd5157119cd36a3223e48bf83d47727" +checksum = "d3f10d3f68e60168d81110410428a435dbde28cc5525f5f7c6fdec92dbdc2800" dependencies = [ "combine", "crc", @@ -20522,7 +20522,7 @@ dependencies = [ "pbkdf2", "rustc-hex", "schnorrkel 0.11.4", - "sha2 0.10.7", + "sha2 0.10.8", "zeroize", ] @@ -22214,7 +22214,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "thiserror", "zeroize", @@ -22532,7 +22532,7 @@ dependencies = [ "log", "rustix 0.36.15", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "toml 0.5.11", "windows-sys 0.45.0", "zstd 0.11.2+zstd.1.5.2", diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index 0879481a419..cda652d4f65 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -59,7 +59,7 @@ sp-blockchain = { path = "../../primitives/blockchain" } sp-core = { path = "../../primitives/core" } sp-runtime = { path = "../../primitives/runtime" } wasm-timer = "0.2" -litep2p = { git = "https://github.com/paritytech/litep2p", branch = "master" } +litep2p = { git = "https://github.com/paritytech/litep2p", rev = "e03a6023882db111beeb24d8c0ceaac0721d3f0f" } once_cell = "1.18.0" void = "1.0.2" schnellru = "0.2.1" diff --git a/substrate/client/network/src/litep2p/discovery.rs b/substrate/client/network/src/litep2p/discovery.rs index 27f4d547372..47a620db132 100644 --- a/substrate/client/network/src/litep2p/discovery.rs +++ b/substrate/client/network/src/litep2p/discovery.rs @@ -462,7 +462,10 @@ impl Stream for Discovery { "`GET_RECORD` succeeded for {query_id:?}: {record:?}", ); - return Poll::Ready(Some(DiscoveryEvent::GetRecordSuccess { query_id, record })); + return Poll::Ready(Some(DiscoveryEvent::GetRecordSuccess { + query_id, + record: record.record, + })); }, Poll::Ready(Some(KademliaEvent::PutRecordSucess { query_id, key: _ })) => return Poll::Ready(Some(DiscoveryEvent::PutRecordSuccess { query_id })), diff --git a/substrate/client/network/types/Cargo.toml b/substrate/client/network/types/Cargo.toml index d8f03939ab9..e36d34b86fc 100644 --- a/substrate/client/network/types/Cargo.toml +++ b/substrate/client/network/types/Cargo.toml @@ -12,7 +12,7 @@ documentation = "https://docs.rs/sc-network-types" [dependencies] bs58 = "0.4.0" libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } -litep2p = { git = "https://github.com/paritytech/litep2p", branch = "master" } +litep2p = { git = "https://github.com/paritytech/litep2p", rev = "e03a6023882db111beeb24d8c0ceaac0721d3f0f" } multiaddr = "0.17.0" multihash = { version = "0.17.0", default-features = false, features = ["identity", "multihash-impl", "sha2", "std"] } rand = "0.8.5" -- GitLab From b85c5a0df7e53358167c7ce6a3aa3b9900e18476 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Thu, 2 May 2024 14:20:51 +0200 Subject: [PATCH 036/170] Add PoV-reclaim enablement guide to polkadot-sdk-docs (#4244) This adds a small guide on how to prepare your parachain for pov-reclaim usage. --- Cargo.lock | 7 ++ docs/sdk/Cargo.toml | 7 +- docs/sdk/src/guides/enable_pov_reclaim.rs | 84 +++++++++++++++++++++++ docs/sdk/src/guides/mod.rs | 3 + docs/sdk/src/meta_contributing.rs | 2 +- templates/parachain/node/Cargo.toml | 1 + templates/parachain/node/src/service.rs | 2 + templates/parachain/runtime/Cargo.toml | 1 + templates/parachain/runtime/src/lib.rs | 1 + 9 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 docs/sdk/src/guides/enable_pov_reclaim.rs diff --git a/Cargo.lock b/Cargo.lock index f5b2ee855f5..d72d6229e1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11786,6 +11786,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-interface", + "docify", "frame-benchmarking", "frame-benchmarking-cli", "futures", @@ -11842,6 +11843,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", + "docify", "frame-benchmarking", "frame-executive", "frame-support", @@ -13897,8 +13899,11 @@ dependencies = [ name = "polkadot-sdk-docs" version = "0.0.1" dependencies = [ + "cumulus-client-service", "cumulus-pallet-aura-ext", "cumulus-pallet-parachain-system", + "cumulus-primitives-proof-size-hostfunction", + "cumulus-primitives-storage-weight-reclaim", "docify", "frame-executive", "frame-support", @@ -13936,9 +13941,11 @@ dependencies = [ "sc-consensus-grandpa", "sc-consensus-manual-seal", "sc-consensus-pow", + "sc-executor", "sc-network", "sc-rpc", "sc-rpc-api", + "sc-service", "scale-info", "simple-mermaid", "sp-api", diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index 426c5d9de4a..fe53845d849 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -51,6 +51,8 @@ sc-consensus-grandpa = { path = "../../substrate/client/consensus/grandpa" } sc-consensus-beefy = { path = "../../substrate/client/consensus/beefy" } sc-consensus-manual-seal = { path = "../../substrate/client/consensus/manual-seal" } sc-consensus-pow = { path = "../../substrate/client/consensus/pow" } +sc-executor = { path = "../../substrate/client/executor" } +sc-service = { path = "../../substrate/client/service" } substrate-wasm-builder = { path = "../../substrate/utils/wasm-builder" } @@ -60,9 +62,12 @@ cumulus-pallet-parachain-system = { path = "../../cumulus/pallets/parachain-syst "parameterized-consensus-hook", ] } parachain-info = { package = "staging-parachain-info", path = "../../cumulus/parachains/pallets/parachain-info" } -pallet-aura = { path = "../../substrate/frame/aura", default-features = false } +cumulus-primitives-proof-size-hostfunction = { path = "../../cumulus/primitives/proof-size-hostfunction" } +cumulus-client-service = { path = "../../cumulus/client/service" } +cumulus-primitives-storage-weight-reclaim = { path = "../../cumulus/primitives/storage-weight-reclaim" } # Pallets and FRAME internals +pallet-aura = { path = "../../substrate/frame/aura" } pallet-timestamp = { path = "../../substrate/frame/timestamp" } pallet-balances = { path = "../../substrate/frame/balances" } pallet-assets = { path = "../../substrate/frame/assets" } diff --git a/docs/sdk/src/guides/enable_pov_reclaim.rs b/docs/sdk/src/guides/enable_pov_reclaim.rs new file mode 100644 index 00000000000..3c0c5fba215 --- /dev/null +++ b/docs/sdk/src/guides/enable_pov_reclaim.rs @@ -0,0 +1,84 @@ +//! This guide will teach you how to enable storage weight reclaiming for a parachain. The +//! explanations in this guide assume a project structure similar to the one detailed in +//! the [substrate documentation](crate::polkadot_sdk::substrate#anatomy-of-a-binary-crate). Full +//! technical details are available in the original [pull request](https://github.com/paritytech/polkadot-sdk/pull/3002). +//! +//! # What is PoV reclaim? +//! When a parachain submits a block to a relay chain like Polkadot or Kusama, it sends the block +//! itself and a storage proof. Together they form the Proof-of-Validity (PoV). The PoV allows the +//! relay chain to validate the parachain block by re-executing it. Relay chain +//! validators distribute this PoV among themselves over the network. This distribution is costly +//! and limits the size of the storage proof. The storage weight dimension of FRAME weights reflects +//! this cost and limits the size of the storage proof. However, the storage weight determined +//! during [benchmarking](crate::reference_docs::frame_benchmarking_weight) represents the worst +//! case. In reality, runtime operations often consume less space in the storage proof. PoV reclaim +//! offers a mechanism to reclaim the difference between the benchmarked worst-case and the real +//! proof-size consumption. +//! +//! +//! # How to enable PoV reclaim +//! ## 1. Add the host function to your node +//! +//! To reclaim excess storage weight, a parachain runtime needs the +//! ability to fetch the size of the storage proof from the node. The reclaim +//! mechanism uses the +//! [`storage_proof_size`](cumulus_primitives_proof_size_hostfunction::storage_proof_size) +//! host function for this purpose. For convenience, cumulus provides +//! [`ParachainHostFunctions`](cumulus_client_service::ParachainHostFunctions), a set of +//! host functions typically used by cumulus-based parachains. In the binary crate of your +//! parachain, find the instantiation of the [`WasmExecutor`](sc_executor::WasmExecutor) and set the +//! correct generic type. +//! +//! This example from the parachain-template shows a type definition that includes the correct +//! host functions. +#![doc = docify::embed!("../../templates/parachain/node/src/service.rs", wasm_executor)] +//! +//! > **Note:** +//! > +//! > If you see error `runtime requires function imports which are not present on the host: +//! > 'env:ext_storage_proof_size_storage_proof_size_version_1'`, it is likely +//! > that this step in the guide was not set up correctly. +//! +//! ## 2. Enable storage proof recording during import +//! +//! The reclaim mechanism reads the size of the currently recorded storage proof multiple times +//! during block authoring and block import. Proof recording during authoring is already enabled on +//! parachains. You must also ensure that storage proof recording is enabled during block import. +//! Find where your node builds the fundamental substrate components by calling +//! [`new_full_parts`](sc_service::new_full_parts). Replace this +//! with [`new_full_parts_record_import`](sc_service::new_full_parts_record_import) and +//! pass `true` as the last parameter to enable import recording. +#![doc = docify::embed!("../../templates/parachain/node/src/service.rs", component_instantiation)] +//! +//! > **Note:** +//! > +//! > If you see error `Storage root must match that calculated.` during block import, it is likely +//! > that this step in the guide was not +//! > set up correctly. +//! +//! ## 3. Add the SignedExtension to your runtime +//! +//! In your runtime, you will find a list of SignedExtensions. +//! To enable the reclaiming, +//! add [`StorageWeightReclaim`](cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim) +//! to that list. For maximum efficiency, make sure that `StorageWeightReclaim` is last in the list. +//! The extension will check the size of the storage proof before and after an extrinsic execution. +//! It reclaims the difference between the calculated size and the benchmarked size. +#![doc = docify::embed!("../../templates/parachain/runtime/src/lib.rs", template_signed_extra)] +//! +//! ## Optional: Verify that reclaim works +//! +//! Start your node with the log target `runtime::storage_reclaim` set to `trace` to enable full +//! logging for `StorageWeightReclaim`. The following log is an example from a local testnet. To +//! trigger the log, execute any extrinsic on the network. +//! +//! ```ignore +//! ... +//! 2024-04-22 17:31:48.014 TRACE runtime::storage_reclaim: [ferdie] Reclaiming storage weight. benchmarked: 3593, consumed: 265 unspent: 0 +//! ... +//! ``` +//! +//! In the above example we see a benchmarked size of 3593 bytes, while the extrinsic only consumed +//! 265 bytes of proof size. This results in 3328 bytes of reclaim. +#![deny(rustdoc::broken_intra_doc_links)] +#![deny(rustdoc::private_intra_doc_links)] diff --git a/docs/sdk/src/guides/mod.rs b/docs/sdk/src/guides/mod.rs index 3120f253310..2dc807af8ea 100644 --- a/docs/sdk/src/guides/mod.rs +++ b/docs/sdk/src/guides/mod.rs @@ -23,3 +23,6 @@ pub mod cumulus_enabled_parachain; /// How to make a given runtime XCM-enabled, capable of sending messages (`Transact`) between itself /// and the relay chain to which it is connected. pub mod xcm_enabled_parachain; + +/// How to enable storage weight reclaiming in a parachain node and runtime. +pub mod enable_pov_reclaim; diff --git a/docs/sdk/src/meta_contributing.rs b/docs/sdk/src/meta_contributing.rs index fcdcea9934b..a029595254c 100644 --- a/docs/sdk/src/meta_contributing.rs +++ b/docs/sdk/src/meta_contributing.rs @@ -139,7 +139,7 @@ //! //! ```sh //! SKIP_WASM_BUILD=1 \ -//! RUSTDOCFLAGS="--html-in-header $(pwd)/docs/sdk/headers/header.html --extend-css $(pwd)/docs/sdk/headers/theme.css --default-theme=ayu" \ +//! RUSTDOCFLAGS="--html-in-header $(pwd)/docs/sdk/assets/header.html --extend-css $(pwd)/docs/sdk/assets/theme.css --default-theme=ayu" \ //! cargo doc -p polkadot-sdk-docs --no-deps --open //! ``` //! diff --git a/templates/parachain/node/Cargo.toml b/templates/parachain/node/Cargo.toml index 63267acdbca..ed857b4e4b9 100644 --- a/templates/parachain/node/Cargo.toml +++ b/templates/parachain/node/Cargo.toml @@ -24,6 +24,7 @@ serde = { features = ["derive"], workspace = true, default-features = true } jsonrpsee = { version = "0.22", features = ["server"] } futures = "0.3.28" serde_json = { workspace = true, default-features = true } +docify = "0.2.8" # Local parachain-template-runtime = { path = "../runtime" } diff --git a/templates/parachain/node/src/service.rs b/templates/parachain/node/src/service.rs index 20e5b37b41b..ad4689c6e55 100644 --- a/templates/parachain/node/src/service.rs +++ b/templates/parachain/node/src/service.rs @@ -39,6 +39,7 @@ use sc_transaction_pool_api::OffchainTransactionPoolFactory; use sp_keystore::KeystorePtr; use substrate_prometheus_endpoint::Registry; +#[docify::export(wasm_executor)] type ParachainExecutor = WasmExecutor; type ParachainClient = TFullClient; @@ -61,6 +62,7 @@ pub type Service = PartialComponents< /// /// Use this macro if you don't actually need the full service, but just the builder in order to /// be able to perform chain operations. +#[docify::export(component_instantiation)] pub fn new_partial(config: &Configuration) -> Result { let telemetry = config .telemetry_endpoints diff --git a/templates/parachain/runtime/Cargo.toml b/templates/parachain/runtime/Cargo.toml index 9cd5b7ca599..d15ff2807a6 100644 --- a/templates/parachain/runtime/Cargo.toml +++ b/templates/parachain/runtime/Cargo.toml @@ -28,6 +28,7 @@ scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } smallvec = "1.11.0" +docify = "0.2.8" # Local pallet-parachain-template = { path = "../pallets/template", default-features = false } diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs index 14af00f9b2c..179a425ca04 100644 --- a/templates/parachain/runtime/src/lib.rs +++ b/templates/parachain/runtime/src/lib.rs @@ -75,6 +75,7 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. +#[docify::export(template_signed_extra)] pub type SignedExtra = ( frame_system::CheckNonZeroSender, frame_system::CheckSpecVersion, -- GitLab From 4e0b3abbd696c809aebd8d5e64a671abf843087f Mon Sep 17 00:00:00 2001 From: Qinxuan Chen Date: Thu, 2 May 2024 20:25:08 +0800 Subject: [PATCH 037/170] deps: update jsonrpsee to v0.22.5 (#4330) use `server-core` feature instead of `server` feature when defining the rpc api --- Cargo.lock | 97 ++++++------------- .../client/consensus/babe/rpc/Cargo.toml | 2 +- .../client/consensus/beefy/rpc/Cargo.toml | 2 +- .../client/consensus/grandpa/rpc/Cargo.toml | 2 +- .../client/consensus/manual-seal/Cargo.toml | 2 +- .../merkle-mountain-range/rpc/Cargo.toml | 2 +- substrate/client/rpc-api/Cargo.toml | 2 +- substrate/client/rpc-spec-v2/Cargo.toml | 2 +- substrate/client/sync-state-rpc/Cargo.toml | 2 +- .../frame/transaction-payment/rpc/Cargo.toml | 2 +- .../rpc/state-trie-migration-rpc/Cargo.toml | 2 +- substrate/utils/frame/rpc/system/Cargo.toml | 2 +- 12 files changed, 43 insertions(+), 76 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d72d6229e1a..30a4d62900f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1080,7 +1080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener 2.5.3", + "event-listener", "futures-core", ] @@ -1090,7 +1090,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" dependencies = [ - "async-lock 2.8.0", + "async-lock", "async-task", "concurrent-queue", "fastrand 1.9.0", @@ -1104,7 +1104,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" dependencies = [ - "async-lock 2.8.0", + "async-lock", "autocfg", "blocking", "futures-lite", @@ -1119,7 +1119,7 @@ dependencies = [ "async-channel", "async-executor", "async-io", - "async-lock 2.8.0", + "async-lock", "blocking", "futures-lite", "once_cell", @@ -1131,7 +1131,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock 2.8.0", + "async-lock", "autocfg", "cfg-if", "concurrent-queue", @@ -1151,18 +1151,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener 2.5.3", -] - -[[package]] -name = "async-lock" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" -dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy", - "pin-project-lite 0.2.12", + "event-listener", ] [[package]] @@ -1184,11 +1173,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" dependencies = [ "async-io", - "async-lock 2.8.0", + "async-lock", "autocfg", "blocking", "cfg-if", - "event-listener 2.5.3", + "event-listener", "futures-lite", "rustix 0.37.23", "signal-hook", @@ -1205,7 +1194,7 @@ dependencies = [ "async-channel", "async-global-executor", "async-io", - "async-lock 2.8.0", + "async-lock", "crossbeam-utils", "futures-channel", "futures-core", @@ -1618,7 +1607,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" dependencies = [ "async-channel", - "async-lock 2.8.0", + "async-lock", "async-task", "atomic-waker", "fastrand 1.9.0", @@ -5331,27 +5320,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite 0.2.12", -] - -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite 0.2.12", -] - [[package]] name = "exit-future" version = "0.2.0" @@ -7036,7 +7004,7 @@ dependencies = [ "curl", "curl-sys", "encoding_rs", - "event-listener 2.5.3", + "event-listener", "futures-lite", "http", "log", @@ -7112,9 +7080,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3ae45a64cfc0882934f963be9431b2a165d667f53140358181f262aca0702" +checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -7128,9 +7096,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455fc882e56f58228df2aee36b88a1340eafd707c76af2fa68cf94b37d461131" +checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa" dependencies = [ "futures-util", "http", @@ -7149,12 +7117,11 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75568f4f9696e3a47426e1985b548e1a9fcb13372a5e320372acaf04aca30d1" +checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d" dependencies = [ "anyhow", - "async-lock 3.3.0", "async-trait", "beef", "futures-timer", @@ -7175,9 +7142,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e7a95e346f55df84fb167b7e06470e196e7d5b9488a21d69c5d9732043ba7ba" +checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5" dependencies = [ "async-trait", "hyper", @@ -7195,9 +7162,9 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca066e73dd70294aebc5c2675d8ffae43be944af027c857ce0d4c51785f014" +checksum = "7d0bb047e79a143b32ea03974a6bf59b62c2a4c5f5d42a381c907a8bbb3f75c0" dependencies = [ "heck 0.4.1", "proc-macro-crate 3.0.0", @@ -7208,9 +7175,9 @@ dependencies = [ [[package]] name = "jsonrpsee-server" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e29c1bd1f9bba83c864977c73404e505f74f730fa0db89dd490ec174e36d7f0" +checksum = "12d8b6a9674422a8572e0b0abb12feeb3f2aeda86528c80d0350c2bd0923ab41" dependencies = [ "futures-util", "http", @@ -7232,9 +7199,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467fd35feeee179f71ab294516bdf3a81139e7aeebdd860e46897c12e1a3368" +checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d" dependencies = [ "anyhow", "beef", @@ -7245,9 +7212,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.22.2" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca71e74983f624c0cb67828e480a981586074da8ad3a2f214c6a3f884edab9" +checksum = "58b9db2dfd5bb1194b0ce921504df9ceae210a345bc2f6c5a61432089bbab070" dependencies = [ "http", "jsonrpsee-client-transport", @@ -18438,7 +18405,7 @@ dependencies = [ "async-executor", "async-fs", "async-io", - "async-lock 2.8.0", + "async-lock", "async-net", "async-process", "blocking", @@ -18461,7 +18428,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0bb30cf57b7b5f6109ce17c3164445e2d6f270af2cb48f6e4d31c2967c9a9f5" dependencies = [ "arrayvec 0.7.4", - "async-lock 2.8.0", + "async-lock", "atomic-take", "base64 0.21.2", "bip39", @@ -18472,7 +18439,7 @@ dependencies = [ "derive_more", "ed25519-zebra 4.0.3", "either", - "event-listener 2.5.3", + "event-listener", "fnv", "futures-lite", "futures-util", @@ -18515,12 +18482,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "256b5bad1d6b49045e95fe87492ce73d5af81545d8b4d8318a872d2007024c33" dependencies = [ "async-channel", - "async-lock 2.8.0", + "async-lock", "base64 0.21.2", "blake2-rfc", "derive_more", "either", - "event-listener 2.5.3", + "event-listener", "fnv", "futures-channel", "futures-lite", diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index b2661bbde27..4c755df541d 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } futures = "0.3.30" serde = { features = ["derive"], workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index e46fc4f4410..0959424ba86 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.30" -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } log = { workspace = true, default-features = true } parking_lot = "0.12.1" serde = { features = ["derive"], workspace = true, default-features = true } diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index 0789a429ac4..9b73418c958 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -15,7 +15,7 @@ workspace = true [dependencies] finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } futures = "0.3.30" -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } log = { workspace = true, default-features = true } parity-scale-codec = { version = "3.6.1", features = ["derive"] } serde = { features = ["derive"], workspace = true, default-features = true } diff --git a/substrate/client/consensus/manual-seal/Cargo.toml b/substrate/client/consensus/manual-seal/Cargo.toml index 1422d46105b..7aa8df248b7 100644 --- a/substrate/client/consensus/manual-seal/Cargo.toml +++ b/substrate/client/consensus/manual-seal/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } assert_matches = "1.3.0" async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index 9b391b76ea0..ec790790678 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } serde = { features = ["derive"], workspace = true, default-features = true } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index 169714d2245..c5613662b9f 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -28,4 +28,4 @@ sp-core = { path = "../../primitives/core" } sp-rpc = { path = "../../primitives/rpc" } sp-runtime = { path = "../../primitives/runtime" } sp-version = { path = "../../primitives/version" } -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index f2fc7bee6e2..1b5696f657c 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } # Internal chain structures for "chain_spec". sc-chain-spec = { path = "../chain-spec" } # Pool for submitting extrinsics required by "transaction" diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index 09dc611caa0..fd053d326e9 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/frame/transaction-payment/rpc/Cargo.toml b/substrate/frame/transaction-payment/rpc/Cargo.toml index 6d7f632af82..7f5e0d0b466 100644 --- a/substrate/frame/transaction-payment/rpc/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } pallet-transaction-payment-rpc-runtime-api = { path = "runtime-api" } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index 98a87b7d5b2..3673b2790c5 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -24,7 +24,7 @@ sp-state-machine = { path = "../../../../primitives/state-machine" } sp-trie = { path = "../../../../primitives/trie" } trie-db = "0.29.0" -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } # Substrate Dependencies sc-client-api = { path = "../../../../client/api" } diff --git a/substrate/utils/frame/rpc/system/Cargo.toml b/substrate/utils/frame/rpc/system/Cargo.toml index 9e571bef9d0..3e623daa14b 100644 --- a/substrate/utils/frame/rpc/system/Cargo.toml +++ b/substrate/utils/frame/rpc/system/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } futures = "0.3.30" log = { workspace = true, default-features = true } frame-system-rpc-runtime-api = { path = "../../../../frame/system/rpc/runtime-api" } -- GitLab From df84ea789f3fd0de20bd801e344ffa30172ffb55 Mon Sep 17 00:00:00 2001 From: Lulu Date: Thu, 2 May 2024 14:34:48 +0100 Subject: [PATCH 038/170] sc-tracing: enable env-filter feature (#4357) This crate uses this feature however it appears to still work without this feature enabled. I believe this is due to feature unification of the workspace. Some other crate enables this feature so it also ends up enabled here. But when this crate is pushed to crates.io and compiled individualy it fails to compile. --- substrate/client/tracing/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index ba1a7c51ab8..a8f0676a82b 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -30,7 +30,7 @@ serde = { workspace = true, default-features = true } thiserror = { workspace = true } tracing = "0.1.29" tracing-log = "0.1.3" -tracing-subscriber = { workspace = true, features = ["parking_lot"] } +tracing-subscriber = { workspace = true, features = ["env-filter", "parking_lot"] } sc-client-api = { path = "../api" } sc-tracing-proc-macro = { path = "proc-macro" } sp-api = { path = "../../primitives/api" } -- GitLab From 30a1972ee5608afa22cd5b72339acb59bb51b0f3 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 2 May 2024 16:08:24 +0200 Subject: [PATCH 039/170] More `xcm::v4` cleanup and `xcm_fee_payment_runtime_api::XcmPaymentApi` nits (#4355) This PR: - changes `xcm::v4` to `xcm::prelude` imports for coretime stuff - changes `query_acceptable_payment_assets` / `query_weight_to_asset_fee` implementations to be more resilient to the XCM version change - adds `xcm_fee_payment_runtime_api::XcmPaymentApi` to the AssetHubRococo/Westend exposing a native token as acceptable payment asset Continuation of: https://github.com/paritytech/polkadot-sdk/pull/3607 Closes: https://github.com/paritytech/polkadot-sdk/issues/4297 ## Possible follow-ups - [ ] add all sufficient assets (`Assets`, `ForeignAssets`) as acceptable payment assets ? --- Cargo.lock | 2 + .../assets/asset-hub-rococo/Cargo.toml | 2 + .../assets/asset-hub-rococo/src/lib.rs | 48 +++++++++++++++- .../assets/asset-hub-westend/Cargo.toml | 2 + .../assets/asset-hub-westend/src/lib.rs | 56 ++++++++++++++++--- .../parachains/src/coretime/migration.rs | 2 +- .../runtime/parachains/src/coretime/mod.rs | 4 +- polkadot/runtime/rococo/src/lib.rs | 32 +++++++---- polkadot/runtime/westend/src/lib.rs | 32 +++++++---- .../xcm-fee-payment-runtime-api/src/lib.rs | 2 +- 10 files changed, 145 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 30a4d62900f..634a98f82f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -887,6 +887,7 @@ dependencies = [ "staging-xcm-executor", "substrate-wasm-builder", "testnet-parachains-constants", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -1009,6 +1010,7 @@ dependencies = [ "substrate-wasm-builder", "testnet-parachains-constants", "westend-runtime-constants", + "xcm-fee-payment-runtime-api", ] [[package]] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 47574783810..64abedbaac7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -69,6 +69,7 @@ polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", def xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } # Cumulus cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } @@ -246,6 +247,7 @@ std = [ "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", + "xcm-fee-payment-runtime-api/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index c4f4bd4c1ee..2a8c5549f61 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -62,7 +62,7 @@ use frame_support::{ ConstU128, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Equals, InstanceFilter, TransformOrigin, }, - weights::{ConstantMultiplier, Weight}, + weights::{ConstantMultiplier, Weight, WeightToFee as _}, BoundedVec, PalletId, }; use frame_system::{ @@ -91,13 +91,16 @@ pub use sp_runtime::BuildStorage; // Polkadot imports use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -// We exclude `Assets` since it's the name of a pallet #[cfg(feature = "runtime-benchmarks")] use xcm::latest::prelude::{ Asset, Fungible, Here, InteriorLocation, Junction, Junction::*, Location, NetworkId, NonFungible, Parent, ParentThen, Response, XCM_VERSION, }; -use xcm::latest::prelude::{AssetId, BodyId}; +use xcm::{ + latest::prelude::{AssetId, BodyId}, + IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm, +}; +use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -1278,6 +1281,45 @@ impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { + let acceptable = vec![ + // native token + VersionedAssetId::from(AssetId(xcm_config::TokenLocation::get())) + ]; + + Ok(acceptable + .into_iter() + .filter_map(|asset| asset.into_version(xcm_version).ok()) + .collect()) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + match asset.try_as::() { + Ok(asset_id) if asset_id.0 == xcm_config::TokenLocation::get() => { + // for native token + Ok(WeightToFee::weight_to_fee(&weight)) + }, + Ok(asset_id) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + Err(XcmPaymentApiError::AssetNotFound) + }, + Err(_) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + Err(XcmPaymentApiError::VersionedConversionFailed) + } + } + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_xcm_weight(message) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_delivery_fees(destination, message) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 554659415a0..a767ac5af6c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -66,6 +66,7 @@ westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/co xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } # Cumulus cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } @@ -239,6 +240,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", + "xcm-fee-payment-runtime-api/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index a3593732f31..f9ab2145ffc 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -45,7 +45,7 @@ use frame_support::{ AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, Equals, InstanceFilter, TransformOrigin, }, - weights::{ConstantMultiplier, Weight}, + weights::{ConstantMultiplier, Weight, WeightToFee as _}, BoundedVec, PalletId, }; use frame_system::{ @@ -74,9 +74,10 @@ use sp_version::NativeVersion; use sp_version::RuntimeVersion; use testnet_parachains_constants::westend::{consensus::*, currency::*, fee::WeightToFee, time::*}; use xcm_config::{ - ForeignAssetsConvertedConcreteId, PoolAssetsConvertedConcreteId, - TrustBackedAssetsConvertedConcreteId, TrustBackedAssetsPalletLocationV3, WestendLocation, - WestendLocationV3, XcmOriginToTransactDispatchOrigin, + ForeignAssetsConvertedConcreteId, ForeignCreatorsSovereignAccountOf, + PoolAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, + TrustBackedAssetsPalletLocationV3, WestendLocation, WestendLocationV3, + XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -84,16 +85,18 @@ pub use sp_runtime::BuildStorage; use assets_common::{foreign_creators::ForeignCreators, matching::FromSiblingParachain}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -// We exclude `Assets` since it's the name of a pallet -use xcm::latest::prelude::AssetId; #[cfg(feature = "runtime-benchmarks")] use xcm::latest::prelude::{ Asset, Fungible, Here, InteriorLocation, Junction, Junction::*, Location, NetworkId, NonFungible, Parent, ParentThen, Response, XCM_VERSION, }; +use xcm::{ + latest::prelude::AssetId, IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, + VersionedXcm, +}; +use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; -use crate::xcm_config::ForeignCreatorsSovereignAccountOf; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -1369,6 +1372,45 @@ impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { + let acceptable = vec![ + // native token + VersionedAssetId::from(AssetId(xcm_config::WestendLocation::get())) + ]; + + Ok(acceptable + .into_iter() + .filter_map(|asset| asset.into_version(xcm_version).ok()) + .collect()) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + match asset.try_as::() { + Ok(asset_id) if asset_id.0 == xcm_config::WestendLocation::get() => { + // for native token + Ok(WeightToFee::weight_to_fee(&weight)) + }, + Ok(asset_id) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + Err(XcmPaymentApiError::AssetNotFound) + }, + Err(_) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + Err(XcmPaymentApiError::VersionedConversionFailed) + } + } + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_xcm_weight(message) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_delivery_fees(destination, message) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/polkadot/runtime/parachains/src/coretime/migration.rs b/polkadot/runtime/parachains/src/coretime/migration.rs index 4f52fc99ec3..6c8ddaa8aab 100644 --- a/polkadot/runtime/parachains/src/coretime/migration.rs +++ b/polkadot/runtime/parachains/src/coretime/migration.rs @@ -46,7 +46,7 @@ mod v_coretime { #[cfg(feature = "try-runtime")] use sp_std::vec::Vec; use sp_std::{iter, prelude::*, result}; - use xcm::v4::{send_xcm, Instruction, Junction, Location, SendError, WeightLimit, Xcm}; + use xcm::prelude::{send_xcm, Instruction, Junction, Location, SendError, WeightLimit, Xcm}; /// Return information about a legacy lease of a parachain. pub trait GetLegacyLease { diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index a30f7336f69..94bce4c83e6 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -26,7 +26,9 @@ pub use pallet::*; use pallet_broker::{CoreAssignment, CoreIndex as BrokerCoreIndex}; use primitives::{CoreIndex, Id as ParaId}; use sp_arithmetic::traits::SaturatedConversion; -use xcm::v4::{send_xcm, Instruction, Junction, Location, OriginKind, SendXcm, WeightLimit, Xcm}; +use xcm::prelude::{ + send_xcm, Instruction, Junction, Location, OriginKind, SendXcm, WeightLimit, Xcm, +}; use crate::{ assigner_coretime::{self, PartsOf57600}, diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 56f4aa40ef1..90a0fe41d4a 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1765,24 +1765,32 @@ sp_api::impl_runtime_apis! { impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { - if !matches!(xcm_version, 3 | 4) { - return Err(XcmPaymentApiError::UnhandledXcmVersion); - } - Ok([VersionedAssetId::V4(xcm_config::TokenLocation::get().into())] + let acceptable = vec![ + // native token + VersionedAssetId::from(AssetId(xcm_config::TokenLocation::get())) + ]; + + Ok(acceptable .into_iter() .filter_map(|asset| asset.into_version(xcm_version).ok()) .collect()) } fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { - let local_asset = VersionedAssetId::V4(xcm_config::TokenLocation::get().into()); - let asset = asset - .into_version(4) - .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; - - if asset != local_asset { return Err(XcmPaymentApiError::AssetNotFound); } - - Ok(WeightToFee::weight_to_fee(&weight)) + match asset.try_as::() { + Ok(asset_id) if asset_id.0 == xcm_config::TokenLocation::get() => { + // for native token + Ok(WeightToFee::weight_to_fee(&weight)) + }, + Ok(asset_id) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + Err(XcmPaymentApiError::AssetNotFound) + }, + Err(_) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + Err(XcmPaymentApiError::VersionedConversionFailed) + } + } } fn query_xcm_weight(message: VersionedXcm<()>) -> Result { diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 0a5312b538b..05a417e17f9 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -2199,24 +2199,32 @@ sp_api::impl_runtime_apis! { impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { - if !matches!(xcm_version, 3 | 4) { - return Err(XcmPaymentApiError::UnhandledXcmVersion); - } - Ok([VersionedAssetId::V4(xcm_config::TokenLocation::get().into())] + let acceptable = vec![ + // native token + VersionedAssetId::from(AssetId(xcm_config::TokenLocation::get())) + ]; + + Ok(acceptable .into_iter() .filter_map(|asset| asset.into_version(xcm_version).ok()) .collect()) } fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { - let local_asset = VersionedAssetId::V4(xcm_config::TokenLocation::get().into()); - let asset = asset - .into_version(4) - .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; - - if asset != local_asset { return Err(XcmPaymentApiError::AssetNotFound); } - - Ok(WeightToFee::weight_to_fee(&weight)) + match asset.try_as::() { + Ok(asset_id) if asset_id.0 == xcm_config::TokenLocation::get() => { + // for native token + Ok(WeightToFee::weight_to_fee(&weight)) + }, + Ok(asset_id) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + Err(XcmPaymentApiError::AssetNotFound) + }, + Err(_) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + Err(XcmPaymentApiError::VersionedConversionFailed) + } + } } fn query_xcm_weight(message: VersionedXcm<()>) -> Result { diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs index 20bf9236f1f..50fd4692cb0 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs @@ -41,7 +41,7 @@ sp_api::decl_runtime_apis! { /// /// # Arguments /// - /// * `xcm_version`: Version. + /// * `xcm_version`: desired XCM `Version` of `VersionedAssetId`. fn query_acceptable_payment_assets(xcm_version: Version) -> Result, Error>; /// Returns a weight needed to execute a XCM. -- GitLab From 6580101ef3d5c36e1d84a820136fb87f398b04a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 2 May 2024 17:19:38 +0200 Subject: [PATCH 040/170] Deprecate `NativeElseWasmExecutor` (#4329) The native executor is deprecated and downstream users should stop using it. --- cumulus/test/client/src/lib.rs | 33 ++++--------- prdoc/pr_4329.prdoc | 14 ++++++ substrate/client/executor/src/executor.rs | 30 +++++++++--- substrate/client/executor/src/lib.rs | 11 ++--- .../src/chain_head/subscription/inner.rs | 2 +- .../rpc-spec-v2/src/chain_head/tests.rs | 6 +-- substrate/client/service/src/builder.rs | 14 ++++-- .../service/src/client/call_executor.rs | 17 ++----- .../service/src/client/wasm_override.rs | 23 ++++----- substrate/client/service/src/lib.rs | 9 ++-- .../client/service/test/src/client/mod.rs | 21 +++----- substrate/frame/system/src/tests.rs | 12 ++--- .../api/test/tests/runtime_calls.rs | 4 +- substrate/test-utils/client/src/lib.rs | 23 +++------ .../test-utils/runtime/client/src/lib.rs | 49 ++++--------------- 15 files changed, 115 insertions(+), 153 deletions(-) create mode 100644 prdoc/pr_4329.prdoc diff --git a/cumulus/test/client/src/lib.rs b/cumulus/test/client/src/lib.rs index a39a662553b..d233ad26917 100644 --- a/cumulus/test/client/src/lib.rs +++ b/cumulus/test/client/src/lib.rs @@ -45,33 +45,18 @@ pub use substrate_test_client::*; pub type ParachainBlockData = cumulus_primitives_core::ParachainBlockData; -mod local_executor { - /// Native executor instance. - pub struct LocalExecutor; - - impl sc_executor::NativeExecutionDispatch for LocalExecutor { - type ExtendHostFunctions = - cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - cumulus_test_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - cumulus_test_runtime::native_version() - } - } -} - -/// Native executor used for tests. -pub use local_executor::LocalExecutor; - /// Test client database backend. pub type Backend = substrate_test_client::Backend; /// Test client executor. -pub type Executor = - client::LocalCallExecutor>; +pub type Executor = client::LocalCallExecutor< + Block, + Backend, + WasmExecutor<( + sp_io::SubstrateHostFunctions, + cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions, + )>, +>; /// Test client builder for Cumulus pub type TestClientBuilder = @@ -100,7 +85,7 @@ impl substrate_test_client::GenesisInit for GenesisParameters { } } -/// A `test-runtime` extensions to `TestClientBuilder`. +/// A `test-runtime` extensions to [`TestClientBuilder`]. pub trait TestClientBuilderExt: Sized { /// Build the test client. fn build(self) -> Client { diff --git a/prdoc/pr_4329.prdoc b/prdoc/pr_4329.prdoc new file mode 100644 index 00000000000..2fe11a60f4b --- /dev/null +++ b/prdoc/pr_4329.prdoc @@ -0,0 +1,14 @@ +title: "Deprecate `NativeElseWasmExecutor`" + +doc: + - audience: Node Dev + description: | + Deprecates the `NativeElseWasmExecutor` as native execution is already + discouraged and should be removed entirely. The executor should be + replaced by `WasmExecutor` which can be found in `sc-executor`. + + The `NativeElseWasmExecutor` will be removed at the end of 2024. + +crates: + - name: sc-executor + bump: minor diff --git a/substrate/client/executor/src/executor.rs b/substrate/client/executor/src/executor.rs index d56a3b389ef..913bcdfcfe5 100644 --- a/substrate/client/executor/src/executor.rs +++ b/substrate/client/executor/src/executor.rs @@ -83,7 +83,7 @@ fn unwrap_heap_pages(pages: Option) -> HeapAllocStrategy { } /// Builder for creating a [`WasmExecutor`] instance. -pub struct WasmExecutorBuilder { +pub struct WasmExecutorBuilder { _phantom: PhantomData, method: WasmExecutionMethod, onchain_heap_alloc_strategy: Option, @@ -218,7 +218,7 @@ impl WasmExecutorBuilder { /// An abstraction over Wasm code executor. Supports selecting execution backend and /// manages runtime cache. -pub struct WasmExecutor { +pub struct WasmExecutor { /// Method used to execute fallback Wasm code. method: WasmExecutionMethod, /// The heap allocation strategy for onchain Wasm calls. @@ -252,10 +252,13 @@ impl Clone for WasmExecutor { } } -impl WasmExecutor -where - H: HostFunctions, -{ +impl Default for WasmExecutor { + fn default() -> Self { + WasmExecutorBuilder::new().build() + } +} + +impl WasmExecutor { /// Create new instance. /// /// # Parameters @@ -312,7 +315,12 @@ where pub fn allow_missing_host_functions(&mut self, allow_missing_host_functions: bool) { self.allow_missing_host_functions = allow_missing_host_functions } +} +impl WasmExecutor +where + H: HostFunctions, +{ /// Execute the given closure `f` with the latest runtime (based on `runtime_code`). /// /// The closure `f` is expected to return `Err(_)` when there happened a `panic!` in native code @@ -558,6 +566,9 @@ where /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence /// and dispatch to native code when possible, falling back on `WasmExecutor` when not. +#[deprecated( + note = "Native execution will be deprecated, please replace with `WasmExecutor`. Will be removed at end of 2024." +)] pub struct NativeElseWasmExecutor { /// Native runtime version info. native_version: NativeVersion, @@ -568,6 +579,7 @@ pub struct NativeElseWasmExecutor { use_native: bool, } +#[allow(deprecated)] impl NativeElseWasmExecutor { /// /// Create new instance. @@ -628,6 +640,7 @@ impl NativeElseWasmExecutor { } } +#[allow(deprecated)] impl RuntimeVersionOf for NativeElseWasmExecutor { fn runtime_version( &self, @@ -638,12 +651,14 @@ impl RuntimeVersionOf for NativeElseWasmExecutor } } +#[allow(deprecated)] impl GetNativeVersion for NativeElseWasmExecutor { fn native_version(&self) -> &NativeVersion { &self.native_version } } +#[allow(deprecated)] impl CodeExecutor for NativeElseWasmExecutor { type Error = Error; @@ -718,6 +733,7 @@ impl CodeExecutor for NativeElseWasmExecut } } +#[allow(deprecated)] impl Clone for NativeElseWasmExecutor { fn clone(&self) -> Self { NativeElseWasmExecutor { @@ -728,6 +744,7 @@ impl Clone for NativeElseWasmExecutor { } } +#[allow(deprecated)] impl sp_core::traits::ReadRuntimeVersion for NativeElseWasmExecutor { fn read_runtime_version( &self, @@ -765,6 +782,7 @@ mod tests { } #[test] + #[allow(deprecated)] fn native_executor_registers_custom_interface() { let executor = NativeElseWasmExecutor::::new_with_wasm_executor( WasmExecutor::builder().build(), diff --git a/substrate/client/executor/src/lib.rs b/substrate/client/executor/src/lib.rs index 6b99f0a6ee0..204f1ff22d7 100644 --- a/substrate/client/executor/src/lib.rs +++ b/substrate/client/executor/src/lib.rs @@ -36,18 +36,17 @@ mod executor; mod integration_tests; mod wasm_runtime; -pub use self::{ - executor::{ - with_externalities_safe, NativeElseWasmExecutor, NativeExecutionDispatch, WasmExecutor, - }, - wasm_runtime::{read_embedded_version, WasmExecutionMethod}, -}; pub use codec::Codec; +#[allow(deprecated)] +pub use executor::NativeElseWasmExecutor; +pub use executor::{with_externalities_safe, NativeExecutionDispatch, WasmExecutor}; #[doc(hidden)] pub use sp_core::traits::Externalities; pub use sp_version::{NativeVersion, RuntimeVersion}; #[doc(hidden)] pub use sp_wasm_interface; +pub use sp_wasm_interface::HostFunctions; +pub use wasm_runtime::{read_embedded_version, WasmExecutionMethod}; pub use sc_executor_common::{ error, diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs index 3495d9e5449..a6edc344bc6 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs @@ -864,7 +864,7 @@ mod tests { Arc>>, ) { let backend = Arc::new(sc_client_api::in_mem::Backend::new()); - let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let executor = substrate_test_runtime_client::WasmExecutor::default(); let client_config = sc_service::ClientConfig::default(); let genesis_block_builder = sc_service::GenesisBlockBuilder::new( &substrate_test_runtime_client::GenesisParameters::default().genesis_storage(), diff --git a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs index 4bab2194e08..363d11235dd 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs @@ -16,13 +16,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use super::*; use crate::{ chain_head::{api::ChainHeadApiClient, event::MethodResponse, test_utils::ChainHeadMockClient}, common::events::{StorageQuery, StorageQueryType, StorageResultType}, hex_string, }; - -use super::*; use assert_matches::assert_matches; use codec::{Decode, Encode}; use futures::Future; @@ -32,7 +31,6 @@ use jsonrpsee::{ }, rpc_params, MethodsError as Error, RpcModule, }; - use sc_block_builder::BlockBuilderBuilder; use sc_client_api::ChildInfo; use sc_service::client::new_in_mem; @@ -2550,7 +2548,7 @@ async fn follow_report_multiple_pruned_block() { async fn pin_block_references() { // Manually construct an in-memory backend and client. let backend = Arc::new(sc_client_api::in_mem::Backend::new()); - let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let executor = substrate_test_runtime_client::WasmExecutor::default(); let client_config = sc_service::ClientConfig::default(); let genesis_block_builder = sc_service::GenesisBlockBuilder::new( diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index d0d7cba3862..06fc2ea3b30 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -37,8 +37,8 @@ use sc_client_api::{ use sc_client_db::{Backend, DatabaseSettings}; use sc_consensus::import_queue::ImportQueue; use sc_executor::{ - sp_wasm_interface::HostFunctions, HeapAllocStrategy, NativeElseWasmExecutor, - NativeExecutionDispatch, RuntimeVersionOf, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY, + sp_wasm_interface::HostFunctions, HeapAllocStrategy, NativeExecutionDispatch, RuntimeVersionOf, + WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY, }; use sc_keystore::LocalKeystore; use sc_network::{ @@ -262,11 +262,15 @@ where Ok((client, backend, keystore_container, task_manager)) } -/// Creates a [`NativeElseWasmExecutor`] according to [`Configuration`]. +/// Creates a [`NativeElseWasmExecutor`](sc_executor::NativeElseWasmExecutor) according to +/// [`Configuration`]. +#[deprecated(note = "Please switch to `new_wasm_executor`. Will be removed at end of 2024.")] +#[allow(deprecated)] pub fn new_native_or_wasm_executor( config: &Configuration, -) -> NativeElseWasmExecutor { - NativeElseWasmExecutor::new_with_wasm_executor(new_wasm_executor(config)) +) -> sc_executor::NativeElseWasmExecutor { + #[allow(deprecated)] + sc_executor::NativeElseWasmExecutor::new_with_wasm_executor(new_wasm_executor(config)) } /// Creates a [`WasmExecutor`] according to [`Configuration`]. diff --git a/substrate/client/service/src/client/call_executor.rs b/substrate/client/service/src/client/call_executor.rs index 86b5c7c61fc..9da4d219257 100644 --- a/substrate/client/service/src/client/call_executor.rs +++ b/substrate/client/service/src/client/call_executor.rs @@ -337,26 +337,17 @@ mod tests { use super::*; use backend::Backend; use sc_client_api::in_mem; - use sc_executor::{NativeElseWasmExecutor, WasmExecutor}; + use sc_executor::WasmExecutor; use sp_core::{ testing::TaskExecutor, traits::{FetchRuntimeCode, WrappedRuntimeCode}, }; use std::collections::HashMap; - use substrate_test_runtime_client::{runtime, GenesisInit, LocalExecutorDispatch}; - - fn executor() -> NativeElseWasmExecutor { - NativeElseWasmExecutor::new_with_wasm_executor( - WasmExecutor::builder() - .with_max_runtime_instances(1) - .with_runtime_cache_size(2) - .build(), - ) - } + use substrate_test_runtime_client::{runtime, GenesisInit}; #[test] fn should_get_override_if_exists() { - let executor = executor(); + let executor = WasmExecutor::default(); let overrides = crate::client::wasm_override::dummy_overrides(); let onchain_code = WrappedRuntimeCode(substrate_test_runtime::wasm_binary_unwrap().into()); @@ -425,7 +416,7 @@ mod tests { fn returns_runtime_version_from_substitute() { const SUBSTITUTE_SPEC_NAME: &str = "substitute-spec-name-cool"; - let executor = executor(); + let executor = WasmExecutor::default(); let backend = Arc::new(in_mem::Backend::::new()); diff --git a/substrate/client/service/src/client/wasm_override.rs b/substrate/client/service/src/client/wasm_override.rs index 725c8ab9429..678ae22bec1 100644 --- a/substrate/client/service/src/client/wasm_override.rs +++ b/substrate/client/service/src/client/wasm_override.rs @@ -264,24 +264,21 @@ pub fn dummy_overrides() -> WasmOverride { #[cfg(test)] mod tests { use super::*; - use sc_executor::{HeapAllocStrategy, NativeElseWasmExecutor, WasmExecutor}; + use sc_executor::{HeapAllocStrategy, WasmExecutor}; use std::fs::{self, File}; - use substrate_test_runtime_client::LocalExecutorDispatch; - - fn executor() -> NativeElseWasmExecutor { - NativeElseWasmExecutor::::new_with_wasm_executor( - WasmExecutor::builder() - .with_onchain_heap_alloc_strategy(HeapAllocStrategy::Static {extra_pages: 128}) - .with_offchain_heap_alloc_strategy(HeapAllocStrategy::Static {extra_pages: 128}) - .with_max_runtime_instances(1) - .with_runtime_cache_size(2) - .build() - ) + + fn executor() -> WasmExecutor { + WasmExecutor::builder() + .with_onchain_heap_alloc_strategy(HeapAllocStrategy::Static { extra_pages: 128 }) + .with_offchain_heap_alloc_strategy(HeapAllocStrategy::Static { extra_pages: 128 }) + .with_max_runtime_instances(1) + .with_runtime_cache_size(2) + .build() } fn wasm_test(fun: F) where - F: Fn(&Path, &[u8], &NativeElseWasmExecutor), + F: Fn(&Path, &[u8], &WasmExecutor), { let exec = executor(); let bytes = substrate_test_runtime::wasm_binary_unwrap(); diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs index e46cfab50a3..d0f315c30c8 100644 --- a/substrate/client/service/src/lib.rs +++ b/substrate/client/service/src/lib.rs @@ -55,14 +55,15 @@ use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; pub use self::{ builder::{ build_network, new_client, new_db_backend, new_full_client, new_full_parts, - new_full_parts_record_import, new_full_parts_with_genesis_builder, - new_native_or_wasm_executor, new_wasm_executor, spawn_tasks, BuildNetworkParams, - KeystoreContainer, NetworkStarter, SpawnTasksParams, TFullBackend, TFullCallExecutor, - TFullClient, + new_full_parts_record_import, new_full_parts_with_genesis_builder, new_wasm_executor, + spawn_tasks, BuildNetworkParams, KeystoreContainer, NetworkStarter, SpawnTasksParams, + TFullBackend, TFullCallExecutor, TFullClient, }, client::{ClientConfig, LocalCallExecutor}, error::Error, }; +#[allow(deprecated)] +pub use builder::new_native_or_wasm_executor; pub use sc_chain_spec::{ construct_genesis_block, resolve_state_version_from_wasm, BuildGenesisBlock, diff --git a/substrate/client/service/test/src/client/mod.rs b/substrate/client/service/test/src/client/mod.rs index 51dcc4966e5..4fcb7c160cb 100644 --- a/substrate/client/service/test/src/client/mod.rs +++ b/substrate/client/service/test/src/client/mod.rs @@ -28,6 +28,7 @@ use sc_client_db::{Backend, BlocksPruning, DatabaseSettings, DatabaseSource, Pru use sc_consensus::{ BlockCheckParams, BlockImport, BlockImportParams, ForkChoiceStrategy, ImportResult, }; +use sc_executor::WasmExecutor; use sc_service::client::{new_in_mem, Client, LocalCallExecutor}; use sp_api::ProvideRuntimeApi; use sp_consensus::{BlockOrigin, Error as ConsensusError, SelectChain}; @@ -42,8 +43,6 @@ use sp_storage::{ChildInfo, StorageKey}; use std::{collections::HashSet, sync::Arc}; use substrate_test_runtime::TestAPI; use substrate_test_runtime_client::{ - new_native_or_wasm_executor, - prelude::*, runtime::{ currency::DOLLARS, genesismap::{insert_genesis_block, GenesisStorageBuilder}, @@ -79,7 +78,7 @@ fn construct_block( StateMachine::new( backend, &mut overlay, - &new_native_or_wasm_executor(), + &WasmExecutor::default(), "Core_initialize_block", &header.encode(), &mut Default::default(), @@ -93,7 +92,7 @@ fn construct_block( StateMachine::new( backend, &mut overlay, - &new_native_or_wasm_executor(), + &WasmExecutor::default(), "BlockBuilder_apply_extrinsic", &tx.encode(), &mut Default::default(), @@ -107,7 +106,7 @@ fn construct_block( let ret_data = StateMachine::new( backend, &mut overlay, - &new_native_or_wasm_executor(), + &WasmExecutor::default(), "BlockBuilder_finalize_block", &[], &mut Default::default(), @@ -175,7 +174,7 @@ fn construct_genesis_should_work_with_native() { let _ = StateMachine::new( &backend, &mut overlay, - &new_native_or_wasm_executor(), + &WasmExecutor::default(), "Core_execute_block", &b1data, &mut Default::default(), @@ -206,7 +205,7 @@ fn construct_genesis_should_work_with_wasm() { let _ = StateMachine::new( &backend, &mut overlay, - &new_native_or_wasm_executor(), + &WasmExecutor::default(), "Core_execute_block", &b1data, &mut Default::default(), @@ -2072,7 +2071,7 @@ fn cleans_up_closed_notification_sinks_on_block_import() { use substrate_test_runtime_client::GenesisInit; let backend = Arc::new(sc_client_api::in_mem::Backend::new()); - let executor = new_native_or_wasm_executor(); + let executor = WasmExecutor::default(); let client_config = sc_service::ClientConfig::default(); let genesis_block_builder = sc_service::GenesisBlockBuilder::new( @@ -2099,11 +2098,7 @@ fn cleans_up_closed_notification_sinks_on_block_import() { type TestClient = Client< in_mem::Backend, - LocalCallExecutor< - Block, - in_mem::Backend, - sc_executor::NativeElseWasmExecutor, - >, + LocalCallExecutor, WasmExecutor>, Block, RuntimeApi, >; diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs index b889b5ca046..22b98014db4 100644 --- a/substrate/frame/system/src/tests.rs +++ b/substrate/frame/system/src/tests.rs @@ -21,14 +21,14 @@ use frame_support::{ dispatch::{Pays, PostDispatchInfo, WithPostDispatchInfo}, traits::{OnRuntimeUpgrade, WhitelistedStorageKeys}, }; -use std::collections::BTreeSet; - use mock::{RuntimeOrigin, *}; use sp_core::{hexdisplay::HexDisplay, H256}; use sp_runtime::{ traits::{BlakeTwo256, Header}, DispatchError, DispatchErrorWithPostInfo, }; +use std::collections::BTreeSet; +use substrate_test_runtime_client::WasmExecutor; #[test] fn check_whitelist() { @@ -653,7 +653,7 @@ fn assert_runtime_updated_digest(num: usize) { #[test] fn set_code_with_real_wasm_blob() { - let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let executor = WasmExecutor::default(); let mut ext = new_test_ext(); ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor)); ext.execute_with(|| { @@ -679,7 +679,7 @@ fn set_code_with_real_wasm_blob() { fn set_code_rejects_during_mbm() { Ongoing::set(true); - let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let executor = substrate_test_runtime_client::WasmExecutor::default(); let mut ext = new_test_ext(); ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor)); ext.execute_with(|| { @@ -699,7 +699,7 @@ fn set_code_rejects_during_mbm() { #[test] fn set_code_via_authorization_works() { - let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let executor = substrate_test_runtime_client::WasmExecutor::default(); let mut ext = new_test_ext(); ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor)); ext.execute_with(|| { @@ -739,7 +739,7 @@ fn set_code_via_authorization_works() { #[test] fn runtime_upgraded_with_set_storage() { - let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let executor = substrate_test_runtime_client::WasmExecutor::default(); let mut ext = new_test_ext(); ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor)); ext.execute_with(|| { diff --git a/substrate/primitives/api/test/tests/runtime_calls.rs b/substrate/primitives/api/test/tests/runtime_calls.rs index e66be7f9bf1..5a524d1c7f4 100644 --- a/substrate/primitives/api/test/tests/runtime_calls.rs +++ b/substrate/primitives/api/test/tests/runtime_calls.rs @@ -122,9 +122,7 @@ fn record_proof_works() { // Use the proof backend to execute `execute_block`. let mut overlay = Default::default(); - let executor = NativeElseWasmExecutor::::new_with_wasm_executor( - WasmExecutor::builder().build(), - ); + let executor: WasmExecutor = WasmExecutor::builder().build(); execution_proof_check_on_trie_backend( &backend, &mut overlay, diff --git a/substrate/test-utils/client/src/lib.rs b/substrate/test-utils/client/src/lib.rs index d283b24f286..c07640653d5 100644 --- a/substrate/test-utils/client/src/lib.rs +++ b/substrate/test-utils/client/src/lib.rs @@ -24,7 +24,7 @@ pub mod client_ext; pub use self::client_ext::{BlockOrigin, ClientBlockImportExt, ClientExt}; pub use sc_client_api::{execution_extensions::ExecutionExtensions, BadBlocks, ForkBlocks}; pub use sc_client_db::{self, Backend, BlocksPruning}; -pub use sc_executor::{self, NativeElseWasmExecutor, WasmExecutionMethod, WasmExecutor}; +pub use sc_executor::{self, WasmExecutionMethod, WasmExecutor}; pub use sc_service::{client, RpcHandlers}; pub use sp_consensus; pub use sp_keyring::{ @@ -245,14 +245,8 @@ impl } } -impl - TestClientBuilder< - Block, - client::LocalCallExecutor>, - Backend, - G, - > where - D: sc_executor::NativeExecutionDispatch, +impl + TestClientBuilder>, Backend, G> { /// Build the test client with the given native executor. pub fn build_with_native_executor( @@ -261,21 +255,18 @@ impl ) -> ( client::Client< Backend, - client::LocalCallExecutor>, + client::LocalCallExecutor>, Block, RuntimeApi, >, sc_consensus::LongestChain, ) where - I: Into>>, - D: sc_executor::NativeExecutionDispatch + 'static, + I: Into>>, Backend: sc_client_api::backend::Backend + 'static, + H: sc_executor::HostFunctions, { - let mut executor = executor.into().unwrap_or_else(|| { - NativeElseWasmExecutor::new_with_wasm_executor(WasmExecutor::builder().build()) - }); - executor.disable_use_native(); + let executor = executor.into().unwrap_or_else(|| WasmExecutor::::builder().build()); let executor = LocalCallExecutor::new( self.backend.clone(), executor.clone(), diff --git a/substrate/test-utils/runtime/client/src/lib.rs b/substrate/test-utils/runtime/client/src/lib.rs index 7428a7de3a0..435f3f5ebac 100644 --- a/substrate/test-utils/runtime/client/src/lib.rs +++ b/substrate/test-utils/runtime/client/src/lib.rs @@ -42,38 +42,18 @@ pub mod prelude { }; // Client structs pub use super::{ - Backend, ExecutorDispatch, LocalExecutorDispatch, NativeElseWasmExecutor, TestClient, - TestClientBuilder, WasmExecutionMethod, + Backend, ExecutorDispatch, TestClient, TestClientBuilder, WasmExecutionMethod, }; // Keyring pub use super::{AccountKeyring, Sr25519Keyring}; } -/// A unit struct which implements `NativeExecutionDispatch` feeding in the -/// hard-coded runtime. -pub struct LocalExecutorDispatch; - -impl sc_executor::NativeExecutionDispatch for LocalExecutorDispatch { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - substrate_test_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - substrate_test_runtime::native_version() - } -} - /// Test client database backend. pub type Backend = substrate_test_client::Backend; /// Test client executor. -pub type ExecutorDispatch = client::LocalCallExecutor< - substrate_test_runtime::Block, - Backend, - NativeElseWasmExecutor, ->; +pub type ExecutorDispatch = + client::LocalCallExecutor; /// Parameters of test-client builder with test-runtime. #[derive(Default)] @@ -113,14 +93,10 @@ pub type TestClientBuilder = substrate_test_client::TestClientBuilder< GenesisParameters, >; -/// Test client type with `LocalExecutorDispatch` and generic Backend. +/// Test client type with `WasmExecutor` and generic Backend. pub type Client = client::Client< B, - client::LocalCallExecutor< - substrate_test_runtime::Block, - B, - NativeElseWasmExecutor, - >, + client::LocalCallExecutor, substrate_test_runtime::Block, substrate_test_runtime::RuntimeApi, >; @@ -206,14 +182,8 @@ pub trait TestClientBuilderExt: Sized { } impl TestClientBuilderExt - for TestClientBuilder< - client::LocalCallExecutor< - substrate_test_runtime::Block, - B, - NativeElseWasmExecutor, - >, - B, - > where + for TestClientBuilder, B> +where B: sc_client_api::backend::Backend + 'static, { fn genesis_init_mut(&mut self) -> &mut GenesisParameters { @@ -238,6 +208,7 @@ pub fn new() -> Client { } /// Create a new native executor. -pub fn new_native_or_wasm_executor() -> NativeElseWasmExecutor { - NativeElseWasmExecutor::new_with_wasm_executor(WasmExecutor::builder().build()) +#[deprecated(note = "Switch to `WasmExecutor:default()`.")] +pub fn new_native_or_wasm_executor() -> WasmExecutor { + WasmExecutor::default() } -- GitLab From a9aeabe923dae63ab76ab290951cb9183c51f59c Mon Sep 17 00:00:00 2001 From: Kris Bitney Date: Thu, 2 May 2024 15:16:19 -0500 Subject: [PATCH 041/170] Allow for 0 existential deposit in benchmarks for `pallet_staking`, `pallet_session`, and `pallet_balances` (#4346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR ensures non-zero values are available in benchmarks for `pallet_staking`, `pallet_session`, and `pallet_balances` where required for them to run. This small change makes it possible to run the benchmarks for `pallet_staking`, `pallet_session`, and `pallet_balances` in a runtime for which existential deposit is set to 0. The benchmarks for `pallet_staking` and `pallet_session` will still fail in runtimes that use `U128CurrencyToVote`, but that is easy to work around by creating a new `CurrencyToVote` implementation for benchmarking. The changes are implemented by checking if existential deposit equals 0 and using 1 if so. --------- Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher --- prdoc/pr_4346.prdoc | 17 +++++++++++++++++ substrate/frame/balances/src/benchmarking.rs | 2 +- substrate/frame/staking/src/testing_utils.rs | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4346.prdoc diff --git a/prdoc/pr_4346.prdoc b/prdoc/pr_4346.prdoc new file mode 100644 index 00000000000..e222dec885c --- /dev/null +++ b/prdoc/pr_4346.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Allow for 0 existential deposit in benchmarks for pallet_staking, pallet_session, and pallet_balances + +doc: + - audience: Runtime Dev + description: | + Changes were made to benchmarks for `pallet_staking`, `pallet_session`, and `pallet-balances` to accommodate runtimes with 0 existential deposit. This should not affect the vast majority of runtimes. For runtimes with 0 existential deposit, the benchmarks for `pallet_staking` and `pallet_session` will still fail when using `U128CurrencyToVote` in the `pallet-staking` config; developers can use or write another `CurrencyToVote` implementation for benchmarking to work around this. + +crates: + - name: pallet-staking + bump: patch + - name: pallet-session-benchmarking + bump: patch + - name: pallet-balances + bump: patch diff --git a/substrate/frame/balances/src/benchmarking.rs b/substrate/frame/balances/src/benchmarking.rs index 0ce1240eb5d..14f0ede5e0f 100644 --- a/substrate/frame/balances/src/benchmarking.rs +++ b/substrate/frame/balances/src/benchmarking.rs @@ -44,7 +44,7 @@ mod benchmarks { let caller = whitelisted_caller(); // Give some multiple of the existential deposit - let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); + let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()).max(1u32.into()); let _ = as Currency<_>>::make_free_balance_be(&caller, balance); // Transfer `e - 1` existential deposits + 1 unit, which guarantees to create one account, diff --git a/substrate/frame/staking/src/testing_utils.rs b/substrate/frame/staking/src/testing_utils.rs index 28e08230d70..d4938ea43eb 100644 --- a/substrate/frame/staking/src/testing_utils.rs +++ b/substrate/frame/staking/src/testing_utils.rs @@ -77,7 +77,8 @@ pub fn create_stash_controller( destination: RewardDestination, ) -> Result<(T::AccountId, T::AccountId), &'static str> { let staker = create_funded_user::("stash", n, balance_factor); - let amount = T::Currency::minimum_balance() * (balance_factor / 10).max(1).into(); + let amount = + T::Currency::minimum_balance().max(1u64.into()) * (balance_factor / 10).max(1).into(); Staking::::bond(RawOrigin::Signed(staker.clone()).into(), amount, destination)?; Ok((staker.clone(), staker)) } -- GitLab From ad72cd8d481008ddc38bdd67a3ca3434901dd795 Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Fri, 3 May 2024 12:43:24 +0200 Subject: [PATCH 042/170] [WIP][CI] Add more GHA jobs (#4270) cc https://github.com/paritytech/ci_cd/issues/939 --- .github/env | 1 + .github/workflows/quick-checks.yml | 81 +++++++++++++++++++++++ .github/workflows/test-github-actions.yml | 27 +++++--- 3 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 .github/env create mode 100644 .github/workflows/quick-checks.yml diff --git a/.github/env b/.github/env new file mode 100644 index 00000000000..162ce8af7c0 --- /dev/null +++ b/.github/env @@ -0,0 +1 @@ +IMAGE="docker.io/paritytech/ci-unified:bullseye-1.77.0-2024-04-10-v20240408" \ No newline at end of file diff --git a/.github/workflows/quick-checks.yml b/.github/workflows/quick-checks.yml new file mode 100644 index 00000000000..7bf1983a1f6 --- /dev/null +++ b/.github/workflows/quick-checks.yml @@ -0,0 +1,81 @@ +# Checks that doesn't require heavy lifting, like formatting, linting, etc. +name: quick-checks + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + merge_group: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + set-image: + # GitHub Actions allows using 'env' in a container context. + # However, env variables don't work for forks: https://github.com/orgs/community/discussions/44322 + # This workaround sets the container image for each job using 'set-image' job output. + runs-on: arc-runners-polkadot-sdk-default + timeout-minutes: 10 + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT + fmt: + runs-on: arc-runners-polkadot-sdk-default + timeout-minutes: 10 + needs: [set-image] + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Cargo fmt + run: cargo +nightly fmt --all -- --check + check-dependency-rules: + runs-on: arc-runners-polkadot-sdk-default + timeout-minutes: 10 + needs: [set-image] + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: check dependency rules + run: | + cd substrate/ + ../.gitlab/ensure-deps.sh + check-rust-feature-propagation: + runs-on: arc-runners-polkadot-sdk-default + # runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [set-image] + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: run zepter + run: zepter run check + test-rust-features: + runs-on: arc-runners-polkadot-sdk-default + # runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [set-image] + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: run rust features + run: bash .gitlab/rust-features.sh . + check-toml-format: + runs-on: arc-runners-polkadot-sdk-default + timeout-minutes: 10 + needs: [set-image] + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: check toml format + run: | + taplo format --check --config .config/taplo.toml + echo "Please run `taplo format --config .config/taplo.toml` to fix any toml formatting issues" diff --git a/.github/workflows/test-github-actions.yml b/.github/workflows/test-github-actions.yml index c8ce49cb462..e35ee099486 100644 --- a/.github/workflows/test-github-actions.yml +++ b/.github/workflows/test-github-actions.yml @@ -8,15 +8,25 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true -env: - CARGO_NET_GIT_FETCH_WITH_CLI: true - jobs: + set-image: + # GitHub Actions allows using 'env' in a container context. + # However, env variables don't work for forks: https://github.com/orgs/community/discussions/44322 + # This workaround sets the container image for each job using 'set-image' job output. + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT test-linux-stable-int: - runs-on: arc-runners-polkadot-sdk + runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 + needs: [set-image] container: - image: "docker.io/paritytech/ci-unified:bullseye-1.77.0-2024-04-10-v20240408" + image: ${{ needs.set-image.outputs.IMAGE }} env: RUSTFLAGS: "-C debug-assertions -D warnings" RUST_BACKTRACE: 1 @@ -30,10 +40,11 @@ jobs: - name: script run: WASM_BUILD_NO_COLOR=1 time cargo test -p staging-node-cli --release --locked -- --ignored quick-benchmarks: - runs-on: arc-runners-polkadot-sdk + runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 + needs: [set-image] container: - image: "docker.io/paritytech/ci-unified:bullseye-1.77.0-2024-04-10-v20240408" + image: ${{ needs.set-image.outputs.IMAGE }} env: RUSTFLAGS: "-C debug-assertions -D warnings" RUST_BACKTRACE: "full" @@ -43,4 +54,4 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: script - run: time cargo run --locked --release -p staging-node-cli --bin substrate-node --features runtime-benchmarks --quiet -- benchmark pallet --chain dev --pallet "*" --extrinsic "*" --steps 2 --repeat 1 --quiet + run: time cargo run --locked --release -p staging-node-cli --bin substrate-node --features runtime-benchmarks -- benchmark pallet --chain dev --pallet "*" --extrinsic "*" --steps 2 --repeat 1 --quiet -- GitLab From 871281783c1be03157319d5143096fd3dd860d0a Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 3 May 2024 14:49:04 +0300 Subject: [PATCH 043/170] Bridge: fix zombienet tests (#4367) Due to recent bump of Rococo/Westend versions + the fact that https://github.com/paritytech/parity-bridges-common/pull/2894 has finally reached this repo, tests now fail, because we've started checking all client versions (even source) unless we specify `--source-version-mode Auto` in CLI arguments. This looks like an overkill, but all those version checks will be fixed by https://github.com/paritytech/polkadot-sdk/pull/4256, so now it makes sense just to add this CLI option. We also need to propagate it to running relays eventually. --- .../environments/rococo-westend/bridges_rococo_westend.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh b/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh index 2f11692d97b..57a3e08502f 100755 --- a/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh +++ b/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh @@ -177,6 +177,7 @@ function run_finality_relay() { --only-free-headers \ --source-host localhost \ --source-port 9942 \ + --source-version-mode Auto \ --target-host localhost \ --target-port 8945 \ --target-version-mode Auto \ @@ -188,6 +189,7 @@ function run_finality_relay() { --only-free-headers \ --source-host localhost \ --source-port 9945 \ + --source-version-mode Auto \ --target-host localhost \ --target-port 8943 \ --target-version-mode Auto \ @@ -203,6 +205,7 @@ function run_parachains_relay() { --only-free-headers \ --source-host localhost \ --source-port 9942 \ + --source-version-mode Auto \ --target-host localhost \ --target-port 8945 \ --target-version-mode Auto \ @@ -214,6 +217,7 @@ function run_parachains_relay() { --only-free-headers \ --source-host localhost \ --source-port 9945 \ + --source-version-mode Auto \ --target-host localhost \ --target-port 8943 \ --target-version-mode Auto \ -- GitLab From 1680977e5ed40c45596a7c9fa4b6f177e21ee8ee Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 3 May 2024 14:58:17 +0300 Subject: [PATCH 044/170] Bridge: added subcommand to relay single parachain header (#4365) Related to https://github.com/paritytech/parity-bridges-common/issues/2962 Relay companion: https://github.com/paritytech/parity-bridges-common/pull/2978 Example usage: ``` ./target/release/substrate-relay relay-parachain-head rococo-to-bridge-hub-westend \ --source-host localhost --source-port 9942 \ --target-host localhost --target-port 8945 --target-signer //Alice \ --at-relay-block 61 ``` --- .../src/cli/relay_parachains.rs | 51 ++++++++ .../relays/parachains/src/parachains_loop.rs | 116 ++++++++++++------ 2 files changed, 128 insertions(+), 39 deletions(-) diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs index 1425233add1..00f8cf79ef1 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs @@ -18,6 +18,8 @@ use async_std::sync::Mutex; use async_trait::async_trait; +use bp_polkadot_core::BlockNumber as RelayBlockNumber; +use bp_runtime::HeaderIdProvider; use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient}; use relay_substrate_client::Parachain; use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; @@ -51,6 +53,21 @@ pub struct RelayParachainsParams { prometheus_params: PrometheusParams, } +/// Single parachains head relaying params. +#[derive(StructOpt)] +pub struct RelayParachainHeadParams { + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + /// Prove parachain head at that relay block number. This relay header must be previously + /// proved to the target chain. + #[structopt(long)] + at_relay_block: RelayBlockNumber, +} + /// Trait used for relaying parachains finality between 2 chains. #[async_trait] pub trait ParachainsRelayer: ParachainToRelayHeadersCliBridge @@ -94,4 +111,38 @@ where .await .map_err(|e| anyhow::format_err!("{}", e)) } + + /// Relay single parachain head. No checks are made to ensure that transaction will succeed. + async fn relay_parachain_head(data: RelayParachainHeadParams) -> anyhow::Result<()> { + let source_chain_client = data.source.into_client::().await?; + let at_relay_block = source_chain_client + .header_by_number(data.at_relay_block) + .await + .map_err(|e| anyhow::format_err!("{}", e))? + .id(); + + let source_client = ParachainsSource::::new( + source_chain_client.clone(), + Arc::new(Mutex::new(AvailableHeader::Missing)), + ); + + let target_transaction_params = TransactionParams { + signer: data.target_sign.to_keypair::()?, + mortality: data.target_sign.target_transactions_mortality, + }; + let target_chain_client = data.target.into_client::().await?; + let target_client = ParachainsTarget::::new( + source_chain_client, + target_chain_client, + target_transaction_params, + ); + + parachains_relay::parachains_loop::relay_single_head( + source_client, + target_client, + at_relay_block, + ) + .await + .map_err(|_| anyhow::format_err!("The command has failed")) + } } diff --git a/bridges/relays/parachains/src/parachains_loop.rs b/bridges/relays/parachains/src/parachains_loop.rs index 55f236eeac1..fd73ca2d46c 100644 --- a/bridges/relays/parachains/src/parachains_loop.rs +++ b/bridges/relays/parachains/src/parachains_loop.rs @@ -139,6 +139,33 @@ pub fn metrics_prefix() -> String { ) } +/// Relay single parachain head. +pub async fn relay_single_head( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + at_relay_block: HeaderIdOf, +) -> Result<(), ()> +where + P::SourceRelayChain: Chain, +{ + let tx_tracker = + submit_selected_head::(&source_client, &target_client, at_relay_block, false) + .await + .map_err(drop)?; + match tx_tracker.wait().await { + TrackedTransactionStatus::Finalized(_) => Ok(()), + TrackedTransactionStatus::Lost => { + log::error!( + "Transaction with {} header at relay header {:?} is considered lost at {}", + P::SourceParachain::NAME, + at_relay_block, + P::TargetChain::NAME, + ); + Err(()) + }, + } +} + /// Run parachain heads synchronization. pub async fn run( source_client: impl SourceClient

, @@ -361,52 +388,63 @@ where ); if is_update_required { - let (head_proof, head_hash) = - source_client.prove_parachain_head(prove_at_relay_block).await.map_err(|e| { - log::warn!( - target: "bridge", - "Failed to prove {} parachain ParaId({}) heads: {:?}", - P::SourceRelayChain::NAME, - P::SourceParachain::PARACHAIN_ID, - e, - ); - FailedClient::Source - })?; - log::info!( - target: "bridge", - "Submitting {} parachain ParaId({}) head update transaction to {}. Para hash at source relay {:?}: {:?}", - P::SourceRelayChain::NAME, - P::SourceParachain::PARACHAIN_ID, - P::TargetChain::NAME, + let transaction_tracker = submit_selected_head::( + &source_client, + &target_client, prove_at_relay_block, - head_hash, - ); - - let transaction_tracker = target_client - .submit_parachain_head_proof( - prove_at_relay_block, - head_hash, - head_proof, - only_free_headers, - ) - .await - .map_err(|e| { - log::warn!( - target: "bridge", - "Failed to submit {} parachain ParaId({}) heads proof to {}: {:?}", - P::SourceRelayChain::NAME, - P::SourceParachain::PARACHAIN_ID, - P::TargetChain::NAME, - e, - ); - FailedClient::Target - })?; + only_free_headers, + ) + .await?; submitted_heads_tracker = Some(SubmittedHeadsTracker::

::new(head_at_source, transaction_tracker)); } } } +/// Prove and submit parachain head at given relay chain block. +async fn submit_selected_head>( + source_client: &impl SourceClient

, + target_client: &TC, + prove_at_relay_block: HeaderIdOf, + only_free_headers: bool, +) -> Result { + let (head_proof, head_hash) = + source_client.prove_parachain_head(prove_at_relay_block).await.map_err(|e| { + log::warn!( + target: "bridge", + "Failed to prove {} parachain ParaId({}) heads: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + e, + ); + FailedClient::Source + })?; + log::info!( + target: "bridge", + "Submitting {} parachain ParaId({}) head update transaction to {}. Para hash at source relay {:?}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + prove_at_relay_block, + head_hash, + ); + + target_client + .submit_parachain_head_proof(prove_at_relay_block, head_hash, head_proof, only_free_headers) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to submit {} parachain ParaId({}) heads proof to {}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + e, + ); + FailedClient::Target + }) +} + /// Returns `true` if we need to submit parachain-head-update transaction. fn is_update_required( head_at_source: AvailableHeader>, -- GitLab From 519862334feec5c72709afbf595ed61ddfb2298a Mon Sep 17 00:00:00 2001 From: Kris Bitney Date: Fri, 3 May 2024 07:31:45 -0500 Subject: [PATCH 045/170] Fix: dust unbonded for zero existential deposit (#4364) When a staker unbonds and withdraws, it is possible that their stash will contain less currency than the existential deposit. If that happens, their stash is reaped. But if the existential deposit is zero, the reap is not triggered. This PR adjusts `pallet_staking` to reap a stash in the special case that the stash value is zero and the existential deposit is zero. This change is important for blockchains built on substrate that require an existential deposit of zero, becuase it conserves valued storage space. There are two places in which ledgers are checked to determine if their value is less than the existential deposit and they should be reaped: in the methods `do_withdraw_unbonded` and `reap_stash`. When the check is made, the condition `ledger_total == 0` is also checked. If `ledger_total` is zero, then it must be below any existential deposit greater than zero and equal to an existential deposit of 0. I added a new test for each method to confirm the change behaves as expected. Closes https://github.com/paritytech/polkadot-sdk/issues/4340 --------- Co-authored-by: command-bot <> --- prdoc/pr_4364.prdoc | 10 +++ substrate/frame/staking/src/pallet/impls.rs | 3 +- substrate/frame/staking/src/pallet/mod.rs | 13 ++- substrate/frame/staking/src/tests.rs | 91 +++++++++++++++++++++ 4 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 prdoc/pr_4364.prdoc diff --git a/prdoc/pr_4364.prdoc b/prdoc/pr_4364.prdoc new file mode 100644 index 00000000000..88ee8d12286 --- /dev/null +++ b/prdoc/pr_4364.prdoc @@ -0,0 +1,10 @@ +title: Fix dust unbonded for zero existential deposit + +doc: + - audience: Runtime Dev + description: | + When a staker unbonds and withdraws, it is possible that their stash will contain less currency than the existential deposit. If that happens, their stash is reaped. But if the existential deposit is zero, the reap is not triggered. This PR adjusts pallet_staking to reap a stash in the special case that the stash value is zero and the existential deposit is zero. + +crates: + - name: pallet-staking + bump: patch diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index 5b2a55303e2..52361c6ccdc 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -198,8 +198,9 @@ impl Pallet { } let new_total = ledger.total; + let ed = T::Currency::minimum_balance(); let used_weight = - if ledger.unlocking.is_empty() && ledger.active < T::Currency::minimum_balance() { + if ledger.unlocking.is_empty() && (ledger.active < ed || ledger.active.is_zero()) { // This account must have called `unbond()` with some value that caused the active // portion to fall below existential deposit + will have no more unlocking chunks // left. We can now safely remove all staking-related information. diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index 16ad510c562..f82266c0390 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -938,7 +938,8 @@ pub mod pallet { /// - Three extra DB entries. /// /// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned - /// unless the `origin` falls below _existential deposit_ and gets removed as dust. + /// unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + /// as dust. #[pallet::call_index(0)] #[pallet::weight(T::WeightInfo::bond())] pub fn bond( @@ -1615,6 +1616,7 @@ pub mod pallet { /// /// 1. the `total_balance` of the stash is below existential deposit. /// 2. or, the `ledger.total` of the stash is below existential deposit. + /// 3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. /// /// The former can happen in cases like a slash; the latter when a fully unbonded account /// is still receiving staking rewards in `RewardDestination::Staked`. @@ -1640,8 +1642,13 @@ pub mod pallet { ensure!(!Self::is_virtual_staker(&stash), Error::::VirtualStakerNotAllowed); let ed = T::Currency::minimum_balance(); - let reapable = T::Currency::total_balance(&stash) < ed || - Self::ledger(Stash(stash.clone())).map(|l| l.total).unwrap_or_default() < ed; + let origin_balance = T::Currency::total_balance(&stash); + let ledger_total = + Self::ledger(Stash(stash.clone())).map(|l| l.total).unwrap_or_default(); + let reapable = origin_balance < ed || + origin_balance.is_zero() || + ledger_total < ed || + ledger_total.is_zero(); ensure!(reapable, Error::::FundedTarget); // Remove all staking-related information and lock. diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 3cb51604aa6..76afa3333cb 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -1931,6 +1931,44 @@ fn reap_stash_works() { }); } +#[test] +fn reap_stash_works_with_existential_deposit_zero() { + ExtBuilder::default() + .existential_deposit(0) + .balance_factor(10) + .build_and_execute(|| { + // given + assert_eq!(Balances::balance_locked(STAKING_ID, &11), 10 * 1000); + assert_eq!(Staking::bonded(&11), Some(11)); + + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + + // stash is not reapable + assert_noop!( + Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0), + Error::::FundedTarget + ); + + // no easy way to cause an account to go below ED, we tweak their staking ledger + // instead. + Ledger::::insert(11, StakingLedger::::new(11, 0)); + + // reap-able + assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0)); + + // then + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + // lock is removed. + assert_eq!(Balances::balance_locked(STAKING_ID, &11), 0); + }); +} + #[test] fn switching_roles() { // Test that it should be possible to switch between roles (nominator, validator, idle) with @@ -6953,6 +6991,59 @@ mod staking_interface { }); } + #[test] + fn do_withdraw_unbonded_can_kill_stash_with_existential_deposit_zero() { + ExtBuilder::default() + .existential_deposit(0) + .nominate(false) + .build_and_execute(|| { + // Initial state of 11 + assert_eq!(Staking::bonded(&11), Some(11)); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + assert_eq!( + Staking::eras_stakers(active_era(), &11), + Exposure { total: 1000, own: 1000, others: vec![] } + ); + + // Unbond all of the funds in stash. + Staking::chill(RuntimeOrigin::signed(11)).unwrap(); + Staking::unbond(RuntimeOrigin::signed(11), 1000).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 0, + unlocking: bounded_vec![UnlockChunk { value: 1000, era: 3 }], + legacy_claimed_rewards: bounded_vec![], + }, + ); + + // trigger future era. + mock::start_active_era(3); + + // withdraw unbonded + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(11), 0)); + + // empty stash has been reaped + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + // lock is removed. + assert_eq!(Balances::balance_locked(STAKING_ID, &11), 0); + }); + } + #[test] fn status() { ExtBuilder::default().build_and_execute(|| { -- GitLab From 4c09a0631334c3e021a30aa49a503815aa047b29 Mon Sep 17 00:00:00 2001 From: cheme Date: Fri, 3 May 2024 14:04:04 +0000 Subject: [PATCH 046/170] State trie migration on asset-hub westend and collectives westend (#4185) --- Cargo.lock | 2 + .../assets/asset-hub-rococo/src/lib.rs | 2 - .../assets/asset-hub-westend/Cargo.toml | 8 ++-- .../assets/asset-hub-westend/src/lib.rs | 45 ++++++++++++++++++- .../collectives-westend/Cargo.toml | 4 ++ .../collectives-westend/src/lib.rs | 45 ++++++++++++++++++- prdoc/pr_4185.prdoc | 20 +++++++++ 7 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 prdoc/pr_4185.prdoc diff --git a/Cargo.lock b/Cargo.lock index 634a98f82f8..d846f63b42b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -976,6 +976,7 @@ dependencies = [ "pallet-nfts-runtime-api", "pallet-proxy", "pallet-session", + "pallet-state-trie-migration", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -2845,6 +2846,7 @@ dependencies = [ "pallet-salary", "pallet-scheduler", "pallet-session", + "pallet-state-trie-migration", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 2a8c5549f61..383751578e5 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -1753,12 +1753,10 @@ fn ensure_key_ss58() { use sp_core::crypto::Ss58Codec; let acc = AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); - //panic!("{:x?}", acc); assert_eq!(acc, MigController::sorted_members()[0]); let acc = AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); assert_eq!(acc, RootMigController::sorted_members()[0]); - //panic!("{:x?}", acc); } #[cfg(test)] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index a767ac5af6c..3ba53eb3f93 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1", optional = true } +hex-literal = { version = "0.4.1" } log = { workspace = true } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } @@ -36,6 +36,7 @@ pallet-nfts = { path = "../../../../../substrate/frame/nfts", default-features = pallet-nfts-runtime-api = { path = "../../../../../substrate/frame/nfts/runtime-api", default-features = false } pallet-proxy = { path = "../../../../../substrate/frame/proxy", default-features = false } pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-state-trie-migration = { path = "../../../../../substrate/frame/state-trie-migration", default-features = false } pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } @@ -93,7 +94,6 @@ bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub- bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } [dev-dependencies] -hex-literal = "0.4.1" asset-test-utils = { path = "../test-utils" } [build-dependencies] @@ -112,7 +112,6 @@ runtime-benchmarks = [ "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", - "hex-literal", "pallet-asset-conversion-ops/runtime-benchmarks", "pallet-asset-conversion/runtime-benchmarks", "pallet-assets/runtime-benchmarks", @@ -123,6 +122,7 @@ runtime-benchmarks = [ "pallet-nft-fractionalization/runtime-benchmarks", "pallet-nfts/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", + "pallet-state-trie-migration/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-uniques/runtime-benchmarks", "pallet-utility/runtime-benchmarks", @@ -159,6 +159,7 @@ try-runtime = [ "pallet-nfts/try-runtime", "pallet-proxy/try-runtime", "pallet-session/try-runtime", + "pallet-state-trie-migration/try-runtime", "pallet-timestamp/try-runtime", "pallet-transaction-payment/try-runtime", "pallet-uniques/try-runtime", @@ -208,6 +209,7 @@ std = [ "pallet-nfts/std", "pallet-proxy/std", "pallet-session/std", + "pallet-state-trie-migration/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index f9ab2145ffc..e96ba3d962d 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -117,7 +117,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 15, - state_version: 0, + state_version: 1, }; /// The version information used to identify this runtime when compiled natively. @@ -931,6 +931,8 @@ construct_runtime!( PoolAssets: pallet_assets:: = 55, AssetConversion: pallet_asset_conversion = 56, + StateTrieMigration: pallet_state_trie_migration = 70, + // TODO: the pallet instance should be removed once all pools have migrated // to the new account IDs. AssetConversionMigration: pallet_asset_conversion_ops = 200, @@ -1808,3 +1810,44 @@ cumulus_pallet_parachain_system::register_validate_block! { Runtime = Runtime, BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, } + +parameter_types! { + // The deposit configuration for the singed migration. Specially if you want to allow any signed account to do the migration (see `SignedFilter`, these deposits should be high) + pub const MigrationSignedDepositPerItem: Balance = CENTS; + pub const MigrationSignedDepositBase: Balance = 2_000 * CENTS; + pub const MigrationMaxKeyLen: u32 = 512; +} + +impl pallet_state_trie_migration::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type RuntimeHoldReason = RuntimeHoldReason; + type SignedDepositPerItem = MigrationSignedDepositPerItem; + type SignedDepositBase = MigrationSignedDepositBase; + // An origin that can control the whole pallet: should be Root, or a part of your council. + type ControlOrigin = frame_system::EnsureSignedBy; + // specific account for the migration, can trigger the signed migrations. + type SignedFilter = frame_system::EnsureSignedBy; + + // Replace this with weight based on your runtime. + type WeightInfo = pallet_state_trie_migration::weights::SubstrateWeight; + + type MaxKeyLen = MigrationMaxKeyLen; +} + +frame_support::ord_parameter_types! { + pub const MigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); + pub const RootMigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); +} + +#[test] +fn ensure_key_ss58() { + use frame_support::traits::SortedMembers; + use sp_core::crypto::Ss58Codec; + let acc = + AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); + assert_eq!(acc, MigController::sorted_members()[0]); + let acc = + AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); + assert_eq!(acc, RootMigController::sorted_members()[0]); +} diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml index 22821170a54..8e7aa6d3464 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml @@ -34,6 +34,7 @@ pallet-preimage = { path = "../../../../../substrate/frame/preimage", default-fe pallet-proxy = { path = "../../../../../substrate/frame/proxy", default-features = false } pallet-scheduler = { path = "../../../../../substrate/frame/scheduler", default-features = false } pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-state-trie-migration = { path = "../../../../../substrate/frame/state-trie-migration", default-features = false } pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } @@ -118,6 +119,7 @@ runtime-benchmarks = [ "pallet-referenda/runtime-benchmarks", "pallet-salary/runtime-benchmarks", "pallet-scheduler/runtime-benchmarks", + "pallet-state-trie-migration/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-treasury/runtime-benchmarks", "pallet-utility/runtime-benchmarks", @@ -156,6 +158,7 @@ try-runtime = [ "pallet-salary/try-runtime", "pallet-scheduler/try-runtime", "pallet-session/try-runtime", + "pallet-state-trie-migration/try-runtime", "pallet-timestamp/try-runtime", "pallet-transaction-payment/try-runtime", "pallet-treasury/try-runtime", @@ -202,6 +205,7 @@ std = [ "pallet-salary/std", "pallet-scheduler/std", "pallet-session/std", + "pallet-state-trie-migration/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index d9839060408..35b505d9da6 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -121,7 +121,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, - state_version: 0, + state_version: 1, }; /// The version information used to identify this runtime when compiled natively. @@ -693,6 +693,8 @@ construct_runtime!( AmbassadorCore: pallet_core_fellowship:: = 73, AmbassadorSalary: pallet_salary:: = 74, AmbassadorContent: pallet_collective_content:: = 75, + + StateTrieMigration: pallet_state_trie_migration = 80, } ); @@ -1080,3 +1082,44 @@ cumulus_pallet_parachain_system::register_validate_block! { Runtime = Runtime, BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, } + +parameter_types! { + // The deposit configuration for the singed migration. Specially if you want to allow any signed account to do the migration (see `SignedFilter`, these deposits should be high) + pub const MigrationSignedDepositPerItem: Balance = CENTS; + pub const MigrationSignedDepositBase: Balance = 2_000 * CENTS; + pub const MigrationMaxKeyLen: u32 = 512; +} + +impl pallet_state_trie_migration::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type RuntimeHoldReason = RuntimeHoldReason; + type SignedDepositPerItem = MigrationSignedDepositPerItem; + type SignedDepositBase = MigrationSignedDepositBase; + // An origin that can control the whole pallet: should be Root, or a part of your council. + type ControlOrigin = frame_system::EnsureSignedBy; + // specific account for the migration, can trigger the signed migrations. + type SignedFilter = frame_system::EnsureSignedBy; + + // Replace this with weight based on your runtime. + type WeightInfo = pallet_state_trie_migration::weights::SubstrateWeight; + + type MaxKeyLen = MigrationMaxKeyLen; +} + +frame_support::ord_parameter_types! { + pub const MigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); + pub const RootMigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); +} + +#[test] +fn ensure_key_ss58() { + use frame_support::traits::SortedMembers; + use sp_core::crypto::Ss58Codec; + let acc = + AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); + assert_eq!(acc, MigController::sorted_members()[0]); + let acc = + AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); + assert_eq!(acc, RootMigController::sorted_members()[0]); +} diff --git a/prdoc/pr_4185.prdoc b/prdoc/pr_4185.prdoc new file mode 100644 index 00000000000..88cb6772e5d --- /dev/null +++ b/prdoc/pr_4185.prdoc @@ -0,0 +1,20 @@ +title: "State trie migration on asset-hub westend and collectives westend" + +doc: + - audience: Node Dev + description: | + On westend and rococo asset-hub and collectives westend the state version is switched to one + and a manual migration will be operate as describe in https://hackmd.io/JagpUd8tTjuKf9HQtpvHIQ + `2.2 Running the signed migration` with account `5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD`. + - audience: Runtime User + description: | + On westend and rococo asset-hub and collectives westend the parachain state will migrate + and warpsync will be broken during migration. + +crates: + - name: asset-hub-rococo-runtime + bump: minor + - name: asset-hub-westend-runtime + bump: minor + - name: collectives-westend-runtime + bump: minor -- GitLab From f45847b8b10db9cea664d0ce90083947c3843b10 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 3 May 2024 16:07:35 +0100 Subject: [PATCH 047/170] Add validate field to prdoc (#4368) --- prdoc/schema_user.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/prdoc/schema_user.json b/prdoc/schema_user.json index 1fa4b8d1202..294005f209d 100644 --- a/prdoc/schema_user.json +++ b/prdoc/schema_user.json @@ -140,6 +140,9 @@ "bump": { "$ref": "#/$defs/semver_bump" }, + "validate": { + "$ref": "#/$defs/semver_validate" + }, "note": { "type": "string" } @@ -183,6 +186,11 @@ "description" ] }, + "semver_validate": { + "type": "boolean", + "description": "Whether or not to validate the specified semver bump.", + "default": true + }, "semver_bump": { "description": "The type of bump to apply to the crate version according to Cargo SemVer: https://doc.rust-lang.org/cargo/reference/semver.html. Please check docs/RELEASE.md for more information.", "oneOf": [ -- GitLab From c0234becc185f88445dd63105b6f363c9e5990ce Mon Sep 17 00:00:00 2001 From: gupnik Date: Sat, 4 May 2024 11:06:19 +0530 Subject: [PATCH 048/170] Publish `polkadot-sdk-frame` crate (#4370) --- substrate/frame/Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index ef8d8758f3d..729df227be0 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -4,10 +4,9 @@ version = "0.1.0" authors = ["Parity Technologies "] edition.workspace = true license = "Apache-2.0" -homepage = "paritytech.github.io" +homepage = "https://paritytech.github.io" repository.workspace = true description = "Experimental: The single package to get you started with building frame pallets and runtimes" -publish = false [lints] workspace = true -- GitLab From 73c89d308fefcedfc3619f0273e13b6623766b81 Mon Sep 17 00:00:00 2001 From: gupnik Date: Mon, 6 May 2024 09:29:20 +0530 Subject: [PATCH 049/170] Introduces `TypeWithDefault>` (#4034) Needed for: https://github.com/polkadot-fellows/runtimes/issues/248 This PR introduces a new type `TypeWithDefault>` to be able to provide a custom default for any type. This can, then, be used to provide the nonce type that returns the current block number as the default, to avoid replay of immortal transactions. --------- Co-authored-by: Oliver Tale-Yazdi --- Cargo.lock | 1 + prdoc/pr_4034.prdoc | 14 + .../system/src/extensions/check_nonce.rs | 30 +- substrate/frame/system/src/mock.rs | 11 +- substrate/frame/system/src/tests.rs | 53 +- substrate/primitives/runtime/Cargo.toml | 2 + substrate/primitives/runtime/src/lib.rs | 1 + .../runtime/src/type_with_default.rs | 506 ++++++++++++++++++ 8 files changed, 587 insertions(+), 31 deletions(-) create mode 100644 prdoc/pr_4034.prdoc create mode 100644 substrate/primitives/runtime/src/type_with_default.rs diff --git a/Cargo.lock b/Cargo.lock index d846f63b42b..bc1fb03865e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19620,6 +19620,7 @@ dependencies = [ "hash256-std-hasher", "impl-trait-for-tuples", "log", + "num-traits", "parity-scale-codec", "paste", "rand 0.8.5", diff --git a/prdoc/pr_4034.prdoc b/prdoc/pr_4034.prdoc new file mode 100644 index 00000000000..994811b5d67 --- /dev/null +++ b/prdoc/pr_4034.prdoc @@ -0,0 +1,14 @@ +title: "Introduces `TypeWithDefault>`" + +doc: + - audience: Runtime Dev + description: | + This PR introduces a new type `TypeWithDefault>` to be able to provide a + custom default for any type. This can, then, be used to provide the nonce type that returns + the current block number as the default, to avoid replay of immortal transactions. + +crates: +- name: sp-runtime + bump: minor +- name: frame-system + bump: patch diff --git a/substrate/frame/system/src/extensions/check_nonce.rs b/substrate/frame/system/src/extensions/check_nonce.rs index 7504a814aef..894ab72eb59 100644 --- a/substrate/frame/system/src/extensions/check_nonce.rs +++ b/substrate/frame/system/src/extensions/check_nonce.rs @@ -142,7 +142,7 @@ mod tests { crate::Account::::insert( 1, crate::AccountInfo { - nonce: 1, + nonce: 1u64.into(), consumers: 0, providers: 1, sufficients: 0, @@ -153,20 +153,20 @@ mod tests { let len = 0_usize; // stale assert_noop!( - CheckNonce::(0).validate(&1, CALL, &info, len), + CheckNonce::(0u64.into()).validate(&1, CALL, &info, len), InvalidTransaction::Stale ); assert_noop!( - CheckNonce::(0).pre_dispatch(&1, CALL, &info, len), + CheckNonce::(0u64.into()).pre_dispatch(&1, CALL, &info, len), InvalidTransaction::Stale ); // correct - assert_ok!(CheckNonce::(1).validate(&1, CALL, &info, len)); - assert_ok!(CheckNonce::(1).pre_dispatch(&1, CALL, &info, len)); + assert_ok!(CheckNonce::(1u64.into()).validate(&1, CALL, &info, len)); + assert_ok!(CheckNonce::(1u64.into()).pre_dispatch(&1, CALL, &info, len)); // future - assert_ok!(CheckNonce::(5).validate(&1, CALL, &info, len)); + assert_ok!(CheckNonce::(5u64.into()).validate(&1, CALL, &info, len)); assert_noop!( - CheckNonce::(5).pre_dispatch(&1, CALL, &info, len), + CheckNonce::(5u64.into()).pre_dispatch(&1, CALL, &info, len), InvalidTransaction::Future ); }) @@ -178,7 +178,7 @@ mod tests { crate::Account::::insert( 2, crate::AccountInfo { - nonce: 1, + nonce: 1u64.into(), consumers: 0, providers: 1, sufficients: 0, @@ -188,7 +188,7 @@ mod tests { crate::Account::::insert( 3, crate::AccountInfo { - nonce: 1, + nonce: 1u64.into(), consumers: 0, providers: 0, sufficients: 1, @@ -199,19 +199,19 @@ mod tests { let len = 0_usize; // Both providers and sufficients zero assert_noop!( - CheckNonce::(1).validate(&1, CALL, &info, len), + CheckNonce::(1u64.into()).validate(&1, CALL, &info, len), InvalidTransaction::Payment ); assert_noop!( - CheckNonce::(1).pre_dispatch(&1, CALL, &info, len), + CheckNonce::(1u64.into()).pre_dispatch(&1, CALL, &info, len), InvalidTransaction::Payment ); // Non-zero providers - assert_ok!(CheckNonce::(1).validate(&2, CALL, &info, len)); - assert_ok!(CheckNonce::(1).pre_dispatch(&2, CALL, &info, len)); + assert_ok!(CheckNonce::(1u64.into()).validate(&2, CALL, &info, len)); + assert_ok!(CheckNonce::(1u64.into()).pre_dispatch(&2, CALL, &info, len)); // Non-zero sufficients - assert_ok!(CheckNonce::(1).validate(&3, CALL, &info, len)); - assert_ok!(CheckNonce::(1).pre_dispatch(&3, CALL, &info, len)); + assert_ok!(CheckNonce::(1u64.into()).validate(&3, CALL, &info, len)); + assert_ok!(CheckNonce::(1u64.into()).pre_dispatch(&3, CALL, &info, len)); }) } } diff --git a/substrate/frame/system/src/mock.rs b/substrate/frame/system/src/mock.rs index e1959e572e9..fff848b3b0e 100644 --- a/substrate/frame/system/src/mock.rs +++ b/substrate/frame/system/src/mock.rs @@ -17,7 +17,7 @@ use crate::{self as frame_system, *}; use frame_support::{derive_impl, parameter_types}; -use sp_runtime::{BuildStorage, Perbill}; +use sp_runtime::{type_with_default::TypeWithDefault, BuildStorage, Perbill}; type Block = mocking::MockBlock; @@ -78,6 +78,14 @@ impl OnKilledAccount for RecordKilled { } } +#[derive(Debug, TypeInfo)] +pub struct DefaultNonceProvider; +impl Get for DefaultNonceProvider { + fn get() -> u64 { + System::block_number() + } +} + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl Config for Test { type BlockWeights = RuntimeBlockWeights; @@ -87,6 +95,7 @@ impl Config for Test { type AccountData = u32; type OnKilledAccount = RecordKilled; type MultiBlockMigrator = MockedMigrator; + type Nonce = TypeWithDefault; } parameter_types! { diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs index 22b98014db4..b2cd017e1e2 100644 --- a/substrate/frame/system/src/tests.rs +++ b/substrate/frame/system/src/tests.rs @@ -102,7 +102,13 @@ fn stored_map_works() { assert_eq!( Account::::get(0), - AccountInfo { nonce: 0, providers: 1, consumers: 0, sufficients: 0, data: 42 } + AccountInfo { + nonce: 0u64.into(), + providers: 1, + consumers: 0, + sufficients: 0, + data: 42 + } ); assert_ok!(System::inc_consumers(&0)); @@ -126,26 +132,26 @@ fn provider_ref_handover_to_self_sufficient_ref_works() { new_test_ext().execute_with(|| { assert_eq!(System::inc_providers(&0), IncRefStatus::Created); System::inc_account_nonce(&0); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // a second reference coming and going doesn't change anything. assert_eq!(System::inc_sufficients(&0), IncRefStatus::Existed); assert_eq!(System::dec_sufficients(&0), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // a provider reference coming and going doesn't change anything. assert_eq!(System::inc_providers(&0), IncRefStatus::Existed); assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // decreasing the providers with a self-sufficient present should not delete the account assert_eq!(System::inc_sufficients(&0), IncRefStatus::Existed); assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // decreasing the sufficients should delete the account assert_eq!(System::dec_sufficients(&0), DecRefStatus::Reaped); - assert_eq!(System::account_nonce(&0), 0); + assert_eq!(System::account_nonce(&0), 0u64.into()); }); } @@ -154,26 +160,26 @@ fn self_sufficient_ref_handover_to_provider_ref_works() { new_test_ext().execute_with(|| { assert_eq!(System::inc_sufficients(&0), IncRefStatus::Created); System::inc_account_nonce(&0); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // a second reference coming and going doesn't change anything. assert_eq!(System::inc_providers(&0), IncRefStatus::Existed); assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // a sufficient reference coming and going doesn't change anything. assert_eq!(System::inc_sufficients(&0), IncRefStatus::Existed); assert_eq!(System::dec_sufficients(&0), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // decreasing the sufficients with a provider present should not delete the account assert_eq!(System::inc_providers(&0), IncRefStatus::Existed); assert_eq!(System::dec_sufficients(&0), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); // decreasing the providers should delete the account assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Reaped); - assert_eq!(System::account_nonce(&0), 0); + assert_eq!(System::account_nonce(&0), 0u64.into()); }); } @@ -182,7 +188,7 @@ fn sufficient_cannot_support_consumer() { new_test_ext().execute_with(|| { assert_eq!(System::inc_sufficients(&0), IncRefStatus::Created); System::inc_account_nonce(&0); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); assert_noop!(System::inc_consumers(&0), DispatchError::NoProviders); assert_eq!(System::inc_providers(&0), IncRefStatus::Existed); @@ -198,18 +204,18 @@ fn provider_required_to_support_consumer() { assert_eq!(System::inc_providers(&0), IncRefStatus::Created); System::inc_account_nonce(&0); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); assert_eq!(System::inc_providers(&0), IncRefStatus::Existed); assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists); - assert_eq!(System::account_nonce(&0), 1); + assert_eq!(System::account_nonce(&0), 1u64.into()); assert_ok!(System::inc_consumers(&0)); assert_noop!(System::dec_providers(&0), DispatchError::ConsumerRemaining); System::dec_consumers(&0); assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Reaped); - assert_eq!(System::account_nonce(&0), 0); + assert_eq!(System::account_nonce(&0), 0u64.into()); }); } @@ -858,3 +864,20 @@ fn last_runtime_upgrade_spec_version_usage() { } } } + +#[test] +fn test_default_account_nonce() { + new_test_ext().execute_with(|| { + System::set_block_number(2); + assert_eq!(System::account_nonce(&1), 2u64.into()); + + System::inc_account_nonce(&1); + assert_eq!(System::account_nonce(&1), 3u64.into()); + + System::set_block_number(5); + assert_eq!(System::account_nonce(&1), 3u64.into()); + + Account::::remove(&1); + assert_eq!(System::account_nonce(&1), 5u64.into()); + }); +} diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index fb5fd60fbbf..0389c9f5b2f 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -22,6 +22,7 @@ either = { version = "1.5", default-features = false } hash256-std-hasher = { version = "0.15.2", default-features = false } impl-trait-for-tuples = "0.2.2" log = { workspace = true } +num-traits = { version = "0.2.17", default-features = false } paste = "1.0" rand = { version = "0.8.5", optional = true } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } @@ -54,6 +55,7 @@ std = [ "either/use_std", "hash256-std-hasher/std", "log/std", + "num-traits/std", "rand", "scale-info/std", "serde/std", diff --git a/substrate/primitives/runtime/src/lib.rs b/substrate/primitives/runtime/src/lib.rs index 44bf3c969e5..e4e6b98ff77 100644 --- a/substrate/primitives/runtime/src/lib.rs +++ b/substrate/primitives/runtime/src/lib.rs @@ -91,6 +91,7 @@ mod runtime_string; pub mod testing; pub mod traits; pub mod transaction_validity; +pub mod type_with_default; pub use crate::runtime_string::*; diff --git a/substrate/primitives/runtime/src/type_with_default.rs b/substrate/primitives/runtime/src/type_with_default.rs new file mode 100644 index 00000000000..1465393640d --- /dev/null +++ b/substrate/primitives/runtime/src/type_with_default.rs @@ -0,0 +1,506 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Provides a type that wraps another type and provides a default value. + +use crate::traits::{Bounded, One, Zero}; +use codec::{Compact, CompactAs, Decode, Encode, HasCompact, MaxEncodedLen}; +use core::{ + fmt::Display, + marker::PhantomData, + ops::{ + Add, AddAssign, BitAnd, BitOr, BitXor, Deref, Div, DivAssign, Mul, MulAssign, Not, Rem, + RemAssign, Shl, Shr, Sub, SubAssign, + }, +}; +use num_traits::{ + CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedShl, CheckedShr, CheckedSub, + Num, NumCast, PrimInt, Saturating, ToPrimitive, +}; +use scale_info::TypeInfo; +use sp_core::Get; + +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; + +/// A type that wraps another type and provides a default value. +/// +/// Passes through arithmetical and many other operations to the inner value. +#[derive(Encode, Decode, TypeInfo, Debug, MaxEncodedLen)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +pub struct TypeWithDefault>(T, PhantomData); + +impl> TypeWithDefault { + fn new(value: T) -> Self { + Self(value, PhantomData) + } +} + +impl> Clone for TypeWithDefault { + fn clone(&self) -> Self { + Self(self.0.clone(), PhantomData) + } +} + +impl> Copy for TypeWithDefault {} + +impl> PartialEq for TypeWithDefault { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } +} + +impl> Eq for TypeWithDefault {} + +impl> PartialOrd for TypeWithDefault { + fn partial_cmp(&self, other: &Self) -> Option { + self.0.partial_cmp(&other.0) + } +} + +impl> Ord for TypeWithDefault { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { + self.0.cmp(&other.0) + } +} + +impl> Deref for TypeWithDefault { + type Target = T; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl> Default for TypeWithDefault { + fn default() -> Self { + Self::new(D::get()) + } +} + +impl, D: Get> From for TypeWithDefault { + fn from(value: u16) -> Self { + Self::new(value.into()) + } +} + +impl, D: Get> From for TypeWithDefault { + fn from(value: u32) -> Self { + Self::new(value.into()) + } +} + +impl, D: Get> From for TypeWithDefault { + fn from(value: u64) -> Self { + Self::new(value.into()) + } +} + +impl> CheckedNeg for TypeWithDefault { + fn checked_neg(&self) -> Option { + self.0.checked_neg().map(Self::new) + } +} + +impl> CheckedRem for TypeWithDefault { + fn checked_rem(&self, rhs: &Self) -> Option { + self.0.checked_rem(&rhs.0).map(Self::new) + } +} + +impl> CheckedShr for TypeWithDefault { + fn checked_shr(&self, n: u32) -> Option { + self.0.checked_shr(n).map(Self::new) + } +} + +impl> CheckedShl for TypeWithDefault { + fn checked_shl(&self, n: u32) -> Option { + self.0.checked_shl(n).map(Self::new) + } +} + +impl, D: Get> Rem for TypeWithDefault { + type Output = Self; + fn rem(self, rhs: Self) -> Self { + Self::new(self.0 % rhs.0) + } +} + +impl, D: Get> Rem for TypeWithDefault { + type Output = Self; + fn rem(self, rhs: u32) -> Self { + Self::new(self.0 % (rhs.into())) + } +} + +impl, D: Get> Shr for TypeWithDefault { + type Output = Self; + fn shr(self, rhs: u32) -> Self { + Self::new(self.0 >> rhs) + } +} + +impl, D: Get> Shr for TypeWithDefault { + type Output = Self; + fn shr(self, rhs: usize) -> Self { + Self::new(self.0 >> rhs) + } +} + +impl, D: Get> Shl for TypeWithDefault { + type Output = Self; + fn shl(self, rhs: u32) -> Self { + Self::new(self.0 << rhs) + } +} + +impl, D: Get> Shl for TypeWithDefault { + type Output = Self; + fn shl(self, rhs: usize) -> Self { + Self::new(self.0 << rhs) + } +} + +impl> RemAssign for TypeWithDefault { + fn rem_assign(&mut self, rhs: Self) { + self.0 %= rhs.0 + } +} + +impl> DivAssign for TypeWithDefault { + fn div_assign(&mut self, rhs: Self) { + self.0 /= rhs.0 + } +} + +impl> MulAssign for TypeWithDefault { + fn mul_assign(&mut self, rhs: Self) { + self.0 *= rhs.0 + } +} + +impl> SubAssign for TypeWithDefault { + fn sub_assign(&mut self, rhs: Self) { + self.0 -= rhs.0 + } +} + +impl> AddAssign for TypeWithDefault { + fn add_assign(&mut self, rhs: Self) { + self.0 += rhs.0 + } +} + +impl, D: Get> From for TypeWithDefault { + fn from(value: u8) -> Self { + Self::new(value.into()) + } +} + +impl> Display for TypeWithDefault { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl, D: Get> TryFrom for TypeWithDefault { + type Error = >::Error; + fn try_from(n: u128) -> Result, Self::Error> { + T::try_from(n).map(Self::new) + } +} + +impl, D: Get> TryFrom for TypeWithDefault { + type Error = >::Error; + fn try_from(n: usize) -> Result, Self::Error> { + T::try_from(n).map(Self::new) + } +} + +impl, D: Get> TryFrom> for u8 { + type Error = >::Error; + fn try_from(value: TypeWithDefault) -> Result { + value.0.try_into() + } +} + +impl, D: Get> TryFrom> for u16 { + type Error = >::Error; + fn try_from(value: TypeWithDefault) -> Result { + value.0.try_into() + } +} + +impl, D: Get> TryFrom> for u32 { + type Error = >::Error; + fn try_from(value: TypeWithDefault) -> Result { + value.0.try_into() + } +} + +impl, D: Get> TryFrom> for u64 { + type Error = >::Error; + fn try_from(value: TypeWithDefault) -> Result { + value.0.try_into() + } +} + +impl, D: Get> TryFrom> for u128 { + type Error = >::Error; + fn try_from(value: TypeWithDefault) -> Result { + value.0.try_into() + } +} + +impl, D: Get> TryFrom> for usize { + type Error = >::Error; + fn try_from(value: TypeWithDefault) -> Result { + value.0.try_into() + } +} + +impl> Zero for TypeWithDefault { + fn zero() -> Self { + Self::new(T::zero()) + } + + fn is_zero(&self) -> bool { + self.0 == T::zero() + } +} + +impl> Bounded for TypeWithDefault { + fn min_value() -> Self { + Self::new(T::min_value()) + } + + fn max_value() -> Self { + Self::new(T::max_value()) + } +} + +impl> PrimInt for TypeWithDefault { + fn count_ones(self) -> u32 { + self.0.count_ones() + } + + fn leading_zeros(self) -> u32 { + self.0.leading_zeros() + } + + fn trailing_zeros(self) -> u32 { + self.0.trailing_zeros() + } + + fn rotate_left(self, n: u32) -> Self { + Self::new(self.0.rotate_left(n)) + } + + fn rotate_right(self, n: u32) -> Self { + Self::new(self.0.rotate_right(n)) + } + + fn swap_bytes(self) -> Self { + Self::new(self.0.swap_bytes()) + } + + fn from_be(x: Self) -> Self { + Self::new(T::from_be(x.0)) + } + + fn from_le(x: Self) -> Self { + Self::new(T::from_le(x.0)) + } + + fn to_be(self) -> Self { + Self::new(self.0.to_be()) + } + + fn to_le(self) -> Self { + Self::new(self.0.to_le()) + } + + fn count_zeros(self) -> u32 { + self.0.count_zeros() + } + + fn signed_shl(self, n: u32) -> Self { + Self::new(self.0.signed_shl(n)) + } + + fn signed_shr(self, n: u32) -> Self { + Self::new(self.0.signed_shr(n)) + } + + fn unsigned_shl(self, n: u32) -> Self { + Self::new(self.0.unsigned_shl(n)) + } + + fn unsigned_shr(self, n: u32) -> Self { + Self::new(self.0.unsigned_shr(n)) + } + + fn pow(self, exp: u32) -> Self { + Self::new(self.0.pow(exp)) + } +} + +impl> Saturating for TypeWithDefault { + fn saturating_add(self, rhs: Self) -> Self { + Self::new(self.0.saturating_add(rhs.0)) + } + + fn saturating_sub(self, rhs: Self) -> Self { + Self::new(self.0.saturating_sub(rhs.0)) + } +} + +impl, D: Get> Div for TypeWithDefault { + type Output = Self; + fn div(self, rhs: Self) -> Self { + Self::new(self.0 / rhs.0) + } +} + +impl, D: Get> Mul for TypeWithDefault { + type Output = Self; + fn mul(self, rhs: Self) -> Self { + Self::new(self.0 * rhs.0) + } +} + +impl> CheckedDiv for TypeWithDefault { + fn checked_div(&self, rhs: &Self) -> Option { + self.0.checked_div(&rhs.0).map(Self::new) + } +} + +impl> CheckedMul for TypeWithDefault { + fn checked_mul(&self, rhs: &Self) -> Option { + self.0.checked_mul(&rhs.0).map(Self::new) + } +} + +impl, D: Get> Sub for TypeWithDefault { + type Output = Self; + fn sub(self, rhs: Self) -> Self { + Self::new(self.0 - rhs.0) + } +} + +impl> CheckedSub for TypeWithDefault { + fn checked_sub(&self, rhs: &Self) -> Option { + self.0.checked_sub(&rhs.0).map(Self::new) + } +} + +impl, D: Get> Add for TypeWithDefault { + type Output = Self; + fn add(self, rhs: Self) -> Self { + Self::new(self.0 + rhs.0) + } +} + +impl> CheckedAdd for TypeWithDefault { + fn checked_add(&self, rhs: &Self) -> Option { + self.0.checked_add(&rhs.0).map(Self::new) + } +} + +impl, D: Get> BitAnd for TypeWithDefault { + type Output = Self; + fn bitand(self, rhs: Self) -> Self { + Self::new(self.0 & rhs.0) + } +} + +impl, D: Get> BitOr for TypeWithDefault { + type Output = Self; + fn bitor(self, rhs: Self) -> Self { + Self::new(self.0 | rhs.0) + } +} + +impl, D: Get> BitXor for TypeWithDefault { + type Output = Self; + fn bitxor(self, rhs: Self) -> Self { + Self::new(self.0 ^ rhs.0) + } +} + +impl> One for TypeWithDefault { + fn one() -> Self { + Self::new(T::one()) + } +} + +impl, D: Get> Not for TypeWithDefault { + type Output = Self; + fn not(self) -> Self { + Self::new(self.0.not()) + } +} + +impl> NumCast for TypeWithDefault { + fn from(n: P) -> Option { + ::from(n).map_or(None, |n| Some(Self::new(n))) + } +} + +impl> Num for TypeWithDefault { + type FromStrRadixErr = ::FromStrRadixErr; + + fn from_str_radix(s: &str, radix: u32) -> Result { + T::from_str_radix(s, radix).map(Self::new) + } +} + +impl> ToPrimitive for TypeWithDefault { + fn to_i64(&self) -> Option { + self.0.to_i64() + } + + fn to_u64(&self) -> Option { + self.0.to_u64() + } + + fn to_i128(&self) -> Option { + self.0.to_i128() + } + + fn to_u128(&self) -> Option { + self.0.to_u128() + } +} + +impl> From>> for TypeWithDefault { + fn from(c: Compact>) -> Self { + c.0 + } +} + +impl> CompactAs for TypeWithDefault { + type As = T; + + fn encode_as(&self) -> &Self::As { + &self.0 + } + + fn decode_from(val: Self::As) -> Result { + Ok(Self::new(val)) + } +} -- GitLab From 6e3059a873b78c7a4e2da18b4c298847713140ee Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Mon, 6 May 2024 19:49:14 +0800 Subject: [PATCH 050/170] Upgrade a few deps (#4381) Split from #4374 This PR helps to reduce dependencies and align versions, which would help to move them to workspace dep --- Cargo.lock | 342 +++++++----------- .../outbound-queue/merkle-tree/Cargo.toml | 2 +- .../relay-chain-minimal-node/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- polkadot/Cargo.toml | 2 +- polkadot/erasure-coding/Cargo.toml | 2 +- polkadot/node/core/approval-voting/Cargo.toml | 2 +- polkadot/node/core/pvf/Cargo.toml | 4 +- .../node/core/pvf/prepare-worker/Cargo.toml | 2 +- .../network/approval-distribution/Cargo.toml | 2 +- polkadot/node/subsystem-bench/Cargo.toml | 2 +- polkadot/node/subsystem-util/Cargo.toml | 2 +- .../node/zombienet-backchannel/Cargo.toml | 2 +- polkadot/xcm/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 6 +- .../client/authority-discovery/Cargo.toml | 4 +- substrate/client/chain-spec/Cargo.toml | 2 +- substrate/client/cli/Cargo.toml | 4 +- substrate/client/consensus/beefy/Cargo.toml | 2 +- substrate/client/consensus/grandpa/Cargo.toml | 2 +- substrate/client/db/Cargo.toml | 4 +- substrate/client/executor/Cargo.toml | 4 +- substrate/client/keystore/Cargo.toml | 2 +- substrate/client/mixnet/Cargo.toml | 2 +- substrate/client/network/Cargo.toml | 6 +- substrate/client/network/common/Cargo.toml | 2 +- substrate/client/network/light/Cargo.toml | 6 +- substrate/client/network/statement/Cargo.toml | 2 +- substrate/client/network/sync/Cargo.toml | 6 +- .../client/network/transactions/Cargo.toml | 2 +- substrate/client/network/types/Cargo.toml | 2 +- substrate/client/offchain/Cargo.toml | 2 +- substrate/client/rpc-spec-v2/Cargo.toml | 2 +- substrate/client/service/test/Cargo.toml | 2 +- substrate/client/tracing/Cargo.toml | 4 +- substrate/client/transaction-pool/Cargo.toml | 4 +- substrate/frame/alliance/Cargo.toml | 4 +- substrate/frame/beefy-mmr/Cargo.toml | 4 +- substrate/frame/benchmarking/Cargo.toml | 2 +- substrate/frame/contracts/Cargo.toml | 2 +- substrate/frame/executive/Cargo.toml | 4 +- .../frame/merkle-mountain-range/Cargo.toml | 4 +- substrate/frame/sassafras/Cargo.toml | 2 +- substrate/frame/society/Cargo.toml | 2 +- substrate/frame/staking/Cargo.toml | 4 +- substrate/frame/support/Cargo.toml | 2 +- substrate/frame/support/procedural/Cargo.toml | 2 +- substrate/frame/system/Cargo.toml | 2 +- .../frame/transaction-storage/Cargo.toml | 2 +- substrate/primitives/api/test/Cargo.toml | 2 +- substrate/primitives/arithmetic/Cargo.toml | 2 +- .../primitives/consensus/beefy/Cargo.toml | 2 +- substrate/primitives/core/Cargo.toml | 8 +- substrate/primitives/core/src/ed25519.rs | 4 +- .../primitives/crypto/hashing/Cargo.toml | 2 +- substrate/primitives/keystore/Cargo.toml | 2 +- .../merkle-mountain-range/Cargo.toml | 2 +- substrate/primitives/state-machine/Cargo.toml | 2 +- substrate/primitives/trie/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- substrate/test-utils/cli/Cargo.toml | 2 +- substrate/test-utils/client/Cargo.toml | 2 +- substrate/test-utils/runtime/Cargo.toml | 2 +- substrate/utils/binary-merkle-tree/Cargo.toml | 4 +- .../utils/frame/benchmarking-cli/Cargo.toml | 4 +- 66 files changed, 226 insertions(+), 298 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc1fb03865e..8a7ba656af1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -275,20 +275,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "aquamarine" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da02abba9f9063d786eab1509833ebb2fac0f966862ca59439c76b9c566760" -dependencies = [ - "include_dir", - "itertools 0.10.5", - "proc-macro-error", - "proc-macro2 1.0.75", - "quote 1.0.35", - "syn 1.0.109", -] - [[package]] name = "aquamarine" version = "0.5.0" @@ -672,15 +658,9 @@ dependencies = [ [[package]] name = "array-bytes" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" - -[[package]] -name = "array-bytes" -version = "6.1.0" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" +checksum = "6f840fb7195bcfc5e17ea40c26e5ce6d5b9ce5d584466e17703209657e459ae0" [[package]] name = "arrayref" @@ -1408,7 +1388,7 @@ dependencies = [ name = "binary-merkle-tree" version = "13.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "env_logger 0.11.3", "hash-db", "log", @@ -3456,34 +3436,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "criterion" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" -dependencies = [ - "anes", - "atty", - "cast", - "ciborium", - "clap 3.2.25", - "criterion-plot", - "futures", - "itertools 0.10.5", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "tokio", - "walkdir", -] - [[package]] name = "criterion" version = "0.5.1" @@ -4233,7 +4185,7 @@ dependencies = [ name = "cumulus-relay-chain-minimal-node" version = "0.7.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-trait", "cumulus-primitives-core", "cumulus-relay-chain-interface", @@ -4405,7 +4357,7 @@ version = "0.1.0" dependencies = [ "async-trait", "clap 4.5.3", - "criterion 0.5.1", + "criterion", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", @@ -5007,20 +4959,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - [[package]] name = "ed25519-zebra" version = "4.0.3" @@ -5647,7 +5585,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" name = "frame-benchmarking" version = "28.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "frame-support", "frame-support-procedural", "frame-system", @@ -5675,7 +5613,7 @@ name = "frame-benchmarking-cli" version = "32.0.0" dependencies = [ "Inflector", - "array-bytes 6.1.0", + "array-bytes", "chrono", "clap 4.5.3", "comfy-table", @@ -5684,7 +5622,7 @@ dependencies = [ "frame-system", "gethostname", "handlebars", - "itertools 0.10.5", + "itertools 0.11.0", "lazy_static", "linked-hash-map", "log", @@ -5788,8 +5726,8 @@ dependencies = [ name = "frame-executive" version = "28.0.0" dependencies = [ - "aquamarine 0.3.3", - "array-bytes 6.1.0", + "aquamarine", + "array-bytes", "frame-support", "frame-system", "frame-try-runtime", @@ -5859,8 +5797,8 @@ dependencies = [ name = "frame-support" version = "28.0.0" dependencies = [ - "aquamarine 0.5.0", - "array-bytes 6.1.0", + "aquamarine", + "array-bytes", "assert_matches", "bitflags 1.3.2", "docify", @@ -5909,7 +5847,7 @@ dependencies = [ "derive-syn-parse 0.2.0", "expander 2.0.0", "frame-support-procedural-tools", - "itertools 0.10.5", + "itertools 0.11.0", "macro_magic", "proc-macro-warning", "proc-macro2 1.0.75", @@ -6006,7 +5944,7 @@ name = "frame-system" version = "28.0.0" dependencies = [ "cfg-if", - "criterion 0.4.0", + "criterion", "docify", "frame-support", "log", @@ -8107,7 +8045,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project", "prost 0.11.9", - "prost-build", + "prost-build 0.11.9", "quinn", "rand 0.8.5", "rcgen", @@ -8124,7 +8062,7 @@ dependencies = [ "thiserror", "tokio", "tokio-stream", - "tokio-tungstenite 0.20.1", + "tokio-tungstenite", "tokio-util", "tracing", "trust-dns-resolver 0.23.2", @@ -8356,15 +8294,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.8.0" @@ -8915,8 +8844,6 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.7.1", - "pin-utils", "static_assertions", ] @@ -8947,7 +8874,7 @@ checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" name = "node-bench" version = "0.9.0-dev" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "clap 4.5.3", "derive_more", "fs_extra", @@ -9038,7 +8965,7 @@ dependencies = [ "flate2", "fs_extra", "glob", - "itertools 0.10.5", + "itertools 0.11.0", "tar", "tempfile", "toml_edit 0.19.15", @@ -9425,7 +9352,7 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" name = "pallet-alliance" version = "27.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "frame-benchmarking", "frame-support", "frame-system", @@ -9655,7 +9582,7 @@ dependencies = [ name = "pallet-bags-list" version = "27.0.0" dependencies = [ - "aquamarine 0.5.0", + "aquamarine", "docify", "frame-benchmarking", "frame-election-provider-support", @@ -9751,7 +9678,7 @@ dependencies = [ name = "pallet-beefy-mmr" version = "28.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "binary-merkle-tree", "frame-support", "frame-system", @@ -9999,7 +9926,7 @@ dependencies = [ name = "pallet-contracts" version = "27.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "bitflags 1.3.2", "env_logger 0.11.3", @@ -10683,12 +10610,12 @@ dependencies = [ name = "pallet-mmr" version = "27.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "env_logger 0.11.3", "frame-benchmarking", "frame-support", "frame-system", - "itertools 0.10.5", + "itertools 0.11.0", "log", "parity-scale-codec", "scale-info", @@ -11176,7 +11103,7 @@ dependencies = [ name = "pallet-sassafras" version = "0.3.5-dev" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "frame-benchmarking", "frame-support", "frame-system", @@ -11293,7 +11220,7 @@ dependencies = [ "log", "pallet-balances", "parity-scale-codec", - "rand_chacha 0.2.2", + "rand_chacha 0.3.1", "scale-info", "sp-arithmetic", "sp-core", @@ -11319,7 +11246,7 @@ dependencies = [ "pallet-staking-reward-curve", "pallet-timestamp", "parity-scale-codec", - "rand_chacha 0.2.2", + "rand_chacha 0.3.1", "scale-info", "serde", "sp-application-crypto", @@ -11521,7 +11448,7 @@ dependencies = [ name = "pallet-transaction-storage" version = "27.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "frame-benchmarking", "frame-support", "frame-system", @@ -11944,8 +11871,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" dependencies = [ "bitcoin_hashes 0.13.0", - "rand 0.8.5", - "rand_core 0.6.4", + "rand 0.7.3", + "rand_core 0.5.1", "serde", "unicode-normalization", ] @@ -12574,7 +12501,7 @@ version = "6.0.0" dependencies = [ "assert_cmd", "color-eyre", - "nix 0.26.2", + "nix 0.27.1", "polkadot-cli", "polkadot-core-primitives", "polkadot-node-core-pvf", @@ -12598,7 +12525,7 @@ dependencies = [ "env_logger 0.11.3", "futures", "futures-timer", - "itertools 0.10.5", + "itertools 0.11.0", "log", "polkadot-node-jaeger", "polkadot-node-metrics", @@ -12814,7 +12741,7 @@ dependencies = [ name = "polkadot-erasure-coding" version = "7.0.0" dependencies = [ - "criterion 0.4.0", + "criterion", "parity-scale-codec", "polkadot-node-primitives", "polkadot-primitives", @@ -12917,7 +12844,7 @@ dependencies = [ "env_logger 0.11.3", "futures", "futures-timer", - "itertools 0.10.5", + "itertools 0.11.0", "kvdb", "kvdb-memorydb", "log", @@ -13188,11 +13115,11 @@ name = "polkadot-node-core-pvf" version = "7.0.0" dependencies = [ "always-assert", - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "blake3", "cfg-if", - "criterion 0.4.0", + "criterion", "futures", "futures-timer", "hex-literal", @@ -13297,7 +13224,7 @@ version = "7.0.0" dependencies = [ "blake3", "cfg-if", - "criterion 0.4.0", + "criterion", "libc", "nix 0.27.1", "parity-scale-codec", @@ -13497,7 +13424,7 @@ dependencies = [ "fatality", "futures", "futures-channel", - "itertools 0.10.5", + "itertools 0.11.0", "kvdb", "kvdb-memorydb", "kvdb-shared-tests", @@ -13592,7 +13519,7 @@ dependencies = [ "hex-literal", "jsonrpsee", "log", - "nix 0.26.2", + "nix 0.27.1", "pallet-transaction-payment", "pallet-transaction-payment-rpc", "pallet-transaction-payment-rpc-runtime-api", @@ -14839,12 +14766,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" dependencies = [ "bytes", - "prost-derive 0.12.3", + "prost-derive 0.12.4", ] [[package]] @@ -14862,13 +14789,34 @@ dependencies = [ "petgraph", "prettyplease 0.1.25", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", "regex", "syn 1.0.109", "tempfile", "which", ] +[[package]] +name = "prost-build" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.11.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease 0.2.12", + "prost 0.12.4", + "prost-types 0.12.4", + "regex", + "syn 2.0.53", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.11.9" @@ -14884,9 +14832,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" dependencies = [ "anyhow", "itertools 0.11.0", @@ -14904,6 +14852,15 @@ dependencies = [ "prost 0.11.9", ] +[[package]] +name = "prost-types" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +dependencies = [ + "prost 0.12.4", +] + [[package]] name = "psm" version = "0.1.21" @@ -16236,8 +16193,8 @@ dependencies = [ "multihash 0.17.0", "multihash-codetable", "parity-scale-codec", - "prost 0.12.3", - "prost-build", + "prost 0.12.4", + "prost-build 0.12.4", "quickcheck", "rand 0.8.5", "sc-client-api", @@ -16300,7 +16257,7 @@ dependencies = [ name = "sc-chain-spec" version = "28.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "docify", "log", "memmap2 0.9.3", @@ -16340,13 +16297,13 @@ dependencies = [ name = "sc-cli" version = "0.36.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "chrono", "clap 4.5.3", "fdlimit", "futures", "futures-timer", - "itertools 0.10.5", + "itertools 0.11.0", "libp2p-identity", "log", "names", @@ -16412,8 +16369,8 @@ dependencies = [ name = "sc-client-db" version = "0.35.0" dependencies = [ - "array-bytes 6.1.0", - "criterion 0.4.0", + "array-bytes", + "criterion", "hash-db", "kitchensink-runtime", "kvdb", @@ -16578,7 +16535,7 @@ dependencies = [ name = "sc-consensus-beefy" version = "13.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-channel", "async-trait", "fnv", @@ -16656,7 +16613,7 @@ name = "sc-consensus-grandpa" version = "0.19.0" dependencies = [ "ahash 0.8.8", - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "async-trait", "dyn-clone", @@ -16814,9 +16771,9 @@ dependencies = [ name = "sc-executor" version = "0.32.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_matches", - "criterion 0.4.0", + "criterion", "env_logger 0.11.3", "num_cpus", "parity-scale-codec", @@ -16916,7 +16873,7 @@ dependencies = [ name = "sc-keystore" version = "25.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "parking_lot 0.12.1", "serde_json", "sp-application-crypto", @@ -16930,7 +16887,7 @@ dependencies = [ name = "sc-mixnet" version = "0.4.0" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "arrayvec 0.7.4", "blake2 0.10.6", "bytes", @@ -16958,7 +16915,7 @@ dependencies = [ name = "sc-network" version = "0.34.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "async-channel", "async-trait", @@ -16981,8 +16938,8 @@ dependencies = [ "parking_lot 0.12.1", "partial_sort", "pin-project", - "prost 0.11.9", - "prost-build", + "prost 0.12.4", + "prost-build 0.12.4", "rand 0.8.5", "sc-block-builder", "sc-client-api", @@ -17027,7 +16984,7 @@ dependencies = [ "futures", "libp2p-identity", "parity-scale-codec", - "prost-build", + "prost-build 0.12.4", "sc-consensus", "sc-network-types", "sp-consensus", @@ -17064,13 +17021,13 @@ dependencies = [ name = "sc-network-light" version = "0.33.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-channel", "futures", "log", "parity-scale-codec", - "prost 0.12.3", - "prost-build", + "prost 0.12.4", + "prost-build 0.12.4", "sc-client-api", "sc-network", "sc-network-types", @@ -17084,7 +17041,7 @@ dependencies = [ name = "sc-network-statement" version = "0.16.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-channel", "futures", "libp2p", @@ -17104,7 +17061,7 @@ dependencies = [ name = "sc-network-sync" version = "0.33.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-channel", "async-trait", "fork-tree", @@ -17114,8 +17071,8 @@ dependencies = [ "log", "mockall", "parity-scale-codec", - "prost 0.12.3", - "prost-build", + "prost 0.12.4", + "prost-build 0.12.4", "quickcheck", "sc-block-builder", "sc-client-api", @@ -17176,7 +17133,7 @@ dependencies = [ name = "sc-network-transactions" version = "0.33.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "futures", "libp2p", "log", @@ -17195,7 +17152,7 @@ dependencies = [ name = "sc-network-types" version = "0.10.0-dev" dependencies = [ - "bs58 0.4.0", + "bs58 0.5.0", "libp2p-identity", "litep2p", "multiaddr", @@ -17208,7 +17165,7 @@ dependencies = [ name = "sc-offchain" version = "29.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-trait", "bytes", "fnv", @@ -17337,7 +17294,7 @@ dependencies = [ name = "sc-rpc-spec-v2" version = "0.34.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "futures", "futures-util", @@ -17457,7 +17414,7 @@ dependencies = [ name = "sc-service-test" version = "2.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-channel", "fdlimit", "futures", @@ -17595,7 +17552,7 @@ version = "28.0.0" dependencies = [ "ansi_term", "chrono", - "criterion 0.4.0", + "criterion", "is-terminal", "lazy_static", "libc", @@ -17615,7 +17572,7 @@ dependencies = [ "sp-tracing 16.0.0", "thiserror", "tracing", - "tracing-log 0.1.3", + "tracing-log 0.2.0", "tracing-subscriber 0.3.18", ] @@ -17633,10 +17590,10 @@ dependencies = [ name = "sc-transaction-pool" version = "28.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "async-trait", - "criterion 0.4.0", + "criterion", "futures", "futures-timer", "linked-hash-map", @@ -18441,7 +18398,7 @@ dependencies = [ "chacha20", "crossbeam-queue", "derive_more", - "ed25519-zebra 4.0.3", + "ed25519-zebra", "either", "event-listener", "fnv", @@ -18634,7 +18591,7 @@ dependencies = [ name = "snowbridge-outbound-queue-merkle-tree" version = "0.3.0" dependencies = [ - "array-bytes 4.2.0", + "array-bytes", "env_logger 0.11.3", "hex", "hex-literal", @@ -19016,7 +18973,7 @@ dependencies = [ name = "sp-api-test" version = "2.0.1" dependencies = [ - "criterion 0.4.0", + "criterion", "futures", "log", "parity-scale-codec", @@ -19062,7 +19019,7 @@ dependencies = [ name = "sp-arithmetic" version = "23.0.0" dependencies = [ - "criterion 0.4.0", + "criterion", "docify", "integer-sqrt", "num-traits", @@ -19193,7 +19150,7 @@ dependencies = [ name = "sp-consensus-beefy" version = "13.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "lazy_static", "parity-scale-codec", "scale-info", @@ -19264,20 +19221,20 @@ dependencies = [ name = "sp-core" version = "28.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "bandersnatch_vrfs", "bitflags 1.3.2", "blake2 0.10.6", "bounded-collections", "bs58 0.5.0", - "criterion 0.4.0", + "criterion", "dyn-clonable", - "ed25519-zebra 3.1.0", + "ed25519-zebra", "futures", "hash-db", "hash256-std-hasher", "impl-serde", - "itertools 0.10.5", + "itertools 0.11.0", "k256", "lazy_static", "libsecp256k1", @@ -19380,7 +19337,7 @@ version = "0.1.0" dependencies = [ "blake2b_simd", "byteorder", - "criterion 0.4.0", + "criterion", "digest 0.10.7", "sha2 0.10.8", "sha3", @@ -19509,7 +19466,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "rand 0.8.5", - "rand_chacha 0.2.2", + "rand_chacha 0.3.1", "sp-core", "sp-externalities 0.25.0", ] @@ -19545,7 +19502,7 @@ dependencies = [ name = "sp-mmr-primitives" version = "26.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "ckb-merkle-mountain-range", "log", "parity-scale-codec", @@ -19774,7 +19731,7 @@ dependencies = [ name = "sp-state-machine" version = "0.35.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_matches", "hash-db", "log", @@ -19920,8 +19877,8 @@ name = "sp-trie" version = "29.0.0" dependencies = [ "ahash 0.8.8", - "array-bytes 6.1.0", - "criterion 0.5.1", + "array-bytes", + "criterion", "hash-db", "lazy_static", "memory-db", @@ -20099,11 +20056,11 @@ dependencies = [ name = "staging-node-cli" version = "3.0.0-dev" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "assert_cmd", "clap 4.5.3", "clap_complete", - "criterion 0.4.0", + "criterion", "frame-benchmarking", "frame-benchmarking-cli", "frame-support", @@ -20114,7 +20071,7 @@ dependencies = [ "kitchensink-runtime", "log", "mmr-gadget", - "nix 0.26.2", + "nix 0.27.1", "node-primitives", "node-rpc", "node-testing", @@ -20245,7 +20202,7 @@ version = "2.0.0" name = "staging-xcm" version = "7.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "bounded-collections", "derivative", "environmental", @@ -20515,7 +20472,7 @@ version = "0.1.0" dependencies = [ "assert_cmd", "futures", - "nix 0.26.2", + "nix 0.27.1", "node-primitives", "regex", "sc-cli", @@ -20667,7 +20624,7 @@ dependencies = [ name = "substrate-test-client" version = "2.0.1" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "async-trait", "futures", "parity-scale-codec", @@ -20693,7 +20650,7 @@ dependencies = [ name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "array-bytes 6.1.0", + "array-bytes", "frame-executive", "frame-support", "frame-system", @@ -21460,18 +21417,6 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "tokio-tungstenite" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.17.3", -] - [[package]] name = "tokio-tungstenite" version = "0.20.1" @@ -21484,7 +21429,7 @@ dependencies = [ "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", - "tungstenite 0.20.1", + "tungstenite", ] [[package]] @@ -21746,7 +21691,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3092f400e9f7e3ce8c1756016a8b6287163ab7a11dd47d82169260cb4cc2d680" dependencies = [ - "criterion 0.5.1", + "criterion", "hash-db", "keccak-hasher", "memory-db", @@ -21907,25 +21852,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" -[[package]] -name = "tungstenite" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http", - "httparse", - "log", - "rand 0.8.5", - "sha-1 0.10.1", - "thiserror", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.20.1" @@ -21960,7 +21886,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.8.5", + "rand 0.7.3", "static_assertions", ] @@ -23541,7 +23467,7 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "tokio-tungstenite 0.17.2", + "tokio-tungstenite", "tracing-gum", "url", ] diff --git a/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml index 5315d6b4adb..2d58517c18b 100644 --- a/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml @@ -25,7 +25,7 @@ sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-fea hex-literal = { version = "0.4.1" } env_logger = "0.11" hex = "0.4" -array-bytes = "4.1" +array-bytes = "6.2.2" sp-crypto-hashing = { path = "../../../../../substrate/primitives/crypto/hashing" } [features] diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml index 6860b42a507..88673a8f08f 100644 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ b/cumulus/client/relay-chain-minimal-node/Cargo.toml @@ -47,7 +47,7 @@ cumulus-relay-chain-interface = { path = "../relay-chain-interface" } cumulus-relay-chain-rpc-interface = { path = "../relay-chain-rpc-interface" } cumulus-primitives-core = { path = "../../primitives/core" } -array-bytes = "6.1" +array-bytes = "6.2.2" tracing = "0.1.37" async-trait = "0.1.79" futures = "0.3.28" diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 280ece30fb6..f21a5baf973 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -118,7 +118,7 @@ substrate-build-script-utils = { path = "../../substrate/utils/build-script-util [dev-dependencies] assert_cmd = "2.0" -nix = { version = "0.26.1", features = ["signal"] } +nix = { version = "0.27.1", features = ["signal"] } tempfile = "3.8.0" tokio = { version = "1.32.0", features = ["macros", "parking_lot", "time"] } wait-timeout = "0.2" diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index 659edcb041c..7b5679e1084 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -43,7 +43,7 @@ tikv-jemallocator = { version = "0.5.0", features = ["unprefixed_malloc_on_suppo [dev-dependencies] assert_cmd = "2.0.4" -nix = { version = "0.26.1", features = ["signal"] } +nix = { version = "0.27.1", features = ["signal"] } tempfile = "3.2.0" tokio = "1.37" substrate-rpc-client = { path = "../substrate/utils/frame/rpc/client" } diff --git a/polkadot/erasure-coding/Cargo.toml b/polkadot/erasure-coding/Cargo.toml index 677f15c4b9a..db5967e20f5 100644 --- a/polkadot/erasure-coding/Cargo.toml +++ b/polkadot/erasure-coding/Cargo.toml @@ -19,7 +19,7 @@ sp-trie = { path = "../../substrate/primitives/trie" } thiserror = { workspace = true } [dev-dependencies] -criterion = { version = "0.4.0", default-features = false, features = ["cargo_bench_support"] } +criterion = { version = "0.5.1", default-features = false, features = ["cargo_bench_support"] } [[bench]] name = "scaling_with_validators" diff --git a/polkadot/node/core/approval-voting/Cargo.toml b/polkadot/node/core/approval-voting/Cargo.toml index 473bc67923b..5139d6c6a3f 100644 --- a/polkadot/node/core/approval-voting/Cargo.toml +++ b/polkadot/node/core/approval-voting/Cargo.toml @@ -21,7 +21,7 @@ schnorrkel = "0.11.4" kvdb = "0.13.0" derive_more = "0.99.17" thiserror = { workspace = true } -itertools = "0.10.5" +itertools = "0.11" polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } diff --git a/polkadot/node/core/pvf/Cargo.toml b/polkadot/node/core/pvf/Cargo.toml index 8bfe2baa42f..9666206b1e7 100644 --- a/polkadot/node/core/pvf/Cargo.toml +++ b/polkadot/node/core/pvf/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] always-assert = "0.1" -array-bytes = "6.1" +array-bytes = "6.2.2" blake3 = "1.5" cfg-if = "1.0" futures = "0.3.30" @@ -44,7 +44,7 @@ polkadot-node-core-pvf-execute-worker = { path = "execute-worker", optional = tr [dev-dependencies] assert_matches = "1.4.0" -criterion = { version = "0.4.0", default-features = false, features = [ +criterion = { version = "0.5.1", default-features = false, features = [ "async_tokio", "cargo_bench_support", ] } diff --git a/polkadot/node/core/pvf/prepare-worker/Cargo.toml b/polkadot/node/core/pvf/prepare-worker/Cargo.toml index 24efbec4be7..9ecf1c8af50 100644 --- a/polkadot/node/core/pvf/prepare-worker/Cargo.toml +++ b/polkadot/node/core/pvf/prepare-worker/Cargo.toml @@ -41,7 +41,7 @@ jemalloc-allocator = [ ] [dev-dependencies] -criterion = { version = "0.4.0", default-features = false, features = ["cargo_bench_support"] } +criterion = { version = "0.5.1", default-features = false, features = ["cargo_bench_support"] } rococo-runtime = { path = "../../../../runtime/rococo" } sp-maybe-compressed-blob = { path = "../../../../../substrate/primitives/maybe-compressed-blob" } diff --git a/polkadot/node/network/approval-distribution/Cargo.toml b/polkadot/node/network/approval-distribution/Cargo.toml index 4c04ad83f84..d80519b9e2e 100644 --- a/polkadot/node/network/approval-distribution/Cargo.toml +++ b/polkadot/node/network/approval-distribution/Cargo.toml @@ -18,7 +18,7 @@ polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-primitives = { path = "../../../primitives" } polkadot-node-jaeger = { path = "../../jaeger" } rand = "0.8" -itertools = "0.10.5" +itertools = "0.11" futures = "0.3.30" futures-timer = "3.0.2" diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index e534ac18e4b..e56efbf8254 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -66,7 +66,7 @@ sc-network-types = { path = "../../../substrate/client/network/types" } sc-service = { path = "../../../substrate/client/service" } sp-consensus = { path = "../../../substrate/primitives/consensus/common" } polkadot-node-metrics = { path = "../metrics" } -itertools = "0.11.0" +itertools = "0.11" polkadot-primitives-test-helpers = { path = "../../primitives/test-helpers" } prometheus_endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } prometheus = { version = "0.13.0", default-features = false } diff --git a/polkadot/node/subsystem-util/Cargo.toml b/polkadot/node/subsystem-util/Cargo.toml index 79a6a75e4cd..cb93ad75d20 100644 --- a/polkadot/node/subsystem-util/Cargo.toml +++ b/polkadot/node/subsystem-util/Cargo.toml @@ -13,7 +13,7 @@ workspace = true async-trait = "0.1.79" futures = "0.3.30" futures-channel = "0.3.23" -itertools = "0.10" +itertools = "0.11" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } parking_lot = "0.12.1" pin-project = "1.0.9" diff --git a/polkadot/node/zombienet-backchannel/Cargo.toml b/polkadot/node/zombienet-backchannel/Cargo.toml index fa99490a997..9139c6a4e5e 100644 --- a/polkadot/node/zombienet-backchannel/Cargo.toml +++ b/polkadot/node/zombienet-backchannel/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] tokio = { version = "1.24.2", default-features = false, features = ["macros", "net", "rt-multi-thread", "sync"] } url = "2.3.1" -tokio-tungstenite = "0.17" +tokio-tungstenite = "0.20.1" futures-util = "0.3.30" lazy_static = "1.4.0" parity-scale-codec = { version = "3.6.1", features = ["derive"] } diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index b214342d2f4..f10f45b0b4f 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" bounded-collections = { version = "0.2.0", default-features = false, features = ["serde"] } derivative = { version = "2.2.0", default-features = false, features = ["use_core"] } impl-trait-for-tuples = "0.2.2" diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 49485fe2a1b..b756f350465 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -15,7 +15,7 @@ workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" clap = { version = "4.5.3", features = ["derive"] } log = { workspace = true, default-features = true } node-primitives = { path = "../primitives" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index e6f754fa40b..050004acc78 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -40,7 +40,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies -array-bytes = "6.1" +array-bytes = "6.2.2" clap = { version = "4.5.3", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } serde = { features = ["derive"], workspace = true, default-features = true } @@ -132,11 +132,11 @@ sp-crypto-hashing = { path = "../../../primitives/crypto/hashing" } futures = "0.3.30" tempfile = "3.1.0" assert_cmd = "2.0.2" -nix = { version = "0.26.1", features = ["signal"] } +nix = { version = "0.27.1", features = ["signal"] } regex = "1.6.0" platforms = "3.0" soketto = "0.7.1" -criterion = { version = "0.4.0", features = ["async_tokio"] } +criterion = { version = "0.5.1", features = ["async_tokio"] } tokio = { version = "1.22.0", features = ["macros", "parking_lot", "time"] } tokio-util = { version = "0.7.4", features = ["compat"] } wait-timeout = "0.2" diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index 0cf90ada8ac..ac4537d5ba0 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -prost-build = "0.11" +prost-build = "0.12.4" [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } @@ -28,7 +28,7 @@ libp2p = { version = "0.51.4", features = ["ed25519", "kad"] } multihash = { version = "0.17.0", default-features = false, features = ["sha2", "std"] } linked_hash_set = "0.1.4" log = { workspace = true, default-features = true } -prost = "0.12" +prost = "0.12.4" rand = "0.8.5" thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } diff --git a/substrate/client/chain-spec/Cargo.toml b/substrate/client/chain-spec/Cargo.toml index 84320f17d7c..dd7bb3598c2 100644 --- a/substrate/client/chain-spec/Cargo.toml +++ b/substrate/client/chain-spec/Cargo.toml @@ -34,7 +34,7 @@ sp-runtime = { path = "../../primitives/runtime" } sp-state-machine = { path = "../../primitives/state-machine" } log = { workspace = true } sp-tracing = { path = "../../primitives/tracing" } -array-bytes = { version = "6.1" } +array-bytes = "6.2.2" docify = "0.2.8" [dev-dependencies] diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 805d3ee117f..317a344cf58 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -16,12 +16,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" chrono = "0.4.31" clap = { version = "4.5.3", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.30" -itertools = "0.10.3" +itertools = "0.11" libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } log = { workspace = true, default-features = true } names = { version = "0.14.0", default-features = false } diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 435604a9473..9336841146e 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" async-channel = "1.8.0" async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } diff --git a/substrate/client/consensus/grandpa/Cargo.toml b/substrate/client/consensus/grandpa/Cargo.toml index e59c17b0680..235017d20ce 100644 --- a/substrate/client/consensus/grandpa/Cargo.toml +++ b/substrate/client/consensus/grandpa/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ahash = "0.8.2" -array-bytes = "6.1" +array-bytes = "6.2.2" async-trait = "0.1.79" dyn-clone = "1.0" finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } diff --git a/substrate/client/db/Cargo.toml b/substrate/client/db/Cargo.toml index 57ee1a8ad33..f67a662949a 100644 --- a/substrate/client/db/Cargo.toml +++ b/substrate/client/db/Cargo.toml @@ -39,7 +39,7 @@ sp-state-machine = { path = "../../primitives/state-machine" } sp-trie = { path = "../../primitives/trie" } [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" kvdb-rocksdb = "0.19.0" rand = "0.8.5" tempfile = "3.1.0" @@ -47,7 +47,7 @@ quickcheck = { version = "1.0.3", default-features = false } kitchensink-runtime = { path = "../../bin/node/runtime" } sp-tracing = { path = "../../primitives/tracing" } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } -array-bytes = "6.1" +array-bytes = "6.2.2" [features] default = [] diff --git a/substrate/client/executor/Cargo.toml b/substrate/client/executor/Cargo.toml index efe8cc3069c..c08a7f5af34 100644 --- a/substrate/client/executor/Cargo.toml +++ b/substrate/client/executor/Cargo.toml @@ -36,7 +36,7 @@ sp-version = { path = "../../primitives/version" } sp-wasm-interface = { path = "../../primitives/wasm-interface" } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" assert_matches = "1.3.0" wat = "1.0" sc-runtime-test = { path = "runtime-test" } @@ -50,7 +50,7 @@ sp-tracing = { path = "../../primitives/tracing" } tracing-subscriber = { workspace = true } paste = "1.0" regex = "1.6.0" -criterion = "0.4.0" +criterion = "0.5.1" env_logger = "0.11" num_cpus = "1.13.1" tempfile = "3.3.0" diff --git a/substrate/client/keystore/Cargo.toml b/substrate/client/keystore/Cargo.toml index 908e0aa8f38..443ce350754 100644 --- a/substrate/client/keystore/Cargo.toml +++ b/substrate/client/keystore/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" parking_lot = "0.12.1" serde_json = { workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/client/mixnet/Cargo.toml b/substrate/client/mixnet/Cargo.toml index e605a06c9d9..2ea152221ac 100644 --- a/substrate/client/mixnet/Cargo.toml +++ b/substrate/client/mixnet/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "4.1" +array-bytes = "6.2.2" arrayvec = "0.7.2" blake2 = "0.10.4" bytes = "1" diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index cda652d4f65..f5f6479c41f 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -17,10 +17,10 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -prost-build = "0.11" +prost-build = "0.12.4" [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" async-channel = "1.8.0" async-trait = "0.1.79" asynchronous-codec = "0.6" @@ -49,7 +49,7 @@ tokio-stream = "0.1.7" unsigned-varint = { version = "0.7.2", features = ["asynchronous_codec", "futures"] } zeroize = "1.4.3" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } -prost = "0.11" +prost = "0.12.4" sc-client-api = { path = "../api" } sc-network-common = { path = "common" } sc-network-types = { path = "types" } diff --git a/substrate/client/network/common/Cargo.toml b/substrate/client/network/common/Cargo.toml index 4478693456f..ca510a2ae70 100644 --- a/substrate/client/network/common/Cargo.toml +++ b/substrate/client/network/common/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -prost-build = "0.11" +prost-build = "0.12.4" [dependencies] async-trait = "0.1.79" diff --git a/substrate/client/network/light/Cargo.toml b/substrate/client/network/light/Cargo.toml index d75a2a908da..2abefd4f8e2 100644 --- a/substrate/client/network/light/Cargo.toml +++ b/substrate/client/network/light/Cargo.toml @@ -16,17 +16,17 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -prost-build = "0.11" +prost-build = "0.12.4" [dependencies] async-channel = "1.8.0" -array-bytes = "6.1" +array-bytes = "6.2.2" codec = { package = "parity-scale-codec", version = "3.6.1", features = [ "derive", ] } futures = "0.3.30" log = { workspace = true, default-features = true } -prost = "0.12" +prost = "0.12.4" sp-blockchain = { path = "../../../primitives/blockchain" } sc-client-api = { path = "../../api" } sc-network-types = { path = "../types" } diff --git a/substrate/client/network/statement/Cargo.toml b/substrate/client/network/statement/Cargo.toml index 4ffe6d6e3ae..bcfcf24864c 100644 --- a/substrate/client/network/statement/Cargo.toml +++ b/substrate/client/network/statement/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" async-channel = "1.8.0" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.30" diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index eb79973c273..b25a3657b6a 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -16,10 +16,10 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -prost-build = "0.11" +prost-build = "0.12.4" [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" async-channel = "1.8.0" async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } @@ -28,7 +28,7 @@ futures-timer = "3.0.2" libp2p = "0.51.4" log = { workspace = true, default-features = true } mockall = "0.11.3" -prost = "0.12" +prost = "0.12.4" schnellru = "0.2.1" smallvec = "1.11.0" thiserror = { workspace = true } diff --git a/substrate/client/network/transactions/Cargo.toml b/substrate/client/network/transactions/Cargo.toml index d74636d60a7..7510db808f4 100644 --- a/substrate/client/network/transactions/Cargo.toml +++ b/substrate/client/network/transactions/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.30" libp2p = "0.51.4" diff --git a/substrate/client/network/types/Cargo.toml b/substrate/client/network/types/Cargo.toml index e36d34b86fc..cd82fd6d57f 100644 --- a/substrate/client/network/types/Cargo.toml +++ b/substrate/client/network/types/Cargo.toml @@ -10,7 +10,7 @@ repository.workspace = true documentation = "https://docs.rs/sc-network-types" [dependencies] -bs58 = "0.4.0" +bs58 = "0.5.0" libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } litep2p = { git = "https://github.com/paritytech/litep2p", rev = "e03a6023882db111beeb24d8c0ceaac0721d3f0f" } multiaddr = "0.17.0" diff --git a/substrate/client/offchain/Cargo.toml b/substrate/client/offchain/Cargo.toml index b834241fe5a..c4d07ceec1a 100644 --- a/substrate/client/offchain/Cargo.toml +++ b/substrate/client/offchain/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" bytes = "1.1" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } fnv = "1.0.6" diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index 1b5696f657c..e1f799e3372 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -38,7 +38,7 @@ futures = "0.3.30" parking_lot = "0.12.1" tokio-stream = { version = "0.1.14", features = ["sync"] } tokio = { version = "1.22.0", features = ["sync"] } -array-bytes = "6.1" +array-bytes = "6.2.2" log = { workspace = true, default-features = true } futures-util = { version = "0.3.30", default-features = false } rand = "0.8.5" diff --git a/substrate/client/service/test/Cargo.toml b/substrate/client/service/test/Cargo.toml index 2de984689ba..8766868cede 100644 --- a/substrate/client/service/test/Cargo.toml +++ b/substrate/client/service/test/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] async-channel = "1.8.0" -array-bytes = "6.1" +array-bytes = "6.2.2" fdlimit = "0.3.0" futures = "0.3.30" log = { workspace = true, default-features = true } diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index a8f0676a82b..cad59ef91e4 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -29,7 +29,7 @@ rustc-hash = "1.1.0" serde = { workspace = true, default-features = true } thiserror = { workspace = true } tracing = "0.1.29" -tracing-log = "0.1.3" +tracing-log = "0.2.0" tracing-subscriber = { workspace = true, features = ["env-filter", "parking_lot"] } sc-client-api = { path = "../api" } sc-tracing-proc-macro = { path = "proc-macro" } @@ -41,7 +41,7 @@ sp-runtime = { path = "../../primitives/runtime" } sp-tracing = { path = "../../primitives/tracing" } [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" tracing-subscriber = { workspace = true, features = ["chrono", "parking_lot"] } [[bench]] diff --git a/substrate/client/transaction-pool/Cargo.toml b/substrate/client/transaction-pool/Cargo.toml index e2a0b87eaab..5f0b90ffe5d 100644 --- a/substrate/client/transaction-pool/Cargo.toml +++ b/substrate/client/transaction-pool/Cargo.toml @@ -38,9 +38,9 @@ sp-tracing = { path = "../../primitives/tracing" } sp-transaction-pool = { path = "../../primitives/transaction-pool" } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" assert_matches = "1.3.0" -criterion = "0.4.0" +criterion = "0.5.1" sc-block-builder = { path = "../block-builder" } sp-consensus = { path = "../../primitives/consensus/common" } substrate-test-runtime = { path = "../../test-utils/runtime" } diff --git a/substrate/frame/alliance/Cargo.toml b/substrate/frame/alliance/Cargo.toml index af1fcb296f6..cd91ea79796 100644 --- a/substrate/frame/alliance/Cargo.toml +++ b/substrate/frame/alliance/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = { version = "6.1", optional = true } +array-bytes = { version = "6.2.2", optional = true } log = { workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } @@ -36,7 +36,7 @@ pallet-identity = { path = "../identity", default-features = false } pallet-collective = { path = "../collective", default-features = false, optional = true } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" sp-crypto-hashing = { path = "../../primitives/crypto/hashing", default-features = false } pallet-balances = { path = "../balances" } pallet-collective = { path = "../collective" } diff --git a/substrate/frame/beefy-mmr/Cargo.toml b/substrate/frame/beefy-mmr/Cargo.toml index 8fcb8e1d559..bfdf91c091b 100644 --- a/substrate/frame/beefy-mmr/Cargo.toml +++ b/substrate/frame/beefy-mmr/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -array-bytes = { version = "6.1", optional = true } +array-bytes = { version = "6.2.2", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { workspace = true } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } @@ -32,7 +32,7 @@ sp-api = { path = "../../primitives/api", default-features = false } sp-state-machine = { path = "../../primitives/state-machine", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" sp-staking = { path = "../../primitives/staking" } [features] diff --git a/substrate/frame/benchmarking/Cargo.toml b/substrate/frame/benchmarking/Cargo.toml index 8210e8cfa62..04a10314a95 100644 --- a/substrate/frame/benchmarking/Cargo.toml +++ b/substrate/frame/benchmarking/Cargo.toml @@ -36,7 +36,7 @@ sp-storage = { path = "../../primitives/storage", default-features = false } static_assertions = "1.1.0" [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" rusty-fork = { version = "0.3.0", default-features = false } sp-keystore = { path = "../../primitives/keystore" } diff --git a/substrate/frame/contracts/Cargo.toml b/substrate/frame/contracts/Cargo.toml index d963ac261d1..52c8fceb504 100644 --- a/substrate/frame/contracts/Cargo.toml +++ b/substrate/frame/contracts/Cargo.toml @@ -56,7 +56,7 @@ xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-feature xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" assert_matches = "1" env_logger = "0.11" pretty_assertions = "1" diff --git a/substrate/frame/executive/Cargo.toml b/substrate/frame/executive/Cargo.toml index 95de7c3f3d1..22fcaa993ab 100644 --- a/substrate/frame/executive/Cargo.toml +++ b/substrate/frame/executive/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -aquamarine = "0.3.2" +aquamarine = "0.5.0" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } @@ -32,7 +32,7 @@ sp-std = { path = "../../primitives/std", default-features = false } sp-tracing = { path = "../../primitives/tracing", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" pallet-balances = { path = "../balances" } pallet-transaction-payment = { path = "../transaction-payment" } sp-core = { path = "../../primitives/core" } diff --git a/substrate/frame/merkle-mountain-range/Cargo.toml b/substrate/frame/merkle-mountain-range/Cargo.toml index 6dc919e1650..8a301387ae6 100644 --- a/substrate/frame/merkle-mountain-range/Cargo.toml +++ b/substrate/frame/merkle-mountain-range/Cargo.toml @@ -28,9 +28,9 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" env_logger = "0.11" -itertools = "0.10.3" +itertools = "0.11" [features] default = ["std"] diff --git a/substrate/frame/sassafras/Cargo.toml b/substrate/frame/sassafras/Cargo.toml index 888b1d8f31f..c9a70a730d4 100644 --- a/substrate/frame/sassafras/Cargo.toml +++ b/substrate/frame/sassafras/Cargo.toml @@ -29,7 +29,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" sp-core = { path = "../../primitives/core" } sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } diff --git a/substrate/frame/society/Cargo.toml b/substrate/frame/society/Cargo.toml index 3d99ddba392..df71f79a29f 100644 --- a/substrate/frame/society/Cargo.toml +++ b/substrate/frame/society/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] log = { workspace = true } -rand_chacha = { version = "0.2", default-features = false } +rand_chacha = { version = "0.3.1", default-features = false } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index 4fd0cedbae6..996e1abb6a6 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -37,7 +37,7 @@ log = { workspace = true } # Optional imports for benchmarking frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -rand_chacha = { version = "0.2", default-features = false, optional = true } +rand_chacha = { version = "0.3.1", default-features = false, optional = true } [dev-dependencies] pallet-balances = { path = "../balances" } @@ -50,7 +50,7 @@ pallet-bags-list = { path = "../bags-list" } substrate-test-utils = { path = "../../test-utils" } frame-benchmarking = { path = "../benchmarking" } frame-election-provider-support = { path = "../election-provider-support" } -rand_chacha = { version = "0.2" } +rand_chacha = { version = "0.3.1" } [features] default = ["std"] diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index ecdd9382632..9c977125673 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = { version = "6.1", default-features = false } +array-bytes = { version = "6.2.2", default-features = false } serde = { features = ["alloc", "derive"], workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index 9f8727f7ade..b04af63de81 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -21,7 +21,7 @@ proc-macro = true derive-syn-parse = "0.2.0" Inflector = "0.11.4" cfg-expr = "0.15.5" -itertools = "0.10.3" +itertools = "0.11" proc-macro2 = "1.0.56" quote = { workspace = true } syn = { features = ["full", "visit-mut"], workspace = true } diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index 16b3b946e22..346aa054159 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -31,7 +31,7 @@ sp-weights = { path = "../../primitives/weights", default-features = false, feat docify = "0.2.8" [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" sp-externalities = { path = "../../primitives/externalities" } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index 31741cf32d8..f5a964207ea 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = { version = "6.1", optional = true } +array-bytes = { version = "6.2.2", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } serde = { optional = true, workspace = true, default-features = true } diff --git a/substrate/primitives/api/test/Cargo.toml b/substrate/primitives/api/test/Cargo.toml index 52a4bd7bda3..a4af08c4b89 100644 --- a/substrate/primitives/api/test/Cargo.toml +++ b/substrate/primitives/api/test/Cargo.toml @@ -29,7 +29,7 @@ rustversion = "1.0.6" scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" futures = "0.3.30" log = { workspace = true, default-features = true } sp-core = { path = "../../core" } diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index 16eae43c73f..8acb1e1992c 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -30,7 +30,7 @@ sp-std = { path = "../std", default-features = false } docify = "0.2.8" [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" primitive-types = "0.12.0" sp-crypto-hashing = { path = "../crypto/hashing" } rand = "0.8.5" diff --git a/substrate/primitives/consensus/beefy/Cargo.toml b/substrate/primitives/consensus/beefy/Cargo.toml index a16d943b914..c38d004cf9b 100644 --- a/substrate/primitives/consensus/beefy/Cargo.toml +++ b/substrate/primitives/consensus/beefy/Cargo.toml @@ -30,7 +30,7 @@ strum = { version = "0.26.2", features = ["derive"], default-features = false } lazy_static = { version = "1.4.0", optional = true } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" w3f-bls = { version = "0.1.3", features = ["std"] } [features] diff --git a/substrate/primitives/core/Cargo.toml b/substrate/primitives/core/Cargo.toml index 8437497b02b..b7f3a999765 100644 --- a/substrate/primitives/core/Cargo.toml +++ b/substrate/primitives/core/Cargo.toml @@ -44,11 +44,11 @@ thiserror = { optional = true, workspace = true } tracing = { version = "0.1.29", optional = true } bitflags = "1.3" paste = "1.0.7" -itertools = { version = "0.10.3", optional = true } +itertools = { version = "0.11", optional = true } # full crypto -array-bytes = { version = "6.1" } -ed25519-zebra = { version = "3.1.0", default-features = false } +array-bytes = { version = "6.2.2" } +ed25519-zebra = { version = "4.0.3", default-features = false } blake2 = { version = "0.10.4", default-features = false, optional = true } libsecp256k1 = { version = "0.7", default-features = false, features = ["static-context"] } schnorrkel = { version = "0.11.4", features = ["preaudit_deprecated"], default-features = false } @@ -66,7 +66,7 @@ w3f-bls = { version = "0.1.3", default-features = false, optional = true } bandersnatch_vrfs = { git = "https://github.com/w3f/ring-vrf", rev = "e9782f9", default-features = false, features = ["substrate-curves"], optional = true } [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" serde_json = { workspace = true, default-features = true } lazy_static = "1.4.0" regex = "1.6.0" diff --git a/substrate/primitives/core/src/ed25519.rs b/substrate/primitives/core/src/ed25519.rs index a9494f2860b..269b6bfcd8d 100644 --- a/substrate/primitives/core/src/ed25519.rs +++ b/substrate/primitives/core/src/ed25519.rs @@ -110,7 +110,9 @@ impl TraitPair for Pair { /// Returns true if the signature is good. fn verify>(sig: &Signature, message: M, public: &Public) -> bool { let Ok(public) = VerificationKey::try_from(public.as_slice()) else { return false }; - let Ok(signature) = ed25519_zebra::Signature::try_from(sig.as_ref()) else { return false }; + let Ok(signature) = ed25519_zebra::Signature::try_from(sig.as_slice()) else { + return false + }; public.verify(&signature, message.as_ref()).is_ok() } diff --git a/substrate/primitives/crypto/hashing/Cargo.toml b/substrate/primitives/crypto/hashing/Cargo.toml index 096650e231c..1755164888b 100644 --- a/substrate/primitives/crypto/hashing/Cargo.toml +++ b/substrate/primitives/crypto/hashing/Cargo.toml @@ -24,7 +24,7 @@ sha3 = { version = "0.10.0", default-features = false } twox-hash = { version = "1.6.3", default-features = false, features = ["digest_0_10"] } [dev-dependencies] -criterion = "0.4.0" +criterion = "0.5.1" sp-crypto-hashing-proc-macro = { path = "proc-macro" } [[bench]] diff --git a/substrate/primitives/keystore/Cargo.toml b/substrate/primitives/keystore/Cargo.toml index a34839358e1..3f1a71b62ac 100644 --- a/substrate/primitives/keystore/Cargo.toml +++ b/substrate/primitives/keystore/Cargo.toml @@ -23,7 +23,7 @@ sp-externalities = { path = "../externalities", default-features = false } [dev-dependencies] rand = "0.8.5" -rand_chacha = "0.2.2" +rand_chacha = "0.3.1" [features] default = ["std"] diff --git a/substrate/primitives/merkle-mountain-range/Cargo.toml b/substrate/primitives/merkle-mountain-range/Cargo.toml index 891f893a0c9..b97cef138ed 100644 --- a/substrate/primitives/merkle-mountain-range/Cargo.toml +++ b/substrate/primitives/merkle-mountain-range/Cargo.toml @@ -27,7 +27,7 @@ sp-runtime = { path = "../runtime", default-features = false } thiserror = { optional = true, workspace = true } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" [features] default = ["std"] diff --git a/substrate/primitives/state-machine/Cargo.toml b/substrate/primitives/state-machine/Cargo.toml index 63251bbd181..e00ff5c27dd 100644 --- a/substrate/primitives/state-machine/Cargo.toml +++ b/substrate/primitives/state-machine/Cargo.toml @@ -32,7 +32,7 @@ sp-trie = { path = "../trie", default-features = false } trie-db = { version = "0.29.0", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" pretty_assertions = "1.2.1" rand = "0.8.5" sp-runtime = { path = "../runtime" } diff --git a/substrate/primitives/trie/Cargo.toml b/substrate/primitives/trie/Cargo.toml index 6469a59e0d1..29c3c787087 100644 --- a/substrate/primitives/trie/Cargo.toml +++ b/substrate/primitives/trie/Cargo.toml @@ -39,7 +39,7 @@ sp-externalities = { path = "../externalities", default-features = false } schnellru = { version = "0.2.1", optional = true } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" criterion = "0.5.1" trie-bench = "0.39.0" trie-standardmap = "0.16.0" diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index 4327b685743..8e3e6138b9a 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -21,4 +21,4 @@ glob = "0.3" tar = "0.4" tempfile = "3" toml_edit = "0.19" -itertools = "0.10" +itertools = "0.11" diff --git a/substrate/test-utils/cli/Cargo.toml b/substrate/test-utils/cli/Cargo.toml index d654a3aaa72..c4f87671000 100644 --- a/substrate/test-utils/cli/Cargo.toml +++ b/substrate/test-utils/cli/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] substrate-rpc-client = { path = "../../utils/frame/rpc/client" } sp-rpc = { path = "../../primitives/rpc" } assert_cmd = "2.0.10" -nix = "0.26.2" +nix = { version = "0.27.1", features = ["signal"] } regex = "1.7.3" tokio = { version = "1.22.0", features = ["full"] } node-primitives = { path = "../../bin/node/primitives" } diff --git a/substrate/test-utils/client/Cargo.toml b/substrate/test-utils/client/Cargo.toml index 4e4e65314fc..a5f000057de 100644 --- a/substrate/test-utils/client/Cargo.toml +++ b/substrate/test-utils/client/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.30" diff --git a/substrate/test-utils/runtime/Cargo.toml b/substrate/test-utils/runtime/Cargo.toml index 28c1b22f976..1568ee500bd 100644 --- a/substrate/test-utils/runtime/Cargo.toml +++ b/substrate/test-utils/runtime/Cargo.toml @@ -49,7 +49,7 @@ sp-state-machine = { path = "../../primitives/state-machine", default-features = sp-externalities = { path = "../../primitives/externalities", default-features = false } # 3rd party -array-bytes = { version = "6.1", optional = true } +array-bytes = { version = "6.2.2", optional = true } serde_json = { workspace = true, features = ["alloc"] } log = { workspace = true } hex-literal = { version = "0.4.1" } diff --git a/substrate/utils/binary-merkle-tree/Cargo.toml b/substrate/utils/binary-merkle-tree/Cargo.toml index a89006d94dc..fd35e6b1e1a 100644 --- a/substrate/utils/binary-merkle-tree/Cargo.toml +++ b/substrate/utils/binary-merkle-tree/Cargo.toml @@ -12,12 +12,12 @@ homepage = "https://substrate.io" workspace = true [dependencies] -array-bytes = { version = "6.1", optional = true } +array-bytes = { version = "6.2.2", optional = true } log = { optional = true, workspace = true } hash-db = { version = "0.16.0", default-features = false } [dev-dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" env_logger = "0.11" sp-core = { path = "../../primitives/core" } sp-runtime = { path = "../../primitives/runtime" } diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index 92169484c92..fa270759c91 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -16,14 +16,14 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = "6.1" +array-bytes = "6.2.2" chrono = "0.4" clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.1.0", default-features = false } handlebars = "5.1.0" Inflector = "0.11.4" -itertools = "0.10.3" +itertools = "0.11" lazy_static = "1.4.0" linked-hash-map = "0.5.4" log = { workspace = true, default-features = true } -- GitLab From e434176e0867d17336301388b46a6796b366a976 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Mon, 6 May 2024 16:39:43 +0200 Subject: [PATCH 051/170] Improve Create release draft workflow + templates for the free notes and docker images sections in the notes (#4371) This PR has the following changes: - New templates for the free notes and docker images sections in the release notes. There is going to be a section for the manual additions to the release notes + a section with the links to the docker images for `polkadot` and `polkadot-parachain` binaries at the end of the release draft. - Fix for matrix section in the Create release draft flow (adds the release environment variable) - Reduction of the message which is posted to the announcement chats, as the current one with the full release notes text is too big. --- .../release-30_publish_release_draft.yml | 1 + .../workflows/release-99_notif-published.yml | 2 -- scripts/release/build-changelogs.sh | 2 +- scripts/release/templates/_free_notes.md.tera | 10 ++++++++++ .../release/templates/docker_image.md.tera | 19 +++++++++++++++++++ scripts/release/templates/template.md.tera | 6 ++++++ 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 scripts/release/templates/_free_notes.md.tera create mode 100644 scripts/release/templates/docker_image.md.tera diff --git a/.github/workflows/release-30_publish_release_draft.yml b/.github/workflows/release-30_publish_release_draft.yml index 430b1e26646..a9e521051d0 100644 --- a/.github/workflows/release-30_publish_release_draft.yml +++ b/.github/workflows/release-30_publish_release_draft.yml @@ -132,6 +132,7 @@ jobs: post_to_matrix: runs-on: ubuntu-latest needs: publish-release-draft + environment: release strategy: matrix: channel: diff --git a/.github/workflows/release-99_notif-published.yml b/.github/workflows/release-99_notif-published.yml index 05c9d6a47f5..b5b2ed38e84 100644 --- a/.github/workflows/release-99_notif-published.yml +++ b/.github/workflows/release-99_notif-published.yml @@ -48,5 +48,3 @@ jobs: Release version: [${{github.event.release.tag_name}}](${{github.event.release.html_url}}) ----- - - ${{github.event.release.body}} diff --git a/scripts/release/build-changelogs.sh b/scripts/release/build-changelogs.sh index d9a1f11d01e..d73f06c8cd6 100755 --- a/scripts/release/build-changelogs.sh +++ b/scripts/release/build-changelogs.sh @@ -51,7 +51,7 @@ for tuple in "${aud_desc_array[@]}"; do echo "Processing audience: $audience ($audience_id)" export TARGET_AUDIENCE="$audience" - export AUDIENCE_DESC="**These changes are relevant to:** $description" + export AUDIENCE_DESC="**ℹ️ These changes are relevant to:** $description" tera -t "${TEMPLATE_AUDIENCE}" --env --env-key env "${CONTEXT_JSON}" > "$OUTPUT/relnote_${audience_id}.md" cat "$OUTPUT/relnote_${audience_id}.md" >> "$PROJECT_ROOT/scripts/release/templates/changelog.md" diff --git a/scripts/release/templates/_free_notes.md.tera b/scripts/release/templates/_free_notes.md.tera new file mode 100644 index 00000000000..c4a841a9925 --- /dev/null +++ b/scripts/release/templates/_free_notes.md.tera @@ -0,0 +1,10 @@ + +{# This file uses the Markdown format with additional templating such as this comment. -#} +{# Such a comment will not show up in the rendered release notes. -#} +{# The content of this file (if any) will be inserted at the top of the release notes -#} +{# and generated for each new release candidate. -#} +{# Ensure you leave an empty line at both top and bottom of this file. -#} + + + + diff --git a/scripts/release/templates/docker_image.md.tera b/scripts/release/templates/docker_image.md.tera new file mode 100644 index 00000000000..273635670e1 --- /dev/null +++ b/scripts/release/templates/docker_image.md.tera @@ -0,0 +1,19 @@ + +## Docker images + +The docker images for the `polkadot` node binary and the `polkadot-parachain` binary can be found at Docker hub (will be available a few minutes after the release has been published): +- [Polkadot image](https://hub.docker.com/r/parity/polkadot/tags?page=1&ordering=last_updated) +- [Polkadot-Parachain image](https://hub.docker.com/r/parity/polkadot-parachain/tags?page=1&ordering=last_updated) + + +You may also pull it with: + +``` +docker pull parity/polkadot:latest +``` + +or + +``` +docker pull parity/polkadot-parachain:latest +``` diff --git a/scripts/release/templates/template.md.tera b/scripts/release/templates/template.md.tera index 39bc1c74402..0211cafb428 100644 --- a/scripts/release/templates/template.md.tera +++ b/scripts/release/templates/template.md.tera @@ -2,8 +2,14 @@ This release contains the changes from `{{ env.REF1 | replace(from="refs/tags/", to="") }}` to `{{ env.REF2 | replace(from="refs/tags/", to="") }}`. +{# -- Manual free notes section -- #} +{% include "_free_notes.md.tera" -%} + +{# -- Automatic section -- #} {% include "changes.md.tera" -%} {% include "compiler.md.tera" -%} {% include "runtimes.md.tera" -%} + +{% include "docker_image.md.tera" -%} -- GitLab From b709dccd063507d468db3e10f491bb60cd80ac64 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 7 May 2024 10:33:32 +0200 Subject: [PATCH 052/170] Add support for versioned notification for HRMP pallet (#4281) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: https://github.com/paritytech/polkadot-sdk/issues/4003 (please see for the problem description) ## TODO - [x] add more tests covering `WrapVersion` corner cases (e.g. para has lower version, ...) - [x] regenerate benchmarks `runtime_parachains::hrmp` (fix for Rococo is here: https://github.com/paritytech/polkadot-sdk/pull/4332) ## Questions / possible improvements - [ ] A `WrapVersion` implementation for `pallet_xcm` initiates version discovery with [note_unknown_version](https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/xcm/pallet-xcm/src/lib.rs#L2527C5-L2527C25), there is possibility to avoid this overhead in this HRMP case to create new `WrapVersion` adapter for `pallet_xcm` which would not use `note_unknown_version`. Is it worth to do it or not? - [ ] There's a possibility to decouple XCM functionality from the HRMP pallet, allowing any relay chain to generate its own notifications. This approach wouldn't restrict notifications solely to the XCM. However, it's uncertain whether it's worthwhile or desirable to do so? It means making HRMP pallet more generic. E.g. hiding HRMP notifications behind some trait: ``` trait HrmpNotifications { fn on_channel_open_request( sender: ParaId, proposed_max_capacity: u32, proposed_max_message_size: u32) -> primitives::DownwardMessage; fn on_channel_accepted(recipient: ParaId) -> primitives::DownwardMessage; fn on_channel_closing(initiator: ParaId, sender: ParaId, recipient: ParaId) -> primitives::DownwardMessage; } ``` and then we could have whatever adapter, `impl HrmpNotifications for VersionedXcmHrmpNotifications {...}`, ``` impl parachains_hrmp::Config for Runtime { .. type HrmpNotifications = VersionedXcmHrmpNotifications; .. } ``` --------- Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher --- polkadot/runtime/parachains/src/hrmp.rs | 158 +++++++++++------- polkadot/runtime/parachains/src/hrmp/tests.rs | 143 +++++++++++++++- polkadot/runtime/parachains/src/mock.rs | 40 ++++- polkadot/runtime/rococo/src/lib.rs | 1 + .../src/weights/runtime_parachains_hrmp.rs | 102 ++++++----- polkadot/runtime/test-runtime/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 1 + .../src/weights/runtime_parachains_hrmp.rs | 102 ++++++----- .../example/src/relay_chain/mod.rs | 4 - .../xcm-simulator/fuzzer/src/relay_chain.rs | 4 - prdoc/pr_4281.prdoc | 16 ++ 11 files changed, 406 insertions(+), 167 deletions(-) create mode 100644 prdoc/pr_4281.prdoc diff --git a/polkadot/runtime/parachains/src/hrmp.rs b/polkadot/runtime/parachains/src/hrmp.rs index 65652b38577..42a9c23e5aa 100644 --- a/polkadot/runtime/parachains/src/hrmp.rs +++ b/polkadot/runtime/parachains/src/hrmp.rs @@ -278,6 +278,14 @@ pub mod pallet { /// parachain. type DefaultChannelSizeAndCapacityWithSystem: Get<(u32, u32)>; + /// Means of converting an `Xcm` into a `VersionedXcm`. This pallet sends HRMP XCM + /// notifications to the channel-related parachains, while the `WrapVersion` implementation + /// attempts to wrap them into the most suitable XCM version for the destination parachain. + /// + /// NOTE: For example, `pallet_xcm` provides an accurate implementation (recommended), or + /// the default `()` implementation uses the latest XCM version for all parachains. + type VersionWrapper: xcm::WrapVersion; + /// Something that provides the weight of this pallet. type WeightInfo: WeightInfo; } @@ -1499,28 +1507,19 @@ impl Pallet { ); HrmpOpenChannelRequestsList::::append(channel_id); - let notification_bytes = { - use parity_scale_codec::Encode as _; - use xcm::opaque::{latest::prelude::*, VersionedXcm}; - - VersionedXcm::from(Xcm(vec![HrmpNewChannelOpenRequest { - sender: u32::from(origin), - max_capacity: proposed_max_capacity, - max_message_size: proposed_max_message_size, - }])) - .encode() - }; - if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = - dmp::Pallet::::queue_downward_message(&config, recipient, notification_bytes) - { - // this should never happen unless the max downward message size is configured to a - // jokingly small number. - log::error!( - target: "runtime::hrmp", - "sending 'init_open_channel::notification_bytes' failed." - ); - debug_assert!(false); - } + Self::send_to_para( + "init_open_channel", + &config, + recipient, + Self::wrap_notification(|| { + use xcm::opaque::latest::{prelude::*, Xcm}; + Xcm(vec![HrmpNewChannelOpenRequest { + sender: origin.into(), + max_capacity: proposed_max_capacity, + max_message_size: proposed_max_message_size, + }]) + }), + ); Ok(()) } @@ -1562,23 +1561,15 @@ impl Pallet { HrmpOpenChannelRequests::::insert(&channel_id, channel_req); HrmpAcceptedChannelRequestCount::::insert(&origin, accepted_cnt + 1); - let notification_bytes = { - use parity_scale_codec::Encode as _; - use xcm::opaque::{latest::prelude::*, VersionedXcm}; - let xcm = Xcm(vec![HrmpChannelAccepted { recipient: u32::from(origin) }]); - VersionedXcm::from(xcm).encode() - }; - if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = - dmp::Pallet::::queue_downward_message(&config, sender, notification_bytes) - { - // this should never happen unless the max downward message size is configured to an - // jokingly small number. - log::error!( - target: "runtime::hrmp", - "sending 'accept_open_channel::notification_bytes' failed." - ); - debug_assert!(false); - } + Self::send_to_para( + "accept_open_channel", + &config, + sender, + Self::wrap_notification(|| { + use xcm::opaque::latest::{prelude::*, Xcm}; + Xcm(vec![HrmpChannelAccepted { recipient: origin.into() }]) + }), + ); Ok(()) } @@ -1633,30 +1624,22 @@ impl Pallet { HrmpCloseChannelRequestsList::::append(channel_id.clone()); let config = configuration::ActiveConfig::::get(); - let notification_bytes = { - use parity_scale_codec::Encode as _; - use xcm::opaque::{latest::prelude::*, VersionedXcm}; - - VersionedXcm::from(Xcm(vec![HrmpChannelClosing { - initiator: u32::from(origin), - sender: u32::from(channel_id.sender), - recipient: u32::from(channel_id.recipient), - }])) - .encode() - }; let opposite_party = if origin == channel_id.sender { channel_id.recipient } else { channel_id.sender }; - if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = - dmp::Pallet::::queue_downward_message(&config, opposite_party, notification_bytes) - { - // this should never happen unless the max downward message size is configured to an - // jokingly small number. - log::error!( - target: "runtime::hrmp", - "sending 'close_channel::notification_bytes' failed." - ); - debug_assert!(false); - } + + Self::send_to_para( + "close_channel", + &config, + opposite_party, + Self::wrap_notification(|| { + use xcm::opaque::latest::{prelude::*, Xcm}; + Xcm(vec![HrmpChannelClosing { + initiator: origin.into(), + sender: channel_id.sender.into(), + recipient: channel_id.recipient.into(), + }]) + }), + ); Ok(()) } @@ -1875,3 +1858,56 @@ impl Pallet { } } } + +impl Pallet { + /// Wraps HRMP XCM notifications to the most suitable XCM version for the destination para. + /// If the XCM version is unknown, the latest XCM version is used as a best effort. + fn wrap_notification( + mut notification: impl FnMut() -> xcm::opaque::latest::opaque::Xcm, + ) -> impl FnOnce(ParaId) -> primitives::DownwardMessage { + use xcm::{ + opaque::VersionedXcm, + prelude::{Junction, Location}, + WrapVersion, + }; + + // Return a closure that can prepare notifications. + move |dest| { + // Attempt to wrap the notification for the destination parachain. + T::VersionWrapper::wrap_version( + &Location::new(0, [Junction::Parachain(dest.into())]), + notification(), + ) + .unwrap_or_else(|_| { + // As a best effort, if we cannot resolve the version, fallback to using the latest + // version. + VersionedXcm::from(notification()) + }) + .encode() + } + } + + /// Sends/enqueues notification to the destination parachain. + fn send_to_para( + log_label: &str, + config: &HostConfiguration>, + dest: ParaId, + notification_bytes_for: impl FnOnce(ParaId) -> primitives::DownwardMessage, + ) { + // prepare notification + let notification_bytes = notification_bytes_for(dest); + + // try to enqueue + if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = + dmp::Pallet::::queue_downward_message(&config, dest, notification_bytes) + { + // this should never happen unless the max downward message size is configured to a + // jokingly small number. + log::error!( + target: "runtime::hrmp", + "sending '{log_label}::notification_bytes' failed." + ); + debug_assert!(false); + } + } +} diff --git a/polkadot/runtime/parachains/src/hrmp/tests.rs b/polkadot/runtime/parachains/src/hrmp/tests.rs index 2f767ab7e1b..acfaa8f2d29 100644 --- a/polkadot/runtime/parachains/src/hrmp/tests.rs +++ b/polkadot/runtime/parachains/src/hrmp/tests.rs @@ -22,13 +22,13 @@ use super::*; use crate::{ mock::{ deregister_parachain, new_test_ext, register_parachain, register_parachain_with_balance, - Hrmp, MockGenesisConfig, Paras, ParasShared, RuntimeEvent as MockEvent, RuntimeOrigin, - System, Test, + Dmp, Hrmp, MockGenesisConfig, Paras, ParasShared, RuntimeEvent as MockEvent, RuntimeOrigin, + System, Test, TestUsesOnlyStoredVersionWrapper, }, shared, }; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; -use primitives::BlockNumber; +use primitives::{BlockNumber, InboundDownwardMessage}; use std::collections::BTreeMap; pub(crate) fn run_to_block(to: BlockNumber, new_session: Option>) { @@ -1004,3 +1004,140 @@ fn establish_channel_with_system_with_invalid_args() { Hrmp::assert_storage_consistency_exhaustive(); }); } + +#[test] +fn hrmp_notifications_works() { + use xcm::{ + opaque::{ + latest::{prelude::*, Xcm}, + VersionedXcm, + }, + IntoVersion, + }; + + let para_a = 2001.into(); + let para_a_origin: crate::Origin = 2001.into(); + let para_b = 2003.into(); + let para_b_origin: crate::Origin = 2003.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // We need both A & B to be registered and alive parachains. + register_parachain(para_a); + register_parachain(para_b); + run_to_block(5, Some(vec![4, 5])); + + // set XCM versions for wrapper + + // for para_a -> `None`, means we will use latest. + TestUsesOnlyStoredVersionWrapper::set_version( + Location::new(0, [Junction::Parachain(para_a.into())]), + None, + ); + // for para_b -> `Some(latest - 1)`, means we will use latest-1 XCM version. + let previous_version = XCM_VERSION - 1; + TestUsesOnlyStoredVersionWrapper::set_version( + Location::new(0, [Junction::Parachain(para_b.into())]), + Some(previous_version), + ); + + let assert_notification_for = |sent_at, para_id, expected| { + assert_eq!( + Dmp::dmq_contents(para_id), + vec![InboundDownwardMessage { sent_at, msg: expected }] + ); + }; + + // init open channel requests + assert_ok!(Hrmp::hrmp_init_open_channel(para_a_origin.clone().into(), para_b, 2, 8)); + assert_ok!(Hrmp::hrmp_init_open_channel(para_b_origin.clone().into(), para_a, 2, 8)); + Hrmp::assert_storage_consistency_exhaustive(); + + // check dmp notications + assert_notification_for( + 5, + para_b, + VersionedXcm::from(Xcm(vec![HrmpNewChannelOpenRequest { + sender: u32::from(para_a), + max_capacity: 2, + max_message_size: 8, + }])) + .into_version(previous_version) + .expect("compatible") + .encode(), + ); + assert_notification_for( + 5, + para_a, + VersionedXcm::from(Xcm(vec![HrmpNewChannelOpenRequest { + sender: u32::from(para_b), + max_capacity: 2, + max_message_size: 8, + }])) + .encode(), + ); + let _ = Dmp::prune_dmq(para_a, 1000); + let _ = Dmp::prune_dmq(para_b, 1000); + + // accept open channel requests + assert_ok!(Hrmp::hrmp_accept_open_channel(para_a_origin.clone().into(), para_b)); + assert_ok!(Hrmp::hrmp_accept_open_channel(para_b_origin.clone().into(), para_a)); + Hrmp::assert_storage_consistency_exhaustive(); + + // check dmp notications + assert_notification_for( + 5, + para_b, + VersionedXcm::from(Xcm(vec![HrmpChannelAccepted { recipient: u32::from(para_a) }])) + .into_version(previous_version) + .expect("compatible") + .encode(), + ); + assert_notification_for( + 5, + para_a, + VersionedXcm::from(Xcm(vec![HrmpChannelAccepted { recipient: u32::from(para_b) }])) + .encode(), + ); + let _ = Dmp::prune_dmq(para_a, 1000); + let _ = Dmp::prune_dmq(para_b, 1000); + + // On Block 6: session change - creates channel. + run_to_block(6, Some(vec![6])); + assert!(channel_exists(para_a, para_b)); + + // close channel requests + assert_ok!(Hrmp::hrmp_close_channel( + para_a_origin.into(), + HrmpChannelId { sender: para_a, recipient: para_b } + )); + assert_ok!(Hrmp::hrmp_close_channel( + para_b_origin.into(), + HrmpChannelId { sender: para_b, recipient: para_a } + )); + Hrmp::assert_storage_consistency_exhaustive(); + + // check dmp notications + assert_notification_for( + 6, + para_b, + VersionedXcm::from(Xcm(vec![HrmpChannelClosing { + initiator: u32::from(para_a), + sender: u32::from(para_a), + recipient: u32::from(para_b), + }])) + .into_version(previous_version) + .expect("compatible") + .encode(), + ); + assert_notification_for( + 6, + para_a, + VersionedXcm::from(Xcm(vec![HrmpChannelClosing { + initiator: u32::from(para_b), + sender: u32::from(para_b), + recipient: u32::from(para_a), + }])) + .encode(), + ); + }); +} diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index 97a75d47ff7..a32c9d11b36 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -50,9 +50,16 @@ use sp_runtime::{ transaction_validity::TransactionPriority, BuildStorage, FixedU128, Perbill, Permill, }; -use sp_std::collections::vec_deque::VecDeque; -use std::{cell::RefCell, collections::HashMap}; -use xcm::v4::{Assets, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}; +use sp_std::{ + cell::RefCell, + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, +}; +use std::collections::HashMap; +use xcm::{ + prelude::XcmVersion, + v4::{Assets, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}, + IntoVersion, VersionedXcm, WrapVersion, +}; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlockU32; @@ -247,16 +254,41 @@ impl crate::paras::Config for Test { impl crate::dmp::Config for Test {} parameter_types! { - pub const FirstMessageFactorPercent: u64 = 100; pub const DefaultChannelSizeAndCapacityWithSystem: (u32, u32) = (4, 1); } +thread_local! { + pub static VERSION_WRAPPER: RefCell>> = RefCell::new(BTreeMap::new()); +} +/// Mock implementation of the [`WrapVersion`] trait which wraps XCM only for known/stored XCM +/// versions in the `VERSION_WRAPPER`. +pub struct TestUsesOnlyStoredVersionWrapper; +impl WrapVersion for TestUsesOnlyStoredVersionWrapper { + fn wrap_version( + dest: &Location, + xcm: impl Into>, + ) -> Result, ()> { + match VERSION_WRAPPER.with(|r| r.borrow().get(dest).map_or(None, |v| *v)) { + Some(v) => xcm.into().into_version(v), + None => return Err(()), + } + } +} +impl TestUsesOnlyStoredVersionWrapper { + pub fn set_version(location: Location, version: Option) { + VERSION_WRAPPER.with(|r| { + let _ = r.borrow_mut().entry(location).and_modify(|v| *v = version).or_insert(version); + }); + } +} + impl crate::hrmp::Config for Test { type RuntimeOrigin = RuntimeOrigin; type RuntimeEvent = RuntimeEvent; type ChannelManager = frame_system::EnsureRoot; type Currency = pallet_balances::Pallet; type DefaultChannelSizeAndCapacityWithSystem = DefaultChannelSizeAndCapacityWithSystem; + type VersionWrapper = TestUsesOnlyStoredVersionWrapper; type WeightInfo = crate::hrmp::TestWeightInfo; } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 90a0fe41d4a..3b2cbc88dc3 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1046,6 +1046,7 @@ impl parachains_hrmp::Config for Runtime { Runtime, HrmpChannelSizeAndCapacityWithSystemRatio, >; + type VersionWrapper = crate::XcmPallet; type WeightInfo = weights::runtime_parachains_hrmp::WeightInfo; } diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs index 1d83e97ef0e..572ecc7d411 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `runtime_parachains::hrmp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-04-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 @@ -60,6 +60,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) @@ -68,10 +70,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `488` // Estimated: `3953` - // Minimum execution time: 34_034_000 picoseconds. - Weight::from_parts(35_191_000, 0) + // Minimum execution time: 37_574_000 picoseconds. + Weight::from_parts(38_789_000, 0) .saturating_add(Weight::from_parts(0, 3953)) - .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) @@ -80,6 +82,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) @@ -88,10 +92,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `478` // Estimated: `3943` - // Minimum execution time: 30_115_000 picoseconds. - Weight::from_parts(31_060_000, 0) + // Minimum execution time: 34_560_000 picoseconds. + Weight::from_parts(35_760_000, 0) .saturating_add(Weight::from_parts(0, 3943)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) @@ -100,6 +104,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) @@ -108,10 +114,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `591` // Estimated: `4056` - // Minimum execution time: 30_982_000 picoseconds. - Weight::from_parts(32_034_000, 0) + // Minimum execution time: 35_367_000 picoseconds. + Weight::from_parts(37_000_000, 0) .saturating_add(Weight::from_parts(0, 4056)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) @@ -132,13 +138,13 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `297 + e * (100 ±0) + i * (100 ±0)` // Estimated: `3759 + e * (2575 ±0) + i * (2575 ±0)` - // Minimum execution time: 1_158_665_000 picoseconds. - Weight::from_parts(1_164_378_000, 0) + // Minimum execution time: 1_134_420_000 picoseconds. + Weight::from_parts(1_144_822_000, 0) .saturating_add(Weight::from_parts(0, 3759)) - // Standard Error: 103_726 - .saturating_add(Weight::from_parts(3_444_855, 0).saturating_mul(i.into())) - // Standard Error: 103_726 - .saturating_add(Weight::from_parts(3_527_628, 0).saturating_mul(e.into())) + // Standard Error: 101_380 + .saturating_add(Weight::from_parts(3_325_898, 0).saturating_mul(i.into())) + // Standard Error: 101_380 + .saturating_add(Weight::from_parts(3_338_565, 0).saturating_mul(e.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(e.into()))) @@ -169,11 +175,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `525 + c * (136 ±0)` // Estimated: `1980 + c * (5086 ±0)` - // Minimum execution time: 5_870_000 picoseconds. - Weight::from_parts(2_363_864, 0) + // Minimum execution time: 5_652_000 picoseconds. + Weight::from_parts(2_857_824, 0) .saturating_add(Weight::from_parts(0, 1980)) - // Standard Error: 16_657 - .saturating_add(Weight::from_parts(20_507_232, 0).saturating_mul(c.into())) + // Standard Error: 26_044 + .saturating_add(Weight::from_parts(20_088_467, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -197,11 +203,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `368 + c * (124 ±0)` // Estimated: `1828 + c * (2600 ±0)` - // Minimum execution time: 4_766_000 picoseconds. - Weight::from_parts(4_988_812, 0) + // Minimum execution time: 4_692_000 picoseconds. + Weight::from_parts(6_637_146, 0) .saturating_add(Weight::from_parts(0, 1828)) - // Standard Error: 10_606 - .saturating_add(Weight::from_parts(12_579_429, 0).saturating_mul(c.into())) + // Standard Error: 10_238 + .saturating_add(Weight::from_parts(12_201_629, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -219,11 +225,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `1059 + c * (13 ±0)` // Estimated: `4328 + c * (15 ±0)` - // Minimum execution time: 17_228_000 picoseconds. - Weight::from_parts(27_236_563, 0) + // Minimum execution time: 18_920_000 picoseconds. + Weight::from_parts(27_314_843, 0) .saturating_add(Weight::from_parts(0, 4328)) - // Standard Error: 2_419 - .saturating_add(Weight::from_parts(102_107, 0).saturating_mul(c.into())) + // Standard Error: 2_127 + .saturating_add(Weight::from_parts(90_200, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 15).saturating_mul(c.into())) @@ -237,11 +243,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `276 + c * (63 ±0)` // Estimated: `1755 + c * (2538 ±0)` - // Minimum execution time: 3_549_000 picoseconds. - Weight::from_parts(5_799_542, 0) + // Minimum execution time: 3_502_000 picoseconds. + Weight::from_parts(6_477_323, 0) .saturating_add(Weight::from_parts(0, 1755)) - // Standard Error: 3_025 - .saturating_add(Weight::from_parts(3_173_294, 0).saturating_mul(c.into())) + // Standard Error: 3_416 + .saturating_add(Weight::from_parts(3_149_674, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -260,6 +266,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:2 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) @@ -273,12 +281,12 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `488 + c * (235 ±0)` // Estimated: `6428 + c * (235 ±0)` - // Minimum execution time: 48_392_000 picoseconds. - Weight::from_parts(50_509_977, 0) + // Minimum execution time: 56_234_000 picoseconds. + Weight::from_parts(58_259_646, 0) .saturating_add(Weight::from_parts(0, 6428)) - // Standard Error: 133_658 - .saturating_add(Weight::from_parts(10_215_322, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(12)) + // Standard Error: 160_596 + .saturating_add(Weight::from_parts(11_178_353, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(14)) .saturating_add(T::DbWeight::get().writes(8)) .saturating_add(Weight::from_parts(0, 235).saturating_mul(c.into())) } @@ -294,6 +302,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:2 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) @@ -306,10 +316,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `488` // Estimated: `6428` - // Minimum execution time: 48_465_000 picoseconds. - Weight::from_parts(50_433_000, 0) + // Minimum execution time: 56_035_000 picoseconds. + Weight::from_parts(58_217_000, 0) .saturating_add(Weight::from_parts(0, 6428)) - .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().reads(14)) .saturating_add(T::DbWeight::get().writes(8)) } /// Storage: `Hrmp::HrmpChannels` (r:1 w:1) @@ -318,8 +328,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `296` // Estimated: `3761` - // Minimum execution time: 11_835_000 picoseconds. - Weight::from_parts(12_380_000, 0) + // Minimum execution time: 11_477_000 picoseconds. + Weight::from_parts(11_845_000, 0) .saturating_add(Weight::from_parts(0, 3761)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -336,6 +346,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:2 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) @@ -348,10 +360,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `488` // Estimated: `6428` - // Minimum execution time: 79_633_000 picoseconds. - Weight::from_parts(80_846_000, 0) + // Minimum execution time: 95_305_000 picoseconds. + Weight::from_parts(97_323_000, 0) .saturating_add(Weight::from_parts(0, 6428)) - .saturating_add(T::DbWeight::get().reads(19)) + .saturating_add(T::DbWeight::get().reads(21)) .saturating_add(T::DbWeight::get().writes(11)) } } diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index b56e2f52f5f..0509ba382b2 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -558,7 +558,6 @@ parameter_types! { impl parachains_dmp::Config for Runtime {} parameter_types! { - pub const FirstMessageFactorPercent: u64 = 100; pub const HrmpChannelSizeAndCapacityWithSystemRatio: Percent = Percent::from_percent(100); } @@ -571,6 +570,7 @@ impl parachains_hrmp::Config for Runtime { Runtime, HrmpChannelSizeAndCapacityWithSystemRatio, >; + type VersionWrapper = crate::Xcm; type WeightInfo = parachains_hrmp::TestWeightInfo; } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 05a417e17f9..8ae95e6e1a8 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -1176,6 +1176,7 @@ impl parachains_hrmp::Config for Runtime { Runtime, HrmpChannelSizeAndCapacityWithSystemRatio, >; + type VersionWrapper = crate::XcmPallet; type WeightInfo = weights::runtime_parachains_hrmp::WeightInfo; } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs index 529bdf76105..f1d7932fe8b 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_hrmp.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `runtime_parachains::hrmp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-04-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 @@ -60,6 +60,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) @@ -68,10 +70,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `455` // Estimated: `3920` - // Minimum execution time: 32_195_000 picoseconds. - Weight::from_parts(33_340_000, 0) + // Minimum execution time: 35_900_000 picoseconds. + Weight::from_parts(37_587_000, 0) .saturating_add(Weight::from_parts(0, 3920)) - .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) @@ -80,6 +82,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) @@ -88,10 +92,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `445` // Estimated: `3910` - // Minimum execution time: 28_644_000 picoseconds. - Weight::from_parts(29_581_000, 0) + // Minimum execution time: 35_670_000 picoseconds. + Weight::from_parts(36_853_000, 0) .saturating_add(Weight::from_parts(0, 3910)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) @@ -100,6 +104,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) @@ -108,10 +114,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `558` // Estimated: `4023` - // Minimum execution time: 31_824_000 picoseconds. - Weight::from_parts(33_207_000, 0) + // Minimum execution time: 36_953_000 picoseconds. + Weight::from_parts(38_638_000, 0) .saturating_add(Weight::from_parts(0, 4023)) - .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128) @@ -132,13 +138,13 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `264 + e * (100 ±0) + i * (100 ±0)` // Estimated: `3726 + e * (2575 ±0) + i * (2575 ±0)` - // Minimum execution time: 1_213_331_000 picoseconds. - Weight::from_parts(1_217_120_000, 0) + // Minimum execution time: 1_202_266_000 picoseconds. + Weight::from_parts(1_217_618_000, 0) .saturating_add(Weight::from_parts(0, 3726)) - // Standard Error: 108_190 - .saturating_add(Weight::from_parts(3_485_701, 0).saturating_mul(i.into())) - // Standard Error: 108_190 - .saturating_add(Weight::from_parts(3_564_287, 0).saturating_mul(e.into())) + // Standard Error: 113_091 + .saturating_add(Weight::from_parts(3_550_787, 0).saturating_mul(i.into())) + // Standard Error: 113_091 + .saturating_add(Weight::from_parts(3_615_215, 0).saturating_mul(e.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(e.into()))) @@ -169,11 +175,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `492 + c * (136 ±0)` // Estimated: `1947 + c * (5086 ±0)` - // Minimum execution time: 6_040_000 picoseconds. - Weight::from_parts(5_644_307, 0) + // Minimum execution time: 6_105_000 picoseconds. + Weight::from_parts(6_313_000, 0) .saturating_add(Weight::from_parts(0, 1947)) - // Standard Error: 12_852 - .saturating_add(Weight::from_parts(21_031_626, 0).saturating_mul(c.into())) + // Standard Error: 16_081 + .saturating_add(Weight::from_parts(21_097_410, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -197,11 +203,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `335 + c * (124 ±0)` // Estimated: `1795 + c * (2600 ±0)` - // Minimum execution time: 4_950_000 picoseconds. - Weight::from_parts(5_215_558, 0) + // Minimum execution time: 5_073_000 picoseconds. + Weight::from_parts(5_398_000, 0) .saturating_add(Weight::from_parts(0, 1795)) - // Standard Error: 9_231 - .saturating_add(Weight::from_parts(12_770_147, 0).saturating_mul(c.into())) + // Standard Error: 12_934 + .saturating_add(Weight::from_parts(13_222_909, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -219,11 +225,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `1026 + c * (13 ±0)` // Estimated: `4295 + c * (15 ±0)` - // Minimum execution time: 17_550_000 picoseconds. - Weight::from_parts(25_522_933, 0) + // Minimum execution time: 16_793_000 picoseconds. + Weight::from_parts(27_430_638, 0) .saturating_add(Weight::from_parts(0, 4295)) - // Standard Error: 2_332 - .saturating_add(Weight::from_parts(121_128, 0).saturating_mul(c.into())) + // Standard Error: 2_996 + .saturating_add(Weight::from_parts(191_905, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 15).saturating_mul(c.into())) @@ -237,11 +243,11 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `243 + c * (63 ±0)` // Estimated: `1722 + c * (2538 ±0)` - // Minimum execution time: 3_782_000 picoseconds. - Weight::from_parts(5_263_610, 0) + // Minimum execution time: 3_805_000 picoseconds. + Weight::from_parts(445_643, 0) .saturating_add(Weight::from_parts(0, 1722)) - // Standard Error: 3_152 - .saturating_add(Weight::from_parts(3_309_777, 0).saturating_mul(c.into())) + // Standard Error: 4_991 + .saturating_add(Weight::from_parts(3_459_894, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) @@ -260,6 +266,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:2 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) @@ -273,12 +281,12 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `455 + c * (235 ±0)` // Estimated: `6395 + c * (235 ±0)` - // Minimum execution time: 46_445_000 picoseconds. - Weight::from_parts(48_376_448, 0) + // Minimum execution time: 53_580_000 picoseconds. + Weight::from_parts(55_701_720, 0) .saturating_add(Weight::from_parts(0, 6395)) - // Standard Error: 130_148 - .saturating_add(Weight::from_parts(13_606_551, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(12)) + // Standard Error: 159_757 + .saturating_add(Weight::from_parts(15_601_979, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(14)) .saturating_add(T::DbWeight::get().writes(8)) .saturating_add(Weight::from_parts(0, 235).saturating_mul(c.into())) } @@ -294,6 +302,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:2 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) @@ -306,10 +316,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `455` // Estimated: `6395` - // Minimum execution time: 46_563_000 picoseconds. - Weight::from_parts(48_015_000, 0) + // Minimum execution time: 54_226_000 picoseconds. + Weight::from_parts(55_572_000, 0) .saturating_add(Weight::from_parts(0, 6395)) - .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().reads(14)) .saturating_add(T::DbWeight::get().writes(8)) } /// Storage: `Hrmp::HrmpChannels` (r:1 w:1) @@ -318,8 +328,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `263` // Estimated: `3728` - // Minimum execution time: 12_252_000 picoseconds. - Weight::from_parts(12_550_000, 0) + // Minimum execution time: 11_850_000 picoseconds. + Weight::from_parts(12_428_000, 0) .saturating_add(Weight::from_parts(0, 3728)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -336,6 +346,8 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:2 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) @@ -348,10 +360,10 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `455` // Estimated: `6395` - // Minimum execution time: 79_503_000 picoseconds. - Weight::from_parts(81_630_000, 0) + // Minimum execution time: 93_465_000 picoseconds. + Weight::from_parts(95_845_000, 0) .saturating_add(Weight::from_parts(0, 6395)) - .saturating_add(T::DbWeight::get().reads(19)) + .saturating_add(T::DbWeight::get().reads(21)) .saturating_add(T::DbWeight::get().writes(11)) } } diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs index f698eba41d4..c843f52d41a 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/mod.rs @@ -121,10 +121,6 @@ impl pallet_xcm::Config for Runtime { type AdminOrigin = EnsureRoot; } -parameter_types! { - pub const FirstMessageFactorPercent: u64 = 100; -} - impl origin::Config for Runtime {} type Block = frame_system::mocking::MockBlock; diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index 47209b765d1..cf3ca0de2bb 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -191,10 +191,6 @@ impl pallet_xcm::Config for Runtime { type AdminOrigin = EnsureRoot; } -parameter_types! { - pub const FirstMessageFactorPercent: u64 = 100; -} - impl origin::Config for Runtime {} parameter_types! { diff --git a/prdoc/pr_4281.prdoc b/prdoc/pr_4281.prdoc new file mode 100644 index 00000000000..ab2156a9505 --- /dev/null +++ b/prdoc/pr_4281.prdoc @@ -0,0 +1,16 @@ +title: "Add support for versioned notification for HRMP pallet" + +doc: + - audience: Runtime Dev + description: | + The configuration of the HRMP pallet has been expanded to include the `VersionWrapper` type, + which controls the encoding of XCM notifications related to the opening/closing of HRMP channels. + If your runtime does not concern itself with the XCM version used for notifications, + you can set it as `type VersionWrapper = ()` to always use the latest XCM. + If your runtime does care about the XCM version when sending to child parachains, + you can provide an instance of the `pallet_xcm` with `type VersionWrapper = XcmPallet`, + which can manage XCM versions for destinations. + +crates: +- name: polkadot-runtime-parachains + bump: major -- GitLab From 29c8130bab0ed8216f48e47a78c602e7f0c5c1f2 Mon Sep 17 00:00:00 2001 From: jimdssd Date: Tue, 7 May 2024 18:23:27 +0800 Subject: [PATCH 053/170] chore: fix typos (#4395) --- polkadot/node/service/src/lib.rs | 2 +- .../node/subsystem-bench/src/lib/approval/message_generator.rs | 2 +- polkadot/node/subsystem-bench/src/lib/approval/mod.rs | 2 +- polkadot/runtime/parachains/src/assigner_on_demand/mod.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs index e5c29172099..665533e9bc7 100644 --- a/polkadot/node/service/src/lib.rs +++ b/polkadot/node/service/src/lib.rs @@ -956,7 +956,7 @@ pub fn new_full< pvf_execute_workers_max_num: execute_workers_max_num.unwrap_or_else( || match config.chain_spec.identify_chain() { // The intention is to use this logic for gradual increasing from 2 to 4 - // of this configuration chain by chain untill it reaches production chain. + // of this configuration chain by chain until it reaches production chain. Chain::Polkadot | Chain::Kusama => 2, Chain::Rococo | Chain::Westend | Chain::Unknown => 4, }, diff --git a/polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs b/polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs index 219b2cb515d..e4a6c207970 100644 --- a/polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs @@ -91,7 +91,7 @@ pub struct PeerMessagesGenerator { impl PeerMessagesGenerator { /// Generates messages by spawning a blocking task in the background which begins creating - /// the assignments/approvals and peer view changes at the begining of each block. + /// the assignments/approvals and peer view changes at the beginning of each block. pub fn generate_messages(mut self, spawn_task_handle: &SpawnTaskHandle) { spawn_task_handle.spawn("generate-messages", "generate-messages", async move { for block_info in &self.blocks { diff --git a/polkadot/node/subsystem-bench/src/lib/approval/mod.rs b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs index 6ab5b86baed..6ac0776d2d3 100644 --- a/polkadot/node/subsystem-bench/src/lib/approval/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs @@ -98,7 +98,7 @@ pub(crate) const TEST_CONFIG: ApprovalVotingConfig = ApprovalVotingConfig { const DATA_COL: u32 = 0; /// Start generating messages for a slot into the future, so that the -/// generation nevers falls behind the current slot. +/// generation never falls behind the current slot. const BUFFER_FOR_GENERATION_MILLIS: u64 = 30_000; /// Parameters specific to the approvals benchmark diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs index 598a0f10970..37788a67ea0 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs @@ -740,7 +740,7 @@ where /// /// Subtracts from the count of the `CoreAffinityCount` if an entry is found and the core_index /// matches. When the count reaches 0, the entry is removed. - /// A non-existant entry is a no-op. + /// A non-existent entry is a no-op. /// /// Returns: The new affinity of the para on that core. `None` if there is no affinity on this /// core. -- GitLab From 930b0462d347d56d9d8751b1ca42b210ed6d9c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=B3nal=20Murray?= Date: Tue, 7 May 2024 15:17:22 +0100 Subject: [PATCH 054/170] Add Kusama People Chain genesis chainspec (#4394) Generated with the script from https://github.com/paritytech/polkadot-sdk/pull/2931 Edit: previously linked to a very similar PR --- .../parachains/chain-specs/people-kusama.json | 6391 ++++++++++++++++- .../src/chain_spec/people.rs | 5 +- prdoc/pr_4394.prdoc | 14 + 3 files changed, 6402 insertions(+), 8 deletions(-) create mode 100644 prdoc/pr_4394.prdoc diff --git a/cumulus/parachains/chain-specs/people-kusama.json b/cumulus/parachains/chain-specs/people-kusama.json index 7a55435d12e..518a7be7515 100644 --- a/cumulus/parachains/chain-specs/people-kusama.json +++ b/cumulus/parachains/chain-specs/people-kusama.json @@ -3,10 +3,10 @@ "id": "people-kusama", "chainType": "Live", "bootNodes": [ - "/dns/kusama-people-connect-0.kusama.io/tcp/30334/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", - "/dns/kusama-people-connect-1.kusama.io/tcp/30334/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm", - "/dns/kusama-people-connect-0.kusama.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", - "/dns/kusama-people-connect-1.kusama.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm" + "/dns/kusama-people-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", + "/dns/kusama-people-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm", + "/dns/kusama-people-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", + "/dns/kusama-people-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm" ], "telemetryEndpoints": null, "protocolId": null, @@ -88,9 +88,6388 @@ "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2aeddc77fe58c98d50bd37f1b90840f91f7f3f3eb1c2a69978da998d19f74ec5": "0x1801c674e09ef751ea2fb6f9eaa6e505f5f90e0585b1f06d9d774449c90c75266b3c00902f500900000000000000000000000000000000000000018ef5289702f6b8c7d22b3562ffda7d5593a5f6414226925e72097efbf9b2572000c8e6bc1704000000000000000000000000000000000000014ce421370cf0257d869618ec25c324ed4c6c7f65289297a3c134332c212e350b0010a5d4e80000000000000000000000000000000000000001a6915d6fb30cd30367f23194c68842a6018f565c773ea0c544eb2a62597b1b340010a5d4e80000000000000000000000000000000000000001b6a0389596b472840969a9088eb5852fa03a5b5dd7a3c2fc7275d7c05563a90000902f500900000000000000000000000000000000000000016c0197856b35c7f631f5aa8d9cfd83f7e75202b0d821e67d2f344e4e4b5fc10f00902f500900000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2001a999956b512c074747399c0fbcabd1076ce5a68ccc3f21da73f2b8747c87a71aec14a792bd55050a44cbe58c7196f": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073039f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20027994ba957c6ec7138a4649f05b9bd80c546b7e44391d7f7832d8cd5456f7ca1a76a73e73807544a4184bb59ce6048": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c0cf09fa69020534852494d50", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20036af6dd10e8692493044fc37feec1412c0e71c578bac3ac4c85fb1d9f0645451aa4503782c3f0f3260486b8d3e6123": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033636", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20068043e94d92496a755395960c92c01727dba627f34c210eba395fc7f60d28b3a58c5dbd6b63fb4f9788ee764b2702a": "0x443c76dcde19df9387486ded7845c6d85ec2a4c17f38f8b1e7a0a14de7968d7d0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf200e420fe7fad43e6112bdc886600d40d5da7c5df13916304befdcf8c879f5a35c7d65539711eb5cac00a9d5176b36b58": "0x5a9e357de87525b67cf9ed1d0f06a15a6363665ca1c9f43ff527c87c0945597c0230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2014247ce055f7db9af9631b382a7370a541145a8a9d8b066ecd0c7dff89c9d397a18e2e0e9d65a36cb2c1295c768e376": "0x925000bd5b83d502f56c49f2a91e3532af9f919d6eb52d750b72539c6b62d45b0544534b31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2014446e470b0ae39ab405f9d1d71337112c0e71cba3dffa43d603a1637f373c134f4eb3b0ca902a937e218cf992b4f1b": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033835", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2017185f0a21043525d99a5d934b4322c5883a7c739d00f1d125475cda89e7ceff0f406badf56a7c1270c16f850f62cd5": "0x89abf449cfb7d9b862b775abe556bccbe647820fd4d7a50b63872b657c96506f033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2017d70cc4f902c5ec93f5a80574ca9bc6621dd4e5cdd0ba737c572710c13df35b316d39ecd12c1ae1320bd6db069a07a": "0xc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d60945696e737465696e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20183848bff64fb39e82b8f09455849c2a24f97e96ae4e213d8eae1f35213c986e0ec03126812b24cc1bdc99484430440": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff21606456d696c79", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf201a590f51715a01416d8af71b8911f72f2395f3e80b47fe6ce9eaf63553371c59c73b403bdc28862c86ab1040e62226a": "0x68f8bfef657c69a5c34721cbaa618ae9eb2108566f9a2606cf5055578e0c251106706f6f6c31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf201cde46327cce392512ad52e8d16c8ad7a3a98a1dcff1349491c4de950bac2427069580f45cabcf5b57e645d0df2882b": "0x4eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d12444941424c4f20434f4e54524f4c4c4552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf201cf563ada9e37a12b43c23c5c0a1d5ec8c3dee0510e7e05a5ac3e8ab4e13befdeb0366408b0c47c5a41c887d7dfdd58": "0xaa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d0e48797065727370686572652d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf201df75237d9c28749ff88c3629f478abb8dd36cb05189e12ff133ef1c0f3ddf97d1319dc737e4acbd882d17e143bb083": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf201f67bed5ee86b1cc1704c54f75094ec587fc2461b55e47619ef522b4bd986f71f7adfd207166e6dd2ba381117a2dd08": "0x948223bb2e7bcc8a55be248add34b625c1c0826c58fe037fa5c8e4591440dc59033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2020a67feecfc1baf4b326830fcee99ba800bea28742b7e03bf213fd6cbd84e862ccdc18e30b94635f5778a8103133f36": "0x6aa7f16d0ce7a6288dd1d2f1779fafb18d4c60ee78e89ab3dd3bc0979aad386e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2021891a9f30fc074325596c84c3098be702ffebbe8d46bc7b2d33457e61ee616e16c56d726244a6ee549a25723459873": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033636", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2021bc60d6ce58079c69164e9cbde46ae56c33c3e6261199d162ed7e756297752416cc7f7dc0eec30460a12a0a7e0c577": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512353a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2023a20efb3ac4201d658271e83019ff01c761954d8265833c4b21c7296a314229af2391b34fc090aa76a817b2e79836a": "0x18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc00190233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20249f6186526b3c5a73b2550a4f77e28305b1665aadfdadf6d13f6c8eb36db7e3868ba648e86bdb7d60f23677ea6b337": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202bd65d7890fbc23149d026366a2cdb712c0e71d208c668db313147edb94aa31af86ca4e55d4900fed5eda638862b803": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202c366188ecd4b59e0e9ff5323286c19e212871311a823c9537b3f70adf0a9697c7286c84fdefe5603bb2fc49b0a7b67": "0x187c76f60b8e91032091aacb1ec79764af51e796a0c962bd2f2e766e9e5ade450854415241444f58", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202c4c9771014895723e5f0e7e3b67499c2bf131a9bc49208383fce6b0ebd78517ff563ff812f146c441d917dbe726c4d": "0x584d715bcb7a2d3b6a3120891dba91b19b12df42cd50f1c76103e2581d5b42740767677770657a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202d3730801109c284b64f4c750dd62b9e8fc1e37b0b57aae49b99fb66be1cd0454d275d34a1c031ae4b796fa30d38736": "0xc87dd7c321ad3dca39e53d05541bf9d17306d681ab556029b0f172156e12b6030a434152474f4b534d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202d86f32d2aa798639cfad1f0a1327a9ad17c83beb46308e21cb6fb45b9587a826addb8c001e01bc2280847982af1b77": "0x600e047c97181ac8d0b9d5a6372f6018f556d68b2b4cdb529d87da365f718d4006f09f92b031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202d88bc643c0481680c7d501c743c722be0bc39e129f4ecfac3d20c50d78472dca69f693150064093df5edb3a0caf14b": "0x3cf3f47f611c9dd952bd9007a85b0d84383f91e2f25edd0f13d6be20b5805110033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202e7e87a05e6e3d188d4aa12e16595fb080bd036530545e5e07ad813a408fa757bdd643e76b9d1171417d7eff0d7fe4b": "0x0a7ac5be69a8243f8880d5fd015b2e8f8f30ce6c7162f8bcb5ad1a1fa4246d32054d617263", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf202f1ff1a76fbd652a072b1553bee7ef332ef9a68234eec37684bf683d6e07e2deaf52a336ad7dd7e124041baeee37368": "0x9ce84f6cd845ac3fb2a009aae8e99b1a2fb64aa3e7ce1c7867f3ab2db0c9bc00105f5f5f6c656469727461626f726573", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203025c67a37f9de0530e46911b31a55b9801988b622814386aa36c7aeb697cc35596ede2bcc7e3c7f7c83d99192c611e": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31335d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203371878c11a0f29fb7eb85d26e341d5e4f861ee16e48158f3a84e6e04f1959495fa8b39f13b39c2d3a9a464151f595e": "0x844152eccf08725bea8ce898d6fc5362ff2d0bc9dfc21ed15fd138438d1606220c4b436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20386428efa585a36020d76528b28c3458886a23f6aa185a4d262ade722584c6f1e384ce10b269bfb898abf8785cd934a": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2038da5dd2caf09bf420b4f1d62838b37c282b526ff533bee49db3c9c7ecba02b951f63f8442cc33443a78679d5246829": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203a89a47bc0b8695d2a696b017df9249663b801c02f2b76565f5b60d817e7dd805babdc276b53d20e19cebd199c88555": "0xa6805c6dc7757cea227e11839257d4e24ad39520621e99e6016ee0e1907c3315033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203adecd29d62220c01af1fe296ff62c7eaeb9d2bee9133ac09633b0361b04567f3997d6aa139a401c12f929be161d9f6": "0x548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b07424159414b41", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203d084fa8c88a7030eb111d51f9e56f086929ec01fdfdecf2c5ad0c4f9b537e65084f053980fa1215fb9377dc325f52d": "0xe8b2603f6baee5bc32a9b9e4eee9168499fa553d35edb56aef0035ff7e1f165e0a506f6f6c20f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203db2032eab02e544102e8a26522b190e0fe63b7c5032e2437b3f8327e95b07eae600a8ad4f31e17db0f80a3208c4728": "0xfc659bba6d3985002708101d9c2aea9155bd520c105688751281cb40e4d37163033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2044f6c8244ce36a76ad70843294f01cf26eb2cbbeb40e98cf9d5f39918fe54290600520ccfc9e519efb5779ddf48225f": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2048e9d4e54980e7e80db4c46b84264f2ea4cf3795941a47d46c2b433ee328d7d2a71c85007251569a6e1fa5535af173d": "0x548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b074b415a414b49", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf204a1456c707e805462a0f595c16a950ab0b7458638e3862d435924db213a27b64b5029bb2f06f68bd337b1c3de43fe44": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033738", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2057032750a00050f18d9976d6090d84860384fabe173278be399e99aaafc7d5b3eb2547af81fbc8039eb6fc49ae008bb": "0x0456840228e994122a2750c966571ca20d2456db20a7cb84603ed8e2d550377604303031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2058830e2c4e4dbe31045ce28fc980a8c3c1cdb7f10555d9e080e83ac20acbb4880b32d3d30319f055e37652c7ef3d36f": "0x12d9c0035dd422388e6d346f61df3d9f3667f8ab761c8c57120dd61917976e10032d42", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf205b2dc427f2aecabe11a2ceca1f7a6349c2df8fb28c6749d31d1716854ef3548aff85aafef3175c5e49030715c00fc25": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313438", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2062b0a5a8bc99462cc0bf8fcf90203cba830e5f0091c9f1c5da8a2a9a1a7a0de5802c6bdd3d9e23175d8c116ef226251": "0xd60cf655685824e9966b0a10c01dc8b17b37e24944fdd760e4dd73ff1dd4ac140574726573", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf206574a0ef09abd6ead4f5761035820cbf64689da7688eec693a364879994be8568da0f7ff5223c391b6b58626f827527": "0x0a71c6a0fbf9b63ac089c5395bdea4917a84aabb3475d4454147c4d24ce1013a05706f6f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20674e3388e2e1aa4aaa342a8355ff3662a4f829cfd9c12a01da70549643e5bade2829684c101fe7c1362176c884a3719": "0x8433eae795936e63871cbcf0410517d1dad4755f2da4a6d88c1cc1c589b8e86f14535452415742455252592d5354414b494e4732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2069112c1c85b4d5d7a1a2e5e98b946798e21a74a8d65c99c228e22e79b3e016bab0eb656a5235af8132c2a9a818c7a2c": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523439", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf206e8846cf7d041c8a528c5def8819ecfff07f170fb1e51a81ed96a4ca36d82decd18c5aefabae24a03d36ec5f8ffb257": "0x1ea86f3c82538c486a25d8abca26760e57e76a01212419c7f1c8b510121fca73042d5242", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf206f8e4b397c44dc3b1b19dd0dc7962d84729298bb2a53d0e5974d34d14932af4d4905334d5f9a57d7931ed1eb04eae67": "0x4c4769cc1bf4774f19c7433e31a5b8cb686944cdd758e193d264410d4918b1200232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20717ea76d2755ba7508819bbb7aed8bb12c0e71d0d3a5ede1ed512ea065c3970ff43788f057c99ffa3afe8ede608da0e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2071d474a3a0dd340668c44dfa1a3b906a63f88c1fbb368cfd13ca5e7a68e16da2e80b94fb382948eea95616685598235": "0x22fff76bb4a0a5d66cff0392dbc083abbac3b3046f6fcc328abf0ddd16ca08370232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20730e29b5c9c55b9ad22e208fbaa9c8170d4121446293f928e59d4f8a5eea096ebe1c2538002fcbf7b7845dd2e19ee6d": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20743b925eb1b48c3154a37a00254f8c5e88efbf462925faaafc04b00555e946a843a6a018de2e47cfca41b0804a9f128": "0xaa2b3e0a8702aebcb83d552838a17902b2403b0f16c4e52a4514fe02df532e3c0c303320f09f908f2052414d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf207871568136038f8f6fe7b31199f4eda8a74d6464340d1e60feb30c35ef63b8e48737f225e6343b1875e352756d0160f": "0xa8a2e5461f346cf0c23d1ca613437432a160525b6487dbb718afa51439d48d040d56616c696461746f722d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf207ac57824770a9bdb269d1db618967f46d6f646c70792f6e6f706c73004d000000000000000000000000000000000000": "0xd6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d05f09f909c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf208a202c55ad5022a2add3835e2998492fa6c823ba7c33395d2f298934f304b44af030504cf1af0f1a3f29c78442e0750": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf208b030a3e4385a9eaa71ae95cf3b4df5e50c1ab151d60148984c5494bdd23ddd7e5520a8b4873de12ca413a6f37bc3cd": "0x90c7f4e84347dc6e4e176f9156b2347378faa9b538a857b404cee3e3417063050a5374616b696e672032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf208b8c566be5926cd348648d055d052cd07e8861ce764f34220c198710b60b72f8c59c617fef101bdba96bf6f598016d3": "0x201f968f24fc0df93fe98dab905ff103d00a9a232329bfe78c22663dbe60a12d04303430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf208cef132f46d5bf78fe7bfdf6e7cd9405db58282171c8d2c73678f13f3c61579902ea4572ae9e9158046e8e820bf4d82": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf208ec1901955f6a8ba9fcf40920b62ccf48f5c152ca97d46d67467f3b6c7e2fff11e1f95abc0ea7298255c026ff65d92b": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303320f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209163a5f2972e9c2ad31a6a386bce8bf5c9d4bed4df1d87e33b03c63aef108b00b23253cc0cda93b528ea9f95c33f522": "0xe643e4515fa656d6d830c088ec251ab76ba6cebd85be7e7d6362eafff654e2220f534f4e59412d5354414b494e4732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2096e0db1cbfa92374241919548f80bb3d6945be0cef12df3e9d25d4bfed7c4f6fbe980487ccdcf13891998454d4c7d3c": "0x5202845d849d9eb6a7e5a414492a86d205be4a374ede34e98fc2440de4809a3e033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209acd96884a49ebbd9fadaacd9136d796c8bfefb8ac4b47696a47ba939ccc48415c02fe947afd32437190cf5a3644002": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d81804763036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209c5e5eddd7408e51c125433483eb9177e437bd1edbcf02649eb8a4103c8668f5903ceffd5b2a4215c0d211affbe5f6c": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209da7bc8ea2f3eacbccb7a616c4bb60db4adbb4e711987eb53c39b12dfd79435736f1317a869db5f50d5a913e4045550": "0x46b4eca928ede3e8075d86e25581d46adf3eff915646eab110d13e2fbd947b5e107765623376616c696461746f722d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209e0feacd17dc8258f8d124326e8e79ed047791087bdd0caca708a478371eb8dfc056a36028504ea64f4cc43713fa918": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331303a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209e61fbe0b11a8469a72a9bcc3a79154e2623f940ce24961b8e483b3b00c94e84fd32a5f13a67a09ef5a19d28af59435": "0xca42f0b5c7957571706f29d2828291b148b4b162100ddcac72c507fd8ab69b2e073033f09f90a6", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf209ed2ad028c5f938dede2fc8cc8069b2565e801907aa5ceae0511572155aaaed09c8ecc03b7dca4790609ffe26bdba0c": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20a0833d62ff297dc2423ea20aa9e2d7d9e62629f1f1b6e219c95d80577ba4215ffeee870b4c6f6672e2191bbc3a4b750": "0x3674aa73951219dbd27b3e3fc5847b806c68c1de38fd4f22f9493a461c80e903124f5247414e4943204d494c4420f09f8cb1", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20a08568a637562705bc4fecb1d33c4f012c0e71cc0578209ed2ff07931f254566de682bd7407f07913ca1c4a30e7a633": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033831", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20a50a0c42e458db074cd89e3140a971b8e9871679378b82009f51f30eec29bcddfe60c4f7d22c24f74883b47d935a565": "0x2ce1929ab903f695bdeeeb79a588774d71468362129136f1b7f7b31a32958f9810494e434841494e574f524b53203030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20a73e46ec9da49f29fea3b464d77109b12c0e71cd31ae09c2af44df1c49f572234348e1637127de385daad38c2bd3632": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20adb7651bea6d4d81c019977882d63f75213e3c8881ed30ead22d177f5c25c4cb8bf46cf2d04a8ce55ddbc06118a9516": "0xe4a66ee66171e3238670377bc9ffbd7cb4bda47baf25e6ed80c2070942ee3f721070617468726f636b6e6574776f726b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20ae46c66639fbf674157c4a9171cafa778905d56c02810911e1ebaf201ac246eff919f4e71a5bfa5b29eaf6819663944": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20b0f22c210fbf446d674b51a6e05f9110daa7f988ac07541286ffd6ac83affa9d4f0e119c04eba5f1fb74e51719867c9": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20b432ff63b59bf96f318de5ffc7832c1a00b6ded2d4d0101146c5f76452f6900532c39cfb36b911e38776c782cfcef59": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033537", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20b90dc8cfc3e699a2611c7437eecd07cdeb5320179cd1dab5b17c203384b7ec2fa9e73577a82954f9c526ad535552422": "0x5247e73b8ad3c36bb4e01c93a9bd6a6048afce1e2a45863ea5fe99778b530b61033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20bb0cfec7089d8b9e17ca192fae0a4ee0a9e884e29b1c07ae4918e17e7ec48bbfe9622cd9badab882d14064c8d672b3d": "0x6a0051ef580a2b9dd19a368b82ec20f9a605b0207f2e8d364e6c985b5b2ba8710232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20bf5e86edbfecf7c34436cdd4fae89db424ecaa1e5d069bb89c743c3ddb44d9cb023aff0ad78e3c502bd39b0abbf7715": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd768191041737365744855422d4b534d2d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20c07ed359e65249593e99ee8fa2bfe3e2d2a9ef6dff17530bba04671deccf9754c7cdf0b079e0ac825a43c5c0e274620": "0x90c7f4e84347dc6e4e176f9156b2347378faa9b538a857b404cee3e3417063050a5374616b696e672031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20c0ab7f0e067fc048e2d09c4b539c63d866f40b96e6ca6405ed0c44747726b3972ca4773aac5273dcc25ffbb5003b075": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805407f09f98883134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20c1af3384ddbe14bb73ed1432e7b2ac1bc97eeb4ec96658e0ec1d15b07524376ed7e1444bd35f3c4fc21526176f4c979": "0x749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b75707636172626f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20c5277389a76828673fd42ec57c47c66a26c112ec96a277c48e91f46d5385fbdfee248c6ee7c3a66a9f8e640b31922a8": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c492770574656368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20c598f045d1f5b180f40f1d98146be72e04176c772d8e5b3758231c8155b2265e9522e5047b15f388a23cc707767923e": "0x9a2cb674ea2f4866664769a1663fd6aa321d9cfb89b67c402c881891700c0f571046726965647269636820486179656b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20c85d3369694863e11c43a04c68b3f96d34e07fff5d2c51bf316d91599d98e2e1ecc8bab38f57caa40a4206967dc8ac0": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a074b554b414249", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20caa6f5c0b928e524b323b57e1aa3469f16a6e2b7183e7a10f701d357d224e9ca87bfbc49a663fbfa27426a8f5e9b1d7": "0x38ae9a751c06cfc8b4bfb06f4d0b8d88df80fc88317415ad6f1b9bb6ca11494104303136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20d00278bd6531560df393cb9de7b02fc12c0e71d36450dd3d651da12ea3ff51a9f306650744f4c164ceaa7b2cc084546": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033539", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20d26eef7e0e73557aefe05256116b0761a7df77359ce352ba50059ec6e2635d7964a50cae9012e4a737f5e82c353aa0d": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20d461b6a1731b017b92cfee609c6e3b152e32efcfa98867081b563878242febcb31531cf4648cc496bbf851f39f31f6d": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073036f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20d70449b3466fda44840841f97768623522159de5d549c217b26deed24558c4ea6e33ab8daf73f5410665acc1d5f845c": "0x1aaf37daa4afffeb0d84c47f52330d8293ea648e1bba5fe0e35355057e63c1670f73656c6265725f636f6e74726f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20db0fa311944ee03f68cb14e3a4773a580ec6fb1ab57be7d791fa9bb7e711b2736c6422e0b66932b54f3e95f614b4b2d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20dd32323836d31919cb4cee6850e02135c97523bb1c1be25aad6bfb7a52d7e1a55fab08a78c2099daf42951adf713353": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20dd6a0fe0a25f539d978c7fefe2bdcbd74a0fe5948a9e16263adeced4ac5592a4e15ec77d223be684d9229ab3659fc70": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523437", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20e075b69e5ae02a46271d1b1294e5bf912c0e71ce93b3b5ce42fde862b4d609631d600ee1cc3f3717268e7b9b3e1467a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033834", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20e0ca2b2ed572a3b489c91f83993260940ad8a6c92b5be3305a78ec0ec67cc600e791fb2769b9cae21cad79c40f7c92c": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033435", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20e416e5b5a385055e1f692da0cf0f8b3d21f6f288702a2646b5cec6d0cb5f77d48638af67cf77d6dee823e2959ccb967": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033439", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20e495e95537e75e686c3cb9a975a87326e32e6b0a35b369455c50fcaf7153945fd6d92b850a593ea33b5c3b51d7e5a2a": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20ebce498b8ea6cb844b59453ebbccdff041eda8cf4ea9ed59862c6f5ad3a51e7ef62eff19b629cb241a10d5fd7f96d22": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20ecda764c9be13ae791ffe4aa9702d1744d50e5b2db8b483e5731d39c1e71f33d6ab32318c144f5dc41e57d1d21ee779": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea259385609086e702d726f6f74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20ef92e517426f8737223efd744536afb1ad58fdac86f68d5a3a9a8e07163426d717ef0426d3e03604ae3bf4ed481a923": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2103babf10c477bacfddf27dc23fb5be6bf7c2411b8362b3beedd04428317c3eeb3639379c64eaa724d44eb77b15cc85b": "0x6a2bd95c44c00bcad3fef2f7226ad90b8b93c3c1b9679236d5abfdb39c89584408636f756e63696c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf210769b6d502a8f0b2b26cf9be30f66e58e57071fe8c6591960d214a1100419ff2e2e92d4989a99646354df48ef91e664": "0x1e015452870e49b4e4c3e054556b19683e8895586bfa58638a74a5782ab4f71209414c4558415f3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2108c2734b36b8888f4a19edc8b64f422a6ef8a1f259f84d8e435d119d7c0b8f4d91c7ef95bef739c81ff66a2cad2cc45": "0xaa18b3cf52cb27fd19d5b80fe7982ff955e0d5124dae26ac360056f401dad84607416368696d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf210cd9b5224b78be4929deac8776e2ba46817038f23e3b1e7d91f641929205495b7be633fc2247d0bcc5a6f9709a8f82d": "0xd6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d05f09f909c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf210e1d1720cc5799c635647b68b396e943f25ee912fc878195d9904d4474bf1ffa58d1570bdc39af3f8fdd88829b15655": "0xaa7880fe9ca2bbf331fc13e40525dcb0da661f143df506fed76d8ada3db8f55104303032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21160f447eeed0c082d88e23f3c2553b1c68dc89f99b0b46b9e3a10f9b115283e27b7f6fd591a9f6cf53fbaf1b1a4685f": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805407f09f98883130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2116fee05fc8e4ddbb6958227b9c8ea44d5f8960e7af211c990e0d092ba6038772482a74e9dc91e5696c84fd079992ffe": "0x5a9e357de87525b67cf9ed1d0f06a15a6363665ca1c9f43ff527c87c0945597c0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21185c189300056dde7eb239cf182b8ed223b081a343ef66eeb872caa2ceac54d75566c279627592362d2cd162bd21831": "0x2cba024614ea8ccd1ebf7a634f30b38d65c082be6aaa92551b9c3b4d1f15ae6e0a4368696c746570696e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf211af50e830a384d6cddff2c8765f5e6abcbb3c28aa69648bcb3eb9b493c06256abecc144fca20c90144dc4dc920bff76": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a0530322d43", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf211e4c6afb785c7c325f25d434d4c547340e30e1462871a4a8a38dbf705b96b986d699b62ed53e890b8f42544e3bd7b38": "0x1c7376c9f2afef25e542556d2af805dfa691a414efb9e0fc9a8e33f625294f670232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf211ece78f336d20c9df63aff306176237820f781b839533ebb3f3606d6bdb794136b3da9a8eab8ddb2f4b2c29cefb515a": "0x7add073714bbf9da81fe49db63778e918217e56c55e4f81f68e7d2e7d0e59d0e085448554e444552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21205a8f89ba76fa0d8e59d76f99e1366284e0442b44363d362b1194b107f46ec28e76932170fdbbf8077dbe87aa26001": "0x284eb76f4116f4b75a718fd1a374cc5b6e02fc18f37e02deb3054e57539c5328064672656e7a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21210f72f44ff8832d4eec2d9ec420b5354ba6fba820d02b4f0def9908ed99ed988d415d9b7c272a1d9394fd670ea8950": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21239ddf641b9fe0e1c4a22ce2f5a455a3c0bb72774583cae164f6f184ea05f95f90c8fa34203b9b2c5a2c1b6beb90a5f": "0x8429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee210d5a4b56616c696461746f7232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21292a4b58384768449837f754c99a44ba434a662f5ab9e81bb83c07ab5282538bafe448f142d2b6b119362b1bebbe176": "0xe26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd040b48656964656c62657267", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf212e1ebe0cf66f108c421c8aaec37e4f620430a70d2db1bf57c424e5e81de47ade7f1f0ceae2b568b9182ecf9b025aa35": "0x2cf0838b05fb182718de859525fa1e6d53d557e5fcf631ee9ff44c619810d43b0c476f762050726f78792032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf212eab7168c18605d270be8e19009c67d245fa94cbc6c035f58068a57aee59359d7d464caf058fe55e30623df66dbca94": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083330f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf213783372b26c4b0f21d1ab58ab4fcee312c0e71c508ea654da98971a9a27caa027e9478b84c319ecc1fb63288ffd9b0d": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033933", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf213a6aa123ebf90a2d40cb44290bcbe5e4ac0609d3d326fa83a76b4e89a445ff2c0e6436b338481041af7500057c870a6": "0x6aa9e19b08ef554ef0b123940b685c0d64eabd9a1ec487e43bb7e1f3d981c06200", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf213c3b27ac47fa89e8df1b00c8149ee6b8278ef29ec5edfc3f2694075448853b34a387e0299bcc326c41e9507a5f0ac2f": "0xfa65ad25c6a51ba28504fe803d9e3d542135924ba9fc0736cd3f1d9b839017780f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf213ea12bbf865f261fcf67c0989fafbcf3515e1b78389f5ef86a9b5e739a0912d6cc4e9f4775698ac23458e8fe8764f89": "0xa8a2e5461f346cf0c23d1ca613437432a160525b6487dbb718afa51439d48d040d56616c696461746f722d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf213ff6fa1d0e480ef82d3023f2bc505ec4ea8dd0f74def3f37653a2bc9932edbaa87ba9a185c55cd8b5bd733ea86c6257": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b356805504f4f4c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2142dfa9359ba3ed2b2f893e502c8b2390071d7ea9d85cf0a22365cd41cca3f63121fbef0e1eea72109db9b12af8d4860": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b355d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21430648e2a6c6137bb3f5d386e349ccd5c0db244fc6960005482b5e6c2896bf2064efd1e5be17e851dc8139f839cf062": "0x5842026fdfe358c9320e35012deeedc83c1e19d2b677eba10a1fad0d93c82b6607417a617a656c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21431c0f7853fa382a145bcca8ae92d7112c0e71d330bdafa9c3a6218dcea201399a6cfe0fa73c2692e7a83492614e40a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e731008436f756e63696c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf214d11f5a4090ba5cb906b055f30a6646100a7405e03b712786ff8d6b522fe258843ec33d366eb61379c98aa028bf380c": "0xc664fbde2dbcea2d4180fc9e285ac56ecb6f89a9b88cbee9b407bbceea7da912033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21509e5011f25807bb89b4356ecf60dc9ecd0f078418756af923fefc497d98efcdd243170af2694cb75a2becfe2811732": "0xf00272047a1369138c7948e8d193757bd7d6319254926d2b91175398d8250e30033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2152556d9023c3ebe1aa764cdf018f1384f83a66e4c8f4afa5949586c22ba0e7d73e7e4dbd6c1efeb9ccd689080834600": "0xd61813f456c8f11087d572921c67afff25605aa712899d6a6b04cc42c3d2d4170235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf215bbfd788ae2c0f9c9e0a225c0ec055cfe57cc05a0401fad57f17da9b903ef6d679b4d16c107a89f7a8c3da798d10919": "0x42f3c525c66f2a4eacfa88479f7537670d2e1f45f4ec25703a111f5f003ba15d033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf215cb25fdc3162fa7d0913e39788c78cde1926d2b7dcec1ba035361a2d58a3ddbbc4386ba5bd61d5dd57d22d508154dec": "0x30fd1beaa72357f61ba1fe7e90aa8c5080fcd49b2c82e1b8315bcd9a223cbe4105f09f909d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf215d8cc207ae11b542cb7cbb92097c7237c49a3654ea5a5313645948de60749792de736cb3870da7b401e78734eac3b60": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea259385609033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf215e50edbdf8f9c55d248be9aa8aebeb41253640274e26277dde50bc1d72ed0b3f627e4c6b66d8343d4c52ae97afd0f03": "0x6a88b4d1ab30ab4708521d6c6d480a858d92692c0b0cff67e1a6904e23b84112067374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf215f2fef1721c0c68c45126a895ef442f5c3e489388961303bbe308673f7faba33bae973af37d6ca444e1772a750c9775": "0xa43b2797bd4dd454d7fb0870a2a4edd62b39eea0801f6baaf09b05c8634b5a250234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2160abd6b7efddfa47d7721371053129bd47e15ef535a26d9ee0e3199ea99baf7cae9d94a05581316885d0b21549ddd4e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2167ad101f38ea67077b668a5004b17b68219020203f8d92b4c8ae0dc2a5a9c7c5641486ac27a4b591d3560b434650658": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2169ea0d85e46590c62e047babd2031ed5ff23e481785ec5fddb6178f6860b44bdaa0150ef473a91de3f1ff794b2b6fcb": "0x74422321a842adfae9419ecd3983c4fa2da6e879ccc1db031e54c742bbb9bc030232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf216b68724c80dd9950366d2a74bd473c9489553ecd89d7eda44e51d14dd217fcd4e8f183036ebc916ebb32844bffa9915": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523436", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf216dd1b48754a2a6bfc3757b772f9f01910a315981265a9951067374fb624c1976dcf865c9dc43d08e3031ead35a06219": "0x726ac63a0a6a700ad7e1178fef89a87620bbc152a19f74708defc7f08bbc6556032f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2170594a2516688ce8c96ad22c918ef74a28d12dd5c12e1bc0f85ba2935bff3b257089ef59869ad310056febaa5793959": "0x4ac4eaed36e5c54f045b46cb54f533b2d3949c0ca7137e89ef03ee3f56f8155f05f09f8c9f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2172e6fdcc7f8c128b419cad0db414c1ca6b7d31c38534c4c6dd648a247e5ed408172cd647084f554747823fe69304f43": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2174ab42842aa14b268b5d779ff1bec02d69631266f8f9a76413f5f902d59578faf655a0dbf92938ed749fee838c81bd7": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083234f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21768a70b5a9f93e434aaea779186eb691d6cb02740c7ed074385a93d27f0f9fe5efc113a8e5961d964c54b0afc6bfa12": "0xd46e6f10cd59b0f6d7082dffb33d27c9f29801233f8e28fe3f5edf2d51762c6a04303135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21771c10a29ca314e7ede3eaa2e2ea1cf305b1686b3030de938cfe6a01467a664fd1b42e4f43fab7295963640c5128a7b": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21782c028b4cee54e88a2a2f59b187df39a7994a63250d77c7cf6ea9f364f136dfd163cf4ee30d1fbf5de6808e443f25c": "0x749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b7570a626572796c6c69756d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21796b54cfe327241f52ab83de740e7744613a2044c0cc5b2f0faca94f2d6e7b7533c1ca3610cca54ba03ab9c5831d826": "0xf429460ae52548e754c712a7cfc75f1bf7c9295da165293ca52ccc686db5c02d033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf217bbd7d19db7a586a590ef36d2a5c15b9c4151f0860839590586185a1dd97ef4f3fa86a6c0ad4eeb24addd8bca2aa758": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf217e32de8f088da5a6950148d4e5914ec544e2e588c90a2e53e051d2f87d40e222e1f034913a30f95a9a2f39114e5be38": "0x0277ce02b2ac78ceeb9ae4fa0a595005489bf3f5f77898415e32a3e9504a531418546578617320426c6f636b636861696e204e6f64652031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21800c0ae0531bd79c7e1a42d62b5473f0208bf1b4851b0e3013141e274ea24d6a498412f2703e598e87b7fbdfbc2a72d": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2180c52a2a840db7f6da03a8f69143c170069c3ebd00f7ee39c7f8affd0d14205768535bf95633e60e26f8c8006c27f53": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331313a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21813670e858ce3d80abda7ad1d8d520c1ccc2a2abfdd492dc72fddeaae0b32888f3397860a31b3fcc88430f7c5338c40": "0xf0e5ac8e356d7a3867e9919b8cb1984ee5a070b1659b6195deb85039a3b699280f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2183128dc8292ea45b743287a6fee4c30005e13effb82cec8d1e3de31eefc750ea3afb8df4ee1ffc18a66cf56ae4fe178": "0x280221db3cd2515ba48cff6c400cf4624b9459eca62f30523972ee5b608e967b00", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf218327b1c3d72d8d4ae9355220d5ced9f06419ac9e6a0b6d955fc0274eb9911fddac424b804fa29062ea417f05d64803f": "0xe666c8204234e3e9dc671cc875c4f22316e6a7b67bb8b0538d8d77674468ed5007736869627569", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2185e775e2507305ce9086190859a2ee99bee35b6118399b673cf802455159ae282fa4a1e68368fb67cf85b00e4746119": "0xd61813f456c8f11087d572921c67afff25605aa712899d6a6b04cc42c3d2d417052d303030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf218d86490bc369378378383a66f630a33de4ea9ea77e628210eb1aee0c6816cca8de5235e04a861059b889c6b396fbf15": "0xcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec47711416c7068612043656e74617572692043", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2190dfad73fafb0d1b45ccafde3be8ee05c975241098f4ce19cd95187485c1b0006584a560c101890f32d65a67e787700": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf219632c158fa4271ceec193c1107d6faa1020aecf6332d324cc8681199d469780ab81d8e87dc408aa96ca573c590ce344": "0xa0340d617b2e5fecf5813d12bf441eb025f610edf738af8f79a98a9e168f690d04303032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2197cd122a188ea3dde82c0e656be2377d45b3d8d71f6ca469454a375a951d272db9426e3712e172272f951d8b289d300": "0x1c39ef78e57f239200072aa865312f87edfcb4d4133c6ccc0a7e33f5c799e2010743524f4e5553", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf219a3c826e64c31486f97b2646f45669633815302aca0725e74939106884963f32a80056aba37aa94dfe6220c039cc87e": "0x273e55ba58de0184bb96e5e691dcc9171ec58658d2b94c42c7e4ca7574f6a07613e5a4a7e59684206461697a656e2e696f2f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf219acb7972ea18adfc169f255ba2a0c53d4fda909c31173d9691cf6c488ffe22b46c795d0bc95aa062bcf08f414c4655a": "0x629c17f4f4a24ec53f85a7beb1c70b13379fb8e4f969560704d2c25133ba8d2419416c7a796d6f6c6f676973742d76616c696461746f722d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf219aed655a0935ba8565ad4a450629a910d3fb75084e9d91405dffa8b3f1396968dd935308d4dddc0e119fbd6be444482": "0x4e3711ff0fdcfc953c9ff93355ed42146e442c256b6010ddd5b5fe0ee8b8ac1c0b436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf219e225f61a007373b152253cd4cdb5b1a4b5a3630311d5cf8919e20be535ded925f210724ef5c78f8e3754a32ed43841": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033438", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a0c5cc216d2bead2dd9a018e52181c470cfc338f687e55d944e8e6867f90a05085cfb5e15e2f0d5315ca27026d0aa5d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a165841d41c9c4e6684035fca91b67b0da80f8169a692da1a6a0bda931750ed897b1ef4b0bc9bc6e0cbc906981e2b6a": "0x2a5bd5797da40fe8be1b94dd3260ef86d6b01cfc891c5c1cd160ad7fa198de57066b736d3034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a428eb19ff37265b2a0f3e9d7ac61e5b6a0389596b472840969a9088eb5852fa03a5b5dd7a3c2fc7275d7c05563a900": "0x0ce0bbe155c5f116187af43bae0bd493872f436a139e23d9b26289d0721a310e116b7573616d615f726567697374726172", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a47fe57c5fa0349cec3067ff31bf4715c8186e944c4df5cbb64eb1080932db445d11f69fb4da145a98d0d6aabb4c009": "0xa6c5f0595d6ed85d6260bc682d4a68a4b4e605d43c67d56f2765d19698549772067374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a53113712ec3e23dfa7a3fbbb4a81f44033dc4a810332f94b2874b5aa564424b0583f0e866c908346ae4b2bcb4f5e0e": "0x4e908afcf0fb6b394bd1a043bc8b226fac33b4742731b9cde5d324f450eb3006054b563034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a562df6c0dda0f3b7c471f84b57be58e85a54ca5474be7ec4f0e149232199a19f1f962331e1ebd5be36cbb77d8b0c3e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a563b1be1c6f1fc691a3db82789b249a01f4cca8129d5e282faedcd6547e6676e91c46067489a28711f89da641b1737": "0xaa7880fe9ca2bbf331fc13e40525dcb0da661f143df506fed76d8ada3db8f55104424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21a92e3b3081837f84577ed9566d27d7efc2dda4a648f70d73746458b1109134bbda7b43b46ab3546d310823e36966d76": "0xaad8e905d4c09ac501fc3f74833019107288077bdaa77291588b5e021330657c10534d4152542d4b5553414d41205454", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21aa6ce7ec8af0d5649fdd942061bce54c08ef34fd7c513a00cc447d3a01368dfb0df9d3c84ee52182b8749e18573e14d": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512363a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21bc339faac854827df2a043f2074cedc6964958c102b007555e5fbd10a3f98ee67fb2bc270fa0d20fe2371916450079b": "0xe8b2603f6baee5bc32a9b9e4eee9168499fa553d35edb56aef0035ff7e1f165e0c314b5620f09f8c8eefb88f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21bd423f7418e9c1eb1d2a7a7be14778efaf6136c1b5c48e96fa266bedbb262f30748b53d9da7a435423272e1e67ede79": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331353a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21c7ee21f03ee09ed1b714b8d65938e596366490cf9fcc50f7edbecb28e3b78330a0e35d3e073cfb3538ae6540f0542b0": "0x7cdc1a6a5a7f23437b6528edcdf553d0685f940a4e6e85579727ef3dc574563a04563031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21c83a483946d3f1c3aa060b653146cfac2de6256e9ff0ba9b97f862290f69ec0f72b31fa0a6843e0175e9e81a0165d6b": "0x96e24e9b5ab82dc275b82318a52cebed1cae3e25be096d5f288229b256359e430232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21c88a35959cf7297788e69c0938357382e0c76ebaeb0ca61c682a80271d95abff7bd6249acb3f90cd702df6f23368b16": "0xec5909db1fe8581fbe80eaf39b4577c12a99d5abc87131bc3d4363f623412f42033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21ca9e5c7ad4fb067654fec77e3cf49d2e6f485794ef2701691b1508c90cb2d3bbf6186bff0716c43915936439e0645a9": "0x4284fa7c290fb6052b9437610cfb2e19b3b37081fc72140e444d5b57ca01924d033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21d0913a4692809429ee2d8bc2051cbd15c5c5a4a025f3d8be84fa9ea36383c2cd168c8a018d50c88a34154afe9ecf04f": "0x548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b04474f56", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21d2839773325d03130afbc0b9258596828add2af7269292c685caa58101bae5d78297eff522e3f6b239fd4fff6b52132": "0x845498df40e85e2ba9d9e213d1f476e7b147aab6a9098f1bb250e00251ef8f5c0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21d7bcc3a30ea81e6b0f23efcf27793ca6d6f646c70792f6e6f706c730012000000000000000000000000000000000000": "0x04f3da939fa351c562c7e06e1e3716976b5e14230e83a45995cbad9086f49e1705706f6f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21dfa8f553250b1a01dd3029b6fb4c018c0d792a19684453c51324b0f2a420544d8c3378c515c85c6aad72b7059ed4cd1": "0x88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21e20801bf4118db9d2b9ebe8a8f6e8c8c21c287be88281cfac16666331518cf2820f4de9c29d7caf15ffb596f12cd953": "0xd49e16d1c4f6a051815c5865058cb218fe7d460fa893907bd0cf8596b493f45a046f6e65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21eb9704b8e9a24c4db38498d7e24840528e3a8ec56f21d20789923fc326898987dbae48643c059d5ba9a8afe843a6f45": "0xe4d733aa6e16d24e220efa69687f6ff198317062ab5ee12a059d47b732c27624033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21eb98516eb454f77f6bf48524fb351aa72f10843313abdcc3fe2ab623e213c561d68539db6f9b47f72a41f2946c7fc45": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988834", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21edee54c7d3f913c6b5f680546f1c7272fa216946d71756ea4bc43259d6866958233f796bbdcbca326d684a840ef72f0": "0xb0d8ce5256f0b5a51a38ccaadc6d21fe930d8ff3da1dca198ebe1807802da75304303132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21eff94efdabbd48d172d1d4aee227d5dbf4221d5348a254fa587bc69297dd25173e89f25220ec395ec495e3df9c41d3b": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083130f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21f11459100d14c4bf85663adc622ad75f49bb2abd8dd96beaca34bd5bfb81b5edb5186922b92c3b1f5977cc401b79554": "0x3a3884dbc6806e8b4cccbf2c407d800c12141c3d7cacde442a649a6a2822ac170232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21f2e64dd2847cf975791908dfcd1d8c0cefcdee5940f8e74338264c625fd7fe4c671ce205773f69e8bf4cf1b372f8e26": "0xa89a9920a98f3591ccc0a1a4bc827a0adfba37b75fcc108ae3c7191bb9a32750032332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21f3b43aed9ce7291824c06d4892f051fdec5377d25559444879fa2dbfc018dc9bc4b574c73e7cc4ff17301e6f0404b0c": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21f42ea75dfcca5aa9269c87c2c7b16fe12c0e71d6034eaeb56b1637b948fefd184ecfebeffe8dab40a37c6cdf3971a40": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21fb6bb2381445273135be0586609532bc0020cde3bd8293eb5d5b61b072a9f6b19cdce1624a8ee4a27ca8c57e3ffa628": "0xecc96f0e735d4677e64728f5300b27c97c3413ba01e7a60dd29cb89123990a660f666f726b6c6573736e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21fbd2ecdc920f992454e24c102f0582fffd31bf694e0d28434da06abd3fe4febe23b25054b5de48ed94246339c51b2e6": "0x1c6681030fd4860fcfc1dfad9ae55fc0181229b007b6365dc4c8f5fbe162554c033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21fe4da6599e579730de6e7246ab6547b285f7ae7cc2580d54ec3be6fb7fa3ab6f2c1a32352c793b29163822091839e31": "0xd49fca4c127d246783d23e388e34c09446b624d2d5e1f7773c9590823d45101904303231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2202b406165ae0b48a55036c390d6a7d45c899bdf0bebcb57f0f68da86b80f8840407e7388ee52cbbc1a60f18a7a2eb58": "0x02948b18cd5001e68a33499343bd8ed974fc8398bbfdc3dfafbc7c478544f67d0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22040599cad87ec0bd34f66d1874b3f1712c0e71cf3f161c02727017e5ce4f8f6e245fa61bec1a3a1ac960fe11e917c26": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2209e38e283473095a463778fd16f4db182f53c176ea7abea9092ab9b7ccb5506dd3c81de6fe0a5d2b29068f53dd3706c": "0xf6944b2b5f590f132203e5dd4f04c56e594f43b5681a48b210899382c3880b4e036b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220a577df28075abf403454d10bcde194fa0f5c211f7844143928941e88780961c972b189e6269ca6e0ad98fdae5c994d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523433", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220b79b5bba03d2686899e7c2f4fd8d57bb3daa994e809e4484afce1c63b8737a9adb8a91ccb78d7002386a087b382de7": "0x122ff96f07bd9c9b3961c4387d71362315d05addda58f1dcce642888a643f93004303030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220b88d9599c058872b21e4b3cdee8ea95a43b9d3a39997151c4d745c1513b73ea440fcd50aec480eb4ddbe65fe692477": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033437", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220ba2427ac987e1ef9285ffa826ccee506929a0b268c8a51c457e031e971ba6d1624b2ecccfc94185a8b593549ef7b40": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220bf3c4573e2e1f7ec7423d959ec2aa82aac721ff23bb9448f8ddec8ecd159961a23f604f8fd22d729c3390e9f36f843": "0x4608fc7527698d3f4d4cfcc6074f01c2ed59112ad670dd5206b3658bbb62a0730e4f70656e6269746c6162202332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220c19d30e3fb4f1ba4cbe7787f6ece10a227e750a30259349ff46ad36105156f552fedee92bc3b81470cea913d30d6cd": "0x3e3622fb285dddefdf8f9ac2ab59aa34e2abb5a316e9ebdc020317220e75f879033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220c7172b569a66d53b866ac6577a4f60f2b13a9cb72a219a88fbb88f7c5306fcccbaa21a22484a24bbb84b8acee8b50b": "0x26842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b148033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf220e03524d700cacf37cb5192fd0e1f5b12c0e71c4b17ed34d92d3794d3cac294945580552a9200d74dbaeb0a17a2ce7e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033639", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22130193fa05adaee596bb9896b886a31c88752d6f18f0d5c804929cb727ce8999603dae997b121267ed59d5bb229af3b": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22132c32bfb3ae0cc31e4b119346fc882ba65343515a46a4aa9932cbdf0105d123c9d4ba9bef3be885c46f52c8c058d66": "0x5a1a549172a49f7591155007c51680ad8ad77571cea04acd1b0b84459e7792340f464f524b4c4553534e4154494f4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2213824be956ddcb02bbdc8707078a0ad86cb4a7d71b52b87a0ba07d245f92cc52dd40259d14190cd15f36b509f7ff511": "0xcad4349f82754f223d99182a3f9de949c41ff94e672f7f548e7f4e66c04b5c1b036b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22148a915b086b8df3e3f451d5cfe83db7f90cbd721e0f6df172266f725ed45095c9ac42202cbd84abae8b5494119a938": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2215732379e61d4fe352771dd1f73b23b2a5a25fb22ae60a8a24177845715bb880e16ad84344e91d1269ea6940e929f5b": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d81804763032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2215a57003350bfe8b80a05321712c0b56679005100a874118c6c38e5b3183ef6cb71193480d1de0699f9bb6bfedf1f24": "0x8c20d46f86242eea89c400d5c478207e05c76bbab29a748af8aac90d627e1a010242", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2217cb5dc80e770e56301e3388342372f046511c11fc56b5492bf9fdb92b3ecf551ebb98b73241db611b2a44decbeb856": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31345d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2219bc92ff0195b58d944c87fa8c720de407ffe0ae098321e72b2b6fe6ba331285a2967a27430f04375910007010589c2": "0xc04f1633da0ab6cb71f71ece4d1a5c32926d3f707d250f66ab712d65eb374b2d04303333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf221c70668af2f47e52784ab207b66b07abbce0e01ff970a8d2462a545370e0b992e069db055e417820aeb77e6870f9d09": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073133f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf221f2017acea08193896886ba2d42fc3652ff057f98f0c1bed31b2fd1ccd8de4d4acf957e79b3f71eb69820bf0dc1d22d": "0xd2eb07f02043788e254d9e2df57be11566d241c56302b91199b4647947af30200232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2221549b91569912fd4013a346530e6c7982b1616f2b4b963fe2a8aaec915c4d3f90aada694bba3fa5924127e67a2456c": "0x0cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2221e1f9b0353ab6960a7ad450d81b3442aa7daf7650583460d76859d7f4fea90eaf792ad9cc03e9bcc2667f165f00b36": "0x148a35cad2b2fe9cf6ffe0baf5f4f2f4ef894263baefead0e797a1e3e6d0a07f04303137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf222442364ee4b51b29758d2beabe55e6f92def6fae3d1c6c1598aaaa7dfbd7038c3e047da285f993929e25bfea8d04b40": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f08303150726f7879", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2225a8729dee127dd905734cc5723d49f2cce76137e2e2d9bb63e081d4074cfa4688d7d9781d2888f36634f646da62561": "0x02385caf9a08b92ca458a0b817a8cc303cefd5a0c6e108cb939e04242b9e007d14537562517565727920486f742057616c6c6574", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2229e03382361d7cce206587758627483faf6bf2c43d534d180a04d58c2838ebe73f3c98e0c3699f224ef0ac156c65e23": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf222a6b1ea3c39e6c998b84bf80a02a9461aef0e83444feabcf8eda628195f0d756082152cad2aaea5dab16de839b50931": "0x945e90a1afc83f0c74a3ffe96b40c4ebb5397af04126bc2db23036c043be4a630231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf222e875cf6d620f9a2b1c59ab9ab4cb2eebeb68d26988495f05130309042532d32304be1b171fba3f5f2ac94ef7d33dcd": "0xc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d60b4b6f6c6d6f676f726f76", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf222ecd11d7d3362f6706cfe9a27a85d258cf5dbc7c0ac18cccaaba93224d0c254df33169cf4d38befa64b443b6c4fb75b": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e5105474f474f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf223263a99547c12f80c2696d7124ea053905f923a67cec79db9e1415567822f2c440e794c4a38b43144bfb1a044b2a2f2": "0x51f78769768fc88c83546881a768523b3c70c2500159047a970ac4ef16768af616436861696e536166652056616c696461746f722030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2233e4a764a53db1ddfe7eef21269a810a243baa53ed09e1a0a8879b132121047f10b53b52b4e8111292a196a15136737": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090b6e702d746f67676c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2237a4c02fe6a5829ff6b543bb92a7abf9a3e193ef4ff85f45060902986dd3ba10afd3e4a0749b6718119298be183bfde": "0xbebf5aa73bf19935376f19460dacf00bf0dcd021ca37d6a2284cc6347dfbb13b033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22383fc60043a329576482e8e243f133d8a0e42d190d3ecaebf11d3834f4b992e0fab469e6bf17056d402cb172b827a22": "0x08769738ff8d53c17d6e0f0344e52c50a5ef6b61a33389f4dc4adbb7aa2f384d0a546563686e6963616c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2238ca183d088243cf879ed73fbb18412b8e7e832b85afd9cac90cf30ab4477265f14901bc0f25b2142c2e488bce87352": "0x9e826b5434525d00c118f3f6b0a29b7f432be7bbd18659d472c5f07298e76949076d6572616b69", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22440dac4070e76a7c2b9acdcbde28b80e8e0ac0aa68a0c138a3aa84813f0accae4ed7d6ae4b4905495026f16eda4e069": "0xe8e0ac0aa68a0c138a3aa84813f0accae4ed7d6ae4b4905495026f16eda4e0690b56616c696461746f7231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22443462acbc703f5e2df878bba1ee1c24e7dac693f453f3c407caea7909b1f56c8385dd3ea46059c9b0cdb32c19fba3b": "0x1e76b9da6373b204c3db21d2a7097a79afcf32f642a516980ae26c910e70a35c0b4b5553414d41424f5832", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2246208664a59c37b8232a108546ef20372c76dd7083bfe6b601d39dca6288bb8adaa0673c914f3b0c40ed812fa4b5429": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22467b0c1d946fb21de05bc940b426851ba7e6ae859516ab7792519d1ccc7781409bc58e534f54f4edd0981118d53405a": "0x2aa53f55efa82a9820f3c2569d4e52dc467475a1a11cfc9861ce5440316edb7a0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22471b594c790c4a8ffb77218de909a518057b9f8b71f7e97f0bbb2dd94b1a047992ff072d07aa77f0a3fba1c28884025": "0x7c7d2fe83c4af79c49136f0f8c5f1a00cd8d0aa91c94fe74d0145cb96d688f66032333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2248c079ff9305a5205356a76ad501e4948edca59aaf9ec40d9967f298ab5a5a2bb7265eef18569d5c065f318da512358": "0x8c2625b0e10c7bf65f283c576878cf00f67478d3dbb6bf39ee62b3ca19ce893d0c54616d6f204a756e746f20", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22494a79e75cb38aec1af9bfe66916adb12c0e71c5200cf1cf22ac62ae2910eb3e485a104f610f1535ed1e844b78e2914": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033635", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf224a74414112e2385bd265ce7c5a6e384063dfccb3cf16ab95e3af6fa877724d2ec90697596897ea59069aefe5c223f58": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf224d4c97f800cd5dc7866d75f926d746de816b1ea4928a0d642ee4b4fa99aecfb717bcd47086edb11316254c2e5844d29": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033739", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf224e5fcb31802ec9ec4a03b048a2a3cefe6897f5eba9ec46ed569cb3c532d193f04bccc3971b065df4239a18a1e5e527c": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225213251c5514dfcf9906296ab7205d51907bcf63ee4c58723b0457cc8207bbb53841e33ce3d2876f8cef269c5d4d3af": "0xc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d6074e6577746f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2252377a7bb8a36ce28f1521001db8b4a605cefe161fa9cb1c1649080f78f9cf7943320746e75dbb4b1cbdabbbd6a6638": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22543fb90c7c06ed9092a68a20140a84a0c8bdf19914b8931589d6658da943de4de04cc1102902a9e30d3d3bc68892c02": "0x0a912cf4f0c7894598d81d26f2c24f6e5c2541f312462bb576593e9dc549146d0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225b4b7079aac7ba74397e3a110131c9af204ee949a256b7e81637b358f1d8519458e9b79cec9f1e345ff9d2ad4516370": "0x9653ea6fa2a3e4072178c4de671464a69d9c72c7ff7170bc76697b46b3947b0f0574657374", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225b6c8392d70ef4e5d8f3004f45443740e46029cb6daf09d2408e111ffb14010387ffbe77b16539839cbff1473a3a402": "0xf01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e0423600c534158454d424552472032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225bc31d7924c787aee6d2843d367cb517ab0ef4391500cf4634c08dcc0bafc65b9c787a651ca8679b8ef33a6b557fe5e": "0x70661c356f24a2cddc859fbae974cdff149661f165f5e622df3060bcb8e7b373032332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225c76b12c5310d71a248e2b47d58cb8514a0db74267a9c3994944cb470c48a9f4c8a01df05766b96eb29789e9f049748": "0x6280b912d54001e1ac0bbc1023ba9a16974a6c23d22e817e97d418ea94d29642033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225e2b1e96d72f8f2faf2e5c02063642aca2ecbecab066ed29eb6f04bc145a5fe6ee36cc0144f46a722862cf28dba2c67": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf225ea69f6ea3dc893c1ccd4a4f289aa91c83b0bba37f25f365e26efbe6c9ecfa7905dbdc0b0e3ae60b29980b42c509c6f": "0x5ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43035632", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22606754377682cdf7d7a8dcb21d08351f8df53c69120d27f523d11d1704a4dba9448aee78ea4f1481cee14fa15124511": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2266a0ceb0a9776c0adfe016169dfa4d6e35a5bb9f11f2d71940593c4ff87fba89a7ab269825da6282025c43bf0b4c07c": "0x8ef5289702f6b8c7d22b3562ffda7d5593a5f6414226925e72097efbf9b257201c526567697374726172202331202d2054657374204163636f756e74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22698be0e43b2382133cc789436152a7208ec5cff0e253ab3a5d73aa4cf0db459f5128ed41f6b4d3dfbd99924f4346c58": "0x1eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef4843066e6f646532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf226aa69b6d7b1b9e4d2643e275020a81f7ebadb760b7f8ca8280f493f1604fa76e90df43f3ce4b084ea6383315b94653f": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf226f32bcef343335e33d4bab42719c055e0169ecd64ca393045cc15687b0f3355f7c86eef2d25182c731a45e55f2d165c": "0x7042479798003022a5753c8547cb0de8ef25e2471e40889ff3909fe714e24c5d033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2270dc31da1c0092261b8550a52a8e63420cbc85619baeb354c068a5799d8ffa8b822505221d5357d7e70f2a3ebe08ea1": "0x2a5bd5797da40fe8be1b94dd3260ef86d6b01cfc891c5c1cd160ad7fa198de57066b736d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2271a4d5b71d1e846e0dd6aa4b729046c4ad16debf0db0329b8fa6806c88a774c6d4873579225919e24c856728b575d4d": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b325d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22735323ae77e3c46dfafa9b41fcfef47f20bc9dd454ad586a9c7d259068e87412a8ea309a006e06857a0470704122701": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2273c980fb676ea9204b5119d81a5d1667243fc7f5f476ee7c5fad9de673f1ccfdf59c3e92530c09d6d584ff19452c87c": "0x7243fc7f5f476ee7c5fad9de673f1ccfdf59c3e92530c09d6d584ff19452c87c164d45494e20454b5449544141422057414c4c455420", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2275863690937cb22a4ad61ef020a6d7f021ac11f4e66c8e210deb3f90609d0be4335e8c434912a92fbb1f67d3800452f": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2275fcb0ed0b1f6f90708e70c6bbc4d423818c289aad92bbce3185cbc77619f99bb38a139fd9428ec6c2c97f964d01467": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819033036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2276390edbde8a9d2dc25446e08ea7a4712c0e71c89568cdf09515dad33fa70b04cb39e21d8be64dee93e17569f962129": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033432", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2276b1a0f287bb8a9e322448184a1b7d35c9752508d09c36f243da599f0e850f3bea8f0cf5c43eaefa73bd9c6a075750b": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2278444534ff3156fd33c6448afc51ad512c0e71d378b0a623f2b9eb1b44430061c4f2bab9da7943fd286326a98b54a6c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033530", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf227989d9fbd857434a0a130161cf82b32b06e4c7fa18e7887887e5b7424e8e2131e2a244163d4a70829f311a571d57c2e": "0xaa18b3cf52cb27fd19d5b80fe7982ff955e0d5124dae26ac360056f401dad8460b446f6d696e6971756531", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf227b5d660cf77fbb3ead82ec363f68f9338833de858facacb267fefbade2fe127da59cb1d3653e5acdaf5aaa1c0bb6f25": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b356804554b31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf227d5512b6c4425cfde8b11f1fb419270c6379520320c2c68f6e75938afa22a71c7f3bdcd1308ba1e7795a2fa2d9b9066": "0x9a92ad7c6dcc51fec9f6d98f8316406ca42bd04dbb029d3ce454330a20fac0770231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2281b941957d5816af49eafa5806d300712c0e71c6323105cc5215aec99c36c3931fabbe7dc4a439329be146133235a36": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033637", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2281ddc7d5bf747f585a24d4c7fe7a0bdf6be65cc16c65708bb6a0e4b9958ffe23d1c56ee5683670a69dbbbb70c10d507": "0x6467fd4e7038b925c2422357380d8cc0c5f17d272f639af8fcfd1f1156de7040236b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22851fff2a13d1fa403c185f3d398a4d752acbe4b065282c5b36e7c1b552ccd1bae6039f9e2abc5fa4be566a8f5f10e45": "0x6610405d8ddaba4dcfca1fe4d14f83496de1055fe97efca594f2813a82900e40124e6f7a6f6d692053746174696f6e732032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22896f4c3aa70bf38c325627742de4508b497cbcd9414ec2922ff86acf2e22ad1b49aa07be1182a9490c47d3170e6861b": "0x8a56b1da8dc3f4bd58630c15f5754ee634528a007ab510c86a7e1fe6e62f4166065a656e6974", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22916751bacf7a1c689bf4bbd6ddf0371e396927763007571ab5c30a835b67c150993def51b98681dd7a69e87d7125cf7": "0x1994df5bf0f44342b1719bfbb1561286bd81b6d84f577f55ef45fe7ad6f50e4a00", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2293eece183f6ea017f64f2d32b7f3c45669bfe047c0962dc3ba330b1fb1a83c5cb5262c964fda49b61e9f98a8c759c4f": "0x629c17f4f4a24ec53f85a7beb1c70b13379fb8e4f969560704d2c25133ba8d2412416c7a796d6f6c6f676973742d74697073", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf229481b0ce752c3130d1f37b3d4fe62df3a620493bb740849dc2f946560976cc5f8fc004b038cd61859f5be0b2ae3643f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033735", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf229bfcde621156468aea93db41e872cf912c0e71c536b024440ad0fd64324c6eebdc0e497207ff42489ca8a2489f6e327": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033934", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22a2caa522dfc409937d4315e23476e3fa08ca28409640a6ce8108289d3a279cf6fc3f0657b60f3c41f89d04c0e5fbb2d": "0xcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec47712416c7068612043656e7461757269204262", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22a3b31e12f5823b68f1fee94bdcca383c83bf4af534e16af8aefbc56dcf58d3488c77601bb1abdebafc2fee50534af7f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033938", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22a691636b3a3cbef7b503826101e110490255910ad0897e5c6746e33cf138d8f38a6b46b685d06da2802f83917827c04": "0xb0ef511fbed15d88d75933d12bb50b56d1bbed109380b2fe0c7ec72d441191520232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22aa943c74840f4849588bfa41167504f0cbb4adb01af79c560636910430458ac44cf5fb9e24482279191e6ad8aa33148": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988832", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22aac3855e73925bf3eb8bfee2c26195e8d9511843f9df390385c97ef304025decc2d42cd7082db58f5b5e0523c58183e": "0x4eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d07444941424c4f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22b4c364d171cae9e79e93ae2d94d1e623ea2629ce3574dc7dda1f20721f7d7a1109dea19ee434885d768c5c9f671271d": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22b52e9d7ddc972bbe306b9a3332fb9d2c09b9c71f2c39942154cf7749268d6978f82a55ab68d6a412c628b2ced7f9d3e": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38077061796f7574", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22bab81ede6f82fa5c2d8b7bd197504de679d98218b5d055c770d3a2a406e2e56a97083100bec05cb83f530632dc8c313": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090e3131207c204368616f7344414f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22c0fea6262a5725940873b3385106acab4f8dd9a19e72f2ae65f989872a96ee2e239a9e135a868bddcb4dd278ef0f97a": "0x4eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d0b4d55524349454c41474f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22c1f0987ad658f71dc2e4ee60a1b701f38bc883d8fb7ae97eb3a7862cff1252172f4a901264c84b7feee0a900a64f77d": "0xa2da2913d7db19baf0a41dc40a73d75bc6001ce1691c3ded78e4e86387881b4c0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22c26bd89a02feec6d62288a29dfd9e0312c0e71d43df157fee32bea33e2335ca841ecf4689f61b53af12109a990e8b38": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22c57288c177f6043c1551509c78494fbea073956416e6c3fb74d4423f458a028c9674f147468dc0e2ca6d2c140bcdf4d": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22c6bd18357e634c3d6411538738a0f0378c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a7024": "0x78c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a702408636f756e63696c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22cab4c1eefc06f688a24c634694308eee6a1e58c3cb43cd4bc65bc251f9c7a1a3de5bc3f815a643d658c8c018158aa01": "0x5889dcc187231dbcba0bc0dad136d1ecb09633bc7cd5e27e04daa0277009ff2f033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22cccb10f9bfae617e9c42d761e0bb8ea4c9f8b6c9bbd518b19a4fe57cb38df839f9d893c577a9106579de22ab1ebbb36": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512323a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22ce1c9b86fa2ec5b4854f8f77041d3be98ab313fb0a6faf344c680e6afda715f41179d993ab86f25e481a6259c976343": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22d09503a21fe80f4242378babcd8ebe7fefa1659ff7e86a20f110974463d76eb0238f0e02f6b526df7d586b0657d52d8": "0x54faa9f0cc59a977e73147865791a9272cd4980db5ff2eee27096d34ff2fab6904303338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22d40d3242214a6dbdf33b455b4c4b7a9ce2e98564f421ca69a64608d68480080f5f317f4de4e400af3c065181e0c8a11": "0xce2e98564f421ca69a64608d68480080f5f317f4de4e400af3c065181e0c8a110932446f4b53373266", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22d4c45042aca35d80e31f4e40f1f8a5dc2e445df84e611e629ded39f69fb3ed7877398ad5ce82ae4028b1cbe997043cb": "0x625a907225b8ed830c16996d75cda73ef03750b535a6d83ca2ba1246be2dd4241e5b315d206269742e6c792f6265636f6d652d612d76616c696461746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22d75f9545b5c4b10fd50ca6508173793ca66d6f03e32d64a1a0b23baf1da3ee469d7d63c69ca26ccf3b47752d1171d02": "0xa26f9a811e752199217945e52bb96fb08229d7904bc030f6df73b5b4e6bbdb6e08436f6e74726f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22d846da596a776a6bd99ae5793e24c351015f23420ba4e90023e3df81d423db7fe2b2691657d45e98f02816e5a832b10": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22daedbfdc14657ae4482462d70f2935c300685aa838106c3737c9e6c6086481f3daedc1b1650b84cba9405389ade856c": "0x868cd54faea1a0e45836635b2bf658733436ec69c5567d651be592392cbb69dc0234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22dcde81a7dbcd9cd9afe0b401bd1f79274047a9abeb7a65811ffaf6ce18a99cb02e092d317eead7302b23e5b99ef3c14": "0x366c1d734b33c714b0e0e9f164426e66e3bfa97b917b23e5d3674f4a2074f86f0b434f4e54524f4c4c4552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22e84a4a945b3b1e334fffe4cf4b0bb91645903e6212a6142af81631297af316fdd60dfe4f02cfefe20d20153e7945720": "0xa26f9a811e752199217945e52bb96fb08229d7904bc030f6df73b5b4e6bbdb6e065374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22e9e656ec5a3792f36a6a7868aface0e1c6861821c1863896ec24a799c6ad302e7173b8674e399251bcc571e4977c729": "0x1eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef4843116e6f6465322d636f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22eb711fe51521dc536c3e8ae8fe4e841007f0252d2dda00e8007d8ba227234f9407f28a0584158c1a74b2e4401ba921e": "0xa6500e450888dd3758b301a0f99d433264362547ca7d0f7631ea53871aa3be350556414c31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22ee35136874b9ce15e28d8e9fe9528434b639041c549fb527faf54fd7e915d481955ae0bfb42842cfc3d63b5b98a0f31": "0x62f21f6587843801d599ed5855ae0ebdd2a84c822919e80cd6f12899e50887720258", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22ee8b7ed0b4a8d7af6b8a1dab4d4be4a3c53243e05c79ffbbc910d8df74e4d1ae0197db16b7f00662e2aac74c8ceb302": "0x8c4c81f382ae2c201eed4b0b519f352aa9c0c8593122418b30ac9760844de2fa0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22eee8ffb69a3b9806ddbd458373569a65cb36ec4414da2e8f8e6be74901ceaeb189e4bae84245b00640f96ea36814501": "0x38f45bd8f6341dac4486eedaf00f2357cd19b8d4b8f0271c7340d56fe02bca72033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22f34922e2a2922da4afeaadc44ba7499389af7a171ff4ef270fc5c602f1570ae7b818fbcd797ae42b5ac9f14454c5b4e": "0x8429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee210d5a4b56616c696461746f7233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22f46dde8630c188f0d344bb26d0798e012c0e71ca519959bc745598c859160abc7bdaac3949ca44ad9712c4a35e80c3e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22f4aca9679cdcab872802ffaf70676fc7b9a284d4e600ad4d23bcc2a12a3e52130d96586145ad8246bb3db4a7cb2e0f0": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22f6c74d69b0ae9e4be1134e0d1034f2f6418bc819ab0a29b18e03aaf851463e3718bdb8649f5b864ce9654febf64c950": "0xa02f7333e25590e4f568ae8a2ddc93a879e92e48fa3cf1666ac56e020c106d5505506f6f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22fa7654c4aa6230e58f65b5b66a6d4245e5167d2749eb21e8d257aca0e738ebdf309e9e0ef503e1184463de7db3d0b28": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988838", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf22ff897306f626450a6a589a03993a3d8403c772cc5a0320a23db863c40b5780a9390665df1e3b4255f32df1a0afc396e": "0x3a154cb2e55ed80b9b671b240ccf20a8e2a47a7097a61f156eaebdc98fe4780a033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23011684e56d54a238826b5a928963ffaa057612349296f2777068dd47c499f36c5caa498c22b48f26c09b9498ade826f": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf230117acc9de61be2ed1700dd8e07a10e9ef20ea6b98e87f656d7f23e0b2a310f45d6a6550a211e7df67540cd8b9c4b4a": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23055ef7f3959318572f2c72f84a7c5df8eabb61420c17a6e92eb2ca99f0e2cca15015784552ae332bf2105a592b80dc6": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083136f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2306ae36b436b332f36093f5a288c59659a73a50c79a8b6552ac4628486f70e2efdc87020ce5460f6c7c5153429a61f58": "0x56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b11504474f56", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23078e3402bea8a74fcad86d904ad4337206c097fd6569064a918b1fe42c9a302ee3762daa035b0c44eb771d6c34d1d08": "0xaa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d0e48797065727370686572652d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf230b0a6a605cff253ff46e0b65f43a29dfe41a0fab97ce06654fe9813a999a9d6dfb51bc7ab1f35dbbb27bbb3eac4c164": "0xeebbde3ff2bb37ca11414154e92c0521ac8051ea48d0d84b39714b2347763648033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf230f6e5348ce7d0c052619c0f815d14e9aacf425049b018fb55d17640939a6f651697b153bbc59a060a7f2ce4b4c5610e": "0x7ce2421f6b3c80a00c8fa9476eddad55f7bb9cc2f54ad916b4969c103b5fd438033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23101377354ef463b6d4257bf9070e62266f3189c8351e824c55ea40817590b776431599273c4bd4c853b255e8cfb1b10": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b345d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2310a359dba414c4ad563710c41387ec112c0e71cab33ca9929a6406d6634c55c8d28c63c99b18fb6a2c1eca3037b144a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033738", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2317d821afe57e9ed52fd1977812baa6dcab8f3ac8a49d03d47e037a2f63bcb5f38a180115c70db29ee4f379e2e04c335": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23180ec9c6e76f1efad95ab3371c1287b0036d9a09a0a63e987a6c67a59b52f9eedf6215852cdb4fd034ec99475a17f1e": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf231b722186de98b1feeda0be9e4f1c17b6804069db501a5d23ad862cb312892bdb603740707c1948b797d4d30dcd76d1b": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033937", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2326acd80f3ad3abea8dd2ad7fbfb7797f2453d14482695f0ec5b7ec434dcddaaf83e09e570e22c293906edad0ef967c7": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2327a1f18eec3576a5b0e4670c37e3d6415647f856e3beac82df2fd67403a0fbd18fa79f584646112d15d61a064a681c5": "0xbcb916e7a7ef77dd1f610ed27ec519b4ec226028eb8edade41f95b217f89f6200744656e616c69", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf232ade47d0b89a6e7f0ae456172a9d04ce8ce09ecba19cbfda0c26fd052cc50a5365b22ced871d32fb6a2eb1853d2bb7e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033832", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf232c8c774a969e47bbd831e4ac133f990acf39cf23dd3530b4078b43141f0a0ce5c19549909b0ce4bc163984e045d9b65": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23334f94241fe9fb24eaa8c30bded18705611f54264f980f8d850f4fd87ab8eb7e6c86b99b396f50d1aed3c5cafcdfd88": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f37", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2333e579bf94f3417638ea707ddbd3a44e79c699eb894e1a203b2c6deeaad557fd51fa352841d2d178d3bf78aa0bb1172": "0x36b5dcb29928d8a462f493e0250e895158fc4fc54eb5d00a2a6701fe36a4283d0d5069636f6e62656c6c6f2031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2334f674ad4718de3cfdc31e0294ffcd5ea17387e7283543fb633e2a9e0f68d39e172cd5624c7095e6d81ad3468f35b70": "0x828618dad92559461b479508086bc781d88434e5372229cf66ffc887672e9b3404463153", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf233541aaf3b0b46163c153eea9269153b027d4770a8fb3ee70bb1d12b64f93c794dae984ed5e991267c7e776c77470f5a": "0xdce117ad72d855b586a1c7ab1e2e1400b00418037000a81a26d131eff8486b770231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2335dce23fcb736c7d343245e1d97abc904f231f52cd2a234dd3a72a7c920ea6e10a7f85abede1a9b4062428bc303ad7d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033436", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23365a7a90454eb5b2181b283cbe5afbaac2fb3fedf57f058e0c786f94c46f57eb68ad57982f0b96f56d5d438119ebf37": "0xeceb07c477bd40d22f83b08cce78f2375bc1e4cf188c0de1ffef592570383e590232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2337cfd982a6aeabbc224f3da01500866e81c8e2c7bc6a6b6de522487e8829344e992a3440f957a52c86d93038b9b3dc8": "0x3e3622fb285dddefdf8f9ac2ab59aa34e2abb5a316e9ebdc020317220e75f879033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23409b9d4359b7dfb24d65a40f241da551415a9d9719c249bdeecbb9b746639f743e2f238ef5a2b227ce206eb93724a6f": "0x5a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2348d794b1b37ec54981cce9b89d308fc12c0e71c55443e88a1777244fd0816a9f44562ca36e5b9d95d45f3d79a1cb560": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033932", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234a57029046d165a045e3e0173bbf4d512c0e71d2b06750f95b1dc2ccf25272d0e77de2fa9efb9499be95ef938d6d766": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033531", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234b9ba15342be66c3c34fe0ec01d7333023fe56458783b5ac1d399ab49e8ecfe911d282cf645ecc8b4d9803a130f685f": "0xd88a4b558274e57737ffd3fc9741848596199a29d77fe511804d20810cb7605000", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234d09a76db87bebbfeaec04cd28c9bdb12c0e71cb214fffe90a9fd96c396cd776ae64fe664bd26e6072e7328b1df5756": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033938", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234db77d5e2b41fa43ab18b6c949f624eee69e45394d3fea77645868ce1992caf33fb25200b4ae2b41d1306a46dd5f720": "0x26842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b14810416c69616e7a615f48697370616e61", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234e0b7a0e3a3903166e63810a9d2a71cee9862cf3f7401d7c82461127102626135ac670ea079780708e1ad2c537d9c2b": "0x02098b5f718885f0d6f0f18359a7d16b44c9229857934efe66daf4d9f0eb7a43033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234f4bb0d555326ab304d10f0e745dffd8c7afec700f1f0c83226176063f349c34c3b100f192e4bc106c3305c1c5e4c38": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073033f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf234f4d45fd1eca356f7713bafcba053589f3218e31dad244bf47477de316c3f46a721149ce003f4514eedc2042b854e66": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083139f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23557c6d2ce145dbe718e6e91f686834a5ed6723c4d9632bd0c61bf182c0904ae64fe1dde3f5f1ffc532d41fa14e28405": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf235cdbe003217d4cdb9e41b7122a7b63c1d3635e81c3048b1b2459aefff519b68d0100710ff64578709ca3da808412054": "0xbe1c7627fbc96a38d3a3cf746ae545f60e2510ed80961537d9b4924421fbb56204303034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf235e88ba6a5b07ce8a43b3b5d55da335cc6df02cd907ad64313666799a84023c8e8025e7f9f5483a05823a732de3dbd3e": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf235eb66f50ad20fcb207b7adce083d729c89604d1a2388771784ef80c5577fad1e75bb2362d5d578a94e8dfb3d982e938": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033730", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf236058ea1f2c5cadae73f75ddb39fc6cc9e23e3588757c7744916bc6b65d9562fd12f807da8bfa23ca354ad5b40bece4f": "0xea524b9e0dd9bd336d31e71bc1a172388b10d4b6571ace5e7e6e8364831102160231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2361c4486fa7b6b3d0aa538738cb50d3a527638f35f3b999cb645e1e70a49e7b798a89c36b289bd366056d39115c18ae4": "0x2a5bd5797da40fe8be1b94dd3260ef86d6b01cfc891c5c1cd160ad7fa198de57066b736d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23621938acaf24de980da0e9c3da0446b2c527cb7d17e0fe6df0e0da303a71f3eb46ea5bd309858389666ce6dad8efe15": "0xacab23f327e732756f5d76a43cd32830d5d8a9a489cd9c5c6a8554a3374da0561cf09fa6bff09fa4962057686974654e6f646520f09fa496f09fa6bf", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2367cf7925f6f916680a737f9a92b8452049590cf81393b2630cb72573fff37feee32bc143021d79faf80abf0356d5450": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b32315d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23698eaa4401c9aae8e9fa5d181e66f6c3c0579545b855f0070c2ca5c79342e333fe698081f709b7da3c9117b0b6b3e66": "0x56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b1150d494e4449474f205448524545", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf236d6172bf7cbe1ddf739ca148d279129be86d32d322797f67dd5d386d29d8285cb32504a767956fc58ed8f04ff703c4a": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090574756779", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf236f31208a33c3240383aa8dc08cbdcffb06c021615bf00ced6ccd77c0bc8c820a71e819bfc48dff36ffb12d7ba044338": "0x74c76b2bb6e2e4b16fec1849aefadeae913aed26e72e2101a4dc34abb3e4077604676f76", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2370090c69e14b2750bc45822b5040c3fe85558af1d02241a456725d7ae7370cd1a5299713a970a312c99d9b14d90debc": "0x7ec5e89c029a05224b2759566042a94c54966d125934a8ff8beb8e0b017cbd67095472696173736963", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23712d1f525df891e11270a6023f81e645263f205d321ac0063c4275a7daec9c6b5a34b3f0cb835ca2f4fb22bd9e55e5d": "0xa8a99a7f49f1d3d72656674fea67bc18454325f00c9a5921ec6010c43409d43e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23786e839ef62a0a379d944c73fbb9273a471c7aa909cc665212bb36003c52c5d3eeec39f96556a8242e861c5dd7dde41": "0x5ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43035635", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf237bcea3b60ff6afe7745cfc235b10c39227d3663b23d3565e9f07343f2218b47f60b3221f8bc32692ac60a22c7fb936e": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf237f13f1af7ea279c40b76b426c29d2e112c0e71cb1a9c147998723d2dc7ef44affbf359be54830a570a5840e2734c47c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033437", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23815b690fb1e6c01eefa6eda95f10e6f6a92b1cb54e218fd9815b34f7a3a35ed39165a29edae89c7086040b59d074c72": "0x1eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef4843066e6f646531", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf238186145093d353002ed83a10cc0283d0a88006a747b712bbac65dc015105c9cb6d29ba60dde6762a881975c6b1b1a02": "0x56aa4370ee3d21b98ec19f0cbf2106a036215937a15bbe517b24ae5fef4d38700f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23844247ae95268c32e9dd2d7b8b7d9a532e223d306f0e5bb9a9d6dcc9023ef06edc7717db691cd8c5d85d33b3a1fb136": "0x36e132f4b16bd325ddb6a3c63562f23c18dfd20bb2c785d391f625f481097c1f033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf238741c2654cb50f9a002f53a367ae7f06eaa97150a12560dfe00d1cb77f161ab7c29b6243193186f2d02e933c4c4067c": "0x78c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a7024036b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf238931c8176066b77f9aed90f86b97084eb14462cbcddfd07593831e6ebb7c4a2e5f0acf8c052f6d76aa550113bb72b68": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073032f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23898592d9731c762b9acac9d21e88f7af45cc1889ea605f6e375289fdb22c1acf7e99fc60cca3ba5cad46a21661a7720": "0xe683743954d0cb555a54ab21cfb8161f74e689a051d1ac1dbbb94df70be3d81e034b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf238bc4b013bc95d20f02635b88b7009fc204c52b467988d585dd9cb7cebc94d6e56d8b89042ee692b5739f7d78c39a554": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf238dbbaa13c7969b4a463dc1b8a0ad7146a3770dc90105517476a48c8280337f2c1e39dba204c254f7bb51c8d4ebb435a": "0xaaa635f88e75ad58af28925d0c21a804d87a449469e45970c3a52f57aba7b366033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf238e589a4f59e457afcd8bc58a8e109c25c97521b3cb9261f89f6b05b6ad17e9d148ba5f2cc03daabbfff35e0bc2e3f0f": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf239385193aa9c5a517717763b381e47a2fdce688a422833948306f4aabf043af4be9fb2be40fc763787f30233b2510573": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf239e3ced1badb912f71c02885076ac7979810e91f40b4c50ff66c7d228a9e4109e677c406cd6d2417bfb11f0899345e00": "0xd6030dd61ad78ca1900865d2b53dd163bbbb5b40c82f94d25cb6ecc750a93c25065061796572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf239e7b84c16f204b681bb1bdf953ca0da0e8b9d19878dc5c50ed1ab180f4e76cf7e208851fc6a869b28dbc1ce6208dc0e": "0xa49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e0e4b534d2056414c322043544c52", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23a4fe5f633342995c5aa4f049d03a9a6982f4a55b705be63aaa88e069f4f93a955cc2e1c7dab295388d4a739ef6cb34b": "0x60b791f8467410a5ce2e880cc222933ad50705664917bc9d190a52596b9871211246494c494752414e2d5354414b494e4732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23a7f65fb5510634d37492a50975e87b00e794356479178e2d043755c671a3db6b1882700744cc0f570a84fd33e257e26": "0x6883b9f834076b9c1368e7692ec0a01ae97a52c5cdca957b5d31103423cfbe45044b5632", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23add3f6b98a0545125042fb29e39d33968ef8bec8b0e59e7c456392b9f560a48c0abc26faeb75715b1ec4a804f469f10": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23b04c507ea436bb9a9c93d64e7af6eab55e8dea9080f49b00804005fa39712a313dc6bc21c3de49f172b3f46e9f586e4": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083038f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23b3a63572e436f0ecee136c0fa58a4f1809275c61d0a44ede0bb18a54adf2b684d44d1759e516e46634aad562fff1c2f": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23b418ebcd97f2d989e574d67b34c17ae8aae19fba03bdb71cf735646aba2d56fa5b4b83aad3d96804d70e9559ed8071e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033835", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23b9d8487e1e99c39710593982ada7fc3caad545c5c3d4c99b7866e2bcf2483dd7cc7cf578886586663aa25a96bc64205": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23bbe3877e9759bc837101da925889396c34542e51274a1c23c1293574ed5da6a1c28d092ae4362cec0eca403c02244d0": "0x9ee1fa0d8d4e022ed5680b5925d19718a7ecc9f8f2ff77de54f0822978d2775507536861737461", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23bd0e40608da57a96544da6b957241613051ea9c01a7134f6a3223ea95a09c4dfe0bde5b0eb9ff7169fdb85d7a9bbd73": "0xf01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e0423600c534158454d424552472033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23bd344c9ebf5e59eedf1843847c871d3894b90350435a6f04536b6a1c0f50e83344ac230902f07fd5e69953e8824d63f": "0xe2b3d30136a5bf1ad99ed78efc1c0cfdc6a2c65d3e30d86b3303f3533e155032033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23bd81eff8cbbab65308778f5254bf30df836649df542b24a1b63d80916ee743d4734640aa796648649685dbdd430c362": "0xa02f7333e25590e4f568ae8a2ddc93a879e92e48fa3cf1666ac56e020c106d5504435331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c31353e3949df4431d58a36717edf39c4ceb4225a9a168528d1264733d5b6bb5176c0eb31bb4ca3c962be4cdcbacf71": "0xae0ce04d8021516cbf0a10c00c4e721319c1e91c729402b232942f9e2c1523200953544156522e3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c42ea17d7eda48361e37ed8dc6ba82888508e0d4bb18e50ed1435a4260541b1c53ed009a64801727c195d1f81c08fda": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c4cda34fbf68b7405466cdd8a800b49c48166c755e708cb83a61db9dc635e91cb496e2659e07fde8aeb09130802010e": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090a6e7034322d726f6f74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c6bfd44c6719b63b3f647bfffb348161ff9f838183843605f88f6b88971f887fd069e00f4a2894ce4249a8a70199a05": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c950a22bbbf9f095356cc70ad523f2bd448d47466cd9abc75c90e52f3aae5d03e772ca2f13db8516aad2ec15d341d2e": "0xf4492a28ead0b315fc68069bcc39470c409d12b4e48259384d63da411bad0129033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c994e4d167380e1e4c0bc4c67a284c7ceda44cb74eae64cceb6393fea849c84b6e7c0c00278b6339b14f882fabae15f": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b395d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23c9ef9777fa738330ccf4d6d7937dce0345e9fdb6c477d50a5c7be50ff581405ec6c151ed4ca2c25cf21a510e6bc7e6b": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23cb413cd5bf22ff85f90fa1fcad2e322cc6bce54889ca98332b8d289e4ab347234a96a1d5389bd183d7f991791a79f0a": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ce56b1ab8734c5968aceaf9245ee3bb426cf52dc5549d7f8fee37c20ba68afd3443973a05bf692185cb913fac808873": "0x2cf0838b05fb182718de859525fa1e6d53d557e5fcf631ee9ff44c619810d43b0c476f762050726f78792031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23d940ea66d0242ab8d2981970f3b3c26b18c6f19f15297b4a80fb9f6f29a37e06bc31c723be672d54b45ed42feba74c0": "0xc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d60744617277696e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23de0201a5c3de13ca3540b4aa7802dd139083183c6b196c695c642c6e521ecf55a337cc2bd5df2df8fc6d6c0c7d49c7e": "0x845498df40e85e2ba9d9e213d1f476e7b147aab6a9098f1bb250e00251ef8f5c0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23e2605e31335e2ca4270fe35a899521490f218ede5ef0e08fcde53a9913c8c01d7cc28d31d21d89071b6a8d9262d8376": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805407f09f98883131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23e75fc80d0f17eeb8214e932c319f810dc0ac1271ef05bf490a482a38512b68548cc3c244285635c32ed242b33d79dd2": "0xc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d6084861776b696e67", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ea273d4a190071d6fdb797818ffd8f806bd7c7a1535c6be092a798d558a5757ce89567f7cd939fe203163a8c4264e6a": "0x6ee5ad3ea0da40510f11f42c3281fd543f5a6bfad54ebef7381a7320bb509a0d0247", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ebba5b303f76f66c0b5a99aa006a1439ef2c74b5a6820a16eb04205a9d177c4244a94cdcfe1275039ef8704480a3905": "0x9ef2c74b5a6820a16eb04205a9d177c4244a94cdcfe1275039ef8704480a39050863796265724732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ee00faf9f453ad7378336788066e8aa00247daf7503a9b41fb6c52c11c760f769266b44fa97bfeea3e0c68f0e3db04f": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e510550555a5a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ee0f7de312bddf6b51e8beff38791058ab2f02be4ea327d42477029cd7e8ca99a1b1ec34a9502cbf42c1701cdeee774": "0xa2da2913d7db19baf0a41dc40a73d75bc6001ce1691c3ded78e4e86387881b4c0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ef44fc31bdb69e29b9d2a4ceab48c96b5adad0de4385f3ad6516e39fd6479b85c22886cb0cb9fd91ce52919fec98bbe": "0xa763de880dfe6c4bbdad18fab60e27002f648c221df5248b7d44a575b4bc734200", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f0cbef457ce226c833eb460b5f12fca75a6c848edd2d131588ed2fb322ef45909d4aed3b7ea1197fce14220a68fcfe3": "0xc43aabf384c6baf54ef9712a96be7c46533b538c05d4e6c687fe09b109664b28032d4f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f21975e0edf8d8beb4ac44015a4d67810002bfd652b0ab50a36adb9bc74163a4385c6b4ad8d3cbef794c07716ee0d6c": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f23cebf0963a38a5c625ab1db9c035cfc44a7371ac4b798826aa05df8fd3cd5aa1b62f4a1a7cb9c95b7e83e99633a3e": "0x625a907225b8ed830c16996d75cda73ef03750b535a6d83ca2ba1246be2dd42416f09fa496206269742e6c792f7061796f7574626f74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f36d3a747da18414e4ef43993219d4cf40703cb81f0aeb2691f6069bbb67a5a84b30d392b6c5906100b5a6cc57a781c": "0x5e97f331813198763da88ad2b1f5deb3f42373a93e8895c43de399aa6255da47054b413032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f52876896e0a20445e445dbc940af4fe62bc1402d84b145bae2ce9ac2e50f7f613b7a986734a896af65be8f51244c4e": "0x3a81aea610fd2332295967d1c7846599774a112f2d6cf7e3ebe92392b7b177790ee38182e38184e38186f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f5490f034ae5dba86ba90274da5454712c0e71c4fcce3bde2baa598b4b4b15e3674286d0dc2c03441be1bd48408d92a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23f85806e0e25965e177bbdd90fefbb705a37c441df3f0fed7ddef5581ff70437b00fb071e0b09537caca8adc4354913e": "0x5a37c441df3f0fed7ddef5581ff70437b00fb071e0b09537caca8adc4354913e094e696b6f76657261", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23fcfdc11ec0294abb86dd5aef563da3eeaf1654d9143d99dc782d03b496b3801e06a4c6405ae954f40b7e7475f9ddcb4": "0x1c6681030fd4860fcfc1dfad9ae55fc0181229b007b6365dc4c8f5fbe162554c033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ff37d7df58f34e416370d6f61c5cadb54bcf53ff5d97b41b38a3a5ccda86b3a3b1d7090a20747e2bdfb2cc46a38d514": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033733", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ff6ef5180de4d2caa0e1267bbd89cda12c0e71c7daf0347415ea3623b1441a1f89b5115bfe82a57a132f72d186a2469": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033930", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23ff8c3f77cb008c342242cf0f5b7a81c0c2fb774bdca7e1b4627e9af2a9a66a0b67e7164af0fa26f20781e4b5fa2dc42": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523435", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2400d52bc4847da2f15ebb92c161aff8f78283798169eabf7cd6924745cb60df616354b36e53549fd8dd71e815386f525": "0x78283798169eabf7cd6924745cb60df616354b36e53549fd8dd71e815386f5250d45524e2056454e5455524553", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2405808113ad68224168753ff4cf07d3e086f2422947fdbebd39a68f8708064bd5d9caab70d1d6a51abff895db91f5655": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2406cb41ed80a5299e6f17281fed8e084e2612e76480388dcc8dfc46219130946f276496403ecbdd37a6d1a14c35701aa": "0xc8d887817cd801c256ae0adad712737a18a89e23eb061b7002839d16530fa0d8095472656173757279", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24171da74e75ab4be68a2140459a359b6d0accc7028daefa6de2f047e4650d3ad13d5e25bb0bf2fae4eb8ff8e21674919": "0x3674aa73951219dbd27b3e3fc5847b806c68c1de38fd4f22f9493a461c80e9030f535550455220574f5720f09f92a5", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf241aaa00e0d099b674905d2fa0df29232b53bdc896b61a0c3facca04307105b99e44841190d41b655c127dce9447ce2d4": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a0747414c415441", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf241d1714dce242e34ed024d261bb002c94e8c56b618a0c3750e9f005d58590bbd6b088c326a1fdb075294a8565b4192e8": "0x83c75b56557a84fe8261cadc0c308577b0709cdc54311afc5ec8d348b939f58906546f646f73", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf241d616e843f204ac501ad5ed7c39b27caa672cf29483bc35d2991a17f143213bba4fdf81050113c483cd205f68903236": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033834", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24216e006c2ffda91e61000d30dcd90a6e1cbdb5c7c39209793cf71d71ccd0a5eec8ee530069837073032da3ec4a5a714": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf242499cdd4b0b387526e607e2c992123950d1a6eb9d16f107a16aedb586c8d08259b212a3c54563f183dae7e1964d931e": "0x8e06bfc989509d6d625c085209adb405867bdbe4f167ded7e61ec126c683165d10416c7a796d6f6c6f676973742d3030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2424f2a95714746e854f8c59ad6890acbccc49a4cbcaec6b03737d84c907628a2cc104cc75ad817ad38292e5bb76c527e": "0xf4d95d4c5c0131969148d3a16b3d95ab3d051771d971a1955d7e745b0a3a4f1600", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2427bea476838de38dc1fbd13fe407ff51bb5e480e154b39b0e8e272ba015da6daf3f9f634fd357cd5f8611b29b7d4e51": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f063157696e65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf242a32fa84d9d0a0ceed103e07e2094fc62a791daef6863829ce7969886db050a38050dd52ed6c1a685cf7897e67f165e": "0x6a325e3630266fda0ef7f7725ef8199726e29d569d609f3cf068c4db7e82591a0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf242bd09558096b3bc5a5d0b4375cdbea7304e4137516cc6a906f03158933c2430744e602d6549dfcbf5a0d767358ae419": "0x62a79f3b924342c4f634d8ebdf77f50ac051d41387a72d22f2f38155762c125f00", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf242d5132ec9ea541df0aa87ba39094af7645c0ded9084b8186ef4aa2d83ee1c5ab326757267c41c05444e15c657438424": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033433", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2434d1f1050ebdd3f71c9cf66caf7d10112c0e71c74bc9329f210cf3871cb0df4e3139420f8cd1260ed214f6e310d5969": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033733", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2435ed3017503d4c9faa796b59ef2fc8f322e857c9fc42bcd84f6f4e2d1f7f892baef31f1da5731d22796cfc40e4fdd5d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24369670bd3c4a2bd4a51e70cf242e900d84e08c6dda9a41fd1d44b01b65c7787b48723679a1d0c83d1d9a54798ccf01e": "0x7a8b217ad8d80016336be124846210559ebf720aecd25ea0d0d11c10f1839e7105f09fa7a1", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf243b41e55c99a7dbd2733640313257ffec82d85d99021f559a9a4f5387fca2bee170d488b97e00766b5ad19617c52c17e": "0xbcb916e7a7ef77dd1f610ed27ec519b4ec226028eb8edade41f95b217f89f6200845766572657374", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf243ca307dd8b0fb706dac460ef965f751ecfd5be6a880094d44062af80777e61f10e15d6a8910cf7222bb10dcff874eca": "0xceeccdb6802df2253998f9d4f928b120d51110d1d2afd969b95232bc167687020e626162792d6b6f6b656e616b69", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf243edf09e07e0b49da67583ea78c544158e2499f22749aef04333796fe92b73c06cf4e358a552604ff3e550725774f924": "0x3d6d2d20735ec00c7753d3e6071ad1e2280288a98d7d89c2a2b7fe08bf6d05bd07576f75746572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2441059018251d8f7bac08ff27f40ba5bd7a7116db2d1bd9dd4c7b37c204dc775888f9310a1a18877ee913901bc95281d": "0xc8d887817cd801c256ae0adad712737a18a89e23eb061b7002839d16530fa0d80c536574746c656d656e7473", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24452eac7d15a4caa1515fdcab047ca67b0820d7db40e2a9fe96c7ef2e810cc51a7da195bc995f329ffde72fae04e7b3e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033539", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2445eb2c87a3389c40f9db79631e28362a08c23158a93a3aa7de94d3ced1c9e1b4ed1efbb1e29dab0363b1c8ca4904e06": "0x5c3739d60301126756a7510e34f9d656d4435cd4fe64bbd001f1f3473bc9c33304563031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2448cf37c141500505ea658232325c94412c0e71cf41a90f7205b9034bdc9380a95bc18669cd5b4d6b9452f73d468e74c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24490823f910054ad342b544618de7e4d545e8064f8898a29d4811e09b207cf3302e5cefef16615f8580fcd8fa63a624e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf244e69355112f106a0108abd7c2b1039c83b401968c58e31e421f96e07dd85ce91d985abbccc84bcea5e8f098d97fab56": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2456e2d8e634a3783313096a13937da4012c0e71cdeadb03446fd3519d1dcd4f690e40df4ab0d193b476a94a0b6588c28": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033436", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2457b91c185c520b91b93d213b77b021d12c0e71cac0a27a2fd30bc24907dfcf124197d52af6e9c9506f5bae59bf08879": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24602e5792f844968dd883366d34e6f36c6645597fb2f300ac88b96e8283b06d99319905bc509151e03dc83748708197e": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2462c8d5d6a95e7b844524b1286805b3af20ddf4f2db1f9f800d70ce19dee3812a5d72bc275f413de1ee186ea7473bd18": "0x7042479798003022a5753c8547cb0de8ef25e2471e40889ff3909fe714e24c5d033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24636227993340534dec219349d721d3486d678feab565ecb54f78dcca7036db237002aa86783283b8721de7611d7fab2": "0x2ca8e96b721f074e95a3f7d994c370dab688fc85134de7e2e7d4589d0a306c51033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2465c05d754aee83ce22fc6daf8fb9f3ff7034438a748412760539f824f38f3f9ecbf77ced8716de97c5ade5d2444c8c3": "0x66fae573cabe4172bdfc60dfd00dff703a4323854715c151f868293db828190c0f4a61636b20456e74726f70792032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf246644d0b047de0c1a671d2da7c3e2afbc6a8eba5ee9f02ca31a31bf5de2dd406adc9c55df94001f6efa28370b154544d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf246c867310f374b9379468cf750904427d07218db071b0b88f5979d57b52ad2b7706856f7be0021d30df75fc9ecfd2f64": "0x9cb0d4ddd32f9332dac7059de238b8e489afb55502d1756d7f50b78b58e20c700232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf246e6648c0eef3ebc76337a2a651e7f66faeef086f38d55942fa48bacc018724b488f46ecfc2828d879c7b780c8f57b0e": "0xc07040b1be7aedb10ffc0f136b7e147e4a1ad56944c1c76d6c2f6ca089cf316b033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf246f2c5f574f732e90118cec8ce8ab2c86a7db4fd5d907242e97c2db57fa12f1eff6a103556f8e99f916483ac6674c372": "0x3073c378b0833da59cda1d49d711f37c9ae20ed30dc3dbb842ead63dde5783310f464f524b4c4553534e4154494f4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2472d945308c6256e7a670fee7543b716fca8ea3766270fe9df1ba7a4a7298a908878ed61581b9769100fbdd4164b0060": "0xa845ea35913a0fbdec49687ebc5b1579bb632c080ce61b02919ba40bcf8892760233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24748b70df7ee0fcde2805f260815158e6ca5cd252f0f61e8a9c5eb72ad6d9452fcc1de451f7bcffe04cee9ce73c8ff0f": "0xd453b6e497b6a89979fb34eea715720d37c2381c8c51458be04296fd059dcc3a033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf247bbf49bc47c17666baa2a0f4bcca5b38ff2fd995727bb6c776dce0c1e127955c1f191db6aff56c434a6738fc83d4eb8": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf247d268a008a09e7c814a5aefc77010b5c83b05f03d7e0511d29dca7a11f3631f6a0bf373ee6f96bf99882421dd261a4b": "0xeed08a5b10b1835610d66ce4fa273c8e2436b978c9f65442efb6074871b48a6a0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf247df7ffd2ae80267570cf3ff6085dd3326e1393aaa4e42b5d40f234eeeff068825d5cc50a3802e8e2e488694527b5e7c": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2480f693230d05ce7c07079ea1a1a47d0d2ec0a695435c6324bfc9b27dff217e5092e2972b0123529514006e278914c7c": "0xba0518b2408a0883ce26ff4ea90f8639ac05332bf82260fc45033d7b5baa0a200231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2485cb150126059a2b59f09fa05f9f39c5059875dcee1d4a9908203728cea5bc20ef93a366beac56fa161e04feca03443": "0x1eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef48430c7374616b652d7374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf248676b154b078b376f7179f8d45df23212c0e71c47eb3e0eca577bc8ce7ec63eb978b1e36e73daea0449935e5496850c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2487a39066ca8313f9fc0adfa2e66c257d4c6173852da2969c43006a3806502c5f6bc23e1f3e8d5507baff2b5e2f1774e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2487c1ea83596ff698ee5c267bfdf1f2c8c6211892518630b6e583e09dd395211035a508358a80322614f9894bdceb605": "0x88b9f3a722747e8f637b2583963ea7f1215adc8c75c3957554fdf92fcbfa50340853717561726564", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2487ed75c2026a1bcfada6827c95c445442e37b2268e7e97d6345f7611dba1f4f58baa27382b87cf536ebdaa23c3b811f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033931", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf248b792e5d55ceda46fa27d90bf02ebd3dd2404caa71709d521271bcd64cb771df96abc1454c1bc2db5be8fd84f9f317d": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf248e0f76cea4a67bdec390bbdd0fec4dbe4dc1df8790688cc413fea804c4158d1142db0312e091578306e1ec9fcd6bb77": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2492e02ccc834cd02f4f10c1af60f8b706cbed2071a6b6848b4d170409de00af2da5ce2245166c9a5c32ae79fcf44876f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf249abac528a6bdd59d4bbb34a70ab50f21a2b2effb22453209445e66e170f7beeffb3b66c900fa8fd49cbe9efe9eb4942": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c0bf09fa68820534841524b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf249bff4cb902465a1f5ba7fa253223c4bf25f7a8dd6b648eac453d60b0052dee3cefce2ff56830eb7cc98292c8885f958": "0x9085297d964ea873a23b63151b4c82189c1314c31fda6f2d71f83133d0877c5c054b534d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf249d19d0b0439f08373f9bf84936e2057e57259886f2db2014f3bcf26e8baa581816f49c13e010bff9f52d5d9ea3ae68a": "0xd3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a2340644656c7461", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24a0dbb67dc3d6cc94f0995925c189848cc4790e6ee2ebf4271fffa10d4bcc2a4460ab377a49ddbedfbb647090c6a97aa": "0x76016fc20a6457ff8953bf29686c5698c28bbfa860669ddd07b386c910f1107d035631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24a30e50780aa2b2389a6fb3266118da5f67795750255b9f9c19a23a72960b240276a404d3c5fcb4fde2cf5759e88f704": "0x74422321a842adfae9419ecd3983c4fa2da6e879ccc1db031e54c742bbb9bc030231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24a943623aaca68cff5f3c9cc784bd3ee22b6c1ab9ef945b7279a730423cf50ca4e25feeefd4953abdc0fc8caa403f70e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24ae3d3d666ae697ff8678369655c590dc94a444165f95b45857e4bf1c4b0f784eb2e6f16054a87dce443de41c6d09c1c": "0x08b3b1930f36bf7fa336c7abc044e75fea45cf1c903081e7e0bfbd664a80093a0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24aeb0d2ce707eab19d2c51b7e33da6486d6f646c70792f6e6f706c730163000000000000000000000000000000000000": "0xd6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d05f09f909c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24b1c57136faa1b6758e7628008d14b7e5c8bb12c78741c7b0ff4659360c78bf5da3af34e842a60f58e53045ccb070302": "0x5e97f331813198763da88ad2b1f5deb3f42373a93e8895c43de399aa6255da47054b413033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24b2797725c20d711c01159e65adc42f44ed4af096401134ae34367a42cf8bb5da1d3c878fe08b512baf5e9a4f7e9bf43": "0x6069548e7913a106991a40988bd63d25996d6788f9302ef0a86ec40b4e6bd36f0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24b4fafaf3feb5179324fe3643c74cdc354e0103cb355b3f6f357104c4cea54675909f687aa106a4e47d741dfde35e376": "0xcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec47711416c7068612043656e74617572692041", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24b90b65f45d20d5fad5463d00f0112ec0f6987ec94f7c186a7c76fd7792be048d9e73494daaf0f86245f2f68cef20b2a": "0x2e69ac91dc2b3e54afd2d74736e7dfd95faa1e738dab066c80328980c7c9076e0d426c61646552756e6e657232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24c0b163e0fc8f18feb22619d1b45a5ede45d4839be5ec40b585c1f08ac284e656075327d7038aaf795d35789ab10f15a": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24c38722755eaa48ddee7115903105c0f30cca6318e5c3cea1c72f33f541532ab6609b50853627fcd587bd5883d52f75c": "0x7213534fb02c7638d8d7caf1f62b983225c5aa76b8c14d249f7a704b50ba850a0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24c5b05db14954da4bfb354ff674c2f34703d07f2ac096e6b0b998fad5997c7c9b1e1f417603c350e76ad99e5c19aec04": "0x9cb0d4ddd32f9332dac7059de238b8e489afb55502d1756d7f50b78b58e20c700234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24c7ceb04eb2bf9b9876b7a27998fcce5f2ee0d3d7e3d57e18249e42d570e163d7f34ac68e81c973b41bfa521f2e99e0e": "0x3c7f40746d04d77628d886dfd469c9bf606232dedaa248f5c219d32da93f4054033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24c8b3f5740c3eb6a6128f0a0a7614c156cdac27581d1f3929bf543452b7da444e03457ea6424f84ef9a372ecfda077ec": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24ca011902e6e9d2b02349d69c7c09d462c249c9b361d3c490f66848e4ad2fe71438455108b3a1f0698160c6d1d27fb24": "0xd20f2ce6c2c876745bbb399c6290cf4e3ee75ce31bbc7ec11342fd5118b98e3c035842", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24d2c909b13e573d0f96340bcc560415e661712f60a13d05e0c478d73f3a2dea9766c5d4b54a84895ed8b7f6a3f950614": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24d4c23aef3f039771889d31878ec41333c982ec4375d3b3e9c950f540316fe84dc53191424fd073613cf4dea51cd156e": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313433", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24d5d05fbf3a4df1fbb2ee0c9d6b5069818a06c67746e98a3cc1680079a706c133d5e77d0c8721728cdd7c8525b42b752": "0x8c79cbd600c63f0cc90b34e7301b7cef8c93f7a404cbacecab96901fe53d46400232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24dbb206d3bcc537968224ed4ecddf0706d6f646c70792f6e6f706c73014d000000000000000000000000000000000000": "0xd6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d05f09f909c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24dcae1b443519203be02a76ce2b1215410a89401749948f217611353ab25e1789474699fc06ed1dbbcf44b7035f48875": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee072020726577617264732e61706572747572656d696e696e672e636f6d2f6b736d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24e04bbd20b41540666f251d09ae526c10600cf06f1c8e912c9d968f1de9fe6ed32d033b8e87bfac698602c25604e2b4e": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24e2a67fa8f631129a0bb9461eaf8465f3eeebded302e53d488d9b063922447cf63e7638e60abdce4259c72dec9126a35": "0xe2a0a933d2b1e2dfd0c06baf42557bf4aa2ad84866859e6c869733d6baadf1520c637279707465676f642d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24e4d8f095e102658385486802970aa4254f79360caefa910ba4bc6e26760fbd44a07a9fd4244c6fc7f58b0ce620fe15c": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24e9cb3de883952c0688831aeb26bdd9bf60f07a15346b938937e245a9bc5f757c0a516b249d11c40ba8b0742109d573d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24ea43ddc5cdd8cfb0485d7efd8f7ed754662cd48d69f8c1441434bc2c80a825ded8eb41d2c360f6ced694798678af7ab": "0x2c5bca9fd4c92b051e35c47617175d8f28aba000ccf921cb24bdf555662f2d41033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24ecc547cce29c45f440503d562517d9ea8bc182820c46f4dd6bd98b76dbff06f8565f0004eb1a9840ee3f3bcae1442d5": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24ef5bf1ce1351b456611366722a8515d08d3e6f92d4020b4a2a6d4dff33fe485f2883070668660980fdc064f12dcc129": "0x02302a200a9ead164617576a79dded74ccf9094d6222cdf93ed575422e9f5837134f6b74616e6f646573204b7573616d612032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24f17cba3fd8f4bd74cb6a2f7101b9c90fca5925e677ffb072b404634eb297becf53c269e32c7393c9b9dec8d256dad21": "0xe26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd040848616d62757267", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24fb8017980417d688bf198bf773aed92513b35b8d169fb8f713504d252be09827c6e9fa2197df14bbe563efe67af51d6": "0xbc486ed2f394da6e6b58b130687b48d3d19f756ba6d0655d37bf58ff0f59f9740f53746565626572204c6567616379", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24fc60dfcaf236a03848d0e7d3f2dee82fc8d39aafef0cd3cc978a3b1354b65853a12b9f4ee0a55af14311a4de76b7b16": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523431", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24fd2e33d55a8d00d82a2b2049384f672a83fc2798fabbdc8d93db99a27dda9b8f6615cfef0b16a3a0aca93a49e527475": "0xfaba4f34d61e2defae2db1f7c712007824c194ad921959efdb4a65dd174a590c0b776174657270726f6f66", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24fdfaac0ae09eada38716c0b3212ee71407201429e0f6beb3a79213b46c4f59f002ff4da66dbb0bfcb66cae1cc1a5074": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf250794acaeb679fc61e80cee158ad5e26b3c0b3afec6c57fc99dc2656c38ecae97b5c01f2d44bc9da56714141676e3ff2": "0x5a5f7eb7050fb96d8d7895d9afce428a064ce66e3b094805bcad9a8e68cb99340a43524f57444c4f414e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf250879e5c19596eafbbf169c0b7fccaeaaee302e198305536eef798b55edd01e28516bfd2d16888597da705ee0e74df0d": "0x6e99996cc6c41e39696f7c3bc4248e548473b68fe2ba26567771be07b7eb5b190f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf250b6a9fe615c653477e3366ebb08ff9c64f9e43cd95c94ded79fa17bfec8a8d745932f4d7679f8b06aa9e13f915768b2": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083035f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf250c5e58a66490b175883ea10bf3c8cbb52e2931449f8d897dd10fe7f753414821fc90698d940050169a863db5093bc3b": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331343a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf250fe3047b874e3c5579f29b9e784955f6e63e1f89c023383484d1f16ea1d9fd66d46387f929dcdada62f8e5dcfcc9221": "0x2e69ac91dc2b3e54afd2d74736e7dfd95faa1e738dab066c80328980c7c9076e0a56006f007400650072", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2511494b67f932149a18b93e39dcb486788d38dd7b7e450c426b33bd49db5efe92e702e0c799a5adab42be4fb21ed7566": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25124fa226ff059a10fe8f24b98ac8b501aa9d3c51f17264aea16d04dd1b899fd311853b2bb2944487ac2c43f1e304048": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033934", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2519c4e21e4012a84648aed8d8458e90426acb4e6372fd11f9cf419b845964385848977d6e37b6221ea9d69d58d27d623": "0x26acb4e6372fd11f9cf419b845964385848977d6e37b6221ea9d69d58d27d6230e4c616b6520566963746f726961", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2523d931d34550f8428bb0220ee5d879ff02cd6695698754c7d8a82ef80e87a7c753c95c028557d15c393b9955fe74151": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b32325d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2529b051995d03c074da080c5a99828db98cafd75bd233ed0674c7493c67d589c4d7e78b69cdb409ca66c0f3a7391ec06": "0x2cba024614ea8ccd1ebf7a634f30b38d65c082be6aaa92551b9c3b4d1f15ae6e0853657272616e6f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf252a830b1ee63ed7d3f89561c6195b3d6b0495e49f3241a065bbf17983665997e582b1535c5410530897e3889993f711d": "0x1cf3e5e0a3f8f198a63f5f7284fe493c23e88161d92d2cd418e52d050e3bd22b074d6f77676c69", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf252e1519060862ad3aeca7db222e2424e12c0e71ca3fd568c3120f3c6eb7825d957104fd5e9bd9848ef36a1d5de03b008": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033839", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf252fd9557943d5bf1c9573d3ec3b6a98b4e9807808e2487f1a38ae21d64de700342dd7feac9c23a7293da4687e668e71d": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818076c6b736d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2532ab6f6fc026d4a6643dd68667133ce10230b53a6fbe58eb3eacc65cd3ef675e0456529cfb02a97eb43ff93bb6f8064": "0x0277ce02b2ac78ceeb9ae4fa0a595005489bf3f5f77898415e32a3e9504a531418546578617320426c6f636b636861696e204e6f64652032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25346ee68fa23361590f60872e6ad00dc15a946a44e88eac4fe2568b67d675983e9617e83d70d3ad6d9ec28707203be7e": "0x1ea86f3c82538c486a25d8abca26760e57e76a01212419c7f1c8b510121fca73042d5142", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2539271040b3fa17a151e18555982ae3460a8e45eea9783d521beeb12cb15c6e9094e5d755749b801ff1a532d0934a90d": "0xaa2b3e0a8702aebcb83d552838a17902b2403b0f16c4e52a4514fe02df532e3c0d303220f09f90bb2042454152", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf254338a78024ae39674bdddb5cd6abd43ea00a7167ab2ecc7f024e26e62a15b24c02f0b30e967cb91621169e3c780ae4e": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a04563035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf254f3e98bd9a69f185f1c099c597a8365bed497470a04ca4c13caccd69c7827e3ddc64473fd2d7c5d496c71061f452b05": "0x6467fd4e7038b925c2422357380d8cc0c5f17d272f639af8fcfd1f1156de704023d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf254f577657837a4e532147a687f23213f83dc7edbb29fe81e5e29f18ee1c35a90b6aad5637057e3087699d38e7eea7394": "0x3839e4be40e252a56e2d7c8e89a0c8eb990df5910714fea61c6e1d3b1c4c550204303339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25530d6e304ba2f8eff835adb61de17793c5862ed65c524b7bb3564776a81904218f44f3d7c35162a608e39dbadbcda05": "0x3c5862ed65c524b7bb3564776a81904218f44f3d7c35162a608e39dbadbcda050a6e40544b6172757261", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf255316268e460368587259f3f3af448352ecadcb36865c859f998d5538bc2629b4f4aea6e03dc4cc110bcf0eea4e06330": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2554e5c145db815f1f77e40bce8d396b6d41ef941dae80043db2c5bcecb8501ff3f159ce810271ab6fdcbf979de7cd373": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf255833fcaacae3503dbe52b27182d70a80ad8b4f94dc8e6229e2c448d995094cdc1bd356dc14c6155467ac07ede18b872": "0x2e69ac91dc2b3e54afd2d74736e7dfd95faa1e738dab066c80328980c7c9076e0c426c61646552756e6e6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf255924e4e69574c0cdab46034db8b6f9334fe2832004fffcc1e28aec7ac35d29142b892f10d8d0c301cd26c37860a0579": "0x0cce9e210c473fd1f20178fe889c178956ea1cf325c54b1a439a88bc62fe7851074e4f56592d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2559e7c86d0691c4dcfa3a682743b0611063e0fa2cd4f4b448d507f9d5b2ea8c85e8947a93d92d214be8f4b752807886e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf255bc1197df809de11d807374b141c3eac99cae7c82bcc7d4c6d39b376a3f9a61242bf4ff1225866f5f93acbbf8ac922a": "0xd65d5c1484e5faf8ad32907ab729add8ffc2ffe0f29bc18015bec2c3f8ac7c6604303032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf255f6e7b996756cc74c600c7dd197ff1066a4ddefa00f74de69a30bb8f6f87c50cbd2804768c367f3fbad5663a98fe48b": "0x1c6681030fd4860fcfc1dfad9ae55fc0181229b007b6365dc4c8f5fbe162554c033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf256318734facf3f8a10bd6cf2becc981412c0e71cde22f076b79de5a6fc30cd47be3f5629d4be7fde35d769e7480f4911": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033638", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25671790e3c7a701b2517fd2852b03e5712c0e71d17404deaa91eca3e64e911f5e43ebbfb80fb21f97c4d453ed79bee36": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033535", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf256752f9f8d5ce6b947829aafc1b19e944e1f1d2881471357ea697093e5e68d46712d2b0e5b650945c4ecb571ea43757b": "0xd6c29a7c39cee45b0e045a94081bc188ef73be2be086d66aefd850fc7eeacc45164f6e46696e616c69747920486f742057616c6c6574", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf256819e69d1b4e0465ba4450aaea081ee1a746810bc697bd6b464f5115aef1127130712a70960abe590c8a6491f432232": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a04563032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf256a45fb05964445f6dcd067c402615abe69aa84285f761bb1942735db2c3d443e29dd3f3da5aa7a00038bafdf93abc57": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a04563033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf256d701a119a1507819cf606313cc66cca82cd9ba02bdf8241a35d6a434c019a6078547e238df7a55c6dde5c4deb2f12c": "0xbc63ced3f8fec642128f2aa9c37e989a9313a67e9635dd85e8bd689ae8d0ce1d0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf256ff03eaea16c8ebf5d4c014efdeee2e166a40c58fac1476b58784d0ed59ae59fc516a4b072ba8daeda31d638a53023a": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988837", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25716b10cfb50c5acef6d1a0858444291e2af982fd853bcdb276d9be46e6bad4cc8e1af153d82638d2bc829e6ec3e2a6c": "0x0cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc6605504f4f4c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25716d5eb2b434059c3a47ed674f3c80e41593cf289a037eaf22bfa42c5f10c5325340bd4f488cb37fc72f65cb83f51cf": "0x44da8d011a0f821b2e39d6151f8e17c417c0e09b664587dfe2021a194ee95d7404303334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2573b583b387a3bd826c32978ea0ed0e8a9c13c25dc960c282ae2a76f4e315ed20c60cbdd08750fd45cf5b2790f7ef045": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2577c29443c8aa9c98a578dedce880fddbacafb0ea22a692dea279a648b8cb44649ca71629f9fce6d69e03a4869cd9383": "0x3c1db08dfc6786bee3b0e1b4aaf51e80b6f2ec9badbe3da87d30ad7605a2bd1604303032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25795523df7d9eb4aab5fb0b8b47f2a921f81e872efaf12f97f5a40b31afbf874bde9c0225e89511734f749b4b1d680ae": "0x8c4c81f382ae2c201eed4b0b519f352aa9c0c8593122418b30ac9760844de2fa0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2579585ee165f6fb748e8232dfe0d0f2ae541547dbea2dac6e485f82ea71b8b1f6fb6696aa65cab783b20f9a6c574e644": "0xa6c5f0595d6ed85d6260bc682d4a68a4b4e605d43c67d56f2765d196985497720b636f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf257d195f17fa6af701e4f6105769471d19406aac741b57c529a2b06b06124a2a9b8f8374e072e4b251b13a5c0cc9f617e": "0x5e0a4ca74bbb4da39c79954e7875519fa67049795c02a360412f3ee41a020506033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2581e8ad688578056d036cdf1f8d33b8520f949b07ac91763cef16c15fb78d5370271add31799ab7ea2e940a89af4672b": "0xbaf3f15b9e83dcfc18b50fe91e601fdf446c008c72c3d17799c21a64877e8d3a0b436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2584157afddf0916a8942604846c9d7108688b96ed623770a0b2712dd9661b3c1280da83237db214ba698be7783731b12": "0x482a9a411b630d2c3f850f435c4566a6a93143422e6cce181320f022a74512360232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2589cf380e0b82377485dcbba553646f4acd510542672c65c7c05d56c4c6424a70a0e426f3899f2eb86751cc2e08ef124": "0x6edfd181c979c11a1d853c8fdef7b18e85ec39bb67ce723130b25fc24232c3580f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25932753fa6c22debc1bcae3c80c551ef0650217af71d75baa1bbc577761208886a474cfe4c24435b0295586f2f66a571": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf259867bf87f39d463de936989455b2e82603ebd73cf850b644af5650cc070cf1328601427c712b21aa9746609de2ad447": "0xf2d0eed0f21b82d4b15802153cde2a229f257f01d003694b2973ef785a7347660c416e6f6e7374616b652032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf259a5cda96b7e066af61a618e2ec7113f106b2d295a9a3de6efade304e1efcd123cc66ec27ec92a075964ecac7229f54b": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf259aa4b30d635834bbe3b17ffe590e01bb08c0a54f1f153adae9df1b746cab08c40e3b949cf2458f80ac43ff256f2c17a": "0xb8a40f17f9fc62194fe1b12c10e8a2bfb5efc7057b119f4ca3b05ba96eb7da6b105354454c4c41524a45545f4e455854", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25a19a249f9a9acc87e47c4448779ba642cbc13e6be77e7af272d495780c1b51130e27e41e95d8d651733b53630b3900e": "0x2cbac2d6ac81d2169fa6e455b0497cf0389bd5dd2a11b24a53e6d94053765a7700", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25a31cf95fda855a49f008d4fa2ca66f8d2f17cc6203b5746b14c65b94077e29f02d0b1d56a0ba445458c2d7cf9d55a54": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25ab90ffc9708d1a3176157121ed81a65203fade9dcd70e45da97d67ec48f8c5d8176be2e27cf3a612b6d6d7473c05577": "0x76739ac0320c03658b64366855bd6ab037488fb23fa0d183f53b989106e25a2d04303239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25ac5336faba0796609159ad9c88a24206d192ca910ffc54858d1b7f553cae619803b55c69af50ee3bb1846f1715e6db6": "0xa763de880dfe6c4bbdad18fab60e27002f648c221df5248b7d44a575b4bc734200", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25b59008062bf10ecaec566e66e5af6531cf675676957827846bdae1e0518c92b31a6e0759b3616955445ba3cf8a8111d": "0xae9749dfdee466ed67835efa51f04d74db27d75e919d7050e4f5b7f481f77a14094355524154494f4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25b6e148db97bae3ff6e9959f16d4cfca72020fdf0cdf3cd952082b52fd11ac0df4cb360850efbe0d096126efeefbb6ca": "0xa26c51051a9031ebcc5ae2a4eb9a72e444a5bff59b995ce4612ed8cabe8a2a700e4272616c65205072696d617279", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25b8db23b5ce4c505699e41e822e0455e4e3bd152d910b6c892f23f85469cd64bef5d7561d69475207c60f4542cc1257f": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25b982a12cdee42e465dbb9a6466dc88e92b53a95c31152cb0d95a968db4dc8e14cb7f4495f4b3215db38d0fb6b8a8287": "0x83c75b56557a84fe8261cadc0c308577b0709cdc54311afc5ec8d348b939f58904424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25bc64ab2326698f1348a2d90fe95f824868615ece4f03d149458a8a54f26f7b3992f687e066d7c50e6713f72dcd6285a": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25c3f8ab5a0972dd662a3e2166addbfb0cc710cc1444b51d4cb4d22fc47a446df6d8371a8831a515040a52d7cea1fe70d": "0xa0c077265fa8ebb05329c968fe13efc415460cc5c379fb392a652ac07c9c2f7d033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25c54999bc9fd8464af0dbf1573af3117e2e0c7c189cf04f3600624f5fed3a2107ab6ccf9625663babd571b492bb27cf9": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f0831436865657365", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25c717292043b8b023d37d0055112c7278ca5a28e878867689b757883005b39b269cc76cffb757bc672bd9cb1874cd505": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25c997a05fcaae1f7f8c43f9f6d36f666ad3ef6399e4bf49bf0ed9ade88ec40ef21be714cf9efc112306cc85c194f758a": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25cace6b06122487f6899edcfde030e4e9e992661473c1dc00ad7f67b734bec003561ebddbb7fe0db3759b717ad20fd25": "0xf01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e0423600c534158454d424552472035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25cb0e538cd996389baa4717389419eb9b4105912d0268f239b12bfa0aaa290903ccbb52e0ad2126b73a4b20c9189bd1b": "0xa845ea35913a0fbdec49687ebc5b1579bb632c080ce61b02919ba40bcf8892760232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25cb2a48982d22b1a6679694abacd9244bca1d58132476c8e285668c7c1505e248d79821cc2244724f026d438a27d470f": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25cbfe699cce3ea3a42b238084f199e5a26e07a9cb1d3b8827960bbbee94197ad2204ea98db2d54da63b57bd9eac4374f": "0x3284bc8ce3083b62e671d1c5bd61db5b3fea95a77967341ca8834a69cffcfd5f0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25cd5604f22dc70a5804a812a435574025ae96556bd15eed67a54fe5f9191835994d94c18a764ea4280bd03faaba61774": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033634", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25d1943fc0a7b557c101e38228a007d3a12c0e71c9267977ff8cfbf27005fca3918833daf0d77537e8f879fb9fcdf2b09": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033931", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25d7fae57fd76b925f7fa0a9c2b6c4ed28689cf01de26619d9e77cfb38911661940f6fd4b6379d8bd5558b8b967d51db6": "0xae963c00a7c164fce3f4a8ed94ba0a87e83cc1a7b192726836819cf1f63c522b0c56616c6964436861696e73", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25d85bff0d6337213ea348d05c4c11c7f84c45682961f27cba9bc64fceecf20016338daf42fef5cac7fd229d7727db168": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523534", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25ddd4eff4ab0da0dd3bbcdcdae2a84495edf939d9f238bce8f74fdb215d853697a5a515b0f8b3a9a9d64390265f2cad9": "0x983c5a0d1f1e697c1a0f9798bc25543603751b41102d41c3b0e23cbc6e3fdc0b0c566978656c6c6f5f4b534d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25dfccd679a8f331c1ad6d882e30936b512c0e71cbbe5966e17c328e1a6f43729e44d4dc326af5ea40f9c0e103b19cf1e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25e40ec9d74f1117534a8fd748afed5bd12ba1a34fc5e9b81ba8d7e486f223a2cb47e30c8dc185888aaac0eb25c5f605b": "0xde7fc70edbc29190008415c3b6122dc6390b738453c6f1213b59942b2b76e54a0943757272656e7432", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25e474e5cf89ede702aa65a076ba4571e72a136cbd146b0596b9cbf73f4f2e402dda2683568e33d1a3db791ddfaac6a4d": "0x7c4e144380357ad3e690e74f5b7bbbe4b7d6ab1579d4c6d7c844ef003cad9a24033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25e5c57f7e74cdafe635452961c31d13aa7f6170f731a0acda2c9edc8ac9fc21a0b33e448378730b2392cc0bb76b55546": "0x0e038990f47761a17f45c2bb01c4c7746f4ad67c7d0c1dfbd6915372faae911f09f09f9a80f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25e748e847adffd35d3d3855748c2aac549f2baaa065d3e927f265702cfa8d8eb83cbea8c64bb01d19c5c184b8e2f5d10": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25e9a622d499eca2b47da48307f31c02a599aa7c71c2716d534f7f4ec936d9bc547b4e32fad199466a389b09b139f3f8b": "0x1c378d545f64248bedae80ec34f8f29551fc9f814f8491f8fea50f10fff6e22904303232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25ede6d686847e552985919cf30b1f997af5a44d6d0b15f2cf84afdea4c76b1321f84da230a61b0c73d755d9cf5171a6d": "0xb8a2a7e1c5807c9b5241a00382d483537eeaac2fc756dfde564af6a368fbc27504303134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25eed85774e7cec34e3739c21814420858bfca4af1ecfc9a8af84f239f3f3198d12a666452d0658069c451723e7d922a8": "0x2c5bca9fd4c92b051e35c47617175d8f28aba000ccf921cb24bdf555662f2d4104303263", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25f2351b0f60616b6095d656542dd3fc0a8070648f6e43b7d8a8f10418b696130d2046c10645f10085de80e6098b85f09": "0xfe56be5933800b45a21ee8e9817eae9f49099fdf4a20076718497092ed43c62b00", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25f6101fcb7a75c45db167543a3bca4c7f444730a05ea7fe71e53277384e8e78bc1c8b8c6858d2b177e16d6d1b05c1265": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818076c6b736d3034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25fabc3b9626c2002a6b0d28adab59c3c12c0e71cfab0ec8e02f65d8114492d2c9177d3add541219bd8ddc00ef4e9b66a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033935", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25fd8f37d0ce437a9a9ed9b00ac09770c1244669ebe06bb78a7513e888ab43c70dd2f0c80e90189b02fbf62ecfdfdf66f": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2600940c11f4d4aa49291d6c008357ef840de8fe2227bbb0358570c01c31ce0ebb4b7540c1302ab6a6d021cd0ae5d5942": "0xfaba4f34d61e2defae2db1f7c712007824c194ad921959efdb4a65dd174a590c0c62756c6c657470726f6f66", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26056c060af5f5b395e8dfd029bcf7f1b8c216c3e8fe71b422c34003bcb536257a3ef17928e93792f8d8de4748b81446a": "0x94b3d04ef219a8970ac5f76658fdee1005b4b7ffee3fc02355f60db1a778f8260c46494e5354414b494e4732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf260a1a9e3215ec9f15089823cb1803a7da849df65d3f404d80ceae8a840ec60cdfef83ae70df3a6d681870c87d5a78f31": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf260b1ac8161a811c84a429eff2c631eb50ede8b484ae583e43b011ee69f561cc3d145aa542269304d76b034ec0df99f3f": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf260b68962a2d002fb573f996c7e0d736dfe0dcc8db8a90eed611a4510a8131240174ca310a563a343fdac7fc1060b0b04": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988836", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf261307e87e8bc1566f901b5dbed719573d85148f0fd5fe1eae1bcafc4f9d970f692415245ce7bb7988bbd76b8dffdf02d": "0xfcc5b90bc1891b7d905423f7a00ffb4e8f3d59aa97491b5a1d45b82548639936033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2613dd8bd2041dae29093cb68c280dcde8c600da2883fe70c639e6375b81f45d5225acf4777c4586a3672c2568b9c676c": "0xa49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e104b534d205354414b454d494e455231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf261df5bbd34ecc0ecd2cdf77f33ca1c94c24dc5f34db1ba52471ff7e38158a4dcc3a19b6137b8e6023b72f889cacfe535": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf261f0b29fac740e620484b5e17f2e611612c0e71d133bb870cfcff34b784d933b5ab71a4f90987f854522f076bd23f214": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf261f255051a4c31354a9d2001207b656246d59d9963c62e1d8f82335ec3768bd5aa4cc268abdd209b779d139d99eca26b": "0x78c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a702404676f76", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2621a5cf9ededa4315a266d7bf8f75286468a99f3bf7d3a5ec5cd3932ffbb436ecd78a9c635286d544661acd5f9f8de15": "0x629c17f4f4a24ec53f85a7beb1c70b13379fb8e4f969560704d2c25133ba8d2419416c7a796d6f6c6f676973742d76616c696461746f722d30", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26241081bcbf46fe6d72b580a1e76671a20912c81e6895f7b27bb4be5f6cb4750a326d3deeaba95ccce9a6bf6d1b9fd29": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf262682a6865b2c4c690d6bd023106732e43dde39c254993375b5d7905319e7700ebdbf57acd84e44b3025d869ba7d8e6b": "0xa45d1343d565c182e0e1cd3da2d6c0b1ab5b17a77ca165457d9620db19439a6404303130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2629f18110946927e208f5b411e43b06f6a4aa384952d2245b6c439c833edb350c0ba7e31ca423f081ee6a0d79596c658": "0x5a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf262a75c46816254a83804a42ec946520712c0e71d4911dde07af70a1bafe6ae84ef07a43280a736d0c19395a587935412": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033533", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf262d67377e6d52bd6cb6430a85978e4b04a4ad21f7448e3183c18b8314ffecf0b382098635efdd056e0af7c53228ba426": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d81804763031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf262f7a72b64f01a4727f71e5fc6274dc2d618111c1eb2afe48d95bf0501243748e399e23a538bad0db61fe474f4f2b90f": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2631c0679800402b1fdd76bab9f679f7ce26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd04": "0xe26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd04074265726c696e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2637c3843530e14f1b15fe989582f41780ee022b7052ed281ad71f8cf98ddc2efd5b5fa45d741e4861c225a2bcf22731b": "0x5a9e357de87525b67cf9ed1d0f06a15a6363665ca1c9f43ff527c87c0945597c0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26389048d2b55b0c66fca6515bdec995f3ee307326a809fbca23841d62753a3aaa5d3ef29e45a4f810ea1011c178f302d": "0xd6c29a7c39cee45b0e045a94081bc188ef73be2be086d66aefd850fc7eeacc45064261697264", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf263e1a0f7f5269ddf76106255a28ee08012c0e71d5287b03cc78c4c2faefffc4cacd47bf65ba7bd0bc5d4facc08cf9323": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf263e842b733bc16754c05a3c4e27b82717291c36a6b23990b023acb5bddedf227b9688372d4ae99b442b031cadf13f66e": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf263fd21194b7a0ec0fb9dbb1029a23d80f4c68c01b58b381bcb8b1fe58cab96f90271910ec55c23214c68815130b5a81b": "0x18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc00190235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2640054d8fb17c225857ab80a22e4183126842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b148": "0x26842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b1480458595a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf264c092a725415d558ca5ccb0f490d780f45c6d9ac359665373662814fb3b30355638036ee2aee6807b2f2b228ec1d6e5": "0xd53c9c6e61431448ceef1eb49542ddee942dd3d6c81c19d53efbab8acb02f00f0973656e74696e656c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf264c398d291c5f649be6d6d75b4781aebf206c1276f16bd43aca4fa9d596a7164a310b83bdf34350c1480ed4854cf9729": "0xfaba4f34d61e2defae2db1f7c712007824c194ad921959efdb4a65dd174a590c0a6669726570726f6f66", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf264de414e896f1d1d91e9a01ea473cca0d0ccf4cb7501417f0d7bdb6d577e026612d02579686f0ff1137a10c843f5c963": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073035f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf264f2cd21692bff61795cb794b30944a21cbe59b1e375a52b9131fdb7a85c0992b8c5cdc3f4b4d90e19185972cef58b2a": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a104e4f4d494e4154494f4e2d504f4f4c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2651fedca233a66d0898b07888f9526db8478f51feef5a376deda20303e61c855e0b96451f692ead53d838130bce9cd08": "0x8a320af9e031a3396f15acdcc65c43008124068226505ee7e12bbb0a12012e600c546563686e6963616c2031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2653d347f7ab0616e9312fe3ee15167d1815e86a39ceed754266101e55e352c131c877e72ba6f9652dc45fb3fd3757be4": "0x7cdc1a6a5a7f23437b6528edcdf553d0685f940a4e6e85579727ef3dc574563a04563032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2653d4fb685eca06fcb8b63a86aae6c65aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164": "0xaa2b3e0a8702aebcb83d552838a17902b2403b0f16c4e52a4514fe02df532e3c033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf265423f4616ddca5dd11b3260bf8a0b34e34c880765bf4cdda6ab2045979a9039544bbae925cfba4d6421286296cd9bdc": "0x3c1db08dfc6786bee3b0e1b4aaf51e80b6f2ec9badbe3da87d30ad7605a2bd1604303031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf265bc3fa2aa63b50cd345969f8790d552a42184be9cd7657a019c2624c045f4ef80df884576b0f2e1eece434410537a37": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033638", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf265c6ea578befcfb5b2d2affa63df3b05860a5fb3fb398d56fe3180ba927cc0f0c9308cac7f6af98d4fc7624627343c4a": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090d6e702d6e6f6d696e61746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26691bb6d27adbf3d894c5c905b40c202fab7ede8984030252e6392d2201f91bcd558470d35785c4bf89f6d7cd86c6e66": "0x040298f71f02d7b6a67c0ecee7d7a62ea51dc6daecebf4dd9ad72e0510537a580474776f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf266d79d3fccdc1cb3873b9f7bb80812bbfedd35f51de7e439bf432926351c41500f30fe78941f325c69dbb642f3509547": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf266e7b15209329fb5f45d8d77693f527d9f7951a3a51ead847837ceb367ad2166b0dd1411c860fb01cf7ce94cad08022e": "0xca5bc1915da74aba3aadd7ce7b809045d5eb5b73559259755fdcd85a40a5dc6e194a616d2773205768696d697363616c205472656173757279", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2671946b010703f7d896bcd837d623f0c5e4a7f6fd9a8525d277f96f3e758e51fb673c6c28a7203b1a57f6e90c9f81349": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313431", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2672fdfd5b424654eeaa13d2aea739ac0bc56d28e12b54fcca3e2c3e90cd0d8a991718bd2fcf9a65dcdcd1bdd04be4459": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf267482cc726f02add0a3f6067d99bedf2aee65bf22cdf1f98c91b6c176854d8072f1328e027d2e84d23607b517b1b9429": "0xaee65bf22cdf1f98c91b6c176854d8072f1328e027d2e84d23607b517b1b94290574657374", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf267833ac6e29d30a5cb45c4b75174411ac2e34786dcde41bcaf6c5c3dedd1320c792f0a0bf3c448e03275d7f9cefb7653": "0xde7fc70edbc29190008415c3b6122dc6390b738453c6f1213b59942b2b76e54a0843757272656e74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2679801cf4c337ea779bcd260fcabbcb712c0e71c8bc9217a6448d34afd0c1d226663a864a4141b65d13f8bbc743d1335": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033838", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf267d883de78b7fca5e136b2e623af15e9051e046a4125b20b4a9df6a8d1d5f81f6155279dfaa2050c7970d4470b890e8b": "0x081c465a655cf27eaa73bdf9554abcb46ca2d56fe7fb0a20835c1a5ddec4a32504303233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf267d9e84f6eae02484804da8f9eb7552e483ea32669fca11e7415c4e24e088cb3df49defae82f0f9d069ea0aa75839e38": "0x48745d28d9e9596ca41b7f7bcb03f874757f4f0716a7237e566662a6393bc1250232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2682f326dc001feaa0af173c9de66ed310cad33c225bbc550c7e1b89ff2feb2dcc8993f2e3a8dea40898fa8f54f754b00": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf268435ff8a551e9a6b809aea31b22c1650ac2e966527ec0e3076ac6ae05402fe763d6cae60a8c01e108dfbb6e92d0863e": "0x64e05e73625f3f0991e3062733ad8480c5589a710a24beacbaa555f1c4a7f0640232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2687be05f69f6f8f84f4b954a8981d6ce9c674dc7b750bf4d5d5d0db23578adbd9602cac61f6292fd788879a44c87256a": "0x66f7b3f3db597d3032c2d767568aa550249c946600a61276910b9c1d21a933710f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf268a30cdb6c7b150c4f0fbbfcb62333fe3e4473a8a5c626a2b1eab5002c13537480b487a04ce85ae09292a7c458b3be06": "0xee56126859de69a3539f0e8910ca7e775243f18c6257954a65e020eb229be9120de29d84e29d84e29d84efb88f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf268b65cc0f7d23aee0aeb082d9170bc585058c8963e2b60c6f1e6c921a3893414f370b48ad0c2d2d937c7786febb29003": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf268d8e8420dfda8f984220ccf7a9965693c84672d8f0f25ceea258d980ca234e25ac03cf2d78f925340ce77237844147c": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf269086b8dd50e6fc95ccaaadb185440188224620901db3a08a236f1417e7f865c079b41c0b2e6cb0084109e4be3fb1d0f": "0x707c9246c1c227f1495885cb2f4c59297248ec5abeff2d0f68495075a16bc17a0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2694dfeb03523adb4381226d98475f9ac12c0e71cad505181147127f5267ae6187fe470ce00c91bd1d1adfd0227a7333a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033737", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf269c4dd017da84e735cde3739503ed184821bc7f162ddbc6418c08a018d072e2980a4257c8584435e5b6251f6e27cdf19": "0xb08b555a5a3b2725e01ba15eb40aa32dc5b781532854b797808ed45e752b047c0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf269f011c50eb507802ebe2baf74a0ea66b6d4569e33bc6763785b94b98ec57d07573650e35e682492dd515e0a064d8958": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927706706f6f6c31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26a078f9501f9c92fd33584a668e8c3a5845c9d99f3070604aeab0b883b0f8774de633c1e7b91a0376df2342122fd4148": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e5105434f434f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26a1408806f270ef20161776a9ce654a724102b17c177cf80ebd64796a17ea2c44b68aca3a03fc35be96f6d3ffc60716d": "0x3acdfb6cd734dd3e624b6512e0903724c1c90a516c03c81a9af756491ea8e15e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26a56028c7f51d87f63a6d86e42f64be3d296d443e8532e4977e9d78145f6ec9eadbec4fd2b10158e82985549046fe568": "0x882a9309f1e5f87abb745dc51d5dcc338e3dbe7b818fd8a9768e27d97e57ec130232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26a7ac804917fd14c1c58048ce7e065790efe4d35b7d336d66f5ae2cf6969014428415b9d32d8eb2c17b58829d5054667": "0xbcb916e7a7ef77dd1f610ed27ec519b4ec226028eb8edade41f95b217f89f620134576657265737420436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26a91019b51c62d22ad66a4f15dfe72742ab01782078bd1515a3027895439f31237792568ad0eded4af3d31cbf30d9517": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033935", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26aebc27682321ba956951a5c3e2e2d925c05d424a33d6e9ac92c3863c26aec3515226a439192e9fb28dd47db38dff05f": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26b67a834ff44be6104f436a0795450ce12c0e71c651e27773fa58160878f81a68b7b054ccdccad776181f757e763e514": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26b6eafdd82bb367c496ff30495fa001ad6c6649ddfbc12a755845a05072148efc0d82ff7cf4491ba4e63cc97495b3735": "0x80a135db57d4d35273d9a4f661d3dad8f153a1b5bad478f9b0e5223657aabc0b0e574f4c465f5354414b494e4732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26b8a79cd1758e7292121bddc2d2aeb5cebb515975618eb35e252200dee0fc30b3db265686c72ca22708ad304084b975a": "0x68f6e4f77f043dfcb9fe88519996ee25ccae674ccda259bc49efec6b6eeb96070530322043", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26ba4c9db27e4bd17f30e37e935b673842cfde9047614f815e566dec170152a0e9a7b163f94d0a59e8abc4b84dbaa2e63": "0x482a9a411b630d2c3f850f435c4566a6a93143422e6cce181320f022a74512360233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26bb1d27c505d5ccaf1b88cd5511903d81ac5cc7855b95a4ea69568546a9e38214f4b6dc5de6cf1351649afd6b0bc800b": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26bdc0ff56647d1ce1c6a6d0b4b836e3eb43ec7322956d133d41e28758fc64d2da34d2888d93af64eb41f7afa26967961": "0xb43ec7322956d133d41e28758fc64d2da34d2888d93af64eb41f7afa269679610a617274757273206964", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26beffc5029c1f65bbdd549396e486bb52415e5310193e362840035d0283a5911d358c1553afeabd87ea4d66d35351128": "0x3674aa73951219dbd27b3e3fc5847b806c68c1de38fd4f22f9493a461c80e9031541524354494320425245455a4520e29d84efb88f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26c0e8e3c208d8a94bf73eb953a3c6e46688f2dd2918739ffc90f280131b7d8bbfeaf9f0e2bacfe952a88bfa3bc168045": "0x688f2dd2918739ffc90f280131b7d8bbfeaf9f0e2bacfe952a88bfa3bc168045033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26c3dfe8ae17a27ceb9be0a86c9319a75ce304677ff08c2d76d65ad5bc3adacb74b685907cdf72fe0f155c31dc4c8b047": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26c75c149f8b3ad90d61d9519f4d1cb53ce26c4cd5d39e3dec824a79059cf0746e3aaed0821017aa493da14687d5e550b": "0xc009ab06d6b49cd62f2801c4b0029a5343c51747f6716c788780bfeb2730af66033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26ce6b594ad15fd471e6f5eeef2ce735e1ac452bda8e177f52bae23195e506bee27b7007bfbeda4f2010fa6220e029940": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523537", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d1fe1c743f8b472aee824e1f69711dec0d4fa6e65eb6e8de70d275bd49773f00fa1c385a21608fe2f94a13036ce8661": "0xce6e3dc917919ccb44e66c8a5d4c693b96265d5e7072433971fb38d083d0587e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d3f300520dc0d16c9570946cc6b670504961a29fdfab26086e085f26198e4839826299adf5158e0de4d266528642b5a": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d5112b75bf01c0d280bdb0da16c359812c0e71cb50b65d27c7147f5ea52a5a805f8f75301ecb5d9577244659659965b": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033832", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d5499cc650d3ff7095b51b827fe7ed1c0dd6bb9243edbd211dac2b9b37fd29003be77cf21455af7c2c680af8812b604": "0x18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc00190234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d6154ebc6adee15904e184473e1bda32e05b8c395e198a2efa9bcdf3ac31424d984bb2b9a1cd6635a6e60c9b6a0097b": "0x845498df40e85e2ba9d9e213d1f476e7b147aab6a9098f1bb250e00251ef8f5c0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d6b9a24b605db49b90dfde2329ae9512cc63957be519774cb72783eef49a4a1dd53905dbf49a4a6f180a957e0563021": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523536", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d6c9cd04ff6a263d7cf4ec4b679b030ce384d806d03a4618c1365850015bacaab7b19a86849f627743dc2b1b6c90573": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31375d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26d6d8a60aac223aed9c676354ddeb9aaf8f71fd7d5dbabcdf5a640f194881f3f16c13e2bc18e54cacd08dd60fba0907c": "0xfef5977196fe3fe5c456a767e6b06013ca62762b282de97040add4ad2c53db61033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26df4ad1e32752726b5d14d23e6c0f2b548a9cf978cdd6826ae8be06a8a4c2b5080eba18ed88f5a01cd4db7b947515d71": "0x482a9a411b630d2c3f850f435c4566a6a93143422e6cce181320f022a74512360234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26df5e87b58fedb8a32ae8c35334b088b5055807b7c54a1143ebefe17d711170a5971227a8a8b593c769fdce803812028": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26e16b58ef6482e68e69ecbdfadb1c2a52cd1a4b07571dd2c61dfa5ffd65b190a203d082e9176e791a25bcf242de28501": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26e268d93af6f8ccbe753d9d7aab0dc5aba823c07ebdc12f850eb5dcc7e39971b34d5fd6643064e0394cc77cc0fea6718": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26e497e650775b5009385bbae39687dba346c4cf9a3d4e2bbeeb47694406ec7bb64e9c25e695f5a9051cb8119ca8e216d": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26e4b64ce649099fcd204d308365b0a013a5dfb7d614cd20d8ddf555c4a23acef0a71bd8723463f36f89e603211dd99b0": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083037f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26ebba2aea637e98146839de88adde4c4fd82c8f29cee3c6170e1f21d2d060586e2508f5a3dc977f2f179ed52d33aa923": "0xa80ea94af8a39eb7ba8d9afb913147e67eae84f48aad7b9ce6ee05094fe0394e07476f4f70656e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26ebeacaba92514d9ce59b29ac9021c9bfdcd5afc6aaf6c47e499c5c21097386bf5eeda93a13448eb7b9ddc4fcd0e13a4": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26ecf2cc935beea7b1c3cfe5594654765d10cd1c9ae335b7b25abad42b89554a8d9c9fdce81a11b856604cdfa6edccffe": "0x30fd1beaa72357f61ba1fe7e90aa8c5080fcd49b2c82e1b8315bcd9a223cbe4109f09f909df09f909d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26ef9e6acacfa82facc618c0deffd2d74547be45207a849ca9ec68e16de6964b581b36449cb04256febdfdad833e7e670": "0x9085297d964ea873a23b63151b4c82189c1314c31fda6f2d71f83133d0877c5c054b534d33", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26f1d383e98d0d081d44c4db9b00e30dd163c64722e9d2ead4a7d5d88e4a3e565737094f0d4bdca0fc90d6870a8d1271e": "0x184d701295be7bb38b2c0c58a35bf8edc592671c53d149d206e037dc7c9beb7b0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26fa1bc3177deab3c13c2d8ecd2eb3706e81628fe7cf9e8c5e313f1d418b48778051a756de0f652496423cfb3f1be2836": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313432", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26fc5b71ea1415c8d7c07961675275143463fb9341e83f58071dffd0feb3915815e4f7055c74f0e4ac002214cf06d6588": "0x0650a2e41ea97b60bbd3f87aa30d605562069075deaaf79559959230928a248700", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26fc806dc65089ae91187a1fe690b09db24c295ae61b1b902e08f1b4939f83aefca9d3cf3c6048f1bee7ca71dc5c20a2e": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26fcc51b405d6f6f727140cd71d9d06855034c3e43599377576fb1fb81c8410fca61070ddcff4484cae5e57de2d084f6f": "0x503551a752e49ebef1b6988ee561cbbfe0f442a56fe624a58ae80ff3b3b9cd7d0545505632", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26fe1b129c78493f32f9865094f231f9c8866bf5337468c1c81b265c4d9f352ad6b0e50b7fe77c4a660fa9ce31e45154a": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033839", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26fed3a5a88d568338cceb3c0f4696f43cd1a5def7ac55b1ccf202ae5de75a02a224d939e1b8d84f54e5d03a714d49896": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2701f3befc036e16f64d48c6c8d26cb7deaa9db4e448cc0b93c4cc1d5059f9bb7e017c51964e21916f2106cf56b702f64": "0x83c75b56557a84fe8261cadc0c308577b0709cdc54311afc5ec8d348b939f589084d61796f726961", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27051f48905e9a91b8c8c33367d55ed3e3472a370eb332c43576f14f315b219aac6f86795a580d50cf5454b4c293b811f": "0x868cd54faea1a0e45836635b2bf658733436ec69c5567d651be592392cbb69dc0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf270866c46dcd9148458dfb322e71add45e2c726e24b6fd7c2bf7bd253448f03cbe350cd0e36bcd621a82fd2732bf9c206": "0xaa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d0e48797065727370686572652d34", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2708de677db33cc55b0055884cb832c7a12c0e71d122033fe390632d7275542273a8afc911afdba254ba4b7f330879064": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033630", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2709054a2d4d5d54351c6d9732c95a37eeabbb97403ae010a1fcbbc9cf50529f27e0eda03efec95e29b6ed44dcb075648": "0x1aaf37daa4afffeb0d84c47f52330d8293ea648e1bba5fe0e35355057e63c1670d73656c6265725f70726f7879", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf270aa73d429acc44140f13964c7ac109c92a409f971d4db36b2d2d520adc5ea15c5ac9c012d22e4e551552d250aaae57d": "0x54efb33a98824d6330a8f074481df98b5123305473559bef960180791f8492520a426572657a6b612032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf270cdc84d725fc107ff788b254c7cf112016768f8ff56cc85e23810144f87fcaad260080c7547bb6d3c20d0b4929b9d73": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083239f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27115e3fbaa2944d93182c99cf8826bd3ae8c6dd7bf2e52a684bbda1831b6eea8040b7fa459da6a487a9988a9d84f6b0c": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303220f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27123dc060c010cb7b13ee5f37af3faf62c0f99b106126a14a19ed92af1bd9055ca4c39fd9ed5ed2305d18f6730ac5470": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033836", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27163dd1626fbbeb9a80adc352bda4ae55034b9af07130a1799cbdbfc0c2ff2fbafaf47fc4cf70d82dadd9e606f23085f": "0x503551a752e49ebef1b6988ee561cbbfe0f442a56fe624a58ae80ff3b3b9cd7d0545505631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27168afacb6a98d528a357138dfb05c28f2b7e775b59951428fefeac1c8f7f40b24103e02315552065e37d58ea80c7d77": "0x929aa2bfe7b52500b288c943b7c24a90928cd8a6f7ec8eec44763d9f741984011043727970746f2d6275696c64657232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2717475f84a4c9b87440120beaae13c364c70ba4d71065dc3bd0d11c1fff6bfca26d89b5c3f406eef2e5de8ac7334866c": "0x8429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee210d5a4b56616c696461746f7235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2717d75ca6d64dd31be997b22d763da311ae31e3543602bdd7fe69218e5c8d16c782f96969e2f7e323ec5096ffb294e44": "0xdc86d7e1dba377a90f087a942c0c2777851b447a16af68cfac09c2e58ecf7e1d0245", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf271993737254d0baa3517a60a30837c2f148152531de95b53fa605b79b786c7f16397d3226ccc2f0beae85e2d73770937": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf271a9519680428dfc91bfa55e8853a73a70f955feb0ffd847cc972e17e979619e0bc0739673db8604848204bf61af0071": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf271c0517588bb633aede2620df6d0989a20188a2097650af57e7cba4be37d595ec1884b69aafc65961210f295467a5313": "0x02b2b0de562a79b5ad9c666c3f9e7752955f3b2c2b4a17c71125b2668ea9ce5a0a617374726f63797465", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf271f70b1d97b96cb0f9d8831ab8e8ef2775c4d8aeb08fb3e8276a09141d8139b74d6a76af72acf6955617309dea176a7a": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27205da583a65e8897ab5db17daad1ba84ad44dc061d183f5adb794ba6708425fd6a3e1c306152fe63fb22075d1f7347d": "0x225c1cf2356a5a5cd7e13c8e5dbee6c4c89e1c5f610c1050131cc58b4d96e75a0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2720c59a42b1a2b4c7d2139dcfb90529fbc79ba52668a29f5a5c62044bf72f6c666f2ea1347cd1d23c3e54d7a5dd0614e": "0x1aaf37daa4afffeb0d84c47f52330d8293ea648e1bba5fe0e35355057e63c1670d73656c6265725f7374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf272384e0b39da7c6140d723845b82629ae293a27231ba1550c3767df641d03102ad153acf8b4bdb7db7f180fa9d544d65": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2724c1e316dcad867c557f64623c896ae904f9054a49d973dc073e09bdb9c9e49213558cf7b5a29d6f2671d8f6999656a": "0x36d7b7a05501f3e93e7eec83c53739147dd9824554e4907136371ca062820e3d0e4d414d415f4b5553414d415f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2724d4850ebab3bd5702fb9c234ab0f86386d313e669622ba62d89b48b2d4e7be50308ca20ec56fdb89ca5844952b3953": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2725a8418b84a405c8889b8c32fd59d2ce28ceca047d61c081d502fb5b66527b2dc7438684d607682e9dc082640667213": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2725dcb5bc31ffd3143e49d886f5a357afe96b7fa8b193f73106d03bd579b5cc090cb75640ec8090d19d96a3c3d5d8c7d": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27287cb64c5712f2c170bb9949647ac356579df1779da496305c30a43dcdd9277e4984df2b941343e1086706c613db393": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083034f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf272dae82d2e62eaf973cf7a3da5592630769e87de4b843adb49b3de1ff29ce837047c48023aaaf9c6d3abc6e66b4ec34a": "0x600e047c97181ac8d0b9d5a6372f6018f556d68b2b4cdb529d87da365f718d4006f09f92b032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf273011b2d1b3498c3c4fc781f8c5d49dabea06b45bcad97ae3126af1a6e864197180af4b7e6513da3032228b2bdb26368": "0xda01077bdc025fd779cc21c9760727ec07e52aa132410b82e5fabacb6f45b0550232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27354a2780866415377a9ca2bf004daea1f8ef3aac7ddc528f500ac380bfec2dbe0c58caba4540adc427fd3e3186bfeea": "0xa215ba2d1b408fd5350b93f2566124331dabc06e94c16d7080d3cd5771d5995804303037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27367a138830fe89180766e60d91a6fb938684912197a8fb0da1f815281bb2f52f170d07b4d96450ac6ac06cb4bd42d6d": "0x28322946bfaec48af9564e56ee4134655dc1748ffc206c3694a9c6bddbe8332f0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2736afac49fff50e3afa239555b5dac3166e499f4ab6510c9b071eb403111b1d51b97195af9cc2aa65db79f3b84f09762": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331323a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf273a75a5cf4923c0b7ab99dc4eb485dbf848acf74babbd40295e54caaaf41e505891996968bee93eedcaa8e5b4105c779": "0x16476866c0074663b7d9046023a2b3fbf447c833f4fccfa3dd7a482235f1ec7f0c454e444541564f55525f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf273e7252fc1f23216876fa58e3aef25ea4194458149444dc0e0ae7addb00b669d89f3979309ef9eb635f148c2b879e878": "0x34a3f0845fecdf74f7aeb569953da8cf8f8217a9a167a4e7d6b3438d8bb6d82817414e554249204449474954414c205354415348202331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf273fe8b74e00be2d5b1eb774c777767bb4415d4ced8c9de7ba415022d5b356f25eeb4d9dcd522732b2c87520e29e66044": "0xaeffde5a4dc7117e4cdde2d3fb3d2afc7b2f710d5d66c55c5d1d7c5873598706033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27454aaa2b1424e886ce757cde7dcb36ef295175d63624a3f6e510b8c189db808a049704c4b99f49c2638e9d963d1a3ca": "0x105c06afbe01ff98801bf3e46b96d61d0d7aeadf7af7d6c39a20dbf946b0fe4104303234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2745f3ed7b0f17c656c3bae95e64ef524e64a8c8a0cd5301afb20483923ad8427c597ba471a6fa868947270768bdd2713": "0x1c82102e4554587f23cbd4bfdb0f43c9d2879d18feb6102bbed977930f695f220233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2747c62d525d486a49a8f716dc64ddcd512c0e71c62cf1da0300cb62510765cc22eb8eaf487bd2abe160f4c231e28a340": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27491b968ea371852883ad125704b0ba48e81ad73b19ae9a28e6e7020f70d862a8e379ce88dc1546a2a8724a7c4b5601e": "0xb8a038b439b411fb7c6cc2d7315292a3d1649601641cbbe0825ab7fa90ce30020231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf274ef942dc8366e68b9e82fb8def4a0ceeccb809fabe7f585098c7e61345f71c2e651c9fb61f16ea74a5ed6279a644d74": "0xdcb38c186bf97625f108b4832981d966ebed50d939349d4437a6f538d40d56760c56616c696461746f722032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf275051bd70eaf7d2946e25174a25beafc1ea9ff7a769863d12182a9439c3666f3fbbaedec8b5427d3c3e93633cebb4ae0": "0x2a5bd5797da40fe8be1b94dd3260ef86d6b01cfc891c5c1cd160ad7fa198de57066b736d3033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2750913f60cd84d201ee1959670fdf4bccc2797a71c48e7e7f6defcf2dfe8c379a521c8500c9bbfbc13c8513cd5cdfa3b": "0xaa18b3cf52cb27fd19d5b80fe7982ff955e0d5124dae26ac360056f401dad84607416368696d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27529ee72bd431508bde3a88f3aadf4282c35a5568d679cc0a70e5b714a16a87450270f8ed184d35e961629aa7c364f72": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2754b24bc7acd0d7883e296a775c5b9002c85e23060a9c8b4598f2927a796f8062aa3843dab76f9eadd8b2f36179c263e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033630", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2756ebea7da8902d2c48177e3dad442771644a3ce3456b8954eeca77a5b67d7e9d26eba9f922b82daff95057f543ed03f": "0x447326399643ec639a0bfde97d8b37f8dd0ca9fcb3c74a1ce017f0476f3e2770035631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2757504984d0dbf6cdc735ad4736bff8b1560de907974c342ad34bd99ba8b530cbf89b39a10be019f9abfed3649470718": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a0b4d454c4f44592043544c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf275935d7c517e7fcced318f2d4a6e422e92f63201ab158aa8283fe585a2bf19ceefb00c45eb7b9eb6063b2ee66a108532": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2759f06bc58e1ae9850fc3babcd69da0278c0205b88370e3af02a0d22ff0411cb0335a823f02f604c692a9bb1914f2262": "0xcecae006fbf10a81337d87455340ce6112b125a971482490e02d75a27bb2c33c074561726e5832", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf275a6fd6a3d6602dc9139a95d8168f765dc19a1fb8d9519f281e155457a5ae5e30ee6cbe81b70db34a18c3bd72c67244b": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf275d6a7d09d797ad493c7ca42a7857db7461021bfbc5b35676c92f37d8cc0205b39ca70fe448ddf0fdcf203e2b4ac4d07": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523434", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf276051d7964744016a036afc75a97fcd2384e257ac2372c996a4180f6d9a9a0e16631cc76929c600468583e8d798c1760": "0xa43b2797bd4dd454d7fb0870a2a4edd62b39eea0801f6baaf09b05c8634b5a250232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf276221853e4c1fd94a1341840328ad4fc12c7ad0576988c680601696eba2ec9b035e6f99fc5579637089d06a24d3ff650": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27638143342a9b45d19e9cdd58319a994282272e3e8b07aa02117d8a80fee926dde3a9417a2809b971623dcad89445a3f": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2764e423366369b346b5e82456f9d99d1b8296804203c1734a4dd445fde8f702f106965c6a6b33e44896af15ad093c069": "0x82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e745034956", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2769ae8816d1222b582a1348663326c6ef201e84471e485a37aa3988c97ad57db1297d862ed5405d864708654e430260e": "0x5a5f7eb7050fb96d8d7895d9afce428a064ce66e3b094805bcad9a8e68cb99341050415241434841494e2d52454e4557", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf276d8da789c2d622987b4e50b56a1e55312c0e71d3ed7229dfea16555ba040cce63fba1fa33cd5296c4393fa61114a86d": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033537", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2770d044f20ae77f080ccbe3e419c5ca706b7a79b3d933c72bb9ae21b97fcb67d5dc1811af6d5d9c412545e6ce7eb9a03": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313439", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2770fdb80ff3c5bcd4c5167cd26bd98751bded8b683a29a0938bbef126bd9510acfc57f2332a8009a305e94190da89569": "0x0c841e6aea307d8704d5b7b7b71afad58548ce47dce090e25d01b84925e5c48d0b43686565736563616b65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf277c381130cdc1fe938d65794a88bc78e541a4100aab4ff5eed5dbb5245c488365a4ebe149b8c3d5462a8e7609dff226e": "0xe0d744a6f291a2dc1e6d744d5ae0747e314b046739be170638ecc185ff4a9b5f04494250", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf277ed5108a91ff85f2261e35bbd060cee6ecbc9b76728dae4396541cd517384e9898d5bec4875bdd1971c97041fa28111": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf278090b2e15597b078bd62990fa1fa65862d4ad80a2a5cef99de5288c0f299cb7fa7a3e41fb2db1a4c23fa44892be1360": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083231f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2780bcbbc406269d4486f3e91d23769d672795595ce1298481aeca61391ee534ab7955411342e091fcb079401a784d438": "0xeebbde3ff2bb37ca11414154e92c0521ac8051ea48d0d84b39714b2347763648033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2784b955388235e67e3cea884004e14e01ca9c1ffaaa251b220fbca62f28d6936272e11d052c4e995ace722bb6c2e8d26": "0xa8b5707defe6889dc178861ea7b68861fd0ab5427b54119950e6788afe1cad2f07594152494b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2786fae82b1deffc5248f74a97f59a999109507526c7136932a5129122ab622dd17ca59db69ebb7ab94ede6f7992fe854": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818076c6b736d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2787acc23b92595203a1f562dafb922c42d3568072e73e8e73a9a8cab58e10779bcca9cc9d3da70ee41af6b5682fa1170": "0xd8004911e882a05affdcf81aea45f611077f07a29dacf6b754bb69ab118ae06704303335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf278be0cd4c442d1e710bad9e7d0695b0a055acee05be3352c7d09340c8c6f76c87170f1072bc0ce873e529381c4f5c8a2": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083236f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf278c49887fde38ee6df46e120c93d927c2ec9fc5a5358c74ffff03b8712e8dd1e50e93ca0babd01dff5de303a64f07f3a": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2791c146ebaf5b389673b0eb9e407ca3f6e5b9e2cbd37299c34a07fe45c6f143aa715e1bfccc4db8c82814dd82a0aa35c": "0xeebbde3ff2bb37ca11414154e92c0521ac8051ea48d0d84b39714b2347763648114f70656e476f762044656c6567617465", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2795efb02ecdcb5cae7e9002b6f14e18b8056875c26b0b99303e102f56af5b7cd6494578bfaf7eebc0f251a93a98c0710": "0x90174218ad9d5531fc97c3b347e073d347d157cc40a470ad89b75604b0d9dc3316544f4d41535a2050414e5441205248454920424953", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf279c598d130209ab0dea15637a5b16be71a7938fede32e1275281b3eee5708706d88444a6dc898a4dec463f1eb298463f": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27a126218545699437daa58d9f25c746812c0e71c9f53cee8937a8a3a30c639efe4e9e61faa222953bfff2cc0a782956c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27a35572e7224154ac488096cf4fe0ab4c21bde30a8d12e4e5d4dd612ff510d84e23afe81bdb222e1037a7c7fafd8962b": "0x4e908afcf0fb6b394bd1a043bc8b226fac33b4742731b9cde5d324f450eb3006054b563033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27a4588360f2c57b5fa61037c04a5855ca4242b97bcc4600c1de9c6f1a6ddb74b69d9521127a377d2717f6d9fed5ddf4e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27a9c318a8efd0e10f68cdb5cf293f637f4c6e1ea78fa82de3a28d27e20c93b4b8109fd93489d864a73fe7bd4eadf2061": "0x50ef3cbba6eefa5127e662a1286c69c3f8cd10aa328d394df9e69919af449b450231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27ad4a6fbf90015403b4eca241d6ec123d8c5a6bb60ac4bf7517a02c2612d122e389ef4684a34b5f7be058113e9e74c75": "0x98672c4edf6d578c3151aa2e8d55431cc874360eff95c4592d917fb09a6b63160c4d41474943205441422d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27ad71cdca583260a16b707fccc1b613812c0e71cdc8163ee018634a900a6e973a87e8740b6c9c4400ca1fae2ac8f4e04": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033730", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27adc950ceb58a74605150858156784c4f69837f9346b574bee364518dfa08ec7723533632fbabbab594623d83157a67b": "0xface99d3401cb9b45ee1bc0ec52f4cb35914dc5ad27806230534230eedb8413d0546756e32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27b7491e2d554325cf8c4c05378618e11d6ba1aefd3bd5f72b993e0b6c5f9ab818e96e654e2500b1a547f5104896aa660": "0x2843d91b23b106e3020b7a903da075113d1aaca1db7ac30e119d6250fb6f5961075b315de28fa9", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27be6559229bff0883cfccecdd480b917822adab3c579b87a5731f551e8f311cefbffbf514b27b94a6af35fc23562c945": "0x18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc00190237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27c0aa307ca274a979d8506afc7cab4d55c05d5f192c927b30b33c85470b53474f2a736a01c3c5da905384329a430f22e": "0x5c05d5f192c927b30b33c85470b53474f2a736a01c3c5da905384329a430f22e074a6577427265", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27c41a20a0334a703bfaa50967247e53003a56ca86460efa365897ff7affd5f6d280ab3a0d857b37709ce67f551d1f88f": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a154b5553414d412d414e4e4f554e43454d454e5453", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27c7140bfb738fc55d4104789cb6dd1f00d32b36853f65bf42ac0bdd182edd4601c8503e927fcbbd1f34f1f74048cee6a": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f063257696e65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27c7591c39b0c5a92489bdf587bba9f6db466b09ad7c824d88e8548f5587ba158415f7514a0d0dd7c18144f6503507f47": "0x12d9c0035dd422388e6d346f61df3d9f3667f8ab761c8c57120dd61917976e10032d41", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27ce410244078329893d4dbdb2ea4a0517cecf08ce1f6f9fbe70156ec68ff04ab4ad0dffd5f39fe72c955b7f319d7740c": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216064c75636b79", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27d96139d68d6f7956c00115557f1fd35402d50604742f5071645e00cf27f318d0a0fa805bda1daeec21e11ff9387e923": "0xd453b6e497b6a89979fb34eea715720d37c2381c8c51458be04296fd059dcc3a033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27df1fb605d3871d347ec19e8fe964f32148e8ac56079d875671a8e379e8ce3726be04f32f36a3f8237c2713dd354be1b": "0x9a92ad7c6dcc51fec9f6d98f8316406ca42bd04dbb029d3ce454330a20fac0770230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e093143bfa10910f74f3252829f6e8ab4b4df0af75ca82e3289a23c6c32eea3d2ad337ce4d335029798b3735c8d6367": "0x0a439f839504ef07c5cf8daf62beb17546e808ed1026c8a683be8207245f300f0b5374616b696e672d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e0fe6cb9da98d799af4449535ba0076f87bd083c89d247ea03cac2fb12a410b3f44f87c1b523b0bd0aa3375d4dbf193": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e3adb9aa8682e24ce823aa226cb8123b47150da85f064599455634eee628e2f775d06bad83bb3631130854914e96d01": "0x5ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43035633", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e3d25abb9b49e97f19f73e27d4537613789e73dd3cb036f57dda3ed96e000aa87721b8e19205610d2625e3847f1a06b": "0x2aa53f55efa82a9820f3c2569d4e52dc467475a1a11cfc9861ce5440316edb7a0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e65087dd946c27bb1e415ac33130b0fa65bbeb4425c55a611da4116e848b0cc39686a11f88dee6aacceac6bc5eca657": "0xda9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a0b56616c696461746f7232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e67883c4dafba8127e1226fc8e17468de4a3a5ffb49ce7652bd6a9f98cb78bc68c2360c6e55fcbd6d6d5aa6b0f2347e": "0x86b7409a11700afb027924cb40fa43889d98709ea35319d48fea85dd35004e640a4d6f6f6e7269766572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e6db057075a669d13d6945b30d080b0ca4acfb773d3f44cb7ddeef0caf203eb82d3366bef8d775a0533ef152431b633": "0x3870abfd18505f673c1808b61dd0d7067a810a9719c2ddee18f9b879752f4c500b53746173526f76657232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e8190ad4d57e14b3155b7177b481444b8774ed1e7c90fd0dbe40fe7c6a8d810484ec59624b59374a38a8bbf9d91ee1b": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033731", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e910be4fc1f76c8e2dab1e55ea0497870d7ff9f5cd0e46762d7d7d1c8dc840a4026755fe13c51237ff8601377d4fba3": "0xe8b2603f6baee5bc32a9b9e4eee9168499fa553d35edb56aef0035ff7e1f165e0c314b5620f09f8c8defb88f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27e9c08143156e82cf22a2ac64d702035d376b1daf289d513fd22426812d5a7c48a58dd121e4c043627e00fd216557873": "0xd3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a23408436861726c6965", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27eb0fb5da726390701ee9c4cf250c0f162ef7ddde3d6fa33e5b617265ea9af26a64e1248c80b7ac1cf2df7b171889b6e": "0xbe4bc35b26cdc006c69c1f827d4bfa75e4bfd4ac0094ceaeec8ac70469cac51f065374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27eb5e19af9fd94f13790c96dd5753144ca5164772b835ac12c7e86d391ec217e65f05be0f43b75a059fdb0b3e8a1c44c": "0xcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec47711416c7068612043656e74617572692042", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27efd2aa9904d84c78e70a8cdd10accb1a46e73069e5a05c232b0487e1523e7a426270e43445d0dbc1744222fd4f6881c": "0x60c6e940d5c74596755e6bb1b31ec98958db10d841dfaf66954b5542c95c462b0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27f04a065bd619df1e2c308279dc9e8525b7812d3e31417cabe45153f522a4047b09e9662795cc7c7372cfb02f6dc3919": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b356804554b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27f1b8c1c56d4f27630206a19c89ac452809246069a0bc7cee32210e5e5c1a523e10db11d0d86abd29a3979e68dc01725": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e5105444f444f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27f2b05bc2867bdc02f22b17c1ef504f412c0e71d4b14d52ccb248e416cad1ddfc7283a09f2625c601528d29f9a294b4f": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27f35b91401ce6524d9a9c7fb9ed03b7e9c322a9e20637c9a71e4d131e647d597b1c600dbec94bfa192465e3991a15b63": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27fa714c6ba99619fe4c576dd89b53a722c61317ffa5f84e38eaaa44e333ca7be9924b445ee9e6e275421200ecc58a9b0": "0x0ce0bbe155c5f116187af43bae0bd493872f436a139e23d9b26289d0721a310e0c56616c696461746f722d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27fb6191430b9e8731f77bb822cbcb63631918cb9b9c9414a2cd4dd7f720cb98fe98cf852636fc4860845767989127e7d": "0xc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d609436c617573697573", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27fb74f09333c1c1f27317b348c589ac9e66afee7026bccb1c5ccda9ff095c278ca0c40c7d44f645a9e60d2c1cf49a305": "0x0e993f475e1085cfe2d313b1089c3fbc33c78c178ed19bfc94be3d7937709371033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf280129ca7dc0d15001bcc0788918ce3522e4e174e782224c6e32c71c85d399497af3cd209216738baf31130ed860a5877": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073033f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2802d367e89bc722851768bfc9c0b56e54ab3e893de103d05f3e6e5f210faf6fb40fddb03be173eb3723cb33a074faf34": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2802d8d6177c25397d6b472b80ee0fd824680cdf69422609ddbb2cd596ee4366b84a50a3f17c0a88b9fcab7263852cf6d": "0x0cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66095452454153555259", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28045e484681e088d0d62e4869fc4bc8a45276fb671d5e24c15c73f6766680b83e94bd709644fec1d5829f1126ef1fc2a": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090b33207c204b6172757261", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf280c3b7f80f0fe6e3c42e1c83a3f87ad94ec19498a19021a78fbf00ef07d366245bad3cc89f5837a7004b97a50c4a5e0c": "0x128e3b8a2d3b98071ba399c17206f84350e65653537dbbd646cb5908efff9d49095374616b652d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28103ec254905fc4b190f466efa2a392ea2fa6c11ee56da6d5e51439a0d0ee776c8b4f0f6a914cf6bd9ed8af27db80252": "0xfe6c31fcff28694469c3d4c1681270bdacf6edf7ec39bda6c68cf25738268b79033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf281126b31c52b0e9c700b2d2c99137dfdd6e2246ffbf94311de0e749da628bfe1b40ec0251caa056fc6c2050b09074a3d": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51054a4f4a4f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28118461768bfed729087b69e9d3a933188d38e0b14f3b08bed993ea4fe1b8ab124190191340fe8de0466ea642fd56511": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2816611c9bceda771f96e2dbd296f1f5fb0bf0c9e4095ac5ab829224395315bc4e298b21b180d6e9a86e698f974d2fa25": "0x8e76c9299f5a2046beaa5266ac0ef8b7b310c929704f15d8e6657b371302202d04303332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf281665f2c6a2d1f21c042ae5f12abb684e852fc4a048379bc123ee21bdeb4c6a4d94ee131b0920ad219d6cc280b0a0965": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf281c1d78d5b5076693f2571911f26503212c0e71cee9f575993304f4b1b5dd21ab495dbad0b4613f39c8c4f49ef241406": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf281c389c2b60c4655dd7ef61ec53a85f9aef5713b3583a5730c08c16d252f9fbda97536c8a26168256b998f7e9fc1c602": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e5108504f4f4c2d3133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28209abec313cd5f943ac7567422cde1613ea937fa9da7a04ab5ae026b321323ffbc3f6ffd24898500ef3eaa6b2353613": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a0a4d455a5a414e494e45", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2822c9bc287e6aebbdc3e6070407a7ba1c0f326fa9866f007e8ea4125d5364b3d7061ebbbd9a24341c40a3ad8de3d113c": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e5105544f544f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28239334393b581161cec98eb71582d7ac0e9ec31daccb76e9baaa030b5780a85787b3f1e2ef54fa8f4b857c64552a4e0": "0x4ac4eaed36e5c54f045b46cb54f533b2d3949c0ca7137e89ef03ee3f56f8155f05f09f8ca0", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf282c93184ede0ab8f89b93d497d0e4c4c12c0e71d1e59aa52904247d6ede8d053ec5c65dfb3dc8c1e632acf34c030a255": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf282db2fcb58fad99c289f7a86656931e12eab66a1c3116f15f55dd2996db419e367106043a4c5491a5eeab1d33a17460b": "0x02bf32e061073c44300056b416cd66a4fde1e6c120dbc0089bb65134f5693a3b14636f7265626c6f636b732d6d756c7469736967", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf283189914382e0e073a81098c8a4ceb1ace4f4b5eb5e648247f1796de1f52ccb6d6e763684ab786e21239f26af6d8d252": "0x9cb0d4ddd32f9332dac7059de238b8e489afb55502d1756d7f50b78b58e20c700233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2834e3c780f4d8c7f3fd1c165f191c43040d9bfa0963116a9e97d84f9888882bdcb6faa12332997b7f5b83c7c75532216": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c49277067465636832", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2835fb70434ad8c544e7161ee304031d7026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216": "0xa02f7333e25590e4f568ae8a2ddc93a879e92e48fa3cf1666ac56e020c106d550c53797374656d436861696e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2838555451ee7fa38eb18cd328263423ff67e4658ee318d7985399480025fa332958346cd623a025948cae8a7db36a81a": "0xec8c97edfab0a07c37625d53be2075b8ea64a00ca71d80cffe94edb44d215e000e6e6f6b6f676972697372762d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28388939cf4687fd61cb25dde536b3f654aaa077ac4202f4f7e1135489106099452441129dc5aad89cd5dd4335918fa3d": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf283afa21b810c73cbc3a8c068a6fefcd912c0e71c9d62c402a345adadf6d07c72b92a9df6035128105150414c0f759a23": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033731", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf283e226ba71020eb0449b4752d08be9c9ae3aba9a0f0d03d9fab3ad97a367fe66aba07ac0f7fc58d8dc18eed82f8c62f0": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f33", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf283efe88997adcc154bb4c4b7506e2b55463b64f13f694e789b1c89d219210b4aaef27fcaf8621ce8103f88e3951d054e": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033536", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2840512958b7adc1d1931d8b4abc0d5f54caba24b45e5bb6eda6ae45de9e1fd6aa64fb43bd9086694c4935d21872a5502": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805407f09f98883133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28418b12c5d61f6e70ec0578815a44633a8c96b926e3a1baf17e8f1cab2e0df7229b36c661e9d29f4c005b2dfb0835218": "0x6a1e7cf7558378809fa376f7eec7b065d30759f8a4e7b721ec2ae74b313f08550232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28424750cd8689f881673991db45b14823cf08a632438014746be9061a9a74ccd8d79204032cf03d8fc605d452647c133": "0x1eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef48430574697073", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2842add3765cf6536011a29b408969bec8e602e63afb364ac583747b0a8bab092d5b20ee98f0495ce7562a8c992ac9f17": "0xe4a66ee66171e3238670377bc9ffbd7cb4bda47baf25e6ed80c2070942ee3f721070617468726f636b6e6574776f726b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2842cb762bc9e90f859325df5f7a1b7f5dcadf01d571672f755b4032af1cfa3784d389da711ea341209b86f840784937a": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf284dd8e83e4115e0710c4a6f92f8ef075f2e0c893582b2b34b415274bf95b65f52ab82079a097a9ed28349eb9a7bae745": "0x38a48b1b98077c557c474ad091c854286fdf929b0e710299b16daae9e0ae4a77064d61676963", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf284e13b8771645bb9c5f38e0d81e31dd8c0d0a4ad7841c483d4cb7813af9550c9d7c1b182613bf27a900e5211d9b64d68": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28505622504ca5ec69b4ee65beb5a1d47bcc2112d8a9de4645c4ff651aa6efa2f301c9d6a2355f1bf0e6a80826f50016e": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988833", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2855c311b5e502d7a7a2071f1b2e5875ce26714e05311dfb5e182d27b7f0e2c399c96ccdd81c25cf47e9c61315274631f": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2856044625ae62eaa06af331bef9b4bf3e848eff972706bdacaf38bc657028f303d44bacde7b359b8595fe7a4268e7418": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a0b47414c4154412043544c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28572931292aec8386fd2265b8a2ff8b68aa121a03ca81740284a3d24ea4bf49f22578caa58441527a76e8464a319a015": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2857bc767f3c97fff988fd0f41b34e326b8d56768e91cbccbdf754d7f60db1fedd96eae27b591e65d2fc8afb99b27c20b": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2863d51a50e2a040df6b12294462b8073067a2e439cc384440cf187331543175270b479ba695e2c4d6ba9528bbb6be460": "0x5a5f7eb7050fb96d8d7895d9afce428a064ce66e3b094805bcad9a8e68cb99340e50415241434841494e2d464545", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2864c5bec13d1ff0385cf6d3d8593552798672c4edf6d578c3151aa2e8d55431cc874360eff95c4592d917fb09a6b6316": "0x98672c4edf6d578c3151aa2e8d55431cc874360eff95c4592d917fb09a6b63160a4d4147494320544142", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf286a26c691af61a1cf897f552bd881ae68011fa4c76d86408e873beeae9385075b1f735e05b59dca7fee6147c14952770": "0xbc63ced3f8fec642128f2aa9c37e989a9313a67e9635dd85e8bd689ae8d0ce1d0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf286d609f103e7771c593f381b2d26a7fe03460b53d4200f03a8183f00d5ed6c971942ddae9065693b4702f0f782e5c553": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083134f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf286dfd59b7c01c1691d8f25c46f1e638672b86a19da9f10eab2fffdb74143afea62356c6896c265dd18207867f2575110": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf286fc3cf7a3b78ef39d1b9799193dafecf063c0ba3d0dfdd209dc5b98dee86531ad264283fce758952e49f8e6b7f85c7c": "0x54ec6a7bfcee3ac00ab63b98e084f1a1c4d0e82ff63c31387aee91c9a721a81e124e656a6c6570c5a1c3ad2073c3a17a6b61", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2876b89c310e3d0ec6ad7349ca30194ebdeaefd68c861d01a4472a1c518bdacd7f99b6c4a0b64ba32d74995a21405797a": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805407f09f98883132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2879951c2d47788d64c265a580690d0e4c0c86652faff45a0e4a86f5749bf813d9d40aac848b8c672123d7ee2503a6d53": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf287a93ca2110fca6305fdd39cf046eba06c6ed8531e6c0b882af0a42f2f23ef0a102b5d49cb5f5a24ede72d53ffce8317": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf287c93e4e09c3118cc211d3fbf53f8c1a305b166542492b1615c15fb92c573ee387b90427312d08338b9c211b85a27a20": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28810385af8152cbd391955134fba2fec81a73b784a15727dfd555a15f61575f5f1b8323b8fd41416dc9eeb4df87acd23": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2881932dcd906c93391a3670833a85edae8e0a4bce889b5d71d9c9dbcd6687dfda6458cf22bca0a342f5db49d8258ca6a": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a077061796f7574", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2882e5f9d02a3ef933907e7b8449417cb12c0e71d4ebd6afa6a6462c87da8f8da65e320b207a3958a76e854432b5cdd02": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28869befdaf019f3f68978f837aa0a6b95ad7885e61fefa8373066bbb08ffe85c08ecd11bafb3a9f85af75a4eabffaeae": "0xaa7880fe9ca2bbf331fc13e40525dcb0da661f143df506fed76d8ada3db8f55104303031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf288a6f5506c390ba1d001f320e2245f4328e219b7c6307a185ea3d7d203fcbf5b78176fc0601cd62b1a3ab95e81e06116": "0xbe4b9973a7f6a5586a38fa295ec8e64d4026aa878c840630a7ccfa7f3914d1620d474f424c494e53414d412d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf288b83d271455307fdb42a6decf23918a920799b25e259ab600be83eedfa7807ac27a842f005dea4a2bd49799840f4b3a": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d81804763033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf288babea6cf0a5b1540770a29aef8469f6cd55c3ecbc354fceb81b0ac3ae860ef4a3794e1aa9e31477de7c2cd36ccf11d": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf288bacc16a6990c6752a600138df36bbfa620a613e0049a85c71fab0328f7449b0a9963195eab763760e1ff50a10d4404": "0xce072084c159fb3547381b718ac1660d14030e7bcbe9db68eef0f7c0e340f33b04303035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf288c132aed752df1ffc83e682e8cb9c0ed228fd275f3f92e8b6ccc56a9437582dc59db70153ab33cdd77562661adda60f": "0xf4914e62f037cdb798c40ea01fd56e555b77635e0e9b7175b98bc9514021756c0f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf288dfcf7145a2d07dbc6dc199850afacee00e404cb030e7bfb50b9615ea9a2f8f75601ac9f6128d1263a7fb5d22de741b": "0xfef5977196fe3fe5c456a767e6b06013ca62762b282de97040add4ad2c53db61033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2894d6ff01ce98efb73b650a4b774379fd8900a50ea497ab51afd5227503f91b03a91584b72146c2e485d149cf67f543f": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2895a7e0c21e153c5b1e9c8ab30676264196375cde4e10495687128f72d513b94bc323bbe7dc36f305133ad7cea4c6da8": "0x32068fb3b800c5df40df16619761b3418e40d9455784b6a293d2425e35ef2c270b434f4e54524f4c4c4552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf289a5c85a2b62855cb64f81d7b447d8c3449e6184747b236ba5577c3560b7739e35718c65039b8997b7e723722512b310": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d81804763034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf289f0c7284252c2b2bd6111539764c636ca0ed2d57f858e89592c76cad4ac00258041aaccb971171ea43b6fc39a4c4c1a": "0x9ee1fa0d8d4e022ed5680b5925d19718a7ecc9f8f2ff77de54f0822978d277551253686173746120436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28a02d541d624e3f86986ab3c97423cd412c0e71c89b2c75caab9eb9b3ee5a918dc734c5c595ee569e64ed37a306de974": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033837", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28a2068796da680669082c83b0d8ddc6aaa580379e5714c790f17e4af93773d158e30eb08f5a4d24abe4f535776b5721e": "0x4edf81ba4fbeb6ea13cd45ba93cc1d689a6e2e5c6dfc35a458a971823a3242180231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28a2569fac8ce42fae78d6bd23582abeb927f1c23cdd2161cb6bf0da7abb4dd94ce6a98ff07e9fbdedfe96acd3d7dbf5a": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28a4dff2cbc5c84c220d46b8114c4fcdba27a87e5999ee8830465b09da09f16adfaa168d3aec122953b44796a9db5157d": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28a92e7bb0410302274121a546ca7bfe212c0e71c9fdf776b26f8b4def79ecfeb98cf14bba80546f54124e4725da6036f": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033739", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28ac86cf8a962a3e880c844ddcf10c77a611f3cd11a51748d355ff0686f5c5bbc2a7b0e91b6efa0fb4f9aae77c53942c8": "0xc43aabf384c6baf54ef9712a96be7c46533b538c05d4e6c687fe09b109664b28032d4d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28af49ed4bd7a685e31f6b770f74980cc305b166a309fbb4a05d24e70b726218dbb1b5d3e8d4e1488524481032e0acb00": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28b40ffa4ca5650f8c82e80d8155f686124edcf58959173bb907319517828c0e5949a178917099537bfa4895695e5d00f": "0x98989f74514aeaf57d4f41069770242a83d619c9ae5d46cc05b85136edd537760231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28bf47da292b8ad6c3110455ee972d87afeddac420e696be2b3c613261dd7d84a25b6410eca645efd87d9f4030c7bbc9f": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28bf7bf3e9db575299831af37682643db6ec238210f082cca5552aa2ce9a0d1c4be9c7bf44c04f4524ded21f8cbcc611d": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28c09f47aed688f8039f80ce6956097da3525a2d8318f0a082d428d90eeeccba905e0001fdad3a04d6abe49dd79e15186": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28c1dfcfe0f7184d52ec4bee559507653b2f0176465f8cf99c213696538dac784ba8c59e4f577c6fa88555bb5f28ecd35": "0x749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b7570748656c69756d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28c5e4b05bb62da0cbac68ac69e5ea5acfc0b298393d72240ea0a06586ea1227e8c84f786c7fa05879e1ff28422017370": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033932", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28cad469349d96aebe667315ea8c7f907daf0804d1bf147f716661acb2ce7c796d0d655e2781c22cd138c4e6d6edb9b0c": "0x9642d0db9f3b301b44df74b63b0b930011e3f52154c5ca24b4dc67b3c7322f150573756232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28cb23603f98695797808da60a37bd11f97a78ac6bd50295c46bc350d252714c70dffccdaa6c1740dce1da940acbec1d1": "0xd2cfdfb80cb90a4a5826c98846a367489fd25d3a2561838fa372f39f3f7fb138033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28cddf503217fbb2c01228e3df0cde1322efecb509bcbfa0ebbe40f7bbc6a74d4a90cfd7e982ce06c2f11fdcc70efeb5a": "0x7c7d2fe83c4af79c49136f0f8c5f1a00cd8d0aa91c94fe74d0145cb96d688f66032332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28ce13b0ca6e2330d9c6c2ea7d714324cb4f54529b00e5295e6efaacfad2de17a22cfe1466f2ef142caf1328b5a701005": "0xaa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d0e48797065727370686572652d33", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28d07f92145d67784590a148189a6ee5d9654bbc25d7891d49151110003c37da87fce6eb551768c02e47eae754b61b466": "0xc50f089e43c19f3f4ce606cd994bbecc50bf8dc53e970c0c1c592304f651966f033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28d219622e65973214a92fb842af92ffd4a18d3235c574d9f25aa3371f0190be83bdc423f5b77fc310390e753b229a952": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28d3a18f5fc9112db250af9b04d92a7bf402b7e0857f31fc28e9c6a0f0970cc810b66ad393edbe120b4d97f5ce99261c9": "0x88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28d67a84b4069a6f636ed06dd005329f1120460743583c4ebc3076d422b73bef41b48b87e6c07aeecb07df3cf95565eec": "0x128e3b8a2d3b98071ba399c17206f84350e65653537dbbd646cb5908efff9d49095374616b652d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28d7e3c6390768290af1abc5436b80b2c97d5a706146081fdd5ce77ad4ee232f351c4bbbce94596c12d300efae588ce9e": "0x142eba87db082b693b5f35e88d7a70409b0ddb61d430abf218884d4467af102404303331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28d8c1c92a879346f1453f6ee18eec0a51af4af68069a4772fc4e73cba9d1479943982c64e124ec73bb1cbc70f66bcf3f": "0x00f53cf59ee4bae1fc47b5df521d48a3cc2d02d5c15fd5d3bfa3d6a4a2e6a57611f09f8c8a4164726961746963f09f8c8a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28dbbdd354383e9438731c56ffca55a16ce10c51e89ab2907983cc8b846d9d1afa2f9700db18e176c7fcfe709d0406339": "0x86b7409a11700afb027924cb40fa43889d98709ea35319d48fea85dd35004e640a53746174656d696e65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28e26c50c3f1787beebe557f64b5fa734289fad9cb619fa9f9b77fd385d003476fdacaaac6ba7191bf5486aa09e1d8329": "0x707c9246c1c227f1495885cb2f4c59297248ec5abeff2d0f68495075a16bc17a0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28e94df84b52d02aa15ea48e0b82af07954ec418763624a46b49693114ba91a0137b37c1e47cc3fdcb2db75c9c4b11c79": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28ec2e6f95318a0783a464b6de2c96a7a5ac7f6af5aeb5364188840d02f0e74e813e6d9cc0398d6994b66727658a4fb30": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28ec9397fb62b151d82d56c66fb216bbcc20f540f6c1dc4dba60d21936788a5bc5628f26333e27b14cd091145d92d8f25": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28f312e4f679915416400fdf70a92471ffa98b8b13a1b03a3f86748ad19edb237b86ce74b4c4dcc08492907df447f7026": "0xfae63fdb20e3ec7589586b14ea019731b5089e2d1b22a7911e48603a5939780c0af09faab432f09faab4", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28f3a49f3d43586e2ce50911aea0140960002dd621e14bf09425ab305ae1139310c1c0f78f2d3632c7ea507feb7f82900": "0xcc9f261e20561ee1a137a7c03770706d09a6f85e36e7a313f04d92faefbd3d43036b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28f7d791d3aacd3d0caa46c42e0da75e3463e61911efe5b07ac64fbdd0b388a7b9569d067a6a34f01ce88bbfd9357f29f": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf28fb4051b925d1271466358365212b6bd564491c88a293f54f2fe2cc09b0ec63f226bc77ebf6df8f998fbc7551d0fa10a": "0x4ec0381e4427ed6567f7a5c328288ced36c33becea6ececd8145001f4230ac1b0d59542d5374616b696e672d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29025a41e3f449cd46ef58c63f3e1b6f936ed432555d82a6fe15f2517dc871f1d02c72d8d5aa1bce703288d180ff1fdf6": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29043b6de8dafbecb9dfde02a5b7f5431b65d8d7707042e22fbf2213c687b330cafa3a792598536cb5fef7aef40cdf07c": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033933", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29065839bd178183fbfb7fd12220824f968ae914b1cddf602f7e775099eb62db646dcdabf6c32fc0bb1b951e94130503d": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331363a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2906e1529cc4bb4c08bcd87af5938145d5aa67923621f3a3395c3e2a58aeb89756e2dc11ba9ef1ac8bd4953cf2a220134": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073130f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2908b71a779b8f1d7862ce857e0e002cf2494641f85af0c7f9d2e3c942fd250dd7c2ecc7e5dcc401fb3ebca0573edc571": "0xa49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e0a4b534d2056414c3120", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2909433256e5279bada3397b9805dd81195d056d702a9431c14cc2c46634fcb656e162dca4b5a2100789373a07695f6b8": "0x6a81f13352076dce1dfe8f357fd805bbece6ec16efabad52a2c24e6824e163150fe29895455350524553534fe29895", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf290a1cf6de13c900c2fcaae9a03136c1012c0e71d5e85f0442d53fd7419af7a23a2908f88ebcced94150e396bb64ef644": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf290b3eac6dedb823eb7dbf9f5615bc0d412c0e71d2ffe345813bd81eea02b361a65b0b88ef0e5ee8a0a2268a8ad9bbe2c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033538", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf290c655b3d9ca5d7affde1fa4a89e43b13a29d1002e1c81fb779d11e082da66b45a355067ab816aa015f5d5ce3d927068": "0x9aa6373b24df370b863773f45f2bed6ebd80c886c58b4232e655a9b130b6d6150b626567696d6f74696b4c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf290cb66eb914dabd4d48b3ddf423383cd12c0e71d0f4707cb93bd1de1eeec36c3e1f995dc51eeedba0cb52287d2fd3c7d": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033439", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf290d41166ba1e5993da33382795bc0a692c1800d8039258f2722009625f77a8203729e8770d6ea72358f165350233ec25": "0x4e531ab22f712634089201978511b49aa987322314dcd8f16fa241f0055e37370c4172696e676f74792e3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2912b1a223b3e6999688bbf8a97215ab4b2dbc35ccf086294a0d24e1091d08ca3b5c2a487071c4fb54070e666cc99e02d": "0xa2da2913d7db19baf0a41dc40a73d75bc6001ce1691c3ded78e4e86387881b4c0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2913af7f52e6a8ea6b296177ebc40a7007a0d37cd4a96cb4e0445c91d19d6c84856f994d5e099e0f911b6855605833860": "0xf89b361ea400867da22fa6a069fdd840819fdc24fee6cc3763b6cf3a8a20246b0d4441524b2d4b5553414d4132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2914a0e6bd3ba3602f18f7a4d6319f53d70610bb9d4abd640e545cf56c9be0e8886b9ec274ea2e4d7facf8dbc575a9447": "0xa02f7333e25590e4f568ae8a2ddc93a879e92e48fa3cf1666ac56e020c106d550230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2918147e4e0e94d353be1c6c52c222f2944ed131039b1a6d98896aa12e996d928f7adb00a832fe5c11b719e7d4a4d9b0f": "0x1a903015b9ceaaf0f183eb409d3a38c4f0c9a685066ed90b32c834940c689e1c0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2925b7f992eb3af442a5645737c1b4e09216959aedf96ab893d8b8d8c66abeab8ef62940b1c6a6ab7228099d72291c72a": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf292602536a51c4465ab513af925e2592514a4ee7a1c85e78b96211b9af1d020030203a9d13c0eac03f4106dbe42d68314": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313436", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2929707b74d7370eaabcc6859872c2e319ac3a89771d2fc8c62e9d37bc6548f67306caeeb4ba49e7aef7c09b68a260665": "0xaa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d0e48797065727370686572652d35", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2929a52a46b17027d6d5846b66bf982e3d76236f0c5d432f6e6b99845a7eada1491dfa6288c36dbafe21b45a0d90488d0": "0xb45b073f1e692d18c2dcebae861b2f166a4dbfd95d9780ffef603c9e61d009350a417461726465636572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf292b9e3cc674216db6bd2b3a683ed65d66eb0bb735fa04cc282b87141ed4d60afada62fc213bda5ea0d0569c2a8c25d25": "0xcca9cb5657907dcb0bb01d335b17564e77994536edd05ddd50524a9355c2221e0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf292c8146024721c651afec91539049cff4b514120fe1efd6da4118dab0e2b1fa66ff2eeaab54af205b2ec6c506b52fb76": "0x2c08cfa5b2dbfcf6850a3b836596d82a9ed7d2d743b42aa5c69798b502b29b57033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf292f26db9e1a10596464efc932b402ef1e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099": "0xd3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a23404537973", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf292ffa09d38524f9c0d1aa774b67c212dcacacf100cec1782c4f9342566de5b4132a012335481dc83fb4d42bcdfcca853": "0x3a0b67c6e4b35133a18ff9c3b56d6cd28662f9e47f38afbfc508543087966870094355524154494f4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29328dcfaf4b0ac7a274e9e4316053205886a977a6d8063db1b9c58daf3906841f3e2577b07cee9595c5c7e98f7b3aa66": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29363108295e372daca2b92b7cbbbebc64c9984b5187f51b9b35d16a7df5b38a2e069e568bf813532ba08068477772205": "0xfe7d71599a2b67c5085142c626641ccfc1f44919270fcac28d2ecfd41e0c7e3c0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29368de12521e294d422942c4cf48ccf200c703a1cde92ffaf1f8312c1fdb3a81140f7e76789d55ae1f0683025c428649": "0xe0d744a6f291a2dc1e6d744d5ae0747e314b046739be170638ecc185ff4a9b5f1543686164f09f949750617261f09f91914b696e67", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2936f517cdc5783a821a4d40c671d88ab5c975241672d5275044da23dcd085d64949b82c83e963a2bae2230af259f527c": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf293c3d393cc9dc062cc10318cfa90edf8f2c9cf52ac4784de6db0c160481ae4ebf7ce0d7066011e36e18948172c05d059": "0xfc659bba6d3985002708101d9c2aea9155bd520c105688751281cb40e4d37163033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf293ccb275d05874df082d79db1d3bdc3076c26a1fb9acbdd56be00d4c44901856929b9d2a879caad6119ad0417e994949": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf293e0b349ed966efe9d44b24fe04ba87050bf01d23906f2dd19d8cd71dcbd3033af5fa1dd042dc4dc1f3f5f86c2e9ad5b": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033830", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29425ecf1d7477bb6ee5778054833e56cad37814b38fe39243c36ec13d832f06e178267058a03d5011f4e06ab78f67e0d": "0x56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b1150c494e4449474f20464f5552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2943fbed7900a24332c116cd5ed62ee005a718199b3c87bd8c24c35f027b2b4ba2789a85782a79cc6a924f9e4241c3005": "0x5a718199b3c87bd8c24c35f027b2b4ba2789a85782a79cc6a924f9e4241c30050b536b79736b6970706572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf294a5e7e6e250f2265bc0fa25d357064c9a992b67797a09bfa4fc79558b14bff0e2ae2b20207ceadef50ecef31d120a15": "0xb85d101c656fa86dc284f34f7583b5f178d9e9b619df6031fe2c04b4c5f07e260d414e47454c41205354415348", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf294dd2b48f94bbb72fb6066cd46e1a0f57cf5689832c7f3a596de7cf58e6d764884c33fa5bcadc7038e65e9361108b10f": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf294f1ce732f38340d83b0fffd53be934a373d025abe0b6342867c03f3772e5e3fcfa7b13d7d5451ddc934efee37894a6c": "0x7cdc1a6a5a7f23437b6528edcdf553d0685f940a4e6e85579727ef3dc574563a04563033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf294f66f6bcd95b7eec2b2de1cf9b5e39f50e1946cc920aa86edf541dcd4bc35efbf4b28671b87c68b5abfb22f655de453": "0xd23f678af47c89d76031edc91e43784bcf9991b131f957d312fced2c5187fb470c5354414b45435241465432", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2951b362994cf98a76d2f525c2b9d58a8e2cbbeac13b1017c8a5a32551d77e89017551a2f9438743446de2dc2ed13ec4d": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf295460da598e0f6061cc2d1d6889c2796ba91845c6ce9f14ebbb24f008964bd395a2c1f92149810d6f6133a905706000e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29577ce8ae8e1ccdd44fdb9bb4cbeafa013dbe68838d76d77ca594e3e55c937ef7886fe2e8e46de8fe11f20cdf106b29c": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29593d3dfe56b3baf292a5b3d6e830c04607b422f959ab305856c1621be625a1776d2ffddfac9a03446da3052d7cd3a58": "0x607b422f959ab305856c1621be625a1776d2ffddfac9a03446da3052d7cd3a580c434f5645524c45545b315d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf295b01a64976c6d22df38d3ced3df87cec95dfabf99a55a128f0cc1a12a58cdf161e58872515ee35cf87510536082d53d": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083233f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf295d48737b8979b34a23569551bcfdc2a969b1c4800a2e1700fc49adc3228a1faf72543f36ef784991a2a25d74632b26f": "0x6a325e3630266fda0ef7f7725ef8199726e29d569d609f3cf068c4db7e82591a0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf295e555b62758cc7ac3b0144e37591dda9454a3dfb574a6756a307688f156f4ebcfd72b63515bcdfccb50cf7f7bf92c12": "0x0ce0bbe155c5f116187af43bae0bd493872f436a139e23d9b26289d0721a310e0768616e77656e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29638f6afd44aeba3d7752935d82d39f7f657af299a3b7d16d7c4d27876099924e5905d4d85d683988726e31b25037cb6": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29652101d72ed67522b8a8646680a61d080de9a994f4ebfe1053baf13182362e06fe78b159c319be596fbbd8d027db576": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512373a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2969cc64f0f49a2feb2096e17db454ffe16ee0e830501e14db6f33efb672620f030b65bcd30a91152c9b9abb66f4c117c": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf296bfd6a3d3b57d99a0b4224c1e28ee46a8e2730b18be41205e5d9192603da3fc19d7d4b951519509cb32458ad622ae33": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf296d6c7bceed20143a9bd871ea4607e2d6d3ffc8efc1d719ddf99d29c8a1b285ff855969c4fff0668f9985a6b41c4b499": "0x83c75b56557a84fe8261cadc0c308577b0709cdc54311afc5ec8d348b939f5890d4772616e204d61796f726961", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf296db546d80b94d272e5849041185281b54c3bc9063fba6c75163f3e051f1387121c0120d3bfe764e68764f02ea33bb48": "0x206dd955d4ade8d59bab18cba031e664ae888491d173084bc9a0efabf0be195e0230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf296e6536073707345fa326cc3764d0545c016c699321be18f86dd04415e6f3152fe5b3bc13f4808bfb4617b9bedc2e129": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073038f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf296e6605eb771be4cef81797aa0721253269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b39": "0x269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b39033030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf297157ac5f270300f55c7fbc4161c36e98bbf421fcb86d5fd3e28a4762d295b722fae2260d0f3d548fe6eb8cd741c286e": "0xa06446b3474c3d9dcfb759f3df134cf4b6620b2559c4e1b99d3be4d010378f400232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29743ee8b8a0d5acb6a9232ff73ff5c26da466dea606e6a603356cbfece746254c6585b90647714222fb59e42ce45c601": "0x9e0bb283b2d2522a090d71d9c8fb484c7966d3e28b21bc513419ef7f70d6a5630f464f524b4c4553534e4154494f4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2979823f538d5bd1d523893f8cdaa15b2ecda6ddb746609cf2736a0b70823b52b11b15b1bb35a4021da70126290bbdc64": "0xeaab0cb55c147ffaf184a4c00513e85f6d5bb6416994fbdd0dd168f3c59a291b0558454f4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf297d1bd2ad87be06432a6596dc8e50db988c3d536bd6f68f296a34c8c3df53f1fb5321622d5f21739b6a76670500e413c": "0x38cadf9abf7492ce1df73d8b7ee82e10c2a0571970e2aa5ded4b9a6f91a498330232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf297d7395bbd0ea44ec2a47571a9ab2859803f3ff57158c1e5483e88d4dd5d04f7f8ca3c5203c6ac29344f314099f96a31": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29815f036bb71d34b99b55524d5bc83aeb8270b6d0325eac9f3ffd34032017f7848eaa460ca9a96a90a5296e34af91f96": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf298160c29cb485d50f2de0a12d611f93f36a8ff1b35d2750c1d8482b5f8290d835f5e497bcb9ebf11928d9de622fc3053": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805407f09f98883135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2981b64b19cd5827afcd4a27d56826450fcdc5fe2f7a0789f42175567fe656b9121815763a037c761ef846f0d97420239": "0xa81e54507ca4f6fa30932b96d35e8f073556c99f4e3119e5f67989345019210904303032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2982fdfd002ceea52e57a6b775006ec4e86b81e36ea46dc1b355c79bf38968367ed63d58e7b61e9aa5c97fb6fd94dcc3a": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2983f6d2269a64d9c6bfd7ee3a26ccade600786fada3d88a3e440751d50f3e522f9b7b28dda4e0f674c9faa24360a082e": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51064f4e452d54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf298b8e5323878044027edf2eace12a3d6b2f9413214ee983786be59b316ce9fe3848ca7cf5cb20f109b3e31d09f213274": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a0530332d43", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf298c35ff9c09ca50254e3b86d4586ce9ba248e7a6ef290c55ae9f1383eef475298bf04a1a78fc22f186cce5a797ebf508": "0x1a41e8f79310cf5b804b038d19f28b535261fc5c1c3d1dcfdc49e6bf5a946d320f7a7a4265715f5f636f6e74726f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf298d8a7a39e5d3be19e11c4fd292285504c50bd7cf1308738e5758e3f5063ffbacc50d2944f95506b8b4710d1f7a03536": "0x169b1ca15010ef10b423afee4c0fca7e42f745b39e1fe4197436ec352b7f17080c54525553545354414b4532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf299b08381cb4ebeb70490e94f7b088eb716bc1a5fbe6783b4c4fa8be371150435d5cace22115338b33a9966b4de2ef82d": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf299c3e4571dbcb08a3ba8de93413ff91512c0e71d56bc0e445558b892aea1eb53639aaf99ec6f51aba44607213c3dfe2e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf299d617edf1fb6836d3fb1d281c3082e9ccbb21d7b5bf0b08630681c37ebda5b98b5454c8916463a9c2b50262466deb76": "0x68170716ab7c6735dd0a1012045d9ea33891b5f6596cf97eb217d0962d86a51804676f76", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf299e7a835913510e319671e6e48424e90d6bacc09599d6647899ed6734cc33a655c56e6bf08d2273ba8464eb1d4a0830b": "0xeebbde3ff2bb37ca11414154e92c0521ac8051ea48d0d84b39714b23477636480970726f6a65637473", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29a033bf2a2ff16545abce4209cfcdbc02a646f536fec9eeb72210c0a5ae166e0b0853846f4d052ffaf438696921bd725": "0xa8cc040d5d391967b6c50b54d81dbc18acf06fd13a704decc7df6f464679051b033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29a1c41ab23706798d628389fa84e65c0661242bc6a8ea761d8668371ad17f9d036982ffbc68af2c28ebcbf2d30ad16e1": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29a5cb01d226018a91e06d985f1279f6412c0e71cf317d94584299468b9a292c7e69d3ce2ba40e4819166c78dce18e859": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29adb7651c6ddb15f52fdf2d547a6fc7dea595939a7255c7eac3f67f54c75929152fb73018a56bb468445373c17200447": "0xe49a94c01d7c0511480422e00ef7030ff64f314591b50d7057deadbd6411112e0474776f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29adfe05e86f52238646a6221a4950f03f4243300b12f9067d1fcf01c8e05f598ec2dfaa142a33398177f8b6e32ecfb2f": "0xe4a66ee66171e3238670377bc9ffbd7cb4bda47baf25e6ed80c2070942ee3f721170617468726f636b6e6574776f726b31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29b01e8742be34ae0db08438a76542115109e87a012b2754d0b23501fe1fa775db374927f09c228f07948f81ad84bf617": "0x109e87a012b2754d0b23501fe1fa775db374927f09c228f07948f81ad84bf6170a736c75736866756e64", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29b04304c1d352f9d8819b856e042349c0c92d4e41eddd3bec4ce4caf3610213e3b3b143a6c0319766961aecc27e124ff": "0x0e038990f47761a17f45c2bb01c4c7746f4ad67c7d0c1dfbd6915372faae911f05f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29b1bd5ce8a3bab3c40e1f31c3d91ccdd70375a0d07a2172cf390b17cce40e34997aa99c1762e9fe3f96a91ed60c7354b": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f10640a425249444745485542", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29b99595fff38df3b6b595984a8507bd7deea74425ab90f984007c4324ff21437aaacd212a1a5f349d31f03f735cce907": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29b9b06a2624ffd2e996e4e2702db7ac0739b4e65cbeea7cadf808f0df0154218982008f8cb4ce04a18b89625e69ab6b1": "0xf8d542920fa20b0dd5e126de37f7c0142db98b51a6caa4968922467b42b95a7404303133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29baac3b430823cc6d06a14178999ae3c8be18f3fe77e8807a0fc3201a7689f4742a12ff44622e1dc241d1a08088ab6ec": "0x4ac4eaed36e5c54f045b46cb54f533b2d3949c0ca7137e89ef03ee3f56f8155f033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29c1917ea5d48a42331709192836f4d6355a7b1fbf19d76a12b4cefc4009405905cbea3fc16452627e6a01ff866e9b6f1": "0x14ce4e09b999c54351c75b74d0bafdd17d86d98b6aab5176b9068e1be13e096f0242", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29c2bc3d8255e38d782f633ed2c3642f047b5dc76e7833045cd155547da3afa84a1fe6b9f8d8556e8c7187c3b2f50a467": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073131f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29c65c97b9960b1ab50e8d1b24af7d44d0033f9ee5f550181bf234c12c2e07ef74652d9323c13ab31ea9c2b053eac7458": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29d29c9439c87f692e75c9704c292bf0a602d88c1c8aef782a7eba2fc345663405cce57081d4a34003b895057d96d8e42": "0xf6d6531d9623034efed118d00dc62831eb6f017dcb45d66ec6af44947ef41431033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29d62ec2f1c1a1b440508c50c06d174f058ac509e6e93bcf6ac0800a070f28bd477fb9e9717ff7779d035094e361b1504": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b3568063151554944", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29d6591f67423dd3eae30b13f892a6d257c50145c707078b4d38802058b2d16fd80748729aac222af64be9e55e854da2a": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e5108504f4f4c2d3132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29d94cf5c11bd3c262179794562bc10a274e6950dc3144fc86b2f190216b04dd5f75c5ee52d7d3d0a949bb697d4843007": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29da5eaa72e0f6d6dd9732513dc7d9b7be7934d8edca47f33d004647a350aaa7ca31871f8ffe6038f187e1689cf34dcdd": "0x09ed7dc92692f6d1b8bf5e71b68f9019a16f825e4eb71bb22c5bcbb9fec300d10c30786e3030627a2d737562", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29db6e5981adfc93bab5cbedc92feb8b4cc9732afe3d57624b8bdd1afdaca3f940d0010ec54c6eeef52b15ee1da15b069": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29e2195a6551f5e80ca943326e7136a6b58a72e119fd6922255ddcb1b3f89bab2286d43b9bb3f5b3fd1d3df6a6fb72767": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29edc61902d52e6b186a7d297baed279c7a43965f93ab8e28323fe1c19ce8156b9d0a941e56661f2b172da1bf74a2de64": "0x184d701295be7bb38b2c0c58a35bf8edc592671c53d149d206e037dc7c9beb7b0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29f0984a5859e139849dcc9578dfb6a99de38c0e7726f26fb4ce2b3bc8a17ded6197309efbf24d70d0425728eff597d50": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29f12fc9430779ecf768f55ef08254e86d7a15c23db646cb253f769875604c28b184a2487b5dff9c282bd65087e7b4238": "0x92536c5469fd64b2adaee0a10c5936bb0d4c8e4c5e4d31185fbc0c9136e1f20504303038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29f2c660e85e746236d5bb3e2a3e2ecfe99a833467b3227e480dd06ccad8eb537c399e3851d8acd1b3d1c3e711db83686": "0x6482a21b7e92055e74bc9b182ded5b0cb86e6f7706090c916f60e8235b8fe51a04303238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29f32f4580e9268c1d68e167f1631232d38aa672a41872f698aa995f14f0bd9e54cfa4efd97350e742d68a0c44da377d9": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29f6c8fe35aa3f4db319cfda3f707659402881d4f53d1205e5bdf3864a12c724927270a38a1139e0d6434eed97b930163": "0xd2eb07f02043788e254d9e2df57be11566d241c56302b91199b4647947af30200233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf29f8d27205097c0fc77fb50bf2bdb69b796413aaaa130817e645a00e8f380264161aa37a6ef35c2328f4c79565ae9e408": "0x82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e745035649", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a023661e103f148d838160e6ca67efd4f4ecfa7baadacf1a3aa65baba89f28312db782c43e750e677dc40fca086f7b01": "0x824651190f1d20237fea2d5953bb53ec59df25d581e54f291d6978c9a80177410231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a035199af9b75d26986371519d122b7d4e346e6bb879c076c4b6290aaeec0a06ebc5cb198245f31343ac1160e16e942b": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a09312cd7e7d60aa00c36f3dd70e9475e635bb7c13379f6b759e79aa78b8852d750afe7da16ec7f01139fef08849147b": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033432", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a0a92f1ab233e621803eb3692eba355dfa6bd8e8fcf8cd5be5d5cf808b5b5cb20aeaf43d7cf5551f1b33b0f029120016": "0xe49a94c01d7c0511480422e00ef7030ff64f314591b50d7057deadbd6411112e046f6e65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a128862a321908a2676eb04870be1e83be03f2946dd310eb0212bd2c44122eb48cf77c834699f6bffa88e2697e7fe04f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033530", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a16440a443fbf60e13b7c0767af70dae9061deeb89b61291cb59efc126c4add37ce655a7954f8e2b246fdad18c07d358": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523432", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1825eaaa48ce221369a3de522058a2212c0e71c8c7444fd30b0ba7ccac70112280c31a7b57682c59443918e741b713c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033734", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1987de2aa0c33e9cb255d957a55085ccc2db6639c1895e08c384f618c9f215e32e0fd23f2ca0ff3b013d1c658287a75": "0x688f2dd2918739ffc90f280131b7d8bbfeaf9f0e2bacfe952a88bfa3bc168045033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1b15a955920ab51bfdb77c757fc2a4f9a48686506ea99e3f79e0643854fd07392d8e59f7249b61557e1662de58ee059": "0xfc90e922a45ef6a5dc3c8abed38bb0aae5b9aa7efcd388fab60e329fe9c2d945094252554d4d494532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1c36adf3b3ef482c569689f17c1b29adc7a8f82a2faa5ec9326f6970edcd577f8ed603104845ad07ce5c5d8f4a49d55": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033632", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1c42ae62ff0169c3e7d42f1a4bfd73c24d573f4df9151235e457956765e6446cf33077033bbca48d8d5c6c9a1d7fd33": "0x28778f95bd35e3fec4ee72a0d252c47097380c3ffdf93a9600b364ea119c05020c524d524b204d696e746572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1c8c938e388a473d04f4274bf82f47e4416405ae9e2ded76e049abaac98028161a04e23bdd02ed40fc9e1e0826ff65e": "0xe6247d2909686256b09006b07e758ecc128364a926f1223ef04b38628a5a3a5e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a1def25ee807b27b6eb5b62a2cf92bbe668103daef522e6916064ee8e27db33ab950e2d4f065276f7c9d86efbdab3b7d": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988831", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a20ab94b438dc5cd312a7a4f775108c91883cb0c880e437370dbe0ab6747e1d6fc6decf1e0ef4f423b815f14e3ffc009": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512343a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a20d168569c6ac29c25f2be85d91be8e8ccd612df568bb9b459480879224e360d0d8c3caf9365f1fe7d54b458b010b50": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523533", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a21a585b9bb7683f0ab2d1b21ab3b528bd19630ce7a6e94431c5f771e66232e46a034f3cd18006febacf02baad831132": "0x14ce4e09b999c54351c75b74d0bafdd17d86d98b6aab5176b9068e1be13e096f0243", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a21b7ddbef861f5d3180da05262db8ba0a16d6fd4dc2954c449699e5f6e3c7d2f0dc64df5b8008135fd60eb3eac61e6f": "0x8e111a2e445cc0f64b5809496887b3130718d969db6637c0ebf1118c39b15c550a7733636f696e732f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a2e00997517152f7c5a6a1916a7f1677e040d1b984526d7e5222ffbec6cbe8bdaa73f9190a9e3d7244a54fc99cf37a65": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a2f5fbc17674a2ece961c4f66cf723b42482fd4f47789ed517ae4bf2672eba2895d1b6a85e5d963e82cc77c48e57f176": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313435", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a30511bcf2bdb11e5753ecc63e410ffce2c6bbc2bf8ac332d8f9f45013049439bd2d31008db521ffe472e8c4c4e0c348": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819114272696467654855422d4b534d2d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a345f357db50388185012839eb399bef12c0e71d2f08b6d34a5103c892d4baa26995bf4b184eb7507f9e111014e58b79": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033534", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a369a0e2a7e74a70c8e44ff8e9c77ac4003afd6023b1888ca027ee106726fced92608aa111486ac2b82717744009ea04": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a38a952f11746a2911b0532aed30d9ab4c08de8a66557f63521d871087a9290cf8032705cab1ece83bc4e5a230f13020": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a3b65d3ae78bf54868139cf1b48f13ca42d7c710711e3f6a4d282c46bdc093a1796b6878a45c805827b838756ef78e18": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b385d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a3bbb5a55aa80e890a9289301ba092ad486e705093cbe54e60dbb3e63ecf3ffbc84bbfa2a1efd0a3a9282585e2f50772": "0xbc63ced3f8fec642128f2aa9c37e989a9313a67e9635dd85e8bd689ae8d0ce1d0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a3c36c06b110b23a5f4efda988e923e486434ea1ed238bc9c3106178b9371fda26e3d4333adc04513d188844a789c844": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a3fc3d89e3a83adca320ca843b0d50f6fc46341527cd1a52b60dd5884d8ac5aa272c27cd3b3cc6750ffa51ffe6b34ab6": "0x0650a2e41ea97b60bbd3f87aa30d605562069075deaaf79559959230928a248700", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a416a53ddbb72fa299d2d271242163459862f63cee080f43d1d4de935b51b615cd7a15682e28e41f0bdf6565deaadc06": "0x2033f1e89095d22a9c51162dbcce5e28a6b12957fdcb4c3cf11ea8def5ea1e220232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a46112d3948e95f08c4e5bd2916f094fba5a53f10121888c3b765d7a0e4ad64209bb08abed45cf9b6f72eafb3af9782a": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a55918795f90eceac4c224477edaa15cd237627616a57f2897c778f501c919d17ea969251d6b46cae60ba3f01dc0c72f": "0x5842026fdfe358c9320e35012deeedc83c1e19d2b677eba10a1fad0d93c82b660a42617261636869656c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a56319aa32365b6830690093fe1ae148d38bb685e02bad927a5425d733b7f89077e5b2b6c09e8e8990c98dde3275067c": "0x548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b0648494d4241", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a57580a9416b0fbf23202acd932054ab129129bd5eb2ac144f5d28695aa11f2f14153863409d08656f7e34c2963dc112": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033838", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a587a8f0f48d85c990398429f01f6c909eed509e1b9e0f45b24942e75abb7aa6fa306d0e52c74fa8811857d54d0bd03e": "0xf287534dd5ead6c0247a1b0d3ada5588e578602c2ed64caa6f6fc2a5efee6f23033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a5fa68b8d15856164c9e0cb0185972757c24bc10ff87531a3d2780dd51b94ed0b85818f4827ddc09ab394a53884c6444": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a04563031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a6046f086be7cc791eeb3ad97f12368eacd6b218c883c8ecc7a71a6b22a74261f1c2394399818ad3f3939ef31e463e23": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033939", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a61efe1bf1487d89d2f762b254ff43ac9fb287e33d2e6433438c3584150a857912afdca0c065f86275b53fe95d3f8192": "0xa86620314a174486a9938856e3b939de3bcd73458780f542388be0cd66379e28033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a63ccf38a7ebdf295ab7eb6f05f851b8a28ef91b1509ab5a2d494b230780761fb5e5ea00e01f7ce4296907b8b97f4c1e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a659e14a22da42c9feda53098784cfe2121cb3c0a7a70ec5db8b5e2ba95aa0320ece6b999a593c146471df768adad97e": "0x482a9a411b630d2c3f850f435c4566a6a93143422e6cce181320f022a74512360231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a6db3a194fcd0b3fe07f2a594dab431ba00505eb2a4607f27837f57232f0c456602e39540582685b4f58cde293f1a116": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a09495354414e42554c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a6e457d13fc9b43cbb67310a31f93951007b26343e6ebaed9459ffaae9358c5b2460902c2a0d63d68a748e1d8eb15033": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31395d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a72f6673ff72d0780e6235664d747ad9502d8f8870937f44fb43dbda57dea5b07eead72982b0712bd52a5e033be3b031": "0xac1d2d82c4a69b16c3ce9eb5d0b6f34f948a34efe62488879a514bbc837e0e500232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a74699a0ff32c2ae10dffd64b855da39524c4404c14e7fbda3e893815a3eca9a05f453ff0f73212319201a2f46d5382a": "0x6ee5ad3ea0da40510f11f42c3281fd543f5a6bfad54ebef7381a7320bb509a0d033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a757e639e4b51ed97c4e339323e1500d3a365c988f1b8bf6c4574656c803938a4e0250e25837f74fa6046f0ccf225123": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a7964c423dd9e3aaf5da9f04822e052f74b215d61cfbd296a81d6ead301607072d2bbf9dd308c3606eb1b795a62bcf2f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a7a9263bf47daf8ed2eadbb65c3705a302c1151878ea5c35d75c7d4f879fb48ea7a4199e2d3ac9ed79d686a157384d2f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a7b19e02e279c0b393f41c2279f9c727fc1855c2c5d97b41f55fd7b122cabeb3c2529f1e27dd836d131e88f5d6a66a09": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a7b6572087649c1090d7aedd811559775c975226ca9eedc6f15bb8f513c0fe5a3e813c4ea2fce105febce11d5b89ff01": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a7c645175479ef806888faf606eb4fbbf227ec6d922254e93c2342a87fe0840cecfa015478fc5ae7b28bb18c66c3a70d": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a7d9456f949713292865fa0e300e5a6910448cf888bdc13a933c0d1d33653f83d3b34bd775038e0f5900c5363aafee01": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a801c1088a6edb2102bdaea9a3a7f30caef53be490b506e8e00bc24809e634fef3ed2b1f8f3bc9926a39e2b40c3c70fb": "0xc66f4d91ebc7dd0065a5a2837014e5f4cef5d36d36d4ba7c915137d885dd76400a626c6f636b62757331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a81ad72ba738a6cc677caed9e0f2df5d26104ba050f385c19450c62d2adb3e9deabed8783eee0059d582ff8918c03b10": "0x26104ba050f385c19450c62d2adb3e9deabed8783eee0059d582ff8918c03b100a456c64726f6e414456", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a836828036088f3f615226f382327ffd12c0e71c73acdcfb922d6d2daaca383ec2d7a0cbcfe42ac84bb16da1c25c8c2e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a84152135635ed4add79867174ae34bfbc1e141bf6afbb7224e41e050c296f264e8c4c3cabb0d91a5594f0585be05714": "0x0cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a8760e5f4b12aefc09bc776ef8d705d1d6ea41749ba9fa1ea5fb094593de0726ce6c1ae997e000b3bbd66ef09298f92d": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f36", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a8ea09bcd3fe2111d755f045fc38132964aa224ccde37501e8661ac74a75eb9c2a6793b13e40828860deae744d806346": "0xd425daddf60b2545e07c695d32d6bea2b9343f1528052b4edd1a777e93058565033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a95fc139939688200eeb51ec25bd87d012c0e71c782aad6c734c6714946bf965fe464aaaf2e15c7d43409f936540ea72": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033833", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a984484f2835a3f41e2ba4f61bb3a323a6e5748915493258986746cb3e58f9e76c69bd65bab4fc620dc649c102baf716": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a9e475cf45beb5df0760b93b4b99e3d488d38ddf4d661801a1ab2efe073a9f35e0acd5c3c896aa28d8b5b20e2e88436e": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aa0fd96e6b35383106d6798df39b9ccfc05809bc85b574b586d8cb6cff329b5e5666a7f56963c06a4c95fcf681271e24": "0xbcb916e7a7ef77dd1f610ed27ec519b4ec226028eb8edade41f95b217f89f6201244656e616c6920436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aa10384d1e60926caec3f314cecb220ff954fd2279cdc545fb8b89133ef97c121308e4ca8e26dc2f7d3c3d9b2dc52dbc": "0x6ce8f0f322c021ca4991c83240d0feb94ad1678835b51d228999252bf9223e4907506963736f75", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aa3554924e8f0605dbd0edded09a9ffe94082abb5e84b31a7cb7e0e69fd711f013ac426d62f1e157b762d284ee6efe2b": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303520f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aa50a6c101407ebd9bede53a0c4277144e6717194ee8da5cb1669a5636c8821f764ecffa0bb0e43b610b8bb1fb1f197a": "0x16f24ecfa07199b88f010d94f47864ace2c0357aa4f37898f85cb39992e2036d033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aa51254ca720f17a1f5a7027f48ba5f9c01b6763a287079871d569b4c1ef94255494347450d13fa06d2ecb298c426d3c": "0x54c473bf199d05b878ab34e9a37d17d0a8bf70498edb5c759672e984fa38b4320231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aac99d77f60d544097912c8355c33c854ee9592a2fd8d3954c85b71eb39e6eb323411ca48bfba174abbf1751d2d190ec": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aae461333986963974e8312595132a9412c0e71d5b27b11da4fee8ee2b71b1535daaccd5775846c26ba02d0821244667": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033536", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ab394ee3cf4d50586384bb27c9b041034c27cde4c0ba44b80bd040462654c90c73e26b474895a2fd746fd5febf3ecc65": "0x8429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee210d5a4b56616c696461746f7234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ab536a7613dde80e8e70d0da84e89d752ab862c753d2f6331a4403f28cdd60a942d5611882e934c079a55145f49f9659": "0x82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e74504494949", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ab8a278565c6192692b3b187d9c43f84c05795cea6af4d0bb72417772d60d0e8ca43f5790448fc92f764088b0d4f4b1a": "0x16d5b643fdfb1b22d5dfd3a50157104df0580c910d2754987afc25fe0aaf582704746f70", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2abbffc8eba374975f0e6e558b2307c9230ed0348562c1ed74187bf91ab00d4f734ce2505a6d6f5d189ca1f8dc966e665": "0x2aa53f55efa82a9820f3c2569d4e52dc467475a1a11cfc9861ce5440316edb7a05506f6f6c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2abd3d4eb29ca65a76575312e85d8f7d03650aa13fb0f5a4c3a5ae264eb820463be11b8fdbe5fd09cb34df93c19430a22": "0x66a4d150e1799ed9ffa721e7e95397c4484db801fb7f26fbc4f27e1d158ef8390232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2abde7cd2c1b8f30e8b80c6dce5c67f6ca618dac7de8bd9fe8561c672d303c542f356e8f27be541bb6e54e80141d8187e": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f08303250726f7879", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2acc6eb9833a7502d18771c4fe9ecf81850c63f86e505700906b9303be612c11427a137eee64475e048ca585562f79c50": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033831", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2acc93bace0b7ce787d1d2104372dcab3a6644cb7298d69083173522d5e51c66dc5c88bb7e4358ab6d88b216d6574b010": "0x6a325e3630266fda0ef7f7725ef8199726e29d569d609f3cf068c4db7e82591a0234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aceb033b9addeb8aa7d5d99c6a8cf50414ededef8a62c8642099e5b094ef95519a5e2a1898ec9783c2bac2c71f71cd16": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ad065bddba06d39b4ba56da138a2d772f69f5924c239023e8555b80a7323494f03c76357fac283664c131a90d13bf971": "0x749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b757084c69746869756d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ad24a02ed1d484da31090f95d6db1491b046bbfb0ab2a461c916bd646f879787adaed72992ff0182233cc798fc9a2c31": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512313a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ad261372a499359b91b3a2e016b9aa80eb6a6d492311cb809fe02a7649fe2c815ac9a824be7761d7f5b28360d06b810c": "0xa215ba2d1b408fd5350b93f2566124331dabc06e94c16d7080d3cd5771d59958063445766572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ad3c87deaab49d4ef8674efce03c8935c49ea8deb91aae7843e2cdfba3a91fb9910efab535670b9da55bd5abdb7e542a": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b3568064354524c32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ad540dafa3c010985e733c528734c9d2769bde86b6f4610d3b75a775d3cc411da01222b117e84073f9fb18e5a89de715": "0x4866f45ae7b07019c03464e3c8c1324e96d3f05a2c5205e889fe597b0af2a70c033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ad7db5fb78662b93f04b6acc7c18d012041eda8a25068f57f573d5b152e2c8947c7ab80dead270769184cf63c77af554": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2adcecde88c84b8143f2c31ed585d2e44e62e1df098a40f24df7e2359de24775b28736ded030da69a7ec3c809b10b6e5c": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b335d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aea9940615a604916633e29b45b404fa07598edcb29987227d3fc1d585227937f701af167165fb0a99b6a21983fdba04": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083138f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aecb57ea6827c8a04c14050c344d78266ce201e876781c6466468f641ea7defd144b054fd1966e2292bab3c550f88711": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083137f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2aef307bd73838b989f1a749238b6f04a98735853f4d1ce4c0e545e53dbbd8c65fe5f89385fecbb646a26fe00cad77959": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a651331333a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2af13827ef9659fb4dacd7cc4675e17ce2a30902e14ea5ffdb5135aed31d3940e0df7027a27d079c6a67d135981f47601": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b356804554b33", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2af37c584ede4bc96a2beec1a74fb3f10e6fe75fdd65d00f6ea16c22ba1ce89e45441b80c597eca58690664288f1ca146": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303620f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2af5798e78cf8fcbc4626ea2f1f3e4a70c5fd9b06ea650783b1d4ad13841ed6caf054ff5cbe72ec4636fce640bf1ae53b": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083232f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2af74e10d03469e3142b06730cf0bd7cbbc921beb233fc0c3ebb3f98676aad4aea89f81a08f57251e24e2c02f0dc0a901": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2afa7012257eee9779458ee194e0b6a5144ab70adf9b1a6402cf14b3c61f98acf5bccabaf0030d537510166a21ee44d16": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2afd1838df35537febadf5e3617420f7b8af704356b5593f79cf9861e3c26748ac8ac6a4c2920582293228f56351d2667": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083238f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2afd5dbb951d5f4a9f07651fe3541d5bee2cd31d823eeedeaf516f7fdcc4c7287e3d23014e76f804b332d7b52571c2a6b": "0x625a907225b8ed830c16996d75cda73ef03750b535a6d83ca2ba1246be2dd42417f09fa496206269742e6c792f766f74696e672d626f74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2afdb125b38cd6e1b71477dbb7dc67946c8ceb3b9d38e7a25f5016eba5e885ade09042c214623524d78c73f6ce9bcf95f": "0x749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b75706626f726f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2afe65ec5f6703d19a70469bde3745d4fc1c0081353c756023d47df0da1d4c1b9eee95b9bb90058215e6b42ec5b00d525": "0xba98d1704adcb69b1d50aebfab39709c03713555e3d49e75690492b0a02f547c04303230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2afe974c51069584f0b67963f8f53fa99b085746d68637b4db6d45d855e9e31ac9059ffc928c3330ad1e13ac6f170ad48": "0x0cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b0143ed97b93f210d26c121497e79683e8f0c9814b8cfe6b4a46e4ee7f2b9fd93aa98485c646f07e973e57293a107059": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b04ce42c85bf3a1f40e03b434f56e20740e488d3a17720b2cc51ddc6cc6c4afb23ed4fcde97698aa2cf374fa7fadb37d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033538", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b156ac766093c7ba112248de120f8777ed1d56154af1862efb63fc12298d73411b024a7b5312346ca95effe7011efec3": "0x2e6dde560aa0f00b08d0db5e3c2f199181be3ca53d2e7a0a742aa5692433060d0f405477697474657268616e646c65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b161fc09a5dd4437945738a2db74412778018b68f1983978069a54f1befb11b0702529b1cb9bb0163999d9bbeb85391f": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b1671755a267e779d29b745afa7184bdd05bd77a93988e8d68d67733df1c5c149fcaf773e6a74e70428b2aaedb018ac9": "0x56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b1150b494e4449474f2054574f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b1845a811651232c98d46a6d2db1468678054da56ab2c696de80350f00924db18c896c3b9d66c26750628082750b332c": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523630", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b1bc87a77984491d27e1f0e6ba22efc2b20ba612ec45aa1ccb1ede3e2838ed2b4f5eadad5d80a873d74ead94b9689850": "0x904168b519b2745aa1480867fbc7db364c79e03fafd6e30ccc1691e7214ef8601631efb88fe283a331efb88fe283a336efb88fe283a3", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b1cc4601528b3b27d22bffba3940a3cf60857d3958e4e8809b36403726468f6b336e952d7cdee4a16c32126719dac411": "0x868cd54faea1a0e45836635b2bf658733436ec69c5567d651be592392cbb69dc0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b1d90018e8428ca502a306eab52ec898dde48b0a82d440116e0620963bfc19d1520435a7b64c4b36e5b258be8a9974e0": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b22683884f7fb7a780be6472f2eeabfd2889d414f8bb29201637b8ae394fd131642a3eb4764a82730e494d6e60a6c4bc": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b2a6983ef59563be11c6dd410ce0053c6aa3fa5a328b8a928c0aedc22aa88d14e807d2552c31bda8b23f3ac2cf01565e": "0x423e5d0451428d77e1f81f6f20c87427e355468da3ac8eea9eee7f041871a7330231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b2c14e2914e297220ba4ac2ecf4a2dd0c009ab06d6b49cd62f2801c4b0029a5343c51747f6716c788780bfeb2730af66": "0xc009ab06d6b49cd62f2801c4b0029a5343c51747f6716c788780bfeb2730af660e434841494e2053455256494345", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b2d425c1822c8e8f9d00c0f561b3d58a06ffadfd1ff3fb474bcca0ee75b100d244da043ce2e0725e40b1e8c7d6f0251a": "0x0ce0bbe155c5f116187af43bae0bd493872f436a139e23d9b26289d0721a310e0c56616c696461746f722d30", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b2f4429c50834c52a099157f11c40a473a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04": "0x00f53cf59ee4bae1fc47b5df521d48a3cc2d02d5c15fd5d3bfa3d6a4a2e6a57611f09fa5aa53616e6477696368f09fa5aa", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b335bd1aec2af648ea2cb3450de1bf5a759dc44004f91bfe44588e84d9c60517627929b322b7d00b8979035c3fc0be87": "0x8e28e91f200ae0e50fec4354a429a7e4e00f684f594a33437dff6e8c4ed180530230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b34954837d8d6e4690d665d2e8f6698746591c7794e2cb60b8a342f82bf14b2cfea945671453f92e330917366ed5f946": "0xf01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e0423600c534158454d424552472036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b3a55f3b29992f1e339da4168c1a78c8007cf8c189e43ad7cc1eaabd0aeb82ae7d62e5ca915f6bb87c4a0d85bb8c3772": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033533", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b3be96d7b60e74bf343f4dd04e31babe081c3d2269ab0253aa2d2c40fd37ab6e7304b0daf0bd6068d0d689fb51f1c40f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b3d6cf295dc61108cd8672c531252b07644f5b938a2bca8d0b0d5b0f08bfa3faa67acf54f9d45449777022fc23cdbc0f": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b44e7e0fad1601773b34fc84fbfffbd11ccd666d5c96fc362fd7fb1633ff09d05b3394ad29e7574e4231f5ab2e0f276c": "0x828618dad92559461b479508086bc781d88434e5372229cf66ffc887672e9b3404463143", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b4738370a4177572a0e9eb1ba3a720d8a61a8e0ccd37645a2dd65916d9bcf3b77ecdf395ecc3beef72f3ad5565bb3353": "0xf01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e0423600c534158454d424552472034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b487bb41f8f8bcf50bd84ad49b25667b662d04da99fa11b0ddd8bdfec9bbc2574ac71565e9346c8e13857934c18b3646": "0x2cba024614ea8ccd1ebf7a634f30b38d65c082be6aaa92551b9c3b4d1f15ae6e09486162616e65726f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b48c0b478f2d6dc553626f8464e3bec9936c411f5a41fcab2c26fd03ea779dfce7ce65c93203c5538051e77258315834": "0xfe88f2849c8b51127fefbb618de330c811b4092da0b9272edf2b8b7fddc05c1f032331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b49ee3607cefdaa13f3616289ca079f136dafe22546294dab15b18d1f15fed8856e6ace31582b0dca7f8d450cd963368": "0xabb9286b2b288f2af6eb392d95b12a64768174de723047b9ae0f86283dd5e34c06506f6f6c73", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b4b7eb72a33fd8a878404ccb4c18d3b01239360b36af37935b370032d2306b6c99c2e06b0312c2de4ad61c263b82886c": "0x5a5f7eb7050fb96d8d7895d9afce428a064ce66e3b094805bcad9a8e68cb99340650524f5859", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b4bb8572019f90dd482da55248e0f1b21ed7e0b663455310e4a8d084ce985ea6dde9cbd788f01cbc27f9a85264e97515": "0xd030ca0b2a60a30e7d1a0fec231f6f36c3b608036d25ff6b2b9ab9576d59c2520d5354414b452d515545454e32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b4efc7c6912288cdba7f101a722de6d9d8a8b294275746ad87f5fe0d3f5eb3fb81905036522357b616096f3e84bfced6": "0x4eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d0a4156454e5441444f52", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b4fe5af086dc362ec68a3fd6623154e7027b1e50e1acb6c1ff8777599be3350bbbd0236fd3866c367f420393d3adee41": "0x7ca460cc927a04fbc91f4ddda54149556d1a85196bc753d054aca1fb7621e3490474776f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b5129a9ad311055df8bc46e48cbcd31b4462badaa1c9c6bf3e368c5de7a206c0e8c1ec70ff0c8c5d2a51545e0514ae30": "0xd6030dd61ad78ca1900865d2b53dd163bbbb5b40c82f94d25cb6ecc750a93c250643544c3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b5202c8793cc26142c2ed9c2300e87072ed9d00721b2fe294f0f2af432a1a2d98a45cf3d6db2939ae20f5bf25625ecf8": "0x1a8ab26aba64d6176b6aa462a2a7ef6252ca1063cf978dcb6f6c64fec81e7861074534592d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b56ad69ff410d39715cea2897e28035c4248d8caebe59dd27fb0606a3640daab22456c80bf8449bc0f9ca721ad2e2074": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313030", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b58bca7f1d5002592c9d5f4314d6155dc44a96f5d752d040b443a98592bb0d42719b2cf3ebe538fc10f76637bc054e7a": "0xd6030dd61ad78ca1900865d2b53dd163bbbb5b40c82f94d25cb6ecc750a93c25033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b59699f193b136dca7642aeab5b7e63f1240c5bddabe0326741d3653bff06d6fcac311846cede93f8aa44a86a971924f": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b375d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b5b91b98aa6173a5eb85270b4ee572efc80e5adbafea30ecb72dec246ad8b5647f95092b535a702b4347d2ec210c6972": "0x321ec507203650141d2ec630b967b76ec45dd53d852b9cb25f220dd3a3fa2e51094e4f564f53494232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b5bbe7f3e23bed01c8dd47249447aa6c953288a0e80d88a64db2db07ca48da06678f683fb99301500223d663dca35b7a": "0x582e9acd4386d60a8d3de206a575ab9ab0c383f3b4ee88d2a2ed144afd3565040872657365727665", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b5bef284b5039ba4a4ba3ba8eb004ed490e389b9296c049a2cf0cc3255f3d58346b0eb6e6b0826aeaf81aae144d5306c": "0xea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b0239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b5cf72ccc7c79555b6fa9d50f10f9754c2b0f22e091372190ee2f4f79357f9084e1a9d3bc9af30e41db16a3fb31fd3d1": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f0832436865657365", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b600787f7fa0dcf6bcd77df14eeca35a12c0e71d25be2e5d1c5893ed30710dc6c645e8f26b3e1c3ca43800fb99fcfa4a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b6dfaac45c58ac397aa14e90efb01d6976b2a1db526de647dd7aeeebd328bc037be6795e79e7235a23f74198387be12a": "0x7825b33ec8baf2d437c19856a6ce74f09bbf49c284602a18ecc0683874dd596e16736e66206b736d20e29e8b2076616c696461746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b738857ffdcbfc2a18c7c4e9a3bed4ef12c0e71cb2e754bb49f1758439d6729debf9a30cf5b9a797ec564f00592a2f5f": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033632", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b75da1999ab35263ba79c536fd478fd338f0ee79e61dd2bd100c13719c468038ec4d722104b0a95fc38af7057c28fa50": "0x82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e745034949", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b77d8d27f7500c1c4a94f6d63eb20ab612c0e71c512bfec8bb542308c909c7b50f401219848e9cd7ee84c2bf25196449": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033431", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b77f5b4c626027fc176dcd30aa8167a9e68e209129894d176228151c41e67d96f9d8ed4da38338fab5c964f2cd2c6156": "0x4211b834beac4f35ff92e0dcbb0167f6ae7a0c43b186727d581d3f69f10fea3407484652203031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b786bbaf5f0f4985d65e2c96b517b5f42cb40effcc1bd1e91c49205a599b87e3a49dfae2ce9644f3a431e974c721c54f": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b79f96e3e2aca9cd3df81bb6611dbd0d62307128d13196dc291ac51e68173c5801fe6bace303a222d2659255d9debf27": "0x8429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee210d5a4b56616c696461746f7231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b7b365c76d69bce8a04dfa122cb30ee3e62bfe4941f647a18c74850008608346ad2c9623378dc3b8856f4d9a17ccb176": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b7b7a632d73902d03c337522ac4f6b102c13d8c2c4b4445943ffce2d55a39cd4c982e5bd4181d30f712ccfd8347ca45d": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b7e3a8de83f5d9c72a220db7d533ecad8e2ca3235e29d530a16e44fdc3a6ce04c42aaff4ed9b7c275bb9ced877bde979": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b7ebe3f39428014d2cd531f2df6e16c48a989898ac32a8333eea5bebe65671f63fbae7c43756c21f8507be73a53941d1": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f35", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b7f510898ca9dc0d3cde9929856ade57ce0b753196d88630621ff926331ce4780474fdf5b100fbcf96dfd4e984d1c669": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073036f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b8077874958094585a4ed28a6037b037ac0c25ae153af1c54bd0eb9c02dbd01e3b462be18089e560a9cd19890dceac6e": "0xb0ef511fbed15d88d75933d12bb50b56d1bbed109380b2fe0c7ec72d441191520231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b8d9e0ce3698ce76df431f5bb8cbfd883c6d21b257bbfa6eaef65227c3ca8f934d4df946f53f65aee505dfa6b741c852": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b8f66ddba1b6cd906785cd2ab3f5d1995eb5606f625995f4a16ab77fab23443b28b5ae51964638b6c6d1020f5cdf5d04": "0xc2a82d0740d343bbcf853665019f2afe81ddeb884f76dbb5c74533610f72a73217747769747465722e636f6d2f706f6c6b616c75636b79", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b914add7bf4db96d40bc2192c35c31e246378406055f64e506440a1b008f875abbbc8d3fd7c05f785a723fe1b5739fee": "0xc852bd64d95e1c2fc164ba7ee6c2cce6e87ff8cef81c60940d46f710ed712b7a0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b99149ca92c21e9733fc719abb9e96bf9e7fb05bdd2dc88013e77f26a37dc19e1c1717fde8a27bfd1f2fa8231ddf8538": "0x3e89cc7fecc4ad46cd7ba606522a8d1679863da498718cf9acdafbde8cfe4b7804303039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2b9bba004e878e6b65f88fb505f441de8b82ba825d0fa34373ebb741509f70042068219d805f221b75330b4513f62e674": "0xf0fd6298e6d06eefc52fb2f12dc1a6ff9e8958ac2a3efebc7f5673dc33808170033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ba8007316dfb0887dfa7438eebe1aa06dea318de2228da64b91c671dd7f325df63959f9c51c86a36f28ec94126f32070": "0xf01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e0423600b476f7665726e616e6365", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ba8e2b3d2b14691b6e8f2b344633e311f6f9a8d8e0eb8f9113107b5f2bc4c3bf64a31c6ce51913433873e4357bd35524": "0x1c82102e4554587f23cbd4bfdb0f43c9d2879d18feb6102bbed977930f695f220231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ba98f853e954fceb922f0ff042f441575ff5a4655138350a17e2dbb4ed130642abbe12b52ed03867883f0af9a1ef0cc8": "0xbc955504a40c50ded178a8082516a78a68f503348c16b106fb2a1aa2c594743e065374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bad206323c089bccba048f80edd29a1248b36ca55541b8f8c030a3a844a247a85e731764d015bdede53205fb5b355a25": "0x7eb07fd02281d018a4c45bab914fc6e2a0f81620663b53ab62432ae62a07194d0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bafa48c72defb21f2abfda59e80ad84d9181d99f43daa05e74f15ff308adb8a4ef121fe4976904813de2e16ac447c3ee": "0x625a907225b8ed830c16996d75cda73ef03750b535a6d83ca2ba1246be2dd4241e5b325d206269742e6c792f6265636f6d652d612d76616c696461746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bb0e7e0784f6df9f4d3896533f0ff3e380b036ace5df3680d4f61cccc6cef4d37bc396e6a6e63fdecf505ecbfe41149b": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bb44505de60060b7443bc2710270975712c0e71d06dd205beae5054c937e4170b53866e429f4be7a98318c261b3a0b2d": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033438", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bb928d4de94710209fa18382a0eaa1a602f777f4b3001d83e7a2441ab8456d2db9ad30b77e5d3f2fa0c4150b769e9a39": "0x0cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bc06dd4cdc189d8a0eef9f070ce3c65b5f58951d682a66090492f70ce968af8b8d39a6308aebb3cabeafd44bb0213d91": "0xfaeffbbb88ab949b51abcacd45d7f9addf608a6e6ddc3d4b39147454e1a23a161356414c494441544f5252554e4e455250524f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bc1cc9ffed2bab794b7c8387367708533245a2e5ac185dedd4f63f9899990dc2d467a359dd573a7adf0817e06948451d": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763134", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bc29a465fa8d8290db0e093571568a99160e772b488c83753ee69cadc56cdfe71937dec6a69b4bee87e4cfeb4bf8d475": "0x2458c79f1b8d080257ba31830f364170c90b6b173be1832ebace48595d193b2b033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bc4c1ee10a12aee9866c188315d2c8d1caa6c46edcc1d2a38bbfc4e200c3851762178268d7a3e565ab99728c18ae0376": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bc80891a015d9446458f46a10ae007da7eb15d7fc95b03fce6ab8cbc54c38ac898932407a3e9bd86d8c03bbfb5b8112a": "0x6041e8f550869197a24ed9e968eae648692cde7bbc04077114639c249cc0a0430474776f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bccad62ada0ce1d94de52aca44af59005247e73b8ad3c36bb4e01c93a9bd6a6048afce1e2a45863ea5fe99778b530b61": "0x5247e73b8ad3c36bb4e01c93a9bd6a6048afce1e2a45863ea5fe99778b530b61094e5244204c616273", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bcdb959b5ddbd2d2d60f5ea4cc127e5464c23bf3c5f9b5c2b83e9bf6722b1a6c15671dd610c63009b0f67d4daa521b4d": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b32305d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bd24d016e6e576c1e340b9aea878a99d9d2acafdebef59f646598614d1e0f1ea7ebacf643f0ba096abd078d9a2e4ae96": "0x400a075c48b7985fad91dda0b168b2185958c9fee280f145d2dfe24958a12737033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bd46d31c6545637d7db64114b9c8bbc0ea6f0d87d39b6b348f609c20246f065864972f409b809e94636fad2e6e779059": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bd5adc4b7050e1990be742027d6b835ddc64ebe91ae1dd904651525eb5fd91eb0abf458cb0f5986158803e0075604153": "0xca437639da37528d8edc0bb6b31966fdc0263218f4bd60c6f2cc37e963090371066d61727332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2be0a46a1f347a4442d32a7ad6c50a341f0825186ee2e14875b4da41144acdac7d5aeeda144951b84cb93c5b62388dd57": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2be2eb08addf037c74fe47d69298bafee7cc30da54f59bf041de60af0a1eeaea965edff0ba95e43be290b08ff15f91716": "0xbebf5aa73bf19935376f19460dacf00bf0dcd021ca37d6a2284cc6347dfbb13b033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2be4581484e33efc5a4f22c2fb7ea7935d3fb95a477ea8deb243947948b28d08677f5fbc3515d9365668056b12f028ce6": "0x400a075c48b7985fad91dda0b168b2185958c9fee280f145d2dfe24958a12737033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2be638c7d07ef5629ed517c7de9ac8e5d88d38df37c92f9cee029f6290428a9848f70dd8f10d519a6c8a861101863cd40": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2be7ffaf77a9ed2625b0a2444d7405c4a5624e7bedddddd49110e4c76ecfc6d2406dc3bbde447a71ef0e511560f588f63": "0xb2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a04563034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bf222eadfe6e79e6b98def037e616931eabaedff8f91f5afd170b1c8252522e76584565bda69f49ca2e223fdec4b5529": "0x7825b33ec8baf2d437c19856a6ce74f09bbf49c284602a18ecc0683874dd596e16736e66206b736d20e29e8c2076616c696461746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bf2ef73a6f67c9959ea062054f42e7d14beb8e393d37e827b64939797512b2988db9ea41f5b4d2f06a4f8c8fb955d89e": "0x5cadb1617794ea8d20a5b0bf1e3275a815229a34c834c9eb6383602ad47ecc550231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bf553593611c66c71467dc868745cd4fcca9c8d2749a01cf11872c61580b40f227d566afedd3b40cd29849276414c350": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bf662d325aa8286f5766ccfbc05655e76920834078df5f13662750273260531e585b9e802eb1dea6a98e7fe2f7555570": "0x68f6e4f77f043dfcb9fe88519996ee25ccae674ccda259bc49efec6b6eeb9607033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bf7716964fc735731e1526ba1768d4ec3012b3f9f22dfe0f9f29a97eb2fbcd227e5bd4f9c27df3a24816f9fd3a4b1713": "0x4e3711ff0fdcfc953c9ff93355ed42146e442c256b6010ddd5b5fe0ee8b8ac1c065374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2bfb6aae7f8cb718d69cb0f57c5895a988805b2b3d962de88736fcbcccefb08f9915ad1ddab9d1e31782954ef1ea3e622": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c0732c17118f0d7b682c4eef1536a9e29083308a14f56003ddeeadcf3e12c5f3685f05393380a47adc6be23c88d8b40a": "0x244a202cd6b29e2026b65a07c3fb32422138a122e581a627e35791da331bc9050a566172656a6b612032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c095df4ecf754f5d54cc181242ef3a6a68c1fc61924efb992b4e4c2c7a21d528dca21d3073fd304f536fd99a5cf1794a": "0xd6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d05f09f909c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c0972e8de0c13e5b5abf5e9475c633d76d6f646c70792f6e6f706c730063000000000000000000000000000000000000": "0xd6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d05f09f909c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c09f36644024793eef9e286856d2db4f8e74741b4eab0c60f4b1621f8d244da79dc84785622e52ac8e4e5d3da9f9e512": "0xee16a0a68c6bb00ee88ee56a12ad67e778bbee540f868ead35fb6851fc522c0e033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c0ad33ef6d83ca521b3310eb6dde9706c419b5e959b021c52f9afc64d96ab1130da2a03f08f820789a20faa24a206163": "0x844152eccf08725bea8ce898d6fc5362ff2d0bc9dfc21ed15fd138438d1606220942657a65726b6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c0bfa6e33b308d851c2483e1c82b32f44e3d6c92a32e9ec43fd78e7d7b967fa28ed347d96028d73f37113300cfa565e5": "0x34a3f0845fecdf74f7aeb569953da8cf8f8217a9a167a4e7d6b3438d8bb6d82817414e554249204449474954414c205354415348202332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c0c182d03f1e9ffa82b584e07c5c05fb12c0e71c9c7a0df0270f56ecec10f80525ff477398256a84db44f8362cc9cb7a": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033830", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c0e1ad46d17fc0f4b698a7287ef8fe3efca784faea5287b50efffea3b8ec2995d80648fcf5292f38deeb5bcec2d15e2b": "0xd86dba437fa4388bc312e57328e808cb1d37cd49143b90c338714703867edd7a16f09f8d8041524953544f5048414e455332f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c10ad8e048145565807efaf7c8b46d8d0fca29bfa87fda85b6d07265341c56bc44fe830e4bc1d7b8cd31f54cac6a32d6": "0xa6c197a5b757309578dfde7a02e19aa9922b8f81a60e81bb0c6b7295090b3456033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c13831eb5df91c871b9b1c11fe81eed6bcf0343edbf88dbd0b2d302af4a027cf7a1b45be2fbed9e9b11b6bb6bcc426b6": "0x608aa0febae80d8c228709183cf997bc87b0aa219cda0928408df22ac7ffef3904303330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c1824b6d21a6d089a61ac4a92a8da63458599575b1d7994d5f588624fa628018dc6357f6a90f488a2d880525e582a914": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c1d348ce50c513331c744df4c80887f61233533732bfa8bcf7a95e0dfca71309e49a1fdd70d43fd5c405505a6826ef72": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033633", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c1e5370219ef8bf404a05386035753985c9752253a165c2eccaa4dd8644eb754e3c760f586e935efbdd7c3b629cc0642": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c2c0df7bcb2ddc198b401ed3b93b3d6e766ebc87370f898dd73004e524f0019b36a511b071efcc5f685cd935cd6ac57a": "0xca42f0b5c7957571706f29d2828291b148b4b162100ddcac72c507fd8ab69b2e073032f09f90a6", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c2cac9c49da2b4ffcb8edcbc915771ae12c0e71ca560b3ce013e7ea6f20692d95ceba300e0b354cafdb4095a94a27e68": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c2d19768bb70536f5095fd03d90932a3a8ad44d6bd00b9ebeda2a48ccdad36d0ca29bd930ca2856cc8ce1c109f938625": "0x18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc00190236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c2d4765322365cb80a91583d75048ec0d693e6d764ce80662d891b0e1496fc7afdfd3470eeb4d703ce721460bb459d6b": "0xc63b6d81d7d307b9f4464304330a840f5159c78a804dd344c5fcbfb3da9aad11064b52594e4e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c2d88f1fd0fa5c57e30db65a2d54c3d8e573ce3c1ed2c09f46eef869e472f6fc1e1345949d22b585d2dab0198ed34727": "0xd3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a234054563686f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c34421b30f87d463f8dae047c202eda6b43e9512a0b56f6e9080b36543163cd843c3816854a331c48cb107c63ee42f21": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523530", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c368e1042e4bd743cf6dd650094c8968ac66f315467fc0b8d0d5d5d8906dae845567f911e24012ab0ebc185ed2dc6a66": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073037f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c36b2c037f282fb5ba74450b56b8cdc60e2515bd2e4ff6a32fed6306b3fc37095cf875c65f987c19c2b2691d8545fe51": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033535", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c36cb8b90eea3eee5d839a707af372125c97524a02c01e505359a29988f9098c6b1034dcb3ed8af5873fac659a10763c": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c372ecf6bda917e8c3993d822e9d2938cafd506351cbb8a3af1f69479dc08628bcdc05de50e86e2f94aaa21306727b2c": "0xbc0525c374a8198f3288a0733918321dfc26532e253d94da3a6a27a4c3e317600548415553", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c39dc7c0b3db9a41dc9d0cb970ab04784445d3cb2872e596cdcab7e8ac9815a369a6d4277f831287523ad9da7e60a53e": "0x128b1857f835ab1569c06a71e4de49df3154a9d5a5fabfa2a4f1ab1c458bc1400ff09f8d9d20434152424f4e415241", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c3f748efc07f699c0be80180e548a68c18b8c0db8e0d79d681abc2cde9bcdf73e8b84b9e893952d5528d849a465f9a25": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31355d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c4282e7215ba56f6fbedbad9256127c9d3247cacd091a8f95e795c76e84bc34db75ba76e13a79c1c4671f12f433ee83d": "0xd3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a23406427261766f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c433a21d7d9dd5728f4fc2b5002cbe7012c0e71c85b306f02dce509fbd905815ba90fd450199f70a6e00a56341340360": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033736", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c43d84a1afca11e60189cdbe2d58a9702add23627ef63d51a47ec9d5f0fa0d06fc3dbfb0e84183b90a13f072cf735300": "0x4866f45ae7b07019c03464e3c8c1324e96d3f05a2c5205e889fe597b0af2a70c033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c44d77cf66ec684924776cfa5a523fba5c975240a88ac1dc2d87fb2de37a5d8759307dd7cc9281114515ca26876f530b": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c47a4b177cb9cb76f304a12fb2e5dbaa326e27145577ff5e9bcd3f75bba30fca9622705f65a07ecf04a5d692b284ce72": "0x9085297d964ea873a23b63151b4c82189c1314c31fda6f2d71f83133d0877c5c054b534d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c48fac29dc8b043a08ca8a6866a3172d405637fb518f654b40c86cf257796c857ac3c28e5ce0ed978dcc4d69a5d67442": "0x628f36dddf8cdb0242104a2531e7d3efd4860a9a4633be69aaf30f63ccb25a5e08322d4461766f73", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c4a73ca17582841b17aef5d92af7ad84764e2315d026e1e02073b27ae98b6866388a0208294c4ca8e4d70e25f4ddbf18": "0xe2fec50feac8a6c83a3e9f869ce04ab800420b2c80c4310f2de2e9f0adfa301d0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c4b11bc3246014d0ba9828c2f1e5006eeee6c7b76518ff52ab727047c1214470a0fb4fce60ed6ae06185a1501e9a4ce6": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083039f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c4cbbc94ab26be6a5bdb9daee5cd70725ecc1d4e60a92262c1bec62d034c979f42cbd3fb1c28570d5baed6e5ed20d533": "0x5ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43035631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c511c6d5a2c38335a61c6672dc3acd6602a6ed2142a394d0f42a51281478530276f88d15657aa277b62c54bd1576f322": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c516cdf13321f494db81413474fc683812c0e71c49ca78c235b4cc7c02b0dd42d2ba68cae14091330453206d11f34a56": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c52166ebfd1d6b8020d3943d7cedec91941acddb878c9380546d8e08a2c94431dd6943d8c238428364d4eaf95218075e": "0x983c5a0d1f1e697c1a0f9798bc25543603751b41102d41c3b0e23cbc6e3fdc0b11566978656c6c6f5f4374726c725f4949", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c57d41ec62587c3fb8186cb0e3dfd8644396d758a45239e3ad43d8ffa0d171a6785aec18c571107c6675d53d082f09c7": "0x92e02ce87428939cfbb7fbeeb1ee758b749a5854a1bd3ae9ce36b3bcb753010c04303337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c5e7f71fd200b6fe4eb9835f4d1b25ff6cf4b9ce8d60ca73a35f036cd58afbc52ecea4d691484586967ae1ed45a1c423": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c655baa60c6a1fbebb249e33cb0b9add2bfbb8610a814c9052c287849831e4e28789a020afae5a23c9a19d3f37864a49": "0x0a71c6a0fbf9b63ac089c5395bdea4917a84aabb3475d4454147c4d24ce1013a033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c663bef8269796b13f10c0461aac5d7a460fbb15abc6a11bacac5accdd7a64ac63bf649e22c4efb879ff0cb0446b7e8f": "0xac2709eb9569c861e63940eefaec1f51ccb76eaa84544e56331adfcdec85991104303033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c69574091b5b55b20ca1398ba24ed8127e91f2c936482460b397eea5923867efeb2635679ca776cdfdc62bcea000250d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c6a263da35f84d08100669e601eece0f7c731b26739bf75d9607468391f9d743d3ee7f65f8e668d770174f74dcab7f43": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c6c3052eab8465f19e95119c634901719e7b589d0d5c36284021ae227a2e2be43e1dd1b67c0df432648e5026dfac6f43": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51054d4f4d4f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c6d5d6ccd4c98d250adb9db370fbd83c240246fc1579b9f65b2c83cfa020ea61e54330741399b8acbc8b7215b8dbcf42": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523338", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c6f5823bae5e0af2ed8e01c4052ef851473d3b1ef58c6170dd0d8e4f61cdd1d594cd17280988b52a7333b3a98fed4269": "0xdcb38c186bf97625f108b4832981d966ebed50d939349d4437a6f538d40d56760c56616c696461746f722031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c78f02cbe754419892002443c7030fb284e7a9749fd2b23ce7f7b775dd0f3808d6cdab42ba064fb242afdf0283e60a20": "0xe04ca25cf1cbc516ed1c138492a7f2e606f60c5a9ac96cb405eaa3914fd129730231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c7e0feeab14ba681f29b85c5ad4274fe9dfee84695666c414061c119c231b91511e18267044792868388c73f59306474": "0x08745476e8a2fb16504c77a75b2dd20b6f56cfb71c87125f1707a702753af24e0d4272656164204c6564676572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c7e4e58a6554f3b70576f68ad2adec1112c0e71c471767a1c8d1f0fbdc97763c8730745526c890b3d603d90337caca44": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033735", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c7e7b67dbfb457a80e1167ce2823f278867c63888fb81ef44bb0d5b761d8b536abaaaf5dae3b5d23891554e924049a4a": "0x54fda5a0e241e5497283afebd81b53f6a0235abf62a9bd39594be3f42d291e7f0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c80d069f113fdb657473619a7965822308c74cb0df1d73c69a078a6dd56d80ea94e08a2f72cba07ce6c5b471fcca8976": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033639", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c862a10b89cbe9a3dfa65a39f18b3993ee75ab2836d2ddd324049b86b224542d6cf8a12b601045ec14c454fea4e9cd47": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033534", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c87238565a7c87c42dc1d0af6e850914bec1f258092973881a9591a5f751a5ca2b305c6bac9f4500c0e56ba02dd8581d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033930", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c87c742f32bd7ed02b901c06bc6d6b877fc552b8c6596a09ef8008c83d1dc8ee77dc175036bbd2ca89a55b855a0f01cb": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c88ef78987683612d50c0be34436b628b64bfb076e6685695cbb09316f448529f41964fbbc9520059a0aeed64d63761b": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988835", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8b8e9bfd20adf75bb72e680248543b6241816355a91d53c772aebd5c1ff1114bb35fd22995e8b0d84fe770304b80352": "0xa0ad3e520332a754892d7a16de9de871b9f20e982d62a498b5d9c7e5f93d433e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8bad951e3d5c6352288db6618ba66b03b839ff2a9cba91f5d0a511651c76f3ae7e0eb8bc76d7862338f987e506ba6de": "0x58bb56063a47ee6e4a4d0bfe444682394a1e4657fa39f4622f2a0285689c1b3c04303037", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8c2ebe9ba5122aa7c5b611104f6d2133c667aac50304fdae4ba9932ebe5628ff1e133986bb2e1ce686f28c6a5d4ac27": "0x0a409ce1eed912358015a8139383b02292284b392bf23ef9eb89c7f31ed7e10b0c47414c4158594e4f444532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8ef88b4ff9043b10d3482e3d690190188d38deed3dd10c90cab2c1a5b59040baa3c1742b2439d6c4ac83df7da5d894e": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8f27ce4c04af2dbee5b29cf6738cc4e64dd9ec1480c8ae7a38a6566f4634c7f1b5253a0fcd426b3c712d8e2779ff71c": "0xf429460ae52548e754c712a7cfc75f1bf7c9295da165293ca52ccc686db5c02d033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8f65b71c2d877b722553f31af6ccfa9c61e997a53022149bda8907ce19e1780b9ae75e23fdd6b44fd5a6adb4ff91801": "0x14cd612ff7f390b9e90584767a00a4e9b740b61c0f2134698bbac79c6649764d067374617368", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c8fe8b016f9239cbd637951585c50f2512c0e71c4dd67a196937bcfc45ed0384d81a3b7e8a5b9746ac82081c4bf30964": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033634", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c9112bddeb1c092662778b846189608264563004d7fde7f69c99e461d43e799f2b8bc69c9c6941a265f5fe1e7e50c464": "0xbc486ed2f394da6e6b58b130687b48d3d19f756ba6d0655d37bf58ff0f59f974104520504c55524942555320554e554d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c92041aceb812cdc1cfef27b6e230ef0eea34392724db7a397808df783a7fe52ae6436bd9c2d86af32abe8dd81f43c33": "0x80dea82a6a4704d208bd43d1ea1d5a0bd97a9d20c5237beb348be8c82f37d93c0644656e6e61", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c9237312715124e8572d812441a946b9980e50eb048a8102b537fad10ac389068a37e29e93ed6cdb700ee571eb988116": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c93e26ac998c0f325e7513c26a2d488436ea3b4376625f8f5ac0cf7b48b7a186f96bc215f34976f9eb692eadb46ce29a": "0xac59122f8bc8c527a8efde87156403558ea66ca0ef049cf3fa4f671f98517d6104303131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c975a2d94f7f370b9deebb70fcb33468888593ed4e02aa8a39aed15ec8aa2f0ba2eae732b9e2bf7f6d72b6d012fd925e": "0xb8897a746ceaa53376946a3da353c1c987df8c0caa4395ac0eaf0e6c748740540656414c2031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c97ab4211b2be80337ce8db6424a4b82d2d790f992e31eec84ed33b3ddf3e92ecaeaed911f0026c2ca09087f3eb1d3eb": "0x00f52ade889dac25285059b639359071c2aad88e3f1f60593f86cc460ce2021304303236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c99c694356696e0d88c2b9f0978eaa40d6574db78e7c0315546032b1775930c40d4cca7562e9210cbde93344aad7aa54": "0xe04ca25cf1cbc516ed1c138492a7f2e606f60c5a9ac96cb405eaa3914fd129730232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c9a3fca2fd6455d970ee5a18021cc07f12c0e71cdddce276170fdafc609d13aa23bc51e46a52772dcf1e378130b6b014": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c9de13c0f1f94250695cf5357c033fed5767532cfd7c17f35bb22551c3364d9737749661b25f431f04df8364c9db3954": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c9fe0fb7c71abc4543f69c72b7a12f10f29100ef06c7724dc32404caf185c03adcfe64e92a3a4885e08cdafab2594d2d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033431", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ca0a74073e20c91c21ead30bd7c080ac7bdfd0ce52699e0b3f913ebc544b48b0cb02fcb8cb394625f88945200318f592": "0x0093c7603ddb81760e5c90ba6c0fde51812e18e6cc14121c081f5a573a86814204303237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ca264436f692517aac39a0019195e8e55a3116fd94d5f079378c4b1f2066ff567078ae68d97100fa408185a98ee92fb2": "0x9ee1fa0d8d4e022ed5680b5925d19718a7ecc9f8f2ff77de54f0822978d2775508576869746e6579", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ca4a896e116624b2861f94798a238d6a29cba2b60e937fa112f8e61fdde36e4043d0c40b1eb73f12b5534b52d01b5e16": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ca60b7ae0e6a88784f6dbde953128897deb536d9d2138242abbfb7d0f1b7b2905d8316566edd28c2d029996a89e51e09": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a0e4d455a5a414e494e452043544c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ca68f8e1e13fc625a7186db589a2d5efeaec5e47daff641a4a15c87ad7e12649e07f6ebbb54630b984952184c657e441": "0x88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ca791bd928f52765c183f6f1589e1951c2b69f99b0ddfb88c8fa9df62c4865ca4e69515a21c16bde93c726b1e678a156": "0x8c2f8f1570391214b89f82df1e2e0c12f9e2e814cc8e38b3d8baf3692724a311032f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cac3a1bd3e914af301f241775717b98284993faa382230fb6bae24747cb90b01087b26817950513c4b313168b517950a": "0x4e516d9d6527c3bdcc45105195b8e23480bc0f257308b1f4fef03e06efbb1c5b00", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb02f7923bef31f1ce1312dc332cf80f603d8b10a42a8be5f7e755820b0c4241732614384e039536c8e43d3b41443056": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb0b84d68fc7b2a7866ad3cb80b672c24c6a12b41192cb3355642a4de4fa55ae61387c23673f0e8c8637dd864eb0c443": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033736", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb15507f9629d869c55b268697b25ac0d6d65677fb307c3ac6c6c0405a1ecd9a47d0ade13ebd9fd340038fc78d9d8836": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313039", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb2339fa49f11b9c1fd38f5f968d07102c01bce1cfd949c169cf6d216d5c446a8c947147b5b7f128b6a46dfe92f90f00": "0xeaacc14e67deba7935dc28c86bb8b6bdb64239065b718fed6b8691ce141633500953494c49434f4e53", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb40f49264114da393e7182b3be70e075e25f73392aeea8ecd64fd33e2dd4728e355e314d8fca42e2a382f95a941d6ca": "0x5ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43035634", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb5a9851dff4fdf52cfdb2a41da2aac53ac5201c3a4b0b032e701e34988ca6a06831b69aadaf9a388dbd33d85ac85f6d": "0x14ce4e09b999c54351c75b74d0bafdd17d86d98b6aab5176b9068e1be13e096f0244", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb65691609bf934f487f8039e13f8182305b1689cfee594c19a642a2fcd554074c93d62181c0d4117ebe196bd7c62b79": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb689f2fd08e34f3e90238d841086e91d8151ecb8e8d11e6c6bd81ae49216b9ef92d2b83b3ae39702a397922f1477768": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a064672617a7a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cb7fec13b4b0d346f813adbf6e0f4714d2de3abc2fce0e6fb421d7a29d736a9ddcfdf51244022ffc483a291c4e4da958": "0x5e97f331813198763da88ad2b1f5deb3f42373a93e8895c43de399aa6255da47054b413034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cbc95794f214bac79234d84db933b4666a1241c7ef9541ddaad26287d92df0abacf7ac4a7fc4df046e4b866c05db4aab": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cbd2e8e70dc5faf3239fa2b71325c085426c1e2855920b16c78a37f7b6f480163f2a876a889f78b1ef2d11ebc9fd1459": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cc0032b7847c0117ed1762e6f5618b9ce25940a2f472c60c242463e18c20ab6555074a0644ac2b9583140abc15e27124": "0xabb9286b2b288f2af6eb392d95b12a64768174de723047b9ae0f86283dd5e34c055368657a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cc32df75fbbde634234f8396ad7d4c25280daf6efb2a16974f928da1abda06f2997f18a8db3cc73dab3cdc97d13fa520": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303420f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cc5cd9eb850ca3895f1947c8669274c754572de1db5ea15bc7731401c4fb92ba2ab3f7c387acdbbc2590a673bef4e248": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cc60d0fcf17e5894976fdecfb422e9975e5085f483896c9bfc341a80912faf167a1ef9229fe8b2989de7b6bad03c63cb": "0xf04c95a6ac10a0db5af28ac44776f95949dd543f494f8b8787925c41fccf7e0f033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cc69ce5a07e89174505f3dc6f32b0130c6125fdd59c2b545e1032e0223a7ae0e3aa3c4ebbafe72576dec399441068e3c": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083237f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cc7658cd138d09c0993a1fbfc7d4dee1540a38c94322e193c52afe4d438b6d6b1c50a9cafa87e47f1fc41221594d5f39": "0x7c88cb63517049b0569ba773b2cd7be3dea4c7c88340ba5f31c7bfa2e847f65f04574d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ccaf6e6baf961c91815720cb19b07a1dee67b25f8646b574d06dda6da0b74ececa842c48cdc5bd8fabb48276f28a6043": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818076c6b736d3033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ccf2a14c5e31903431298a626cb6338886505f7c520a5d79d531e99903d5a18615f4510652500f511c8052d8e6a42721": "0x0a71c6a0fbf9b63ac089c5395bdea4917a84aabb3475d4454147c4d24ce1013a033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ccf79fc0aca9b50e29400ea26e3766a3f40945c32b5bb894f311b2a680d927a1d26080b3b4b1c8b5bcabb196918d0e2d": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303720f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cd4c0c53d5dad472fcf92c48f39dd8b04e9a1114da2f930a02193c823ab3393fd2f4867b0ba68ab5ec267e50ecd35420": "0x5271937d9336b12c2801a62938d27878729a7987c705770d5f19c0e42ffcc64c0c455645525354414b452032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cd5844c23cffe5eeab0272580b3c099e5c97523e781c4c65e7df12bcab25d2f3ad96a2e73c9252da3b889bcf77aecc5a": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cd76e777b154c1f906b39ca7917edeac0cb5554f54c346c7996d2f6ad6c5bedcdc094b6ce0bb9a4afc7db6ae865cd378": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cda725c218beb9ad3ed6c3f612069deb9257672efbce6327e97783808a8feb2ef8dfa71bdff401f06700337dae17a253": "0x84bda1949a2b78bfc3b12dcc8f2c8e8822912efe0c693a23effaf7f3b54e9a5c0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cdae06255e18caf09f75addd45e7945c60bcf3dbbcdcb2254472d74e7522e08b6e35bfab991d39e17c8e35ab634e3c28": "0x34f589d251903b0ac5a22b1d13d54696fba34b77f5d21f5244de9071711447630232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ce65ba8dc6d139df7b9d100a5355959d9c9d52f08adf4aa10b316922daa16d396cfb66bf6d3b87454d7a468e19060f68": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ce7325022b2841cbd87e51dc0fe475e72f9daa984f4b569c43ddfa8b12c3f75e2e02f8c0ce9980e00daec2cb391c74a4": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083235f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ce84651c82027649daa82f74929a1a68ac5912fc44a3f886271bf2e8f0dd2d5f102f7bc313f1009b771526114fdc2d70": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31385d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ce8550d1d22ea15df455e6d9bafe27d0befe117ae4a987baebd13ac5c3b611ded994a75dc9ef2dfcab5071688ec9e2fb": "0x702a6dc9592ec94ce9e1f07e2a0559d7f43f932101bace2400d0e92419218732033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cebc66c2defb142ef92b6aaf4fd35cd226090dc5275e53b65763f135108a9111289aa1ca6331a8ddb3440059cd33d75f": "0x26090dc5275e53b65763f135108a9111289aa1ca6331a8ddb3440059cd33d75f076b7573616d61", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf19e88c68ecd0fe6ff5531f8a20c3d056a88434d91c219575e30f91afe0ef870901772375a33f006fa82b7c743b4917": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033936", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf2a472468ebd4c5207391a823f9eaf954cbb80bdac7fd85808d631bc4007c2b928e88ef08e8773d7b26e0acce33dd39": "0x7ec07e354ed4f92abdd5a1570470994410ad04181deb63229bd98ff39b73170a0f4b454241422d5354414b494e4732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf3df5e48db7f78958ad9e0c84b7a87d787f2dc3f07598f255932ee1fd3cdfea934389c61a31473a87d270655f70811d": "0x287e6f010e50f642775dab59f39ee4de313fe6325181ca603824399cf4d42c080232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf54cae9e2c000cc351b755c233471197618f7a742a744daaea9f6761f81fc54933a584cc5b4870a47e9525f42cb1760": "0x82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e7450256", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf59286ba700190de3e238a509f05654e2dfbb25f8e8e6047e14474e054090c283b6c8d34fbcc7370fff8292592f934e": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303120f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf5a7a71268d5aef05bb902061376d137294d22dea735215a7ac4a2aee260eb25d1beaad4b02bd8dacf87bd611a96c3f": "0x7294d22dea735215a7ac4a2aee260eb25d1beaad4b02bd8dacf87bd611a96c3f0e416c656e61204c656f6e6f7661", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cf84a8a77725503ae8de745901e90a5c0aed675c9de132c2b598f6fe8d256c8057b2d2cd28b2ae3fe6fad5475b407324": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cfc822ea97fc4ccab14633d946df8d1370a8fd1a49157402789a0c495dc9c9d12e87a64805374661b32f1d715ca22f5a": "0xd896f718b4ad053ba53468ba0347060b4a80f03fa72e9c14da5e2e7ea80e3f2c046f6e65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cfe0705b1ec0b13dcfca8982fe2be0685e0a33a0fede6d4995303cad923ea9cb39de708069630184e76f3c276b76c772": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523339", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cfe616516a4c40b9240377a15fdd83ec3f9bd8000dedbde0a47dbd7bf089dee1fa558ac28796942a5883af07ea59fce1": "0xcca2a0719fad006090aad6536ca8b7d8c527589be01b0012564dbdd36d9a492305f09f8c9d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d027c850edbdd122c1ca049f4f84bcbe6cdfaeaa8c9eba3e4d30f66d1b53a97f830612cdcdb1ee1d203a797ef4973125": "0x4e908afcf0fb6b394bd1a043bc8b226fac33b4742731b9cde5d324f450eb3006054b563032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d05351a690517c7ff30db70d638702339a7f00455c8ddda3532450ad2eae9a5405522b11b320e52851ac6fd870b12d12": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee070f5265776172647320436f6e666967", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d0c0098f070694c79f4ac845ed9ddfa312c0e71d489fee1707d4857f5f4cca6e9ccc10a81fb25b9cdf5c2d872d0f3a5c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d0e999d1814db997088ab8eb16c8e4ce2c61f078a240b295eb8d19db50e5b27b39225ede1cf718c0872c441cb7ac8d54": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d1225dcab17d4833c75587142b80cdc916cec430366d2ba6b46f6b084f62ec4f76967ec6fc65101e6de60c92d2751977": "0x664b2886e95f12e168b420f06b90c11d8cdfa7ee747bc12e235a6d5efbae6e12033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d14e8491c6088ebd501c2798aa90a7983e8086aa5e41114ace08f4330aa4d5adca61f5dab191bba7ab6b2596f1c40c18": "0x844f55022b2b8667129c167068a9c2a6bc292f2d312336bd98339d686b575a1b0e414c4c34484f444c45522d5631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d194b05dbfa05a400c9c5eedbd8b124c3a43a4e20e15a0c9e0009fa11135246e1de9cf4507c1945bc86cb0a088c1c465": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d19b2b7f6f4027c79a0abc64de1ed2c7a570c6ce21a0b2f432dfd11756cca948259a8b281196ccec975c681372a06280": "0x3a731ac0ae7375a2cce5b504484d91f1c49923b3425072e36e12b0afd5f2a8570530303031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d1b6d842ffc033eb576b4e2268de1a3f6cfe88656d6a99bbf56d216614a02ef9f0182f63dfc21d7dfedacb4ff517f135": "0xf40cd7a2181289e32776625b9f3a193f749e33ce1bdeb76cfaabece606c7324c1968656c697873747265657420666f756e646174696f6e2f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d1d8e0232be19b72146d75ffbef993757282bd520ed3b58e948d1e3ec6d993c607c87f153a9b90954fa973cdf3adfc54": "0xa845ea35913a0fbdec49687ebc5b1579bb632c080ce61b02919ba40bcf8892760234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d1f92b7f176d02ad63f25f36c9c66c1912cc166f2df9f0fe89f79e2b568a6e92d61ca5f5f53050ef8744edf74aced0fb": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d26582886f6371b327d9d490054d68b8681559f05e3544030950899e305d923d8e11e244943c1520c35e801253d28008": "0x8e32641448f9a5ec78ad04a33b7874a2942ca7ad4c7e8ee2e45409cee1883e060231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d26ccbf305e9a72d94dce38f185b6f613a4d56fc0f3aed44e21a24d0a3c17a4d6c1360123ce0a4d9a22aaac577031c2e": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d272d57e3f1f50afcf83e2781a1a3bffa6f39c26ca691bd958706b03619b5579a313404e93089bafe5760b2a9db4b551": "0x6c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc12857789867608e29aa1efb88f34", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d29b1f2499b255d6726de0fd9a8f33d4b842b822ff26324247b6ac5a4f3eaa2bb97ab63a9ca95c2ff07775a1858f0173": "0x78283798169eabf7cd6924745cb60df616354b36e53549fd8dd71e815386f525033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d2eeee9a44ebb023b302f71ce92956c9807a095defd81e409429e0f0036df659f3472f90e3b9376e669b71adb898702c": "0x184d701295be7bb38b2c0c58a35bf8edc592671c53d149d206e037dc7c9beb7b0234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d332c90c9ea90c0bc0897fbf38b83925589d797b259ba12d5f74d118a2f63fdd5b519b69003821b9da81614225776a2a": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31325d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d339f0d287fd7b01b925311f978fa71fbc154c7a8b77c508d364f2ad31111f48c1eebcd3367da39f5fd907b510e5e170": "0x68f8bfef657c69a5c34721cbaa618ae9eb2108566f9a2606cf5055578e0c251100", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d3804a2d371ac6b1b45ff1c4db978cefa61366bf4c8e9f8fa63bdf70263753a1d34a66a616dca43b48c9f99d2c641c7e": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523331", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d39abee85bb62414141a5baf3a7022bc2dc4deb5830a5e765042800fdbf03927e72ad3d40644360b07cf9ac241638701": "0xb45b073f1e692d18c2dcebae861b2f166a4dbfd95d9780ffef603c9e61d0093509416d616e65636572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d3f2c11ab0f9dcc8fdcbe4b7d2419a2ea6cf293e01355a99ab2429bc7d9f56bd24beb526079ac3eb0a00c3c70e4f6465": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303820f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d3f889daf4e1933ed169fde2153f634448ff655461db0e896365cea6351beafb80b40f19a3c453fc27e6609f872e4238": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033637", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d3fbbbc50dd153421623bd762a2151e4c6150d4b20644caff90e355c0740cf211f04ec624a65acac57608e7390488f0a": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d3fc34f7bfb87eb2c0895361a192e82a94ee7175041f3293479d3abab6dd9fd5e5d463f539bf6eb18a2bfc85e6c5bc54": "0x16eaf9666bd95a04bc6ed619c30a4809a43fd7265e414284c11b27b8c666fd23084b686173746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d41bc04620b2161b34eb34e6a47af25a3a337becdfacffca71fe67fec208733754f035958d349d36b30225fd47798f6a": "0xf857311106c8d7b0daf6e096db9a0d759b52403e439ab23fd6559780a8b1c803066269736f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d435c2aa12bf8a0adfbadf18fac462d02602783d96c4e25d8f6894e457ceb968bf1c9694295aee52514d4919056cdb12": "0x26842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b148033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d4a320b2374d4601da0b577a391500a08a51fcf7cd53d24e15d85b8180f31d5f9b295af7841f9448f80b7264f3818752": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512383a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d4c814a5e0c2b6022849e302087912d44f00d8607ea768fa23a0befe7cead74f5f99102a70f53aae2cf68922f526523e": "0x046ff960b0d51db710b8ca414171afd47c9612311b69fa9416622dfb42a33124033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d51de4a39ebe413b925af948980a9318ce00415c4b594b4c5085fc803c7eb7872847b7b50fbb0ad93cf0fb95c7a0bf68": "0x7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd7681903434c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d52334bf3f7bd78a7fece8f120b980605f5013d41624228728182b71bbe799dce7dc5df6963fc02730c6b4b3e84273e1": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073132f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d53c55f298492f938e93d235aa93defd6c98dfc795cd34290966dfa3a4f690a2c703dfaa31792854885295a61cfdd670": "0x8a320af9e031a3396f15acdcc65c43008124068226505ee7e12bbb0a12012e600c546563686e6963616c2032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d561cdf3d173b0e7dfe0ebd50b63f0a9260707c021782450fc2707ad65e0ffebf1f9e4025b69b8e192378e4835b05f74": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d5741a0a36a4d5ff8186e070a2e5f417d4cc99150b203e2ded46d1bdfa43c2f64f89cb4a9102e8e6d5b37784ab97b117": "0x9642d0db9f3b301b44df74b63b0b930011e3f52154c5ca24b4dc67b3c7322f150573756231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d57f307487465f7a00d54cad65ec792a34a2536cdfc1e92e55a4f4c1310aa2cb76257a87b0e66cea1f2d392c7080be22": "0xc8566f6d3669729e877cd5e453d59f6be01ae6f31b7a9c9925160e70072f7242094d555348494b4132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d5912e8857d3fd846b9b7afb3d401568d091cf86d04141b1c17c70826c08d074cae1b00d6f82de1b8a5406ea10ce723b": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c095452454153555259", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d5a47d7294408d90d3f758a183db159d49820d872869c2370f72f871556e9584aeefb7b7de62e6559c69f1503cbdb545": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d5a98fa4765f4842f41161a64bdef2980cfd5ba5a03ebfcf979f3bb7d68fd694bfc64d37bf04ca7b2e87d4e38827f94c": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523531", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d5b7042dc452982b56910a0b527fe10c9cbecddcf7044de2e7f8aff6dddd8660e28ef5214c59623dd37a62d950da795f": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763332", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d5fa0362c54826076a67ea94dbd89fc41884855fe5ccb84c814252cb959d599ee9f90de9d3b7c65058b75c39f21b2802": "0x225f2459239641fc50300041f8980fa044cb07705db61fefb340804172b1c25d033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d6422f105e1d8cb4f11ba2d711d212f922dd0bd944bf21712d577daa894b5d2def3b907ed1ce8cb334dff3c8216e1a59": "0x50df6ec6f3dbb1134df6fd1d572d4dfdbe1058fca0e7197ef8d0f3d05a720f5e0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d644185f1c9275c27934b091f00ce5aca56bd842d168e9b1eae2ef3d1f6d323b9bd4b8db997ffd2ff52369e5c0ba5512": "0x9c2b14c09923911fe0ff6918b7c7702a91762aede2c2cdd0f1f0bdcf7b9f2a5a04303235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d647c6fd4fc90d8ae0a3118849fd10e144a8bb3fcbbd5b54617b782667c7f8c5a89ca53c1f878cdc9dc1766f447ea30f": "0x269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b39033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d6551bb9732ee95a0588e7c3edff87bcef8d3f3e96613631bf0c63444db7abcc063f40cfcd2f4b477615443fb8e84d5f": "0x4ef63a0f97791221290fd19207cbb23ec5783221b5016afa55161b01dbb0125d04303139", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d6916cf16eb26f9d1c7af3577f43b00c367c5a125977696926fd9820f8282c73f7a2cc8fa0dff0f0153cd7519d6ff316": "0x20112dff656489548b0a7815a06d3a59f93880ea46ee2662a6439bb431bab04607736972697573", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d6a9f2d02150c4f45638b84b15be87b812c0e71c4aba6d53775e0a27ff00a6090b2d9bb4171096109a5aa2a59328df61": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033633", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d7c3b31efac1b9eedcf9c85fe247c820dc89c6865c029c1088fb27b41c1a715b0bb611b94e1d625fa0bb8a1294187454": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033335", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d7c748420ef9a4ddbad4b898d4a03a5df86ca83eaea9aace8ba08ee406a2ca470fb8d274a9fb496cac6e8797721c5977": "0x3ef88f51188ea054ff03b902d8706c6d9b1ea56c119b34e0b88e915b5d02da5d035f31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d7d29505a6326c67cf801741f043061f4cee1a8fd3bca977c086368843e54330002df861543497ac55e3818e4111cc26": "0xcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec47712416c7068612043656e7461757269204362", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d7eae4b41a09c76f6187adc728d7c74b3ab6cfff71e91eea05d195a10fc0a03a78667a6ee5a915fcfbb25e90bc258f08": "0x2c5bca9fd4c92b051e35c47617175d8f28aba000ccf921cb24bdf555662f2d41033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d8058cd6e8e400b8b686a6dded37ac508c65e884140b3bfc129cf21cb7423ea9f6a72246c273c3ca4c77a00910f58136": "0x5e97f331813198763da88ad2b1f5deb3f42373a93e8895c43de399aa6255da47054b413035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d83f38b37d340f3c33fabe76bdeeac52b0eb1b93d4fb82e4fe4e55b4dd8375b8a09c97596db6bc7e080401f2b88a07e9": "0x88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d930cac322a8e3609661590a21692ba3ae47a2ee72d479b5ae8c2237b156a6c584d82884c37be50958ea32c1aaef7832": "0x7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a0530312d43", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d9393dc793396a1735689e9acf9fb238fc53b8a54a21149380351cadce380bcd0028cec8145c34fbb67db6176dbcd31c": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d81804763035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d9dd9d53e72d0e4a66b17379e58131ce6c736a063c16e476c5d534aedf7e9c95a40f13c95aceb085ef74155d4b37800b": "0x2e62b548856a9ff975d160a0df8219bd36a7807620ac1ae2eeeb34498ba3e4701264656967656e76656b746f722e696f2f32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2d9f6e3572a83d81ad6cadaa3c87a2d5272f67d9caa91e4c5777b9edbb0f7297d7f294627685c9af7eab3563ef66ffc20": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2da14c430f61b548473feed1d3e41218222caae65e7ded01a955d36299f613aa1636767c9944621bf5eb149290339b97b": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512393a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2da71dd7ef8ca0345c33322399ee10dc612c0e71d2a6032287a5bdb910afd1522f52f26c1d619395f3c8d1d18ed23c12b": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2daca255e05a7d5ca9895f01d07cc29fa7fd69aae09c52bef16685e25b29e22f3d1b43f6469f035a9081033b9a7025c94": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b04423132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2db06bc4c90988ca9c276efca888bef2f720436c87f73ebfaadd5ff7748bac986ab74277d57e5b946066d922884a5d80d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2db0bacaee235efe7f0fe598298761c3912c0e71cb40d9d91814a130bf4ee7008a6e83563520ad677eb2034209fa20e55": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2db2588a557075ca073621e5d0b07a30d2c21eb7992f79d2d844f3006382236000c2b1eeb4c8985c6ed6db26734ec2e70": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed80540c6b6172757261706f6f6c30", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2db6986be783dc3e2bb83f85d79155aedbb4e1d9efbe50d88f02dc608509ba4ef589646abb8dde69c9398738becc8cd48": "0x008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a074d454c4f4459", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2db6d64cfec14a985d9c3e13fd71cf74f29c22701c5675f9a1d0c99c86c5bd43a5c781b5029d080077926cd3d3d17a81f": "0x8c4c81f382ae2c201eed4b0b519f352aa9c0c8593122418b30ac9760844de2fa0234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2db8cc90b6fcf6061805fc0b2f6d2e0b68a650412c92229bf1a2eb1c0cab9c133d54c5b82cc723b202ee634e925effa6a": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dbcd9f73ac37913ba3bcf7ff82f93706882b91920f9e4483d2910d72403ecc9522283079ff6770b58be852648e008d44": "0xb4410d33f13c053dca87be657a0ae3cc87655baf43f7efdd454ff74e3a9d8a2f15f09f90b15374616b65204b697474656ef09f90b1", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dbf093212b4012e7da96293ddc06a4a09b1e47be56602b6fd57d873573f8e1cf67e97ee448fabff165be2cd9b7b6a777": "0xd2cfdfb80cb90a4a5826c98846a367489fd25d3a2561838fa372f39f3f7fb138033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dbf5ab9f73be1b226d58325b74e902f22e91e1aef05cb877f9c862b416d157a840115d43c307290dfba6ac4c4db5dad7": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc04960fa04dbf91bd6f0f6026404e62faca0437ebd16050e22dffe85c091c5a8e24feb20d488444e9b9e7e7cbc78013": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc27428bd38cd5acd3165a17711fa3ba1a765697eb319802107fc3eb312b686bc335cf4456be1c46d6482bba3e1eb038": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc2a961efcab146f4743645e32a5c866d06a4dfc33d452ca4fbf37fd660a153b0d87011761701591ed79e5bb87596044": "0xcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec47712416c7068612043656e7461757269204263", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc4913f0c56caae531361483b1d0c8ff8c21fb36ae0d9d838e3e635f7d867a4eb44fcedbfc8f3d03f22f342f2a64b38a": "0xa6659e4c3f22c2aa97d54a36e31ab57a617af62bd43ec62ed57077149206927000", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc5dfdba2a0510c456ef89f489bbc1a9b04789c005102f21fd271c09568a78047f581710323b5f91b7c2d5743011e128": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc60939087599aebe53acd8e5d4079d33e94cee09a8718b5957b697f388b7300815ae76c15d0ca5c0b0cefc84d5a7d4b": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dc91ac82f44cabc9de8a2c79d28d6f435e11390e1f7b87f6e2a59603d7979e4e26259c41f011eba0e6f3ed6996e7151d": "0x7a8b217ad8d80016336be124846210559ebf720aecd25ea0d0d11c10f1839e7105f09f9299", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dcb3dc43edbfd078f6047d712dfef49614b04bcc309f1abd5fae50084923f7d14fc5b9eaf257c0e2c5dafcd83e3cb363": "0x94339db8b404ea216d60433f00ed67b0cdcd9e29d21355615d967161db0cb04c033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dcbb8a73f2966312f90b7a816f27dbddda5484b32d12a09f6c28114f2d9ef1a6cb2088cdd2c5d9be152737bbd165733f": "0x1e6ea78e3190ac2cfde9c0041ea7a0e1f7b89d52f4a58f01f69258150b782466033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dccf206125ed7e98f38e60fa95831a952860f5267cc37b8ac5cce7fc5e1e00aeff5c951ca71a7075e75e5be1136e8e3c": "0x4211b834beac4f35ff92e0dcbb0167f6ae7a0c43b186727d581d3f69f10fea3407484652203032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dcfd76fc380cb9ef8907144f5c27f7f5acabeb358e532ad64c9e4e9f5b3a2bef0358e8535cb4e1b8a7727cc24b7be643": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073034f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dcff612df642a86df4851fe810a4e808594e4ff12db88b9c74fecc23b4a9bb35e999a5c9a6424ec47f3e0f5529fb655e": "0x1c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea2593856090239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd00eb692e2e60a5edb02bda27491782c573b977a12a27f38f686571c67e01b848e24b49fb2ce07b8b0f12caf651b6ee": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212073031f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd3906cb7799120e9220dca4276cc62a6268664daaa26e11b1691bbada389dcefe14898f05214f50027c797d8004f777": "0xbc486ed2f394da6e6b58b130687b48d3d19f756ba6d0655d37bf58ff0f59f97411474f5645524e414e43452050524f5859", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd3b705c6ff3a2e644c15c6158e2a27500e31d15b9166c5238cbdfbcab39ccc2fe0173c9419b060f28fbf3f0ea0cf25b": "0x1097c82198eca584e8d9bedca6a5ffc1f1eac3c1fb91d0ef4ef313b842b04c3f0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd41ba720188814261874148a590262616a025114b9898b0e78a9472f31364689261cfcb35daf692c62f36012706db19": "0x1eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef4843117374616b652d636f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd66630c8a9f37422bf4f2e1de7853f55627b276d86cb8de65eb9b261907a0134f1eeca33e423eb357ed4cc339e68d1d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd7049f241e097e2e14377b9f0d1471fec46a834c9d9bad9de24c9d4c6c85d4f942e2c52134f408e7fef2381bcdf2dc2": "0x983c5a0d1f1e697c1a0f9798bc25543603751b41102d41c3b0e23cbc6e3fdc0b0f566978656c6c6f5f4b534d5f4949", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd7649b3c6fd3940e5c3f07a003847b220d879dee526c91e9a590785b4982690fc4a04d41fb7e49c83389e6848132b0d": "0x6883b9f834076b9c1368e7692ec0a01ae97a52c5cdca957b5d31103423cfbe45044b5631", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd8a2891c55851c6d5b09185a589a015c40595c253aabacb254a3a476c0ed1b1fdc9368157d2e6d85dc38f5eddddf13f": "0x945e90a1afc83f0c74a3ffe96b40c4ebb5397af04126bc2db23036c043be4a630232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dda664af553b017672bf40043090e510bcf4933936ffd18b5b65409bdc003b5f5ad8f9b8e36ae97b1f7b5f0af2803bd8": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2de19609c2b633823780967a99f09eece10a89404fc6e546945ce58e433c4e88a17167caf4e763793cd3b048e4b0b5940": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07105041594f555420424f5420f09fa496", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2de251e40f881f9217c2e38706e3af7ac12c0e71cae4be30aa91dc1e77bf2bde98af86c4d385e9c0868d8af4a50258803": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033939", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2de981500a43f4da9e8719948e3d7565e5092144ba4cf9a4997c6dcae1ec2f9b8cd1065ff5d1f97812c5700132036a504": "0x6849627c337067117e864eff154c6125539fa6e4eaa980712e7594cf78447874033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ded01e74365e3760e06036ae1c43d2317c7c8105064a32c52de4d09d9b9dc358756f37ccae41c1ae71178ce302ff5374": "0x749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b75709487964726f67656e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ded4e227d37f3edb020a97a214ae2e0a46105c0b02b08c1a4e094e2bbc42fab06c13cdd155bff92dd844d3bd727f2612": "0xa61514d5cabf81b3f62650806870ad83b2e5059538b846b6dd9963e010566a170c7765623334657665722d32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2df4f39598dce850aaaf9166114fb0bfaa6359df267482f0eb4004f12f3189cc44d1e70441ecfcbc1a2d5c6c32066003b": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2df546ef0648729181d0afdc326b51a3c1e25c43583448b07d9e3ff3a2c67c1674ebc968258e42ac4ac000204f6298774": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dfec92e6b1ceb2162f6b90e6c1e58c1d6c4d3e81cd1909e980648a1d2b7820cc93eafdf0151002f481c0b874502db473": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e00c261c706fa106c6b2fe14b24e0f857e581640cd7c61c76dc4b85b771ce496d10e52429113f8e7629425ad9787c81c": "0xe659339aaaf44f9871d9a42595bece9cc446cc4dc321dcb30c798332a57808460554555a32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e08e603289d76e449e3961b2c9ab6ba4b2fde580d330e81fd2b163a77bf1797f3fd19e98099fec1bbe33217c7f18b77d": "0x366c1d734b33c714b0e0e9f164426e66e3bfa97b917b23e5d3674f4a2074f86f0220", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e0b3f181c5a9a05fa98a63930a7207a1009ea4dab5c62d5da4b72e17b5ee5932a3098fa728b996bc7ed07f112702d32f": "0x5a7aaed28c23b0b10d2fc6a0a914c93ce965749d67d7f657facb010255e4852e0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e0dc322e86d29e3b50cfb38e35ea5a7f90549dacdddd5bba278515f623f95197c97a6a7793e1e350c7492a9436e4a90d": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033737", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e0e6ac01103ed2c064932499ba7b8198623ad4601b91806226421ebcc2af8a4e60b4292b52e9fa8bc1c57131da504800": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e0e84d0ccf8d91b0701dc235514ccf4f40ffc76cc196faba27d81c0c8925911628bea264b949bff7a26edc041bfce66a": "0xfef5977196fe3fe5c456a767e6b06013ca62762b282de97040add4ad2c53db61033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e0ed24a7b6ecc44c7eb0d7c0d32ecde38cc54beb3db37569467a12154f037da2f6d859d11b72db7cc8f615c7456bc923": "0xbee287e579da5137412f2c3bd4d5ae4c6a11c4c420e04261157e04842a2ea641085a676162696361", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e0f6b4abe0f57172867aaec554a3a4177a1b5cf762b0c34865a94bbfb0382ecf0cb030a97e582c4f219c51441ec0b805": "0x6e8a3622a7355ab70892bc48236c461076d5163f55309b7e5d0a459d17c6272a0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e155932771905a9da18ab702614d5a4a46911250513cf4880a89dd8ee3e32cd8363d0f3a064767a4fd19635f2605475e": "0x74c76b2bb6e2e4b16fec1849aefadeae913aed26e72e2101a4dc34abb3e40776036b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e164b11dafd4eb203991a45bdece3cc26cd8d0f1e2161523b73cdde28b857e8d4c281ee0825d88c3658675561a2bda1d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e1cbf7f00da6e53c3249ca49ea77889d62832dca982c4883b26bc9eb5f5af530535e7d216400578738ef04ef0871de73": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313530", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e279f183c3fa7038c796be0ca5053141c0c6960f5ed4ae55f47327fec246d858b57f0d4baafbb54920e0bd47e1dd721e": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e2e0559b320cef9a9e04c60fd88d7ba088bc16ce9ffb289186e900a2c7bafd486c3ac4c2c612497a5bf14f8aa2dcdb09": "0xa0d32bc7ae5d421990bdb847fc38cade9b388ce8138ab4e4ae957fc7ca59bd2c05e29e9556", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e2ea2c505786b366b22eda70f336ba33ce52792eba24d1a81f5979865ac647e16fa810d48fa38b2840de291115171e06": "0x76f45a1045fe47a639befe802be7eeea599080222e2f45fba46492039609cc0706426c61636b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e2eebedecb077f136805ee88eeef2b7eccba4ab664396955d9309b5ddad39f02b7cbbf76743a9e8969949c3e8a2f5ea4": "0xc85cebb3f21b5e97737a7bbc14d8376a79dbba9c2849a28edae77c776d1e4a080232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e3340acd351f61644d02973d5b0808a7c234c72214c38e8cb025a2b0995370d26b4113bec935efcedeca89dd30d21275": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31365d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e35c3408f4c500c4263624ed16c2c6f5545513938fda2f111c89660c78998fe45547148b9c2c0891f28ccadc27313a45": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033531", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e36f6a57fe303b9ac571b4f4e279cdb5600456bf4a3edc3d8ce8fc483ea6b102c620264661f24c3f33b4b41ca8e54450": "0x8e06bfc989509d6d625c085209adb405867bdbe4f167ded7e61ec126c683165d10416c7a796d6f6c6f676973742d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e38aa8146872f9e132f103cbded76a490ed01c71965026d33ac38506cc0590b2ceceaf2a3cd648e16e0a1d4c10542671": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313437", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e3f641554b5597f917be4084dae6e274d44824ac8d1edecca67639ca74d208bd2044a10e67c9677e288080191e3fec13": "0x68170716ab7c6735dd0a1012045d9ea33891b5f6596cf97eb217d0962d86a51809706f6c6b61646f74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e456d7ddc7cc8e5a24e70581b204c85b2ad8cd53e45f24d5e7c2cacb60dfc3a4dc6260682150104828e62d3a0142c008": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e4941e79c2fc14646d53947055a43a6a5ef2424315d83ff1d4199b1151f91ad9c0e89306512b02f846f7acf17f00da67": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e4a9e83f16a2f3f9536fa0267e9daf3212c0e71d210ce61c449fc8f5f3f521209d2906e445239a938303741301d0ef7c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e4ba00cd633b8e3fa3f5623f69e02de848636a9fc435413c12d7c7524f6c12110ff15938dff2da4dd92cbc87696c721a": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033337", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e4e966dbda21853ec16ee4d348d8d3fa62be3477b75e8497245a053f1f51f752421fb039f6bfe04a397e85be7e193440": "0xface99d3401cb9b45ee1bc0ec52f4cb35914dc5ad27806230534230eedb8413d0546756e31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e4eb707c294c16066f750a1ba2d16fb34a1123e20cbc903262ef39136378a2528eb7382d3b598cd240af1a965f402662": "0x8a65f2773ad69cccedc0a58ef7ebd2d446b882231b4b97044105b2035a8d95460232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e50d77c8ee8e0ca85e7832a42a57c8cb989aa1bd13df5939cb65518a399c66800e3b23e792592f94ba7af30597d7fd71": "0xe4269547e0e9a8c162de9215bd45921be44dfb58ec95d2f627990d51890014400231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e51ce0489d80aacb5ac38f204dead12c740cfb483a7e7c4d04abc9fc3651beeaea5633eed75f65c0380d424312412357": "0xd8783497b4c06f05dfa6ca91a0502e77ea7ffbc5c33c7142a5d9d1f0322d783b0853504152544132", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e53ec219e68dec0b35fe17cf965f90a7a6148a5ba31e548196ff678386e2c8792fb3bea265b6c2475e62eab64254946e": "0x18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc00190238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e54e0729b8b63fc4fa13f0e6fc628f08808652b2296e43e858df65b69d5a3942ba76744dd8d0cf390ecdefc89b3a553b": "0xe4a66ee66171e3238670377bc9ffbd7cb4bda47baf25e6ed80c2070942ee3f721170617468726f636b6e6574776f726b32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e5a91996fdb6ad1366a1d9c10f5cbe533cdf73c789cb02811fadd2fc2fad69647e6a22e18ff3b20c03cb9ed07ca0e69e": "0x2c5bca9fd4c92b051e35c47617175d8f28aba000ccf921cb24bdf555662f2d4104303163", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e5af5fbc22b8e32f770ff1429ca33d395e26900b9067da461527acdd9856b0934eef5f0c099a2acdce01b51f02be2351": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e5b3c8937ab058e906ccfc60b0908667dc226375dedb131cbc73b5c90ea8d374d5d4b5e75dae7eb6a9a4c215d8e9b0ad": "0x98edcae85e6eef98ba192a51fa0efd89aac0541fa264d46adc9d8f29d3e2104704303138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e5b64404ab43ee7cbcbe85ff6f5d5b65ec496735eca64ceabe80e911ddbad8c072ac5b69d3d88ed8dada02a9cf5c66c8": "0x4c042cc1451781f79ff3bc34cacd5329b21591b2b2d82ad57426a5079ad1c45508f09f8eafefb88f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e5e92887f1972bd9979c363bd2d8653ad21bad21a85a2c91d823216610c964d9fef7dddff9f1864b2a7b4a8e667c1f53": "0x3284bc8ce3083b62e671d1c5bd61db5b3fea95a77967341ca8834a69cffcfd5f0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e623a56518f78c9028775cc55f65c190ec194255613dc072122c8330dc7c18e15b12e5eb3093a442224e91e50cba7d3d": "0xc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed805406f09f988839", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e63b7a685f63670a81a262fcfbd9fbd2eaa00abd5e6449dd46d8882c6024f26cb5247d26becbfbb4f57314d342b96a65": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033734", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e658ef02e990b8c30f8da6914cbd955f0119766bce9e7ccb7adf4b74870a29b352995478848ad500f46166c797f1c326": "0x083f39607241c8ebb62919ab2ed816cb6b20c7d0abad78a92570030d2f96c63c033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e65b73e2c0faf462b8528f4a507cc9f8148abf367d1fcc88ac026490727eccbeb507e35714b327c4a3dbe404622184b2": "0x1a8ab26aba64d6176b6aa462a2a7ef6252ca1063cf978dcb6f6c64fec81e7861074534592d3032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e65b7dbc9946c336efe1a3714adc5c139068a88ce95e5c34122578c16d46855386229be241a7e0656ef469a03db4ee19": "0x12d49078cd721faa2f041d0cf96e0d8194561fdcb4ced457270e52f209e76c0f0b37363666373436353732", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e6641af3b6641795527ce31eeed557dd12c0e71d46088235059834f57282e18f93197b164a04be4082b6dfd88d86f531": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e748d98bf8b780c7f223b13fb6222c5612c0e71cbe21aa863d666ff694ca4aa3a1f0e89a9e75ffcdb6c629fa1d006460": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033937", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e7555fb4759ac62feda8f76622333aa7922988e0c062661a2af3df12782ee38f6df030390d1874d113bb8a53c165f147": "0x269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b39033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e7589bc127b541c9356d09774bf0653a2c34b3c3d2a9e4c126b3e6152b8ceeeb75c43d7530aa56ca6f41de5a5e76a270": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523438", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e76b9a352f58af1eff362b8764392433187f07072543de8fe520037e115acbdb9b9ab6a321be237e39e67ca4ee979749": "0x12bf9efdc9e4e25b4dd72c560029152b6546ba2fb62eca400d7edee7e5f36b5a0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e78077f817c4c582219bdfe28f1e7d7e2e8036bee650826ea445368d4643b0ad2341924bb357c8ee1596fd1235ecf326": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e789267e130c5ec1992e7b2300146bdbccc10f47daf388814d58209cad72e4c07dd9131ffb7b2b909d39746577a97178": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e79245080d82d693b3d098f207b3efafd5febe9f9f424e1a509cadb2ccd2f502fa1e9b577c03bfcdf74f7e6abe6f692c": "0x02b47d21483aa953be67636583cb184f55d575e0f71ec75f45383a786324a64b055a524831", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e794c096ddccbd0c284049c16597e94a88c83f9b6b21778914870c7fd18ce9b3b44831ca8706611d6b2fec736a5ecc4e": "0x5cce1eed57740222d643b9c92a594bec58f9b9968bfd4d63d495a7fe5237ab1e094849524953482032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e83fd59e7b41f06d890f542016d8d5f75ad5faadcc4848cc8acadadf39c4a9893e13e8993e270364eba8ce53b8374c6f": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b46011f09f8d80204b534d20303920f09f8d80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e84ddd98e3af983e752fcd3aee367351fe3aa3a8b8e0e17a72626db79dd999dd5e9cecb8e0f265391e5daae3ec229d3c": "0x4eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d154156454e5441444f5220434f4e54524f4c4c4552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e855f21c0bc68c9fd5e477dadbd5b2eab22f3abb5bafd42556aaae871a79acac48e9b874703cedb7f8f5ce219860ae08": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e8745646068bdb0edac7096adc4803d597a214d9d7e4d9756f50d6b43a18a8ee671cb1512b46f2c2c8c1309694dc75bf": "0x548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b06415341524f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e8ac56067099b665e2ce074b028d38a586d6e47051058a73623a0abe221e2cdf86a362a3da910618be17cbe3629eaf31": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216064561736f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e8f202e282deaeb09e361328a01c8e1cbd65fafff9dc200e3945e786ca92ba36a9aa333b09bb500b632e8827f8f7ab38": "0xa49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e094b534d2056414c32", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e8f875b461cf418f5973a82da0aac2212f9c09c8a70b63d73be60dfe13947a17839970667250b900c8560ed4d042841d": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e958ff3b911d721acbddcf612e892996b89b1a8c5532845c171dcfc78c4bd5c42c634e7d6548d6646c83fdc25bd4737b": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523538", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e96d7ea11d81f95d0428a125ac69d5d6225ad9907fd7a3f7f3633f2251c3b390b338385358f1753ce35bd27328c7fdd1": "0x68f6e4f77f043dfcb9fe88519996ee25ccae674ccda259bc49efec6b6eeb9607033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e96ecd9a7d9777c34414149982f444e3801df817f435be03321e6a77b0fab3183b9716117accc0f3db95c9f6f9434954": "0x9a2cb674ea2f4866664769a1663fd6aa321d9cfb89b67c402c881891700c0f57104d757272617920526f746862617264", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e9b53625b2ec22da0d66ee96aed6c8a9fc036538dd0a7335685f0b7f62f6745658ff16bc2d61a8830e70dad3e1749355": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033837", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e9c29fa4d8f011d919e8b0aa24ca376f687a846146ca3cae0d51993c0e186d6026b2134ca05e213562c0141a85b4ef5c": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033430", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e9dba064d1e0741d4b5e37a05f52e1c046a4204de252ad6bb8587604684eb6b0d8d7c5f9f8e7ca0132bcdc6d53131e47": "0x04c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b3568064354524c31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2e9f3f3edd998aec1842b1673a32cb65d16c4a4dfdd6c04572aa9c3fbbce888451c65cb1a1c96f611aa638e609cb6f609": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033532", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ea29bc2f13063ab1c9c07534875dbc8d40619a9305b0571ee5a5666073612190b2035be70b6846a2f16c94e29908d389": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083230f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ea3cedd2f091ff1f1d5ddefad7fe2d8fac11ec66576b8d0a1c924596e74f3b45c61c7408e1680e16b4e365ddb4b93f56": "0x729f8acbb64cb60b5edb62beadc9ac05430ede0086e29800ee32d106befc78250231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eaa90e48b9a7dd48967a015150804612d85561d4ee89c473f4220a4a5ca0c8eaeb01fe8d0740aed291ad796d4b2da175": "0xb08b555a5a3b2725e01ba15eb40aa32dc5b781532854b797808ed45e752b047c0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eaab2b4e0025425dd7049c8429770856c63d0c9d2b2f1b51dee3c65bb2714871c2913cf646efe3c775d5cfefd4e1bd89": "0x16eaf9666bd95a04bc6ed619c30a4809a43fd7265e414284c11b27b8c666fd23034b33", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eab688ffc102f64125630a3c861323e9048bc4da5e4289eeb52244056c70c535f165d37ad921c08b9d00466a1fbfe442": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31315d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eacc1ece31019fbf6408ccea0dfa084d12c0e71d25d4ac0ea242b6e44fc9625e1a4dcfe17e6cf9dfdc0bb233ec589556": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eaf55c9b1b5c07116f73c13edcaa29869eb6835f83b4313045b2a156d5af104e172dc687b2bd07554ff3699748c41050": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eafc1348fe1623ea22d24055452df792d2c2f040d9b3546eee26f30efecb97e72fdaddea5d4999845b37742841e95f57": "0x240cc50e90684f175ebef583b904fbc0b9aef4b38aaafd53e6436ad3e70ba3660b496e2074686520736b79", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eb3072732122ad64b038c799d470f71c4409776e3d248cea53e8d6fce41bc1795b83793fe794119a63b82a7e837e9f59": "0xe683743954d0cb555a54ab21cfb8161f74e689a051d1ac1dbbb94df70be3d81e04474f56", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eb5b956e59f0279c2a89a00f1a78eea9bad66ea053eac162ae6fa88c672a16dc18d932399e7159d0e2ef25c62189e637": "0x3d6d2d20735ec00c7753d3e6071ad1e2280288a98d7d89c2a2b7fe08bf6d05bd0641726a616e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ec26a61f6e5d8383858d0a1eafaf930a9e745f85a1a8ed92e237063f3ba463c198d7744b7698e0e0a9a12c5966d798c8": "0x88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ec4fe475d73cbb6bd5e7e5afecb01039c0266f91841edb77e30346c6da3975b5c3ffce4a2b1ddeb696527bcc0279f3ce": "0xcca2a0719fad006090aad6536ca8b7d8c527589be01b0012564dbdd36d9a492305f09f8c9a", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eca8cbe6e1a53559e1f36828c7644781f87441058c9c1d89f27cd68a74ced729f5393936f7c041de6732df7217d17cfc": "0x548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b074e504f4f4c53", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eca8e087b9c31caf6b65683abd4243337cca5de8c58ec8fd1a269c3e51acf6ad45a8b9b32e4a65a4d4c481c5c449d826": "0x2a807fc9b3748a0d6b964bff11360e00040fb5fc569a9595532f935286a45f47037632", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ecb59c824a063fa221530b13ea4793e99a9868ff02ab61c9603e98eaf9560a864870596f58a7144203636bef6d04e269": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ed7626002652026efc7173f5149ce3a5aec16460ec51be05e01406f39af4e8adc9d400e511cac7aebc10c31d42540f46": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db196270238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ed845b33e774e62f877fb9bec62ac9085b485a5d58748bfe83392a1ade902a02c95084c00df2070dc8f32f13ad499e1f": "0x0c841e6aea307d8704d5b7b7b71afad58548ce47dce090e25d01b84925e5c48d0f43686f636f6c6174652043616b65", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2edbd4867a11999b712c3889ac4cf711276ad7b338e915c739fa6055381d937bd4541d12ca755533161da8611aceca14f": "0xd8876695e0680719107b9ccb595ad5d8bfdc4ccc8e8e4656091fcfe652c0f1550a564c4144494d495232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2edfa6613fca1f3a39cb95daf9098547038cd946bf9de9d576d29db5fc442e5078a03f73b67ba76d8717634b7be4c5a23": "0x8c33b686a457b74f9b1a61b4446404e522d122064d6713ffacee88bfa9a158610f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ee06f0566e3a2fcac576e9bf84a239110a750504f5da1835d98bf849ebc018742d544c86edbcab2525a8acc2178fed59": "0x4e908afcf0fb6b394bd1a043bc8b226fac33b4742731b9cde5d324f450eb3006054b563031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ee1bd3f0eb1dc3033e9f4c7f4c9b3e29cadcba686c8bd7b8579cacb9e1233fee5eba81db5e7c25328b724198bc499b2b": "0x0277ce02b2ac78ceeb9ae4fa0a595005489bf3f5f77898415e32a3e9504a53141e546578617320426c6f636b636861696e20436f6e74726f6c6c65722032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ee51c0467906f0399b711fe5128cb7ee12c0e71ccf0639294d8ecb643d6dad93d9660836463f91d1b66292fd9b1ab05f": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033836", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ee5aa3cff49e0a798d42c3a4edc2b45bf826721deb8c5d5f99d57fab56da2e28286fb7ad92f148b05d1aa353fea2b26a": "0x86b7409a11700afb027924cb40fa43889d98709ea35319d48fea85dd35004e6405f09f94a5", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eecadf8dfe8dba8d2e7c5557ebdeea0b96043b3a00f3e936328165ca3f780b594dc2ff0d9e72659a9e13ad74c3bdad4b": "0x4ac4eaed36e5c54f045b46cb54f533b2d3949c0ca7137e89ef03ee3f56f8155f033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ef2e11f785c26f6ded26c3139eac5be7506014a02fa72b89b1b4ce899d40e369b2ab4d06fc1ead4663c856bae3d9db60": "0x56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b1150b494e4449474f204f4e45", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ef60985c2bf366da5782cb9287150873964d882bb6127e75f8c02efdefbf052be0c010256c41d832e8c81fae632dec75": "0x76e282d7a7eef593fe7a9a8c5d08a21f134e8858e1b1753bf347057c4db9b23404303336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ef72750a5dbb1f175ecf94f7254cf8da53b9577bbf862a61bfd4c7302c3a43bd26a9b50370e3cb6586c8e267c1b87180": "0x58f26dd10efac24a7fd1813d6aa72a8e60bee976f7da28e492ad033fc18223150230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2eff63fd37d1b282f7824ce8d27c457b5ea4565b84bbc645ba42d3ce16887c42062314fe6aca7ab36a1fd942d7f31c76d": "0xc088a8a35f9a31008c7ac0d4103078bb14b3d50213e4b92bf03ea98c081f173c04303036", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f008e8cb26020bde50d4f0b553b1a67093bd14a518853f72f3deb5357ee12fdd6e77151580b082bd468bca1358250d2e": "0x96f7daa1a00790f8b168d3db7f0175e5f8dfd3430dc7edb4c5b807bce2b9d93a076b75732d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f0094ef8d1df177a8d33417bd36a38e93e4f57a212fd4403b083d956909c66b8e492e24c48095c3681a5a28208803744": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c0bf09f908b205748414c45", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f02caa348f4c67075fec728c3413c5677afc36665eb89509814350a32bc136f095dc1c9224dac890c0112b5f4b53ac6c": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f0550d244d630c7356199c24d2f56fe812c0e71d10a91f1a202191134bc06e790e98829eb7d76881e3c8b42dbe8a6d41": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f09d6c2a2016877c4728ec370a211b47feb86644e89b8c9daf871b44f7111264cc15bfd8efa38a255124412b9bcc5869": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f0bf2c785c3e07b3e53a9fce2530b727deb6ff39e56549c7a265ac798934d66b541c41c2e2212c34bd76b29635b4cd23": "0xfef5977196fe3fe5c456a767e6b06013ca62762b282de97040add4ad2c53db610554697073", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f10c646f0d99a97e06f60f9e098d413d831b9437615fae78c29e32df5b9ca228b4e9b4b31eccc8c090834cf6a85c8e29": "0x32068fb3b800c5df40df16619761b3418e40d9455784b6a293d2425e35ef2c27065354415348", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f11a108af7a78573dd904944eb3de78c3e586d68dad3baa2426853204a502f7476c280a7cc3bcc4f25bc4bfa3e121601": "0xa43b2797bd4dd454d7fb0870a2a4edd62b39eea0801f6baaf09b05c8634b5a250233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f13d95baae246a1e8d55a2507dfe207e88624098732487bb9f92045e3d405bd1b7f9432dbd705c3ba58c5e86d1353c69": "0x8c20d46f86242eea89c400d5c478207e05c76bbab29a748af8aac90d627e1a010243", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f1c9ce061a86af07f6a818c8734f14fed8c68f5ee90ef5d4f3a2b0d3e827b6b52d6d42c66f0789546e7672128891df61": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f1fb7eb39a9d8c38c4afdc44ae906bb73481012d5c43235dd891fea6f46c4745b4c6f9ae37e756f7da67f6af35831a23": "0x3ecdb909643a31da23e3dec041ef8920632ec16fc5157297084eda7515badf68033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f237d4da327376ccc05b307e2369972b26053f965308328e14c097fbfc2b09b6b97256bd6a14ca1459ff9c1e8dec3556": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f23ced154c515cc7381ba21c5a71a2ff54416d87ef2183c6d1c383b29dd10f002272468fc70cdbddd42b5093425e5422": "0xc0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b033230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f23f3b7febcdb548f3145cde9c1a0e9112c0e71d364ec914b6b740ad7c055dbd9a15aa2cdf4f6b3349970e15b6b73e01": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033137", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f292f07891bc9729fb879d675866f7f98e4ac154f73a0576603db7786e98d6a1db1e72e3a2b32d2540828395dbd3f7d7": "0x2ca8e96b721f074e95a3f7d994c370dab688fc85134de7e2e7d4589d0a306c51033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f29930ae86e28dadad8b3f03c93d00962d14410d4bb33f09014a028cdbb9d2c2f00e7d5021748ac859c5dc11cc277a6f": "0x02b47d21483aa953be67636583cb184f55d575e0f71ec75f45383a786324a64b0548454c31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f2b50261383f32267afd11d1441702149a3bd9c292ba18b98cdfeddc8e45fc0a4eb962baa86c5d839ff3e433de19944a": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f2cc70fbe35d96dcb882f5452b71816412c0e71c712fc750ea7987ebc3adbf181c53f54133d3378fa5d7268bace38a05": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033336", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f2ccf65413283ccc5fe7be230377dff776497a6036a1ef7d02ede96d44f39094a5fd50e69d524990946cf5e6e6f1da2c": "0x22a58635dd1a211d33750333282985df00d84e87b160293d6b39e89ea4bc7d670b414e4f5645524e4f4445", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f2cfff95d1e91cb6647ce16c34f693f8e4f351785e2ba01d8ae8c408b0112af93577eaf7487d1ad4cfb54285c88dbf1b": "0x9642d0db9f3b301b44df74b63b0b930011e3f52154c5ca24b4dc67b3c7322f150573756233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f39cf3feea5583006ba1636f26099b471adfba8c2b21414451ce19bd06d2e9ab7541214eb3285ae73da678a755432237": "0xdcf2917d37c64e3d60416e47b5185b4d6c3965ca531ecbe29e1d2cf759f5f871033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f3c2ea1f45b4f32b0ef74fc35e1e741a847074f1fb351eaa06337823c68f2a9fb28c98db976bc5cc16867e4b84bc1060": "0x9e826b5434525d00c118f3f6b0a29b7f432be7bbd18659d472c5f07298e769490a7068696c6f74696d6f", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f3c8018203bea6b4195eddc135d90047164f70bb86b671d46c1748f38329f50db8fc5461a4ba4dbbfaca7a47bd063962": "0xfe6c31fcff28694469c3d4c1681270bdacf6edf7ec39bda6c68cf25738268b79033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f3db22b473c2869c1572520aa5e1e3f4dab0125fdf270b1af39164693d9bb3251d63b78742a99693632359e0dc6c4882": "0x36b5dcb29928d8a462f493e0250e895158fc4fc54eb5d00a2a6701fe36a4283d0d5069636f6e62656c6c6f2032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f3e73875249d17f518bc605addbf0c8212c0e71cd7c05aaf2bd4ceaaeddad56e206f8b7be033b915ca7e8391aaa56a0e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033330", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f3ef16462d5d6cf08146deeaad6c6a1558b16e3eabd2cb50029bde70c7a7ec0123d1e710bbf45322f50be3f21ebf8747": "0xe295650fdd71d7046633b1fafd0881a3207719c573f17725fccddf854a8b562805776f726b", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f3f6ab2f877ec353024b0d4a581ec9b69e66677d3f5f4ac376d14bf73bc819845156f1f25ce9e6930fd096741276ed67": "0x1a95c3968b83520b8e43f82edb0f050b1ce7281873a93bf9c0798efd50f5c41a0654616e6973", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f45a148fa03b9a5ce97e26b45105f0e79801bdf93fc1d4b0186e1295d517b03a5749b90c94a5468d74331a6ff529a953": "0xd60cf655685824e9966b0a10c01dc8b17b37e24944fdd760e4dd73ff1dd4ac1404626973", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f471887a1bcebb9ed9456d6694672c5412c0e71c92f12577507a7ceef4da940099fd984e976858d6d4c6826ff76e2544": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f4b2b50539776257271de63e3d55aeeee8b27a414bbf2ca10db6202c922e1d33359b65c8d4967fc76f926d93f54dd916": "0x5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b0237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f4d460a7cf7347eecf1ea2331620d3561024e48276b150fbff7c44baddfce92ba5d90057d518d3b29bcfaa421c13ab7b": "0xe4e00e63c3647fc8c0a3d1b163ac988b6f0a7c3d05a01e209d4adef8e285037b0942696b6572346231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f50b6a6dd76109679dbe380f073a1fba09f7f25aee06632399bd9de5e4a311cfbd1846ecc34f8abc3bb8118a45c98a2e": "0x0a439f839504ef07c5cf8daf62beb17546e808ed1026c8a683be8207245f300f0b5374616b696e672d3031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f50cca20f59770811debd1119a649b719ca08cd9b7fdd71d23d3a07906fac5a51b77c703f290adb2b5099b4334407913": "0x4a003aeae28534daddcc861d7d3e91b576683544217044cefcf4803ced1fbc690232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f54df87c5f1f17edf050018f5d0f6e3d72ae12a9ae7729206f6988826c71f0f3076971462d1ac94efff198392464a657": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f563f9de25dcf55912a6f06a528d5fa774fb773cd20d9adffcfc49a58d0ed20bf5baf645cd37aaaf65408f56ffe22116": "0x4eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d164d55524349454c41474f20434f4e54524f4c4c4552", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f58d058c15c34128c960f33402556779649bd677aa43958fdeedca2f9159ce5de8d5a278c08e73c4ab9a713a24d0d47f": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e15205b365d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f5d4af8d3aac1dc12cb3b4e57ea6d654280774e8e4e6118ffded6250a1b6b1a50285b5a61cf184e19a2bc8e8de880858": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313138", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f5ee7dd57b2155ec96f49d1c5d1dde5842091485cb911996df13bf18b2ced631569a74c5e43790f285fa4ec64142d503": "0x08a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f0531426f74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f61a062242c9ec1639214545821d86e18c6d54d22c18c9072a83594d805c1a6c4a06940528eac4c3cd44359dcf9aee4a": "0xd82318297ca7af51ac2546ea6bd24acca272e1627db952e2ca35df527a3cf2570232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f69833f1ae9dbbb00dae666f139773905009e192ec169788c9c1f0202fe7c2bc79405ff8b6e1d1ac78fd6152006e606d": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c08e29b93434f5245", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f69e7ce6dbcee801e749a85956c602a240e877da5560adb4bb476e067659f4446675875a5e49cac2d3a4ad207adf450a": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae480230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f6dec04f83b8e2ffe18956dcfe64f2db1a232a8dc0c50a8faa639ed22d11410c00f5b812bd14ffa6f3f554d8edad4172": "0x7c7d2fe83c4af79c49136f0f8c5f1a00cd8d0aa91c94fe74d0145cb96d688f66032334", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f6f510eadad5c8c77ed6d38c1698e558568538b172c522826347235dd841d08c6512bbddf1fcf91a10c9bb9542b75ca3": "0xc2a82d0740d343bbcf853665019f2afe81ddeb884f76dbb5c74533610f72a7321b32202d20747769747465722e636f6d2f706f6c6b616c75636b79", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f70d1ff9a047126addaba5bc180f653e0cb8ca7ceac36a246a8295a56068d2b532fa2c61affbb34bc5a80777d91f1805": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033635", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f72913cfcdc0d34c9abb281c5ac246c3ea08268d10b6dd05b9db75c7b7abc2b95e9b24d47f7b2a6147a56dcc745a0b4f": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033034", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f7802b4b06fccbf0ccd56f8111fff98a24177bf6f8ef353988a83494a9fd6a8ed1f89ce97daba4d8448c48035b646960": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f789f222c0c713b56e093e473a22562d12c0e71d466c86c2834663f4edc4bf268a2746f02da7a7334344582db793062b": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f7a6e9656603ab873c94abe3d3da7ffc68851551f073cdbb09116a1e5b1500042b1376b440f967b0ff961df638fae867": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033236", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f7ce288025bd4a563fa7c6828507dff3d8ccc709448e61b19bc01bbe3be7d7e74c2303883ac6d06c19393f9c1140840f": "0x78baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee0705504f4f4c", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f7cf5ede6a33615ed553efc37660a1969e98a7c353052e4ff27d50ee1dea0f7379ccdbdaad823c457b755413243e967f": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680d424c41434b4d4952524f5239", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f7d6185d74423b52fb1014da109a710f93ec952a9328c2f39b697aa00f57f01c289423ac2068f506ce2165be10f1ec45": "0xec7afe6fbfc9947fd177ed118016e403dbc14803a0432bfaf0337e3bbc3c820b04303031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f7e69d9b9b0db08ad3941a583e280b29b00533dede137ae3424e18ed36871d41e440bdf62952275f43c899e1837e3161": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313434", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f881b72e5735e0005018dd4da333c3d8eef86cb3454d5d2d17aceed4598209af5d3ec6a09cacc00bc88d86bba7f34645": "0x243612f0fc6c935d9ee0cbe21c453a83f58a9427054ccdc74966890ca57ca7190232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f8eacb151d14f713c6edc17cd546d26a12c0e71c648c0ea092b2481ad9657956548a531fa3a89a140d3d8f9359fce54b": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033936", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f92cf23fd7dffa81b32c1b18edcb1307de89b93418a2be5e997eebd4b815754518fc3b7db32b2c31bf97c8297f8ff752": "0xf6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a04763038", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f9361e34a3820d9663762bf72d872f77c0ffc934cf4bfe0fd0cbb0153cc1f8c1f784ae59bc53da0e1833056c63b157a2": "0x4284fa7c290fb6052b9437610cfb2e19b3b37081fc72140e444d5b57ca01924d033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f963679a580318063a9fcdd9ffcfeb131cc49a4b3adb82193695b2dc7507d28e72567060373e1e82206a0430005b694a": "0x56d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e16205b31305d20542e4d452f4b5553414d415f424f54", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f97972cd70c90172b59ac8f8bcc1956f12c0e71c6c063c135438f8997461cbe25e61d7569fe4c3f9f07db032f75a581c": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033434", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f9895a23189b4bd5c7dc15f4354c2cb55c7c97a0165263b9287982692ec2845cdf8ea293108d3cf51f598b6e98da1f7d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523535", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fa174cfa8ec743e7fa1821b8f1c83320837cd9bff26ac28b84a814643ab00556d90e873a921633bab990cc75b5a06dea": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212083135f09f9a8020", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fa18806f4b64c61f196b040fb75212ad2ec6d11607a14dd26f32576e47831719d548c856ce4c188091790cd93ba82606": "0xdc86d7e1dba377a90f087a942c0c2777851b447a16af68cfac09c2e58ecf7e1d0242", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fa43c77ec1513d34e343507763368d2c5a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00": "0x5a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fb5e4582a7d7f848ef547ef35b4002c612c0e71cc202669b8b8f008fd88fc91048ddec2434e536b37adc066ae2d1653e": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033238", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fb6259e402d8e96835c54de5060ee57a6e5bea81107431deda89d3b05e7e1656354c48d0a5cb767851726ed359371f7d": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523131", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fb80f286c0d81ae630a5066a97174c07cd5f012106aaea7652374847b9658c8c300f0f0b26e484e99f7c1e3d32d83a10": "0x3a731ac0ae7375a2cce5b504484d91f1c49923b3425072e36e12b0afd5f2a8570530303130", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fb840883000e9e9bb33e817326b3704af4642a032339376577e3ff7f6d55a53fb6519c5a20633e30bea2bd4d2eac3a05": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033434", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fb8fda93c177343af72612720c0a4d885a3b1634ed187e0ff740fa52e33f2748d0e88a19cec4e5c185cb00408a89b605": "0xce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d680e424c41434b4d4952524f523539", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fbb99ba0c4a86dc67ca38c3071429e8406beb838b0ba3114b2d1342cf7011c397879da3fb4b4ffd4df534e6948d4913e": "0xac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f10640554525359", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fbe3ec6b6f209986f7c790b6f07f5b847493915ecb44badd479418bd0ef0f753952690f6ceeb421a0fe567edf2fdb228": "0xe26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd04094175677362757267", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fbef333f49a8a69f97789d70bafe9bc34c69cc407f4deaec89a4090075f36639e151c616b8ed573e7e384ef7672d100b": "0xfc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216073131f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fc1b05f18f15932e1feafb89e827fe010879c078b9026ffc8f5b7ca4f1af1ff0f51c592958f24b43ea5433a34f0cac02": "0x4e4ac8070fea95496b63cdcb6987de88f63dc75a295eace6ce5079149169300c033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fc365be94c882e564b1276951858b44ebee52eddafc82ea6226864dcf0583e034f6510d2b390ed60129b6855fc020c06": "0x8c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c4927704313133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fc3963aac45292fd533f75fd86b2776712c0e71c6d383ed080fca5ac67242f4365fce824e3b989af1388d5a94f38b934": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033237", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fc7ba4593d07409b3f412f1bd282cdfc15ece2a3d6a57419d76a4a66bfb72185e128e3abdd1e13345052f43f21548a9c": "0x8c4c81f382ae2c201eed4b0b519f352aa9c0c8593122418b30ac9760844de2fa0235", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fc85519bd52e95bf35dca96c087df9833159dccdbf4c37ba277b4becdae7ef002bd7ab17d62fc7419dd68967e41a358b": "0x6610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38033033", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fd040f54cbd52461abd73a171fea85debd05066b950d256e451a29012b1fdd38e661516eeeb487d816bb2a65975baf01": "0x68f6e4f77f043dfcb9fe88519996ee25ccae674ccda259bc49efec6b6eeb96070530312043", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fd2d5105a0e18eace0917beab6a3c06106b430745802c7c8d5cb3537dde6dda1c74dd2251837c781be4e0aebfde8d673": "0xe8b2603f6baee5bc32a9b9e4eee9168499fa553d35edb56aef0035ff7e1f165e0c506f6f6c203220f09f9a80", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fd53da24044e2cbb272f820421dcce934e6776c8d171ebb2e352ecd10eb75ae1403f00a4d76089ef92d9d598264ac841": "0xc8c0c1fb9bb3902b9e4790461bec2c33afa31c9a3b72a4e4ab6c050b4a284507033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fd6768c7769684ca925e95e347e739f6f2382813004a234ea40eacc434ee04b04e52977a2907023a2d2cc44d46412057": "0xe6247d2909686256b09006b07e758ecc128364a926f1223ef04b38628a5a3a5e0231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fd7743d42f937d08697eed3dc9a08054de670277a4ec31a0664f1d47eb01a7fc351952d63980ac1246ae1e6751f61504": "0xc229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a6512333a206e6f64616d61746963732e636f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fd8cbf55b87480eb57c660a1ee51397d742e6def792a15d4b2518cd2a957f9bb7f75525308355f9217a2df17a701128a": "0x4c4769cc1bf4774f19c7433e31a5b8cb686944cdd758e193d264410d4918b1200231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fdf2c89d5d9107f1c6f7abf3c00afad2c2b18a21865fc3da2283153ebd44a5da61f33753f6f20eee1d8e41fcbaa0dc67": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033133", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fe336c580c0aac48f9675f6119359f3c74378a77c102cab0cc86d7fa5bd19668bd88c48b2abecf283d81eaf19b4ef464": "0x0a54e1448806b2c0cbdfd5da73198f12554bc972045fc9dd3f2e22b6c5a97c1d0f466f726b6c6573734e6174696f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fe53b5e22298bed52eb973676ce36961a872a2b4f736ef9a7242e0a0d8e64d616ed4c2da9a103707e9ac7807a764292f": "0x8adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48033136", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fe781d2115a0c6d6e092f21df11130e6041edab68d8fa56e9c4845bb931beb45b2e457162753e65c440d11f83cc82871": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3333", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fe7e3f3f42b17a585445b3960246fa578a1e84fa7220a6f820ca42a6dbe689b545ba1def88a7f1bd98d7aa46a9ab742e": "0x48ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54033135", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fe8e5e0ff57af24f2fe84e128c33379f329a36786940b598924622428c95d5c41812d55b9ea2f091ad99b2fbc944331d": "0xaed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b430653462d3035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fef4b17e8881773f3a7026ed8252925b4e8b6fcf0dee98dcb0d710fab325fdc6b158964c7011e9a43be877bae760717f": "0x52e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818076c6b736d3035", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fef90f8cfd2ad5246969d5211208d9bae6ba74e93df6c3e3cd1615c99708e867e1f3160e324fdcce53be8e3b733e663a": "0xd6030dd61ad78ca1900865d2b53dd163bbbb5b40c82f94d25cb6ecc750a93c25033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ff1bac2f77ddd9afa2671c7f8997439f983a3e49a6aef7637adde845d561274ddf1d66ce267c81b3b0bac979ff79106f": "0x9c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627033833", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ff8ef22db0199c20624fd641ce685a3d988740c0cb624d6228e22704f9dddd8a526775c81506cb9eab96d3be870d4a04": "0xdab8ba7a028d62fe9a5088e46acdbd2039f01abd8baa7c695d9377661c3d406d0232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ff935b8d9b8b9bae1cec0a900aa2d3c812c0e71c83c45d50d2f831c6574ab25eabed7842fc69f51bba122c617531d725": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033435", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ffe13fd1e48e4594d33864de440f71acbe6ac75cc8c52d2d3b88dd29c0352b579f4891c52f76508269f2328fece4d07d": "0xa49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e0e4b534d2056414c312043544c52", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ffe84d61bd1090467d85b0393f73254340d1c7929a103e88681731f954862765bb66d96c36e22f82a35fe75cf7a72c20": "0x9ee1fa0d8d4e022ed5680b5925d19718a7ecc9f8f2ff77de54f0822978d2775513576869746e657920436f6e74726f6c6c6572", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2ffe9d9c0d6db5ab5e0051a7533be77e012c0e71c65c6d73c4787dc93561ade71071ffc5d78756ba4f606fe91a6e34521": "0x12c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310033433", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e00216b615048534c12bf9efdc9e4e25b4dd72c560029152b6546ba2fb62eca400d7edee7e5f36b5a": "0x0000000000000000000000000000000004187f07072543de8fe520037e115acbdb9b9ab6a321be237e39e67ca4ee979749", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e00ba2794d92fc826e4269547e0e9a8c162de9215bd45921be44dfb58ec95d2f627990d5189001440": "0x0000000000000000000000000000000004989aa1bd13df5939cb65518a399c66800e3b23e792592f94ba7af30597d7fd71", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e01dba54cb1c92c2856aa4370ee3d21b98ec19f0cbf2106a036215937a15bbe517b24ae5fef4d3870": "0x00000000000000000000000000000000040a88006a747b712bbac65dc015105c9cb6d29ba60dde6762a881975c6b1b1a02", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0214f0b5b1672e56729f8acbb64cb60b5edb62beadc9ac05430ede0086e29800ee32d106befc7825": "0x0000000000000000000000000000000004ac11ec66576b8d0a1c924596e74f3b45c61c7408e1680e16b4e365ddb4b93f56", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0223d09f1c0c1ef00ce0bbe155c5f116187af43bae0bd493872f436a139e23d9b26289d0721a310e": "0x000000000000000000000000000000001006ffadfd1ff3fb474bcca0ee75b100d244da043ce2e0725e40b1e8c7d6f0251a2c61317ffa5f84e38eaaa44e333ca7be9924b445ee9e6e275421200ecc58a9b09454a3dfb574a6756a307688f156f4ebcfd72b63515bcdfccb50cf7f7bf92c12b6a0389596b472840969a9088eb5852fa03a5b5dd7a3c2fc7275d7c05563a900", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0318c1db47739db4d030ca0b2a60a30e7d1a0fec231f6f36c3b608036d25ff6b2b9ab9576d59c252": "0x00000000000000000000000000000000041ed7e0b663455310e4a8d084ce985ea6dde9cbd788f01cbc27f9a85264e97515", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e037dbcdc8f46729a2cba024614ea8ccd1ebf7a634f30b38d65c082be6aaa92551b9c3b4d1f15ae6e": "0x000000000000000000000000000000000c98cafd75bd233ed0674c7493c67d589c4d7e78b69cdb409ca66c0f3a7391ec06662d04da99fa11b0ddd8bdfec9bbc2574ac71565e9346c8e13857934c18b3646223b081a343ef66eeb872caa2ceac54d75566c279627592362d2cd162bd21831", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e03bfd6fd4ef57fa5a0ad3e520332a754892d7a16de9de871b9f20e982d62a498b5d9c7e5f93d433e": "0x0000000000000000000000000000000004241816355a91d53c772aebd5c1ff1114bb35fd22995e8b0d84fe770304b80352", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e03e65d4ca28086078c2625b0e10c7bf65f283c576878cf00f67478d3dbb6bf39ee62b3ca19ce893d": "0x000000000000000000000000000000000448edca59aaf9ec40d9967f298ab5a5a2bb7265eef18569d5c065f318da512358", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e03fc9979d20d8f4376e282d7a7eef593fe7a9a8c5d08a21f134e8858e1b1753bf347057c4db9b234": "0x0000000000000000000000000000000004964d882bb6127e75f8c02efdefbf052be0c010256c41d832e8c81fae632dec75", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e046409e5f145bc2af4f95e82d3eeecfde0058a399005262a9709101ddf3f2a564ab34040678ece15": "0x0000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0556a86b11fa77913c7f40746d04d77628d886dfd469c9bf606232dedaa248f5c219d32da93f4054": "0x0000000000000000000000000000000004f2ee0d3d7e3d57e18249e42d570e163d7f34ac68e81c973b41bfa521f2e99e0e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e055ca836acf0447774422321a842adfae9419ecd3983c4fa2da6e879ccc1db031e54c742bbb9bc03": "0x0000000000000000000000000000000008f67795750255b9f9c19a23a72960b240276a404d3c5fcb4fde2cf5759e88f7045ff23e481785ec5fddb6178f6860b44bdaa0150ef473a91de3f1ff794b2b6fcb", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e05d31d1ec885004a5a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00": "0x000000000000000000000000000000000c1415a9d9719c249bdeecbb9b746639f743e2f238ef5a2b227ce206eb93724a6f6a4aa384952d2245b6c439c833edb350c0ba7e31ca423f081ee6a0d79596c6585a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e05e3f970c23ff63cb85d101c656fa86dc284f34f7583b5f178d9e9b619df6031fe2c04b4c5f07e26": "0x00000000000000000000000000000000049a992b67797a09bfa4fc79558b14bff0e2ae2b20207ceadef50ecef31d120a15", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e06464a684f7b7a0d1c6681030fd4860fcfc1dfad9ae55fc0181229b007b6365dc4c8f5fbe162554c": "0x000000000000000000000000000000000cffd31bf694e0d28434da06abd3fe4febe23b25054b5de48ed94246339c51b2e6eaf1654d9143d99dc782d03b496b3801e06a4c6405ae954f40b7e7475f9ddcb466a4ddefa00f74de69a30bb8f6f87c50cbd2804768c367f3fbad5663a98fe48b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0655181280220c8b6280b912d54001e1ac0bbc1023ba9a16974a6c23d22e817e97d418ea94d29642": "0x000000000000000000000000000000000414a0db74267a9c3994944cb470c48a9f4c8a01df05766b96eb29789e9f049748", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0823dc59ec2f7a204eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d": "0x0000000000000000000000000000000018b4f8dd9a19e72f2ae65f989872a96ee2e239a9e135a868bddcb4dd278ef0f97a8d9511843f9df390385c97ef304025decc2d42cd7082db58f5b5e0523c58183e7a3a98a1dcff1349491c4de950bac2427069580f45cabcf5b57e645d0df2882b74fb773cd20d9adffcfc49a58d0ed20bf5baf645cd37aaaf65408f56ffe22116d8a8b294275746ad87f5fe0d3f5eb3fb81905036522357b616096f3e84bfced6fe3aa3a8b8e0e17a72626db79dd999dd5e9cecb8e0f265391e5daae3ec229d3c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0832e37ad433bf330093c7603ddb81760e5c90ba6c0fde51812e18e6cc14121c081f5a573a868142": "0x00000000000000000000000000000000047bdfd0ce52699e0b3f913ebc544b48b0cb02fcb8cb394625f88945200318f592", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0867cd2096d96b96ea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b": "0x00000000000000000000000000000000200cad33c225bbc550c7e1b89ff2feb2dcc8993f2e3a8dea40898fa8f54f754b002ecadcb36865c859f998d5538bc2629b4f4aea6e03dc4cc110bcf0eea4e063307ebadb760b7f8ca8280f493f1604fa76e90df43f3ce4b084ea6383315b94653f8aa121a03ca81740284a3d24ea4bf49f22578caa58441527a76e8464a319a015a27a87e5999ee8830465b09da09f16adfaa168d3aec122953b44796a9db5157dc6df02cd907ad64313666799a84023c8e8025e7f9f5483a05823a732de3dbd3e90e389b9296c049a2cf0cc3255f3d58346b0eb6e6b0826aeaf81aae144d5306ca8e2730b18be41205e5d9192603da3fc19d7d4b951519509cb32458ad622ae33", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e08cc79e8d56c8beb7c88cb63517049b0569ba773b2cd7be3dea4c7c88340ba5f31c7bfa2e847f65f": "0x0000000000000000000000000000000004540a38c94322e193c52afe4d438b6d6b1c50a9cafa87e47f1fc41221594d5f39", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e093c88d361b492968e76c9299f5a2046beaa5266ac0ef8b7b310c929704f15d8e6657b371302202d": "0x0000000000000000000000000000000004b0bf0c9e4095ac5ab829224395315bc4e298b21b180d6e9a86e698f974d2fa25", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e096c13bcbcb0791226104ba050f385c19450c62d2adb3e9deabed8783eee0059d582ff8918c03b10": "0x000000000000000000000000000000000426104ba050f385c19450c62d2adb3e9deabed8783eee0059d582ff8918c03b10", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e09c71da7f0f4f7aa98edcae85e6eef98ba192a51fa0efd89aac0541fa264d46adc9d8f29d3e21047": "0x0000000000000000000000000000000004dc226375dedb131cbc73b5c90ea8d374d5d4b5e75dae7eb6a9a4c215d8e9b0ad", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e09d05f5fb1d062ad503551a752e49ebef1b6988ee561cbbfe0f442a56fe624a58ae80ff3b3b9cd7d": "0x00000000000000000000000000000000085034b9af07130a1799cbdbfc0c2ff2fbafaf47fc4cf70d82dadd9e606f23085f5034c3e43599377576fb1fb81c8410fca61070ddcff4484cae5e57de2d084f6f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0a7a36431e6bf788600e047c97181ac8d0b9d5a6372f6018f556d68b2b4cdb529d87da365f718d40": "0x0000000000000000000000000000000008ad17c83beb46308e21cb6fb45b9587a826addb8c001e01bc2280847982af1b77769e87de4b843adb49b3de1ff29ce837047c48023aaaf9c6d3abc6e66b4ec34a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0c100cc5eae89342e659339aaaf44f9871d9a42595bece9cc446cc4dc321dcb30c798332a5780846": "0x00000000000000000000000000000000047e581640cd7c61c76dc4b85b771ce496d10e52429113f8e7629425ad9787c81c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0cff0134bde4ac18abb9286b2b288f2af6eb392d95b12a64768174de723047b9ae0f86283dd5e34c": "0x0000000000000000000000000000000008e25940a2f472c60c242463e18c20ab6555074a0644ac2b9583140abc15e2712436dafe22546294dab15b18d1f15fed8856e6ace31582b0dca7f8d450cd963368", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0d39c09be41728d25271937d9336b12c2801a62938d27878729a7987c705770d5f19c0e42ffcc64c": "0x00000000000000000000000000000000044e9a1114da2f930a02193c823ab3393fd2f4867b0ba68ab5ec267e50ecd35420", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0d533a9fec9db13002b47d21483aa953be67636583cb184f55d575e0f71ec75f45383a786324a64b": "0x0000000000000000000000000000000008d5febe9f9f424e1a509cadb2ccd2f502fa1e9b577c03bfcdf74f7e6abe6f692c2d14410d4bb33f09014a028cdbb9d2c2f00e7d5021748ac859c5dc11cc277a6f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0e77a555b20dfd069642d0db9f3b301b44df74b63b0b930011e3f52154c5ca24b4dc67b3c7322f15": "0x000000000000000000000000000000000cd4cc99150b203e2ded46d1bdfa43c2f64f89cb4a9102e8e6d5b37784ab97b117daf0804d1bf147f716661acb2ce7c796d0d655e2781c22cd138c4e6d6edb9b0ce4f351785e2ba01d8ae8c408b0112af93577eaf7487d1ad4cfb54285c88dbf1b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0f177f5acba9e6e070661c356f24a2cddc859fbae974cdff149661f165f5e622df3060bcb8e7b373": "0x00000000000000000000000000000000047ab0ef4391500cf4634c08dcc0bafc65b9c787a651ca8679b8ef33a6b557fe5e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0f7722ef9e3f0c3bb0d8ce5256f0b5a51a38ccaadc6d21fe930d8ff3da1dca198ebe1807802da753": "0x00000000000000000000000000000000042fa216946d71756ea4bc43259d6866958233f796bbdcbca326d684a840ef72f0", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e0f7f00ad7cb619c008769738ff8d53c17d6e0f0344e52c50a5ef6b61a33389f4dc4adbb7aa2f384d": "0x00000000000000000000000000000000048a0e42d190d3ecaebf11d3834f4b992e0fab469e6bf17056d402cb172b827a22", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e103e847acd44a834c8c0c1fb9bb3902b9e4790461bec2c33afa31c9a3b72a4e4ab6c050b4a284507": "0x00000000000000000000000000000000044e6776c8d171ebb2e352ecd10eb75ae1403f00a4d76089ef92d9d598264ac841", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e10af15fa81ea76ada81e54507ca4f6fa30932b96d35e8f073556c99f4e3119e5f679893450192109": "0x0000000000000000000000000000000004fcdc5fe2f7a0789f42175567fe656b9121815763a037c761ef846f0d97420239", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e11e755e0b2a267d8a8a2e5461f346cf0c23d1ca613437432a160525b6487dbb718afa51439d48d04": "0x00000000000000000000000000000000088a74d6464340d1e60feb30c35ef63b8e48737f225e6343b1875e352756d0160f3515e1b78389f5ef86a9b5e739a0912d6cc4e9f4775698ac23458e8fe8764f89", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e11edb4162e9b96b85ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43": "0x00000000000000000000000000000000145ecc1d4e60a92262c1bec62d034c979f42cbd3fb1c28570d5baed6e5ed20d533c83b0bba37f25f365e26efbe6c9ecfa7905dbdc0b0e3ae60b29980b42c509c6fb47150da85f064599455634eee628e2f775d06bad83bb3631130854914e96d015e25f73392aeea8ecd64fd33e2dd4728e355e314d8fca42e2a382f95a941d6caa471c7aa909cc665212bb36003c52c5d3eeec39f96556a8242e861c5dd7dde41", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e11fbcd54abb1de419ce84f6cd845ac3fb2a009aae8e99b1a2fb64aa3e7ce1c7867f3ab2db0c9bc00": "0x000000000000000000000000000000000432ef9a68234eec37684bf683d6e07e2deaf52a336ad7dd7e124041baeee37368", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e136bb08c596dddb97ce2421f6b3c80a00c8fa9476eddad55f7bb9cc2f54ad916b4969c103b5fd438": "0x0000000000000000000000000000000004aacf425049b018fb55d17640939a6f651697b153bbc59a060a7f2ce4b4c5610e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1404625c59d62180187c76f60b8e91032091aacb1ec79764af51e796a0c962bd2f2e766e9e5ade45": "0x0000000000000000000000000000000004e212871311a823c9537b3f70adf0a9697c7286c84fdefe5603bb2fc49b0a7b67", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e149ddb66d3286a35ec7afe6fbfc9947fd177ed118016e403dbc14803a0432bfaf0337e3bbc3c820b": "0x000000000000000000000000000000000493ec952a9328c2f39b697aa00f57f01c289423ac2068f506ce2165be10f1ec45", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e14f43fb7c9ca8d300cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66": "0x0000000000000000000000000000000018b085746d68637b4db6d45d855e9e31ac9059ffc928c3330ad1e13ac6f170ad48bc1e141bf6afbb7224e41e050c296f264e8c4c3cabb0d91a5594f0585be0571402f777f4b3001d83e7a2441ab8456d2db9ad30b77e5d3f2fa0c4150b769e9a394680cdf69422609ddbb2cd596ee4366b84a50a3f17c0a88b9fcab7263852cf6d982b1616f2b4b963fe2a8aaec915c4d3f90aada694bba3fa5924127e67a2456ce2af982fd853bcdb276d9be46e6bad4cc8e1af153d82638d2bc829e6ec3e2a6c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e152f5e61256c5cb31a95c3968b83520b8e43f82edb0f050b1ce7281873a93bf9c0798efd50f5c41a": "0x00000000000000000000000000000000049e66677d3f5f4ac376d14bf73bc819845156f1f25ce9e6930fd096741276ed67", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e15cb248f0f9af445fe56be5933800b45a21ee8e9817eae9f49099fdf4a20076718497092ed43c62b": "0x0000000000000000000000000000000004a8070648f6e43b7d8a8f10418b696130d2046c10645f10085de80e6098b85f09", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e15dcd927177e5b7aaee65bf22cdf1f98c91b6c176854d8072f1328e027d2e84d23607b517b1b9429": "0x0000000000000000000000000000000004aee65bf22cdf1f98c91b6c176854d8072f1328e027d2e84d23607b517b1b9429", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e16530c8e1e5dda93b43ec7322956d133d41e28758fc64d2da34d2888d93af64eb41f7afa26967961": "0x0000000000000000000000000000000004b43ec7322956d133d41e28758fc64d2da34d2888d93af64eb41f7afa26967961", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e171ca88a3597ca4a1097c82198eca584e8d9bedca6a5ffc1f1eac3c1fb91d0ef4ef313b842b04c3f": "0x000000000000000000000000000000000400e31d15b9166c5238cbdfbcab39ccc2fe0173c9419b060f28fbf3f0ea0cf25b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e172f5474abcf5643a8b5707defe6889dc178861ea7b68861fd0ab5427b54119950e6788afe1cad2f": "0x00000000000000000000000000000000041ca9c1ffaaa251b220fbca62f28d6936272e11d052c4e995ace722bb6c2e8d26", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e173c712e406fc7a20a54e1448806b2c0cbdfd5da73198f12554bc972045fc9dd3f2e22b6c5a97c1d": "0x000000000000000000000000000000000474378a77c102cab0cc86d7fa5bd19668bd88c48b2abecf283d81eaf19b4ef464", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e177d87d70120c0c15a9e357de87525b67cf9ed1d0f06a15a6363665ca1c9f43ff527c87c0945597c": "0x000000000000000000000000000000000c5da7c5df13916304befdcf8c879f5a35c7d65539711eb5cac00a9d5176b36b580ee022b7052ed281ad71f8cf98ddc2efd5b5fa45d741e4861c225a2bcf22731bd5f8960e7af211c990e0d092ba6038772482a74e9dc91e5696c84fd079992ffe", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e18871df8131a10a56041e8f550869197a24ed9e968eae648692cde7bbc04077114639c249cc0a043": "0x00000000000000000000000000000000047eb15d7fc95b03fce6ab8cbc54c38ac898932407a3e9bd86d8c03bbfb5b8112a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e18b47e3024d66dfe628f36dddf8cdb0242104a2531e7d3efd4860a9a4633be69aaf30f63ccb25a5e": "0x0000000000000000000000000000000004405637fb518f654b40c86cf257796c857ac3c28e5ce0ed978dcc4d69a5d67442", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e199f24e2487e567b321ec507203650141d2ec630b967b76ec45dd53d852b9cb25f220dd3a3fa2e51": "0x0000000000000000000000000000000004c80e5adbafea30ecb72dec246ad8b5647f95092b535a702b4347d2ec210c6972", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e19caab1fd4cdabfaf287534dd5ead6c0247a1b0d3ada5588e578602c2ed64caa6f6fc2a5efee6f23": "0x00000000000000000000000000000000049eed509e1b9e0f45b24942e75abb7aa6fa306d0e52c74fa8811857d54d0bd03e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1b2d52234edc009738f45bd8f6341dac4486eedaf00f2357cd19b8d4b8f0271c7340d56fe02bca72": "0x00000000000000000000000000000000045cb36ec4414da2e8f8e6be74901ceaeb189e4bae84245b00640f96ea36814501", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1bcae011029977921b0fa0b1a8e6d3ca06224ada945bd41785e55822a36102e48d584ddbb03e9573": "0x000000000000000000000000000000000438bd292140ddbadfe9cfdceda3090c9818d53ae79a862d77e782bf9c9e94fa40", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1bd7316875d7fcf8a0340d617b2e5fecf5813d12bf441eb025f610edf738af8f79a98a9e168f690d": "0x00000000000000000000000000000000041020aecf6332d324cc8681199d469780ab81d8e87dc408aa96ca573c590ce344", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1be2a3fab16ae5e58429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee21": "0x000000000000000000000000000000001462307128d13196dc291ac51e68173c5801fe6bace303a222d2659255d9debf273c0bb72774583cae164f6f184ea05f95f90c8fa34203b9b2c5a2c1b6beb90a5f389af7a171ff4ef270fc5c602f1570ae7b818fbcd797ae42b5ac9f14454c5b4e4c27cde4c0ba44b80bd040462654c90c73e26b474895a2fd746fd5febf3ecc654c70ba4d71065dc3bd0d11c1fff6bfca26d89b5c3f406eef2e5de8ac7334866c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1d7259e4eafa026b88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b": "0x0000000000000000000000000000000014c0d792a19684453c51324b0f2a420544d8c3378c515c85c6aad72b7059ed4cd19e745f85a1a8ed92e237063f3ba463c198d7744b7698e0e0a9a12c5966d798c8402b7e0857f31fc28e9c6a0f0970cc810b66ad393edbe120b4d97f5ce99261c9b0eb1b93d4fb82e4fe4e55b4dd8375b8a09c97596db6bc7e080401f2b88a07e9eaec5e47daff641a4a15c87ad7e12649e07f6ebbb54630b984952184c657e441", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1d77b5b5e1a11bfd62a79f3b924342c4f634d8ebdf77f50ac051d41387a72d22f2f38155762c125f": "0x0000000000000000000000000000000004304e4137516cc6a906f03158933c2430744e602d6549dfcbf5a0d767358ae419", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1e495b9d3175bbcf109e87a012b2754d0b23501fe1fa775db374927f09c228f07948f81ad84bf617": "0x0000000000000000000000000000000004109e87a012b2754d0b23501fe1fa775db374927f09c228f07948f81ad84bf617", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1f4321336da7ceadf4d95d4c5c0131969148d3a16b3d95ab3d051771d971a1955d7e745b0a3a4f16": "0x0000000000000000000000000000000004ccc49a4cbcaec6b03737d84c907628a2cc104cc75ad817ad38292e5bb76c527e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e208d340a192a7ce08433eae795936e63871cbcf0410517d1dad4755f2da4a6d88c1cc1c589b8e86f": "0x00000000000000000000000000000000042a4f829cfd9c12a01da70549643e5bade2829684c101fe7c1362176c884a3719", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2137b4e662fa80a05a37c441df3f0fed7ddef5581ff70437b00fb071e0b09537caca8adc4354913e": "0x00000000000000000000000000000000045a37c441df3f0fed7ddef5581ff70437b00fb071e0b09537caca8adc4354913e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e214a284ee9e9b01cd61813f456c8f11087d572921c67afff25605aa712899d6a6b04cc42c3d2d417": "0x00000000000000000000000000000000089bee35b6118399b673cf802455159ae282fa4a1e68368fb67cf85b00e47461194f83a66e4c8f4afa5949586c22ba0e7d73e7e4dbd6c1efeb9ccd689080834600", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e21667555f2586f1cc852bd64d95e1c2fc164ba7ee6c2cce6e87ff8cef81c60940d46f710ed712b7a": "0x000000000000000000000000000000000446378406055f64e506440a1b008f875abbbc8d3fd7c05f785a723fe1b5739fee", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e21aad0a24a729734c0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b": "0x000000000000000000000000000000008080b036ace5df3680d4f61cccc6cef4d37bc396e6a6e63fdecf505ecbfe41149b2e91e1aef05cb877f9c862b416d157a840115d43c307290dfba6ac4c4db5dad74ee9592a2fd8d3954c85b71eb39e6eb323411ca48bfba174abbf1751d2d190ec4e3bd152d910b6c892f23f85469cd64bef5d7561d69475207c60f4542cc1257f29cba2b60e937fa112f8e61fdde36e4043d0c40b1eb73f12b5534b52d01b5e16cc6bce54889ca98332b8d289e4ab347234a96a1d5389bd183d7f991791a79f0ab8dd36cb05189e12ff133ef1c0f3ddf97d1319dc737e4acbd882d17e143bb083a8bc182820c46f4dd6bd98b76dbff06f8565f0004eb1a9840ee3f3bcae1442d575c4d8aeb08fb3e8276a09141d8139b74d6a76af72acf6955617309dea176a7a7f90cbd721e0f6df172266f725ed45095c9ac42202cbd84abae8b5494119a938a9c13c25dc960c282ae2a76f4e315ed20c60cbdd08750fd45cf5b2790f7ef045bcf4933936ffd18b5b65409bdc003b5f5ad8f9b8e36ae97b1f7b5f0af2803bd8ba823c07ebdc12f850eb5dcc7e39971b34d5fd6643064e0394cc77cc0fea6718fe96b7fa8b193f73106d03bd579b5cc090cb75640ec8090d19d96a3c3d5d8c7d3a43a4e20e15a0c9e0009fa11135246e1de9cf4507c1945bc86cb0a088c1c465feddac420e696be2b3c613261dd7d84a25b6410eca645efd87d9f4030c7bbc9fcd1a5def7ac55b1ccf202ae5de75a02a224d939e1b8d84f54e5d03a714d4989649f2baaa065d3e927f265702cfa8d8eb83cbea8c64bb01d19c5c184b8e2f5d107fc552b8c6596a09ef8008c83d1dc8ee77dc175036bbd2ca89a55b855a0f01cb9c322a9e20637c9a71e4d131e647d597b1c600dbec94bfa192465e3991a15b6381a73b784a15727dfd555a15f61575f5f1b8323b8fd41416dc9eeb4df87acd23f2453d14482695f0ec5b7ec434dcddaaf83e09e570e22c293906edad0ef967c7216959aedf96ab893d8b8d8c66abeab8ef62940b1c6a6ab7228099d72291c72a5db58282171c8d2c73678f13f3c61579902ea4572ae9e9158046e8e820bf4d82bc56d28e12b54fcca3e2c3e90cd0d8a991718bd2fcf9a65dcdcd1bdd04be44591ff9f838183843605f88f6b88971f887fd069e00f4a2894ce4249a8a70199a057fd69aae09c52bef16685e25b29e22f3d1b43f6469f035a9081033b9a7025c943a4d56fc0f3aed44e21a24d0a3c17a4d6c1360123ce0a4d9a22aaac577031c2ead3ef6399e4bf49bf0ed9ade88ec40ef21be714cf9efc112306cc85c194f758a6cdac27581d1f3929bf543452b7da444e03457ea6424f84ef9a372ecfda077ecf87bd083c89d247ea03cac2fb12a410b3f44f87c1b523b0bd0aa3375d4dbf19354416d87ef2183c6d1c383b29dd10f002272468fc70cdbddd42b5093425e5422", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2200b6e2483bae501aaf37daa4afffeb0d84c47f52330d8293ea648e1bba5fe0e35355057e63c167": "0x000000000000000000000000000000000c522159de5d549c217b26deed24558c4ea6e33ab8daf73f5410665acc1d5f845cbc79ba52668a29f5a5c62044bf72f6c666f2ea1347cd1d23c3e54d7a5dd0614eeabbb97403ae010a1fcbbc9cf50529f27e0eda03efec95e29b6ed44dcb075648", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e22501e6d8f21e9dd5e97f331813198763da88ad2b1f5deb3f42373a93e8895c43de399aa6255da47": "0x0000000000000000000000000000000010f40703cb81f0aeb2691f6069bbb67a5a84b30d392b6c5906100b5a6cc57a781c5c8bb12c78741c7b0ff4659360c78bf5da3af34e842a60f58e53045ccb070302d2de3abc2fce0e6fb421d7a29d736a9ddcfdf51244022ffc483a291c4e4da9588c65e884140b3bfc129cf21cb7423ea9f6a72246c273c3ca4c77a00910f58136", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e229ce4e5e00a4f0b1e6ea78e3190ac2cfde9c0041ea7a0e1f7b89d52f4a58f01f69258150b782466": "0x0000000000000000000000000000000004da5484b32d12a09f6c28114f2d9ef1a6cb2088cdd2c5d9be152737bbd165733f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e22d261d77c92c974201f968f24fc0df93fe98dab905ff103d00a9a232329bfe78c22663dbe60a12d": "0x000000000000000000000000000000000407e8861ce764f34220c198710b60b72f8c59c617fef101bdba96bf6f598016d3", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e22dc4c22ba0bc0065c05d5f192c927b30b33c85470b53474f2a736a01c3c5da905384329a430f22e": "0x00000000000000000000000000000000045c05d5f192c927b30b33c85470b53474f2a736a01c3c5da905384329a430f22e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e23439dff64c47d6062f21f6587843801d599ed5855ae0ebdd2a84c822919e80cd6f12899e5088772": "0x00000000000000000000000000000000044b639041c549fb527faf54fd7e915d481955ae0bfb42842cfc3d63b5b98a0f31", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e25235c4616852bcaa6c197a5b757309578dfde7a02e19aa9922b8f81a60e81bb0c6b7295090b3456": "0x00000000000000000000000000000000040fca29bfa87fda85b6d07265341c56bc44fe830e4bc1d7b8cd31f54cac6a32d6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e25c679865a91ba59c66f4d91ebc7dd0065a5a2837014e5f4cef5d36d36d4ba7c915137d885dd7640": "0x0000000000000000000000000000000004aef53be490b506e8e00bc24809e634fef3ed2b1f8f3bc9926a39e2b40c3c70fb", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2643c0564bb7e30e26842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b148": "0x0000000000000000000000000000000010f2b13a9cb72a219a88fbb88f7c5306fcccbaa21a22484a24bbb84b8acee8b50b2602783d96c4e25d8f6894e457ceb968bf1c9694295aee52514d4919056cdb1226842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b148ee69e45394d3fea77645868ce1992caf33fb25200b4ae2b41d1306a46dd5f720", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e26a2abbc21cd770cd88a4b558274e57737ffd3fc9741848596199a29d77fe511804d20810cb76050": "0x0000000000000000000000000000000004023fe56458783b5ac1d399ab49e8ecfe911d282cf645ecc8b4d9803a130f685f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e26e9d47393173c428a65f2773ad69cccedc0a58ef7ebd2d446b882231b4b97044105b2035a8d9546": "0x00000000000000000000000000000000044a1123e20cbc903262ef39136378a2528eb7382d3b598cd240af1a965f402662", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2777a559c125897fb8897a746ceaa53376946a3da353c1c987df8c0caa4395ac0eaf0e6c74874054": "0x0000000000000000000000000000000004888593ed4e02aa8a39aed15ec8aa2f0ba2eae732b9e2bf7f6d72b6d012fd925e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e27dc7bc51117cc44d46e6f10cd59b0f6d7082dffb33d27c9f29801233f8e28fe3f5edf2d51762c6a": "0x00000000000000000000000000000000041d6cb02740c7ed074385a93d27f0f9fe5efc113a8e5961d964c54b0afc6bfa12", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e28cb5aade7584f6236d7b7a05501f3e93e7eec83c53739147dd9824554e4907136371ca062820e3d": "0x0000000000000000000000000000000004904f9054a49d973dc073e09bdb9c9e49213558cf7b5a29d6f2671d8f6999656a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e28db6c1e91cbc43002385caf9a08b92ca458a0b817a8cc303cefd5a0c6e108cb939e04242b9e007d": "0x00000000000000000000000000000000042cce76137e2e2d9bb63e081d4074cfa4688d7d9781d2888f36634f646da62561", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e290aec17ae7c197466fae573cabe4172bdfc60dfd00dff703a4323854715c151f868293db828190c": "0x0000000000000000000000000000000004f7034438a748412760539f824f38f3f9ecbf77ced8716de97c5ade5d2444c8c3", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2960a5a23c329652582e9acd4386d60a8d3de206a575ab9ab0c383f3b4ee88d2a2ed144afd356504": "0x0000000000000000000000000000000004953288a0e80d88a64db2db07ca48da06678f683fb99301500223d663dca35b7a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e29b138c94f24ba807c4e144380357ad3e690e74f5b7bbbe4b7d6ab1579d4c6d7c844ef003cad9a24": "0x000000000000000000000000000000000472a136cbd146b0596b9cbf73f4f2e402dda2683568e33d1a3db791ddfaac6a4d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e29c4999a48e5667768f6e4f77f043dfcb9fe88519996ee25ccae674ccda259bc49efec6b6eeb9607": "0x0000000000000000000000000000000010225ad9907fd7a3f7f3633f2251c3b390b338385358f1753ce35bd27328c7fdd1bd05066b950d256e451a29012b1fdd38e661516eeeb487d816bb2a65975baf016920834078df5f13662750273260531e585b9e802eb1dea6a98e7fe2f7555570ebb515975618eb35e252200dee0fc30b3db265686c72ca22708ad304084b975a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2a9b352e5eaaff5751f78769768fc88c83546881a768523b3c70c2500159047a970ac4ef16768af6": "0x0000000000000000000000000000000004905f923a67cec79db9e1415567822f2c440e794c4a38b43144bfb1a044b2a2f2", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2ad59b47893766e9a215ba2d1b408fd5350b93f2566124331dabc06e94c16d7080d3cd5771d59958": "0x0000000000000000000000000000000008eb6a6d492311cb809fe02a7649fe2c815ac9a824be7761d7f5b28360d06b810c1f8ef3aac7ddc528f500ac380bfec2dbe0c58caba4540adc427fd3e3186bfeea", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2b031c075ea343ce443c76dcde19df9387486ded7845c6d85ec2a4c17f38f8b1e7a0a14de7968d7d": "0x0000000000000000000000000000000004727dba627f34c210eba395fc7f60d28b3a58c5dbd6b63fb4f9788ee764b2702a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2bab42363fea46ad00f52ade889dac25285059b639359071c2aad88e3f1f60593f86cc460ce20213": "0x0000000000000000000000000000000004d2d790f992e31eec84ed33b3ddf3e92ecaeaed911f0026c2ca09087f3eb1d3eb", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2bc21eb1a6e88498ea524b9e0dd9bd336d31e71bc1a172388b10d4b6571ace5e7e6e836483110216": "0x00000000000000000000000000000000049e23e3588757c7744916bc6b65d9562fd12f807da8bfa23ca354ad5b40bece4f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2c09493faa9e924efc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216": "0x0000000000000000000000000000000030a24f97e96ae4e213d8eae1f35213c986e0ec03126812b24cc1bdc9948443044086d6e47051058a73623a0abe221e2cdf86a362a3da910618be17cbe3629eaf317cecf08ce1f6f9fbe70156ec68ff04ab4ad0dffd5f39fe72c955b7f319d7740c2e4e174e782224c6e32c71c85d399497af3cd209216738baf31130ed860a5877acabeb358e532ad64c9e4e9f5b3a2bef0358e8535cb4e1b8a7727cc24b7be643d0ccf4cb7501417f0d7bdb6d577e026612d02579686f0ff1137a10c843f5c963ce0b753196d88630621ff926331ce4780474fdf5b100fbcf96dfd4e984d1c669ac66f315467fc0b8d0d5d5d8906dae845567f911e24012ab0ebc185ed2dc6a66c016c699321be18f86dd04415e6f3152fe5b3bc13f4808bfb4617b9bedc2e1291076ce5a68ccc3f21da73f2b8747c87a71aec14a792bd55050a44cbe58c7196f5aa67923621f3a3395c3e2a58aeb89756e2dc11ba9ef1ac8bd4953cf2a2201344c69cc407f4deaec89a4090075f36639e151c616b8ed573e7e384ef7672d100b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2c3ee724586db259eaab0cb55c147ffaf184a4c00513e85f6d5bb6416994fbdd0dd168f3c59a291b": "0x0000000000000000000000000000000004ecda6ddb746609cf2736a0b70823b52b11b15b1bb35a4021da70126290bbdc64", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2cd98d2b43b99a0b6a325e3630266fda0ef7f7725ef8199726e29d569d609f3cf068c4db7e82591a": "0x000000000000000000000000000000000c62a791daef6863829ce7969886db050a38050dd52ed6c1a685cf7897e67f165e969b1c4800a2e1700fc49adc3228a1faf72543f36ef784991a2a25d74632b26fa6644cb7298d69083173522d5e51c66dc5c88bb7e4358ab6d88b216d6574b010", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2d287fe916fe23dc925000bd5b83d502f56c49f2a91e3532af9f919d6eb52d750b72539c6b62d45b": "0x0000000000000000000000000000000004541145a8a9d8b066ecd0c7dff89c9d397a18e2e0e9d65a36cb2c1295c768e376", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2d859f3bd54b349892e02ce87428939cfbb7fbeeb1ee758b749a5854a1bd3ae9ce36b3bcb753010c": "0x00000000000000000000000000000000044396d758a45239e3ad43d8ffa0d171a6785aec18c571107c6675d53d082f09c7", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2df274fea56f1419fc659bba6d3985002708101d9c2aea9155bd520c105688751281cb40e4d37163": "0x0000000000000000000000000000000008e0fe63b7c5032e2437b3f8327e95b07eae600a8ad4f31e17db0f80a3208c4728f2c9cf52ac4784de6db0c160481ae4ebf7ce0d7066011e36e18948172c05d059", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2e61081843efc3b7105c06afbe01ff98801bf3e46b96d61d0d7aeadf7af7d6c39a20dbf946b0fe41": "0x0000000000000000000000000000000004f295175d63624a3f6e510b8c189db808a049704c4b99f49c2638e9d963d1a3ca", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2e7e56460089fc7a54c473bf199d05b878ab34e9a37d17d0a8bf70498edb5c759672e984fa38b432": "0x0000000000000000000000000000000004c01b6763a287079871d569b4c1ef94255494347450d13fa06d2ecb298c426d3c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2ef7dd71f889f0050c841e6aea307d8704d5b7b7b71afad58548ce47dce090e25d01b84925e5c48d": "0x00000000000000000000000000000000081bded8b683a29a0938bbef126bd9510acfc57f2332a8009a305e94190da895695b485a5d58748bfe83392a1ade902a02c95084c00df2070dc8f32f13ad499e1f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2f20db1fb9bc54324c042cc1451781f79ff3bc34cacd5329b21591b2b2d82ad57426a5079ad1c455": "0x0000000000000000000000000000000004ec496735eca64ceabe80e911ddbad8c072ac5b69d3d88ed8dada02a9cf5c66c8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2f2145cd985eff31bcb916e7a7ef77dd1f610ed27ec519b4ec226028eb8edade41f95b217f89f620": "0x0000000000000000000000000000000010c82d85d99021f559a9a4f5387fca2bee170d488b97e00766b5ad19617c52c17e0efe4d35b7d336d66f5ae2cf6969014428415b9d32d8eb2c17b58829d505466715647f856e3beac82df2fd67403a0fbd18fa79f584646112d15d61a064a681c5c05809bc85b574b586d8cb6cff329b5e5666a7f56963c06a4c95fcf681271e24", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2f8f1ddeb924bbdf5cadb1617794ea8d20a5b0bf1e3275a815229a34c834c9eb6383602ad47ecc55": "0x00000000000000000000000000000000044beb8e393d37e827b64939797512b2988db9ea41f5b4d2f06a4f8c8fb955d89e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2fe1803695779c79b2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a": "0x000000000000000000000000000000001c7c24bc10ff87531a3d2780dd51b94ed0b85818f4827ddc09ab394a53884c64441a746810bc697bd6b464f5115aef1127130712a70960abe590c8a6491f432232e69aa84285f761bb1942735db2c3d443e29dd3f3da5aa7a00038bafdf93abc5703a56ca86460efa365897ff7affd5f6d280ab3a0d857b37709ce67f551d1f88f5624e7bedddddd49110e4c76ecfc6d2406dc3bbde447a71ef0e511560f588f63ea00a7167ab2ecc7f024e26e62a15b24c02f0b30e967cb91621169e3c780ae4e1cbe59b1e375a52b9131fdb7a85c0992b8c5cdc3f4b4d90e19185972cef58b2a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3161b54cf940118e9aa6373b24df370b863773f45f2bed6ebd80c886c58b4232e655a9b130b6d615": "0x00000000000000000000000000000000043a29d1002e1c81fb779d11e082da66b45a355067ab816aa015f5d5ce3d927068", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e323ac9ca334c2bce400a075c48b7985fad91dda0b168b2185958c9fee280f145d2dfe24958a12737": "0x0000000000000000000000000000000008d3fb95a477ea8deb243947948b28d08677f5fbc3515d9365668056b12f028ce69d2acafdebef59f646598614d1e0f1ea7ebacf643f0ba096abd078d9a2e4ae96", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e32ed1c932b701c300e993f475e1085cfe2d313b1089c3fbc33c78c178ed19bfc94be3d7937709371": "0x0000000000000000000000000000000004e66afee7026bccb1c5ccda9ff095c278ca0c40c7d44f645a9e60d2c1cf49a305", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e32fa3d1c089ff9ebfe88f2849c8b51127fefbb618de330c811b4092da0b9272edf2b8b7fddc05c1f": "0x0000000000000000000000000000000004936c411f5a41fcab2c26fd03ea779dfce7ce65c93203c5538051e77258315834", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3308804a76f50044ce6e3dc917919ccb44e66c8a5d4c693b96265d5e7072433971fb38d083d0587e": "0x0000000000000000000000000000000004c0d4fa6e65eb6e8de70d275bd49773f00fa1c385a21608fe2f94a13036ce8661", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e333c08553d75ed2cdab8ba7a028d62fe9a5088e46acdbd2039f01abd8baa7c695d9377661c3d406d": "0x0000000000000000000000000000000004988740c0cb624d6228e22704f9dddd8a526775c81506cb9eab96d3be870d4a04", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e33446753bac3f7d8d49e16d1c4f6a051815c5865058cb218fe7d460fa893907bd0cf8596b493f45a": "0x0000000000000000000000000000000004c21c287be88281cfac16666331518cf2820f4de9c29d7caf15ffb596f12cd953", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e33f1232919bc79e13a81aea610fd2332295967d1c7846599774a112f2d6cf7e3ebe92392b7b17779": "0x0000000000000000000000000000000004e62bc1402d84b145bae2ce9ac2e50f7f613b7a986734a896af65be8f51244c4e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e343126692e3c2e4112d49078cd721faa2f041d0cf96e0d8194561fdcb4ced457270e52f209e76c0f": "0x00000000000000000000000000000000049068a88ce95e5c34122578c16d46855386229be241a7e0656ef469a03db4ee19", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e34bd1b4448aed1acf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212": "0x0000000000000000000000000000000078c573b977a12a27f38f686571c67e01b848e24b49fb2ce07b8b0f12caf651b6eeeb14462cbcddfd07593831e6ebb7c4a2e5f0acf8c052f6d76aa550113bb72b688c7afec700f1f0c83226176063f349c34c3b100f192e4bc106c3305c1c5e4c386579df1779da496305c30a43dcdd9277e4984df2b941343e1086706c613db39364f9e43cd95c94ded79fa17bfec8a8d745932f4d7679f8b06aa9e13f915768b252e32efcfa98867081b563878242febcb31531cf4648cc496bbf851f39f31f6d3a5dfb7d614cd20d8ddf555c4a23acef0a71bd8723463f36f89e603211dd99b055e8dea9080f49b00804005fa39712a313dc6bc21c3de49f172b3f46e9f586e4eee6c7b76518ff52ab727047c1214470a0fb4fce60ed6ae06185a1501e9a4ce6bf4221d5348a254fa587bc69297dd25173e89f25220ec395ec495e3df9c41d3b47b5dc76e7833045cd155547da3afa84a1fe6b9f8d8556e8c7187c3b2f50a4675f5013d41624228728182b71bbe799dce7dc5df6963fc02730c6b4b3e84273e1bbce0e01ff970a8d2462a545370e0b992e069db055e417820aeb77e6870f9d0903460b53d4200f03a8183f00d5ed6c971942ddae9065693b4702f0f782e5c553837cd9bff26ac28b84a814643ab00556d90e873a921633bab990cc75b5a06dea8eabb61420c17a6e92eb2ca99f0e2cca15015784552ae332bf2105a592b80dc66ce201e876781c6466468f641ea7defd144b054fd1966e2292bab3c550f8871107598edcb29987227d3fc1d585227937f701af167165fb0a99b6a21983fdba049f3218e31dad244bf47477de316c3f46a721149ce003f4514eedc2042b854e6640619a9305b0571ee5a5666073612190b2035be70b6846a2f16c94e29908d38962d4ad80a2a5cef99de5288c0f299cb7fa7a3e41fb2db1a4c23fa44892be1360c5fd9b06ea650783b1d4ad13841ed6caf054ff5cbe72ec4636fce640bf1ae53bc95dfabf99a55a128f0cc1a12a58cdf161e58872515ee35cf87510536082d53dd69631266f8f9a76413f5f902d59578faf655a0dbf92938ed749fee838c81bd72f9daa984f4b569c43ddfa8b12c3f75e2e02f8c0ce9980e00daec2cb391c74a4055acee05be3352c7d09340c8c6f76c87170f1072bc0ce873e529381c4f5c8a2c6125fdd59c2b545e1032e0223a7ae0e3aa3c4ebbafe72576dec399441068e3c8af704356b5593f79cf9861e3c26748ac8ac6a4c2920582293228f56351d2667016768f8ff56cc85e23810144f87fcaad260080c7547bb6d3c20d0b4929b9d73245fa94cbc6c035f58068a57aee59359d7d464caf058fe55e30623df66dbca94", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e34cdf837d56a264302302a200a9ead164617576a79dded74ccf9094d6222cdf93ed575422e9f5837": "0x000000000000000000000000000000000408d3e6f92d4020b4a2a6d4dff33fe485f2883070668660980fdc064f12dcc129", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3533fb45c1708948625a907225b8ed830c16996d75cda73ef03750b535a6d83ca2ba1246be2dd424": "0x0000000000000000000000000000000010c2e445df84e611e629ded39f69fb3ed7877398ad5ce82ae4028b1cbe997043cb9181d99f43daa05e74f15ff308adb8a4ef121fe4976904813de2e16ac447c3eefc44a7371ac4b798826aa05df8fd3cd5aa1b62f4a1a7cb9c95b7e83e99633a3ee2cd31d823eeedeaf516f7fdcc4c7287e3d23014e76f804b332d7b52571c2a6b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e35a390c3506c1387482a9a411b630d2c3f850f435c4566a6a93143422e6cce181320f022a7451236": "0x00000000000000000000000000000000108688b96ed623770a0b2712dd9661b3c1280da83237db214ba698be7783731b122cfde9047614f815e566dec170152a0e9a7b163f94d0a59e8abc4b84dbaa2e6348a9cf978cdd6826ae8be06a8a4c2b5080eba18ed88f5a01cd4db7b947515d71121cb3c0a7a70ec5db8b5e2ba95aa0320ece6b999a593c146471df768adad97e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e35c408ac02c2a02dfae63fdb20e3ec7589586b14ea019731b5089e2d1b22a7911e48603a5939780c": "0x0000000000000000000000000000000004fa98b8b13a1b03a3f86748ad19edb237b86ce74b4c4dcc08492907df447f7026", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e360c398fd5e777baf6d6531d9623034efed118d00dc62831eb6f017dcb45d66ec6af44947ef41431": "0x0000000000000000000000000000000004602d88c1c8aef782a7eba2fc345663405cce57081d4a34003b895057d96d8e42", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e368ce1bdc40db94c34f589d251903b0ac5a22b1d13d54696fba34b77f5d21f5244de907171144763": "0x000000000000000000000000000000000460bcf3dbbcdcb2254472d74e7522e08b6e35bfab991d39e17c8e35ab634e3c28", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e36a17a0db79ef688c664fbde2dbcea2d4180fc9e285ac56ecb6f89a9b88cbee9b407bbceea7da912": "0x0000000000000000000000000000000004100a7405e03b712786ff8d6b522fe258843ec33d366eb61379c98aa028bf380c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e36becd4b5e8bdbbe828618dad92559461b479508086bc781d88434e5372229cf66ffc887672e9b34": "0x0000000000000000000000000000000008ea17387e7283543fb633e2a9e0f68d39e172cd5624c7095e6d81ad3468f35b701ccd666d5c96fc362fd7fb1633ff09d05b3394ad29e7574e4231f5ab2e0f276c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3753decbc1ae388b6849627c337067117e864eff154c6125539fa6e4eaa980712e7594cf78447874": "0x00000000000000000000000000000000045092144ba4cf9a4997c6dcae1ec2f9b8cd1065ff5d1f97812c5700132036a504", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e375546d9339430d36aa9e19b08ef554ef0b123940b685c0d64eabd9a1ec487e43bb7e1f3d981c062": "0x00000000000000000000000000000000044ac0609d3d326fa83a76b4e89a445ff2c0e6436b338481041af7500057c870a6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e375605537adb7dfd3d6d2d20735ec00c7753d3e6071ad1e2280288a98d7d89c2a2b7fe08bf6d05bd": "0x00000000000000000000000000000000088e2499f22749aef04333796fe92b73c06cf4e358a552604ff3e550725774f924bad66ea053eac162ae6fa88c672a16dc18d932399e7159d0e2ef25c62189e637", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e378b219e43b8dedff0fd6298e6d06eefc52fb2f12dc1a6ff9e8958ac2a3efebc7f5673dc33808170": "0x0000000000000000000000000000000004b82ba825d0fa34373ebb741509f70042068219d805f221b75330b4513f62e674", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e37fc013628a8c12f22fff76bb4a0a5d66cff0392dbc083abbac3b3046f6fcc328abf0ddd16ca0837": "0x0000000000000000000000000000000004a63f88c1fbb368cfd13ca5e7a68e16da2e80b94fb382948eea95616685598235", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e38172c8cfb5a713e5a718199b3c87bd8c24c35f027b2b4ba2789a85782a79cc6a924f9e4241c3005": "0x00000000000000000000000000000000045a718199b3c87bd8c24c35f027b2b4ba2789a85782a79cc6a924f9e4241c3005", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e383198d18bf4db66169b1ca15010ef10b423afee4c0fca7e42f745b39e1fe4197436ec352b7f1708": "0x00000000000000000000000000000000044c50bd7cf1308738e5758e3f5063ffbacc50d2944f95506b8b4710d1f7a03536", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e386a2f35e87b835c78283798169eabf7cd6924745cb60df616354b36e53549fd8dd71e815386f525": "0x000000000000000000000000000000000878283798169eabf7cd6924745cb60df616354b36e53549fd8dd71e815386f525b842b822ff26324247b6ac5a4f3eaa2bb97ab63a9ca95c2ff07775a1858f0173", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e39a60ff17fca37777ec07e354ed4f92abdd5a1570470994410ad04181deb63229bd98ff39b73170a": "0x000000000000000000000000000000000454cbb80bdac7fd85808d631bc4007c2b928e88ef08e8773d7b26e0acce33dd39", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3a304428675bf6f7e6247d2909686256b09006b07e758ecc128364a926f1223ef04b38628a5a3a5e": "0x0000000000000000000000000000000008f2382813004a234ea40eacc434ee04b04e52977a2907023a2d2cc44d464120574416405ae9e2ded76e049abaac98028161a04e23bdd02ed40fc9e1e0826ff65e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3b8fa2e75a1b9c5bcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec477": "0x0000000000000000000000000000000018ca5164772b835ac12c7e86d391ec217e65f05be0f43b75a059fdb0b3e8a1c44c54e0103cb355b3f6f357104c4cea54675909f687aa106a4e47d741dfde35e376de4ea9ea77e628210eb1aee0c6816cca8de5235e04a861059b889c6b396fbf15a08ca28409640a6ce8108289d3a279cf6fc3f0657b60f3c41f89d04c0e5fbb2dd06a4dfc33d452ca4fbf37fd660a153b0d87011761701591ed79e5bb875960444cee1a8fd3bca977c086368843e54330002df861543497ac55e3818e4111cc26", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3de3c64163d245c278c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a7024": "0x000000000000000000000000000000000c78c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a70246eaa97150a12560dfe00d1cb77f161ab7c29b6243193186f2d02e933c4c4067c46d59d9963c62e1d8f82335ec3768bd5aa4cc268abdd209b779d139d99eca26b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3e3e798a3a6296aaf8d542920fa20b0dd5e126de37f7c0142db98b51a6caa4968922467b42b95a74": "0x0000000000000000000000000000000004739b4e65cbeea7cadf808f0df0154218982008f8cb4ce04a18b89625e69ab6b1", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3edfdd48fc779cd5a80ea94af8a39eb7ba8d9afb913147e67eae84f48aad7b9ce6ee05094fe0394e": "0x0000000000000000000000000000000004fd82c8f29cee3c6170e1f21d2d060586e2508f5a3dc977f2f179ed52d33aa923", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3ffe32ddffac26d1225c1cf2356a5a5cd7e13c8e5dbee6c4c89e1c5f610c1050131cc58b4d96e75a": "0x00000000000000000000000000000000044ad44dc061d183f5adb794ba6708425fd6a3e1c306152fe63fb22075d1f7347d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e411a5418773a1a2568f8bfef657c69a5c34721cbaa618ae9eb2108566f9a2606cf5055578e0c2511": "0x0000000000000000000000000000000008bc154c7a8b77c508d364f2ad31111f48c1eebcd3367da39f5fd907b510e5e170f2395f3e80b47fe6ce9eaf63553371c59c73b403bdc28862c86ab1040e62226a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e415252cc5998dac14e516d9d6527c3bdcc45105195b8e23480bc0f257308b1f4fef03e06efbb1c5b": "0x000000000000000000000000000000000484993faa382230fb6bae24747cb90b01087b26817950513c4b313168b517950a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4229207fadf4b0c2366c1d734b33c714b0e0e9f164426e66e3bfa97b917b23e5d3674f4a2074f86f": "0x0000000000000000000000000000000008b2fde580d330e81fd2b163a77bf1797f3fd19e98099fec1bbe33217c7f18b77d74047a9abeb7a65811ffaf6ce18a99cb02e092d317eead7302b23e5b99ef3c14", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e42946832d384cb2c5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b": "0x00000000000000000000000000000000208a650412c92229bf1a2eb1c0cab9c133d54c5b82cc723b202ee634e925effa6a3c6d21b257bbfa6eaef65227c3ca8f934d4df946f53f65aee505dfa6b741c852fc1855c2c5d97b41f55fd7b122cabeb3c2529f1e27dd836d131e88f5d6a66a09faca0437ebd16050e22dffe85c091c5a8e24feb20d488444e9b9e7e7cbc78013f227ec6d922254e93c2342a87fe0840cecfa015478fc5ae7b28bb18c66c3a70de8b27a414bbf2ca10db6202c922e1d33359b65c8d4967fc76f926d93f54dd9165c05d424a33d6e9ac92c3863c26aec3515226a439192e9fb28dd47db38dff05fc6645597fb2f300ac88b96e8283b06d99319905bc509151e03dc83748708197e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e42ade399737c4384882a9309f1e5f87abb745dc51d5dcc338e3dbe7b818fd8a9768e27d97e57ec13": "0x0000000000000000000000000000000004d296d443e8532e4977e9d78145f6ec9eadbec4fd2b10158e82985549046fe568", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e42b0e5e788b77418280221db3cd2515ba48cff6c400cf4624b9459eca62f30523972ee5b608e967b": "0x0000000000000000000000000000000004005e13effb82cec8d1e3de31eefc750ea3afb8df4ee1ffc18a66cf56ae4fe178", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e42f7186af73e2c106edfd181c979c11a1d853c8fdef7b18e85ec39bb67ce723130b25fc24232c358": "0x0000000000000000000000000000000004acd510542672c65c7c05d56c4c6424a70a0e426f3899f2eb86751cc2e08ef124", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4315c981ebc9c224e49a94c01d7c0511480422e00ef7030ff64f314591b50d7057deadbd6411112e": "0x0000000000000000000000000000000008fa6bd8e8fcf8cd5be5d5cf808b5b5cb20aeaf43d7cf5551f1b33b0f029120016ea595939a7255c7eac3f67f54c75929152fb73018a56bb468445373c17200447", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e43bb1018fc2bff6592536c5469fd64b2adaee0a10c5936bb0d4c8e4c5e4d31185fbc0c9136e1f205": "0x0000000000000000000000000000000004d7a15c23db646cb253f769875604c28b184a2487b5dff9c282bd65087e7b4238", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e443ad277a8dbe9aba845ea35913a0fbdec49687ebc5b1579bb632c080ce61b02919ba40bcf889276": "0x000000000000000000000000000000000cb4105912d0268f239b12bfa0aaa290903ccbb52e0ad2126b73a4b20c9189bd1bfca8ea3766270fe9df1ba7a4a7298a908878ed61581b9769100fbdd4164b00607282bd520ed3b58e948d1e3ec6d993c607c87f153a9b90954fa973cdf3adfc54", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e44509eb7f7220ceaeebbde3ff2bb37ca11414154e92c0521ac8051ea48d0d84b39714b2347763648": "0x000000000000000000000000000000001072795595ce1298481aeca61391ee534ab7955411342e091fcb079401a784d438d6bacc09599d6647899ed6734cc33a655c56e6bf08d2273ba8464eb1d4a0830b6e5b9e2cbd37299c34a07fe45c6f143aa715e1bfccc4db8c82814dd82a0aa35cfe41a0fab97ce06654fe9813a999a9d6dfb51bc7ab1f35dbbb27bbb3eac4c164", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e44555228869870c2e666c8204234e3e9dc671cc875c4f22316e6a7b67bb8b0538d8d77674468ed50": "0x000000000000000000000000000000000406419ac9e6a0b6d955fc0274eb9911fddac424b804fa29062ea417f05d64803f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4456b32654fe47f91a8ab26aba64d6176b6aa462a2a7ef6252ca1063cf978dcb6f6c64fec81e7861": "0x00000000000000000000000000000000082ed9d00721b2fe294f0f2af432a1a2d98a45cf3d6db2939ae20f5bf25625ecf8148abf367d1fcc88ac026490727eccbeb507e35714b327c4a3dbe404622184b2", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e44a4a90b1106c3b5aed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b43": "0x00000000000000000000000000000000a078018b68f1983978069a54f1befb11b0702529b1cb9bb0163999d9bbeb85391f5c97521b3cb9261f89f6b05b6ad17e9d148ba5f2cc03daabbfff35e0bc2e3f0f54ec418763624a46b49693114ba91a0137b37c1e47cc3fdcb2db75c9c4b11c795058c8963e2b60c6f1e6c921a3893414f370b48ad0c2d2d937c7786febb29003329a36786940b598924622428c95d5c41812d55b9ea2f091ad99b2fbc944331df0825186ee2e14875b4da41144acdac7d5aeeda144951b84cb93c5b62388dd57ce304677ff08c2d76d65ad5bc3adacb74b685907cdf72fe0f155c31dc4c8b0472ec9fc5a5358c74ffff03b8712e8dd1e50e93ca0babd01dff5de303a64f07f3a5c975241098f4ce19cd95187485c1b0006584a560c101890f32d65a67e787700fa6c823ba7c33395d2f298934f304b44af030504cf1af0f1a3f29c78442e07508805b2b3d962de88736fcbcccefb08f9915ad1ddab9d1e31782954ef1ea3e622305b166a309fbb4a05d24e70b726218dbb1b5d3e8d4e1488524481032e0acb00041eda8cf4ea9ed59862c6f5ad3a51e7ef62eff19b629cb241a10d5fd7f96d22305b1686b3030de938cfe6a01467a664fd1b42e4f43fab7295963640c5128a7b305b166542492b1615c15fb92c573ee387b90427312d08338b9c211b85a27a20cca9c8d2749a01cf11872c61580b40f227d566afedd3b40cd29849276414c350b8d56768e91cbccbdf754d7f60db1fedd96eae27b591e65d2fc8afb99b27c20b5c97523e781c4c65e7df12bcab25d2f3ad96a2e73c9252da3b889bcf77aecc5a9c9d52f08adf4aa10b316922daa16d396cfb66bf6d3b87454d7a468e19060f683c84672d8f0f25ceea258d980ca234e25ac03cf2d78f925340ce77237844147c88d38deed3dd10c90cab2c1a5b59040baa3c1742b2439d6c4ac83df7da5d894e5c975240a88ac1dc2d87fb2de37a5d8759307dd7cc9281114515ca26876f530b305b1665aadfdadf6d13f6c8eb36db7e3868ba648e86bdb7d60f23677ea6b33788d38dd7b7e450c426b33bd49db5efe92e702e0c799a5adab42be4fb21ed756688d38e0b14f3b08bed993ea4fe1b8ab124190191340fe8de0466ea642fd56511041eda8a25068f57f573d5b152e2c8947c7ab80dead270769184cf63c77af554305b1689cfee594c19a642a2fcd554074c93d62181c0d4117ebe196bd7c62b795c9752253a165c2eccaa4dd8644eb754e3c760f586e935efbdd7c3b629cc06425c975241672d5275044da23dcd085d64949b82c83e963a2bae2230af259f527c5c9752508d09c36f243da599f0e850f3bea8f0cf5c43eaefa73bd9c6a075750bdcadf01d571672f755b4032af1cfa3784d389da711ea341209b86f840784937a88d38df37c92f9cee029f6290428a9848f70dd8f10d519a6c8a861101863cd40041edab68d8fa56e9c4845bb931beb45b2e457162753e65c440d11f83cc828715c975226ca9eedc6f15bb8f513c0fe5a3e813c4ea2fce105febce11d5b89ff01605cefe161fa9cb1c1649080f78f9cf7943320746e75dbb4b1cbdabbbd6a6638204c52b467988d585dd9cb7cebc94d6e56d8b89042ee692b5739f7d78c39a5545ed6723c4d9632bd0c61bf182c0904ae64fe1dde3f5f1ffc532d41fa14e2840588d38ddf4d661801a1ab2efe073a9f35e0acd5c3c896aa28d8b5b20e2e88436e5c97523bb1c1be25aad6bfb7a52d7e1a55fab08a78c2099daf42951adf7133535c97524a02c01e505359a29988f9098c6b1034dcb3ed8af5873fac659a10763c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e44f53fc133ec6c80a0d32bc7ae5d421990bdb847fc38cade9b388ce8138ab4e4ae957fc7ca59bd2c": "0x000000000000000000000000000000000488bc16ce9ffb289186e900a2c7bafd486c3ac4c2c612497a5bf14f8aa2dcdb09", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e453efa586e0ab504d20f2ce6c2c876745bbb399c6290cf4e3ee75ce31bbc7ec11342fd5118b98e3c": "0x00000000000000000000000000000000042c249c9b361d3c490f66848e4ad2fe71438455108b3a1f0698160c6d1d27fb24", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e458263f3dd29a31aca42f0b5c7957571706f29d2828291b148b4b162100ddcac72c507fd8ab69b2e": "0x0000000000000000000000000000000008766ebc87370f898dd73004e524f0019b36a511b071efcc5f685cd935cd6ac57ae2623f940ce24961b8e483b3b00c94e84fd32a5f13a67a09ef5a19d28af59435", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e459cc19119e455ad94b3d04ef219a8970ac5f76658fdee1005b4b7ffee3fc02355f60db1a778f826": "0x00000000000000000000000000000000048c216c3e8fe71b422c34003bcb536257a3ef17928e93792f8d8de4748b81446a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e45be453e8a7bff0f1c7376c9f2afef25e542556d2af805dfa691a414efb9e0fc9a8e33f625294f67": "0x000000000000000000000000000000000440e30e1462871a4a8a38dbf705b96b986d699b62ed53e890b8f42544e3bd7b38", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e45d43cb8401e3564f40cd7a2181289e32776625b9f3a193f749e33ce1bdeb76cfaabece606c7324c": "0x00000000000000000000000000000000046cfe88656d6a99bbf56d216614a02ef9f0182f63dfc21d7dfedacb4ff517f135", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e46374d36cdcac1f68e28e91f200ae0e50fec4354a429a7e4e00f684f594a33437dff6e8c4ed18053": "0x0000000000000000000000000000000004759dc44004f91bfe44588e84d9c60517627929b322b7d00b8979035c3fc0be87", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4642619111762c48be1c7627fbc96a38d3a3cf746ae545f60e2510ed80961537d9b4924421fbb562": "0x00000000000000000000000000000000041d3635e81c3048b1b2459aefff519b68d0100710ff64578709ca3da808412054", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e46b931982fa83f40c009ab06d6b49cd62f2801c4b0029a5343c51747f6716c788780bfeb2730af66": "0x0000000000000000000000000000000008c009ab06d6b49cd62f2801c4b0029a5343c51747f6716c788780bfeb2730af66ce26c4cd5d39e3dec824a79059cf0746e3aaed0821017aa493da14687d5e550b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e46fa647d7b60b7824ef63a0f97791221290fd19207cbb23ec5783221b5016afa55161b01dbb0125d": "0x0000000000000000000000000000000004ef8d3f3e96613631bf0c63444db7abcc063f40cfcd2f4b477615443fb8e84d5f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e47bedb9f0d77b46d6883b9f834076b9c1368e7692ec0a01ae97a52c5cdca957b5d31103423cfbe45": "0x000000000000000000000000000000000820d879dee526c91e9a590785b4982690fc4a04d41fb7e49c83389e6848132b0d0e794356479178e2d043755c671a3db6b1882700744cc0f570a84fd33e257e26", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e484f9e39f4f0e8475cce1eed57740222d643b9c92a594bec58f9b9968bfd4d63d495a7fe5237ab1e": "0x000000000000000000000000000000000488c83f9b6b21778914870c7fd18ce9b3b44831ca8706611d6b2fec736a5ecc4e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e489667186afa0e91ca5bc1915da74aba3aadd7ce7b809045d5eb5b73559259755fdcd85a40a5dc6e": "0x00000000000000000000000000000000049f7951a3a51ead847837ceb367ad2166b0dd1411c860fb01cf7ce94cad08022e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4900c2cf5eb1d4d5dce117ad72d855b586a1c7ab1e2e1400b00418037000a81a26d131eff8486b77": "0x0000000000000000000000000000000004027d4770a8fb3ee70bb1d12b64f93c794dae984ed5e991267c7e776c77470f5a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e494a0eac89f0ff78c63b6d81d7d307b9f4464304330a840f5159c78a804dd344c5fcbfb3da9aad11": "0x0000000000000000000000000000000004d693e6d764ce80662d891b0e1496fc7afdfd3470eeb4d703ce721460bb459d6b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e49577d51da67dbbadc86d7e1dba377a90f087a942c0c2777851b447a16af68cfac09c2e58ecf7e1d": "0x00000000000000000000000000000000082ec6d11607a14dd26f32576e47831719d548c856ce4c188091790cd93ba826061ae31e3543602bdd7fe69218e5c8d16c782f96969e2f7e323ec5096ffb294e44", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4997fd81d8f83eff7294d22dea735215a7ac4a2aee260eb25d1beaad4b02bd8dacf87bd611a96c3f": "0x00000000000000000000000000000000047294d22dea735215a7ac4a2aee260eb25d1beaad4b02bd8dacf87bd611a96c3f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4b290c17b4e25a4a36e132f4b16bd325ddb6a3c63562f23c18dfd20bb2c785d391f625f481097c1f": "0x000000000000000000000000000000000432e223d306f0e5bb9a9d6dcc9023ef06edc7717db691cd8c5d85d33b3a1fb136", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4b5632672e4e08b2e2fec50feac8a6c83a3e9f869ce04ab800420b2c80c4310f2de2e9f0adfa301d": "0x0000000000000000000000000000000004764e2315d026e1e02073b27ae98b6866388a0208294c4ca8e4d70e25f4ddbf18", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4b9d785f0afee887423e5d0451428d77e1f81f6f20c87427e355468da3ac8eea9eee7f041871a733": "0x00000000000000000000000000000000046aa3fa5a328b8a928c0aedc22aa88d14e807d2552c31bda8b23f3ac2cf01565e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4bbfbd1503dacab9f01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e042360": "0x00000000000000000000000000000000180e46029cb6daf09d2408e111ffb14010387ffbe77b16539839cbff1473a3a4023051ea9c01a7134f6a3223ea95a09c4dfe0bde5b0eb9ff7169fdb85d7a9bbd73a61a8e0ccd37645a2dd65916d9bcf3b77ecdf395ecc3beef72f3ad5565bb3353dea318de2228da64b91c671dd7f325df63959f9c51c86a36f28ec94126f320709e992661473c1dc00ad7f67b734bec003561ebddbb7fe0db3759b717ad20fd2546591c7794e2cb60b8a342f82bf14b2cfea945671453f92e330917366ed5f946", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4bc05de7e42ebb50ceeccdb6802df2253998f9d4f928b120d51110d1d2afd969b95232bc16768702": "0x0000000000000000000000000000000004ecfd5be6a880094d44062af80777e61f10e15d6a8910cf7222bb10dcff874eca", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4d35c327c115f99b08745476e8a2fb16504c77a75b2dd20b6f56cfb71c87125f1707a702753af24e": "0x00000000000000000000000000000000049dfee84695666c414061c119c231b91511e18267044792868388c73f59306474", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4d699313bc760a036a81f13352076dce1dfe8f357fd805bbece6ec16efabad52a2c24e6824e16315": "0x000000000000000000000000000000000495d056d702a9431c14cc2c46634fcb656e162dca4b5a2100789373a07695f6b8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4e0e08d8f728b4dd32068fb3b800c5df40df16619761b3418e40d9455784b6a293d2425e35ef2c27": "0x0000000000000000000000000000000008831b9437615fae78c29e32df5b9ca228b4e9b4b31eccc8c090834cf6a85c8e29196375cde4e10495687128f72d513b94bc323bbe7dc36f305133ad7cea4c6da8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4ed12f7f95496d053674aa73951219dbd27b3e3fc5847b806c68c1de38fd4f22f9493a461c80e903": "0x000000000000000000000000000000000cd0accc7028daefa6de2f047e4650d3ad13d5e25bb0bf2fae4eb8ff8e216749199e62629f1f1b6e219c95d80577ba4215ffeee870b4c6f6672e2191bbc3a4b7502415e5310193e362840035d0283a5911d358c1553afeabd87ea4d66d35351128", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4f133aa79b057d66fef5977196fe3fe5c456a767e6b06013ca62762b282de97040add4ad2c53db61": "0x000000000000000000000000000000001040ffc76cc196faba27d81c0c8925911628bea264b949bff7a26edc041bfce66af8f71fd7d5dbabcdf5a640f194881f3f16c13e2bc18e54cacd08dd60fba0907ce00e404cb030e7bfb50b9615ea9a2f8f75601ac9f6128d1263a7fb5d22de741bdeb6ff39e56549c7a265ac798934d66b541c41c2e2212c34bd76b29635b4cd23", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4fc324df3bb6d99258bb56063a47ee6e4a4d0bfe444682394a1e4657fa39f4622f2a0285689c1b3c": "0x00000000000000000000000000000000043b839ff2a9cba91f5d0a511651c76f3ae7e0eb8bc76d7862338f987e506ba6de", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e50004b04910a1297929aa2bfe7b52500b288c943b7c24a90928cd8a6f7ec8eec44763d9f74198401": "0x0000000000000000000000000000000004f2b7e775b59951428fefeac1c8f7f40b24103e02315552065e37d58ea80c7d77", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e50079469344a3846844f55022b2b8667129c167068a9c2a6bc292f2d312336bd98339d686b575a1b": "0x00000000000000000000000000000000043e8086aa5e41114ace08f4330aa4d5adca61f5dab191bba7ab6b2596f1c40c18", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5151486ca217f604d23f678af47c89d76031edc91e43784bcf9991b131f957d312fced2c5187fb47": "0x000000000000000000000000000000000450e1946cc920aa86edf541dcd4bc35efbf4b28671b87c68b5abfb22f655de453", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e51db8a617be61c665e0a4ca74bbb4da39c79954e7875519fa67049795c02a360412f3ee41a020506": "0x00000000000000000000000000000000049406aac741b57c529a2b06b06124a2a9b8f8374e072e4b251b13a5c0cc9f617e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5296f5f3e605a0e3e8b2603f6baee5bc32a9b9e4eee9168499fa553d35edb56aef0035ff7e1f165e": "0x000000000000000000000000000000001070d7ff9f5cd0e46762d7d7d1c8dc840a4026755fe13c51237ff8601377d4fba36964958c102b007555e5fbd10a3f98ee67fb2bc270fa0d20fe2371916450079b86929ec01fdfdecf2c5ad0c4f9b537e65084f053980fa1215fb9377dc325f52d06b430745802c7c8d5cb3537dde6dda1c74dd2251837c781be4e0aebfde8d673", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5361b1ae059eb11e0650a2e41ea97b60bbd3f87aa30d605562069075deaaf79559959230928a2487": "0x0000000000000000000000000000000008463fb9341e83f58071dffd0feb3915815e4f7055c74f0e4ac002214cf06d6588fc46341527cd1a52b60dd5884d8ac5aa272c27cd3b3cc6750ffa51ffe6b34ab6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5439cf6aa71671f74608fc7527698d3f4d4cfcc6074f01c2ed59112ad670dd5206b3658bbb62a073": "0x00000000000000000000000000000000042aac721ff23bb9448f8ddec8ecd159961a23f604f8fd22d729c3390e9f36f843", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5579d397caf9629d608aa0febae80d8c228709183cf997bc87b0aa219cda0928408df22ac7ffef39": "0x0000000000000000000000000000000004bcf0343edbf88dbd0b2d302af4a027cf7a1b45be2fbed9e9b11b6bb6bcc426b6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e562122059d1dbce57ca460cc927a04fbc91f4ddda54149556d1a85196bc753d054aca1fb7621e349": "0x0000000000000000000000000000000004027b1e50e1acb6c1ff8777599be3350bbbd0236fd3866c367f420393d3adee41", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e567dc72806fd2ef9d453b6e497b6a89979fb34eea715720d37c2381c8c51458be04296fd059dcc3a": "0x00000000000000000000000000000000086ca5cd252f0f61e8a9c5eb72ad6d9452fcc1de451f7bcffe04cee9ce73c8ff0f402d50604742f5071645e00cf27f318d0a0fa805bda1daeec21e11ff9387e923", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e56cebd3283e0ea933a3884dbc6806e8b4cccbf2c407d800c12141c3d7cacde442a649a6a2822ac17": "0x0000000000000000000000000000000004f49bb2abd8dd96beaca34bd5bfb81b5edb5186922b92c3b1f5977cc401b79554", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5786fc402111e82d5202845d849d9eb6a7e5a414492a86d205be4a374ede34e98fc2440de4809a3e": "0x0000000000000000000000000000000004d6945be0cef12df3e9d25d4bfed7c4f6fbe980487ccdcf13891998454d4c7d3c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e57b1fed518565181aaa635f88e75ad58af28925d0c21a804d87a449469e45970c3a52f57aba7b366": "0x00000000000000000000000000000000046a3770dc90105517476a48c8280337f2c1e39dba204c254f7bb51c8d4ebb435a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e57c41eaef46fdefb2ca8e96b721f074e95a3f7d994c370dab688fc85134de7e2e7d4589d0a306c51": "0x00000000000000000000000000000000088e4ac154f73a0576603db7786e98d6a1db1e72e3a2b32d2540828395dbd3f7d786d678feab565ecb54f78dcca7036db237002aa86783283b8721de7611d7fab2", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e57e0f36f0fe2bdee54efb33a98824d6330a8f074481df98b5123305473559bef960180791f849252": "0x000000000000000000000000000000000492a409f971d4db36b2d2d520adc5ea15c5ac9c012d22e4e551552d250aaae57d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e57f4780677cf709b4ec0381e4427ed6567f7a5c328288ced36c33becea6ececd8145001f4230ac1b": "0x0000000000000000000000000000000004564491c88a293f54f2fe2cc09b0ec63f226bc77ebf6df8f998fbc7551d0fa10a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e585c0f93d15e98cb42f3c525c66f2a4eacfa88479f7537670d2e1f45f4ec25703a111f5f003ba15d": "0x0000000000000000000000000000000004fe57cc05a0401fad57f17da9b903ef6d679b4d16c107a89f7a8c3da798d10919", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5879c1214022b88dc8566f6d3669729e877cd5e453d59f6be01ae6f31b7a9c9925160e70072f7242": "0x000000000000000000000000000000000434a2536cdfc1e92e55a4f4c1310aa2cb76257a87b0e66cea1f2d392c7080be22", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e587c6bbae1bb420cf2d0eed0f21b82d4b15802153cde2a229f257f01d003694b2973ef785a734766": "0x0000000000000000000000000000000004603ebd73cf850b644af5650cc070cf1328601427c712b21aa9746609de2ad447", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e58d8557741d41ae44e4ac8070fea95496b63cdcb6987de88f63dc75a295eace6ce5079149169300c": "0x00000000000000000000000000000000040879c078b9026ffc8f5b7ca4f1af1ff0f51c592958f24b43ea5433a34f0cac02", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5a5afe08a0a9de9ed6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d": "0x00000000000000000000000000000000186817038f23e3b1e7d91f641929205495b7be633fc2247d0bcc5a6f9709a8f82d68c1fc61924efb992b4e4c2c7a21d528dca21d3073fd304f536fd99a5cf1794a6d6f646c70792f6e6f706c73014d0000000000000000000000000000000000006d6f646c70792f6e6f706c73004d0000000000000000000000000000000000006d6f646c70792f6e6f706c7301630000000000000000000000000000000000006d6f646c70792f6e6f706c730063000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5acf1d24617d25ba6a88b4d1ab30ab4708521d6c6d480a858d92692c0b0cff67e1a6904e23b84112": "0x00000000000000000000000000000000041253640274e26277dde50bc1d72ed0b3f627e4c6b66d8343d4c52ae97afd0f03", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5af3c641a81d6a63eaacc14e67deba7935dc28c86bb8b6bdb64239065b718fed6b8691ce14163350": "0x00000000000000000000000000000000042c01bce1cfd949c169cf6d216d5c446a8c947147b5b7f128b6a46dfe92f90f00", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5b4c4e58d29949859a2cb674ea2f4866664769a1663fd6aa321d9cfb89b67c402c881891700c0f57": "0x0000000000000000000000000000000008801df817f435be03321e6a77b0fab3183b9716117accc0f3db95c9f6f9434954e04176c772d8e5b3758231c8155b2265e9522e5047b15f388a23cc707767923e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5be79f90404ad9e0e4a66ee66171e3238670377bc9ffbd7cb4bda47baf25e6ed80c2070942ee3f72": "0x0000000000000000000000000000000010808652b2296e43e858df65b69d5a3942ba76744dd8d0cf390ecdefc89b3a553bf4243300b12f9067d1fcf01c8e05f598ec2dfaa142a33398177f8b6e32ecfb2f8e602e63afb364ac583747b0a8bab092d5b20ee98f0495ce7562a8c992ac9f175213e3c8881ed30ead22d177f5c25c4cb8bf46cf2d04a8ce55ddbc06118a9516", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5d3dec38e02e37251c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea259385609": "0x00000000000000000000000000000000402889d414f8bb29201637b8ae394fd131642a3eb4764a82730e494d6e60a6c4bc36ed432555d82a6fe15f2517dc871f1d02c72d8d5aa1bce703288d180ff1fdf6be86d32d322797f67dd5d386d29d8285cb32504a767956fc58ed8f04ff703c4a44d50e5b2db8b483e5731d39c1e71f33d6ab32318c144f5dc41e57d1d21ee779860a5fb3fb398d56fe3180ba927cc0f0c9308cac7f6af98d4fc7624627343c4aa243baa53ed09e1a0a8879b132121047f10b53b52b4e8111292a196a1513673745276fb671d5e24c15c73f6766680b83e94bd709644fec1d5829f1126ef1fc2a88508e0d4bb18e50ed1435a4260541b1c53ed009a64801727c195d1f81c08fdac48166c755e708cb83a61db9dc635e91cb496e2659e07fde8aeb09130802010e6a1241c7ef9541ddaad26287d92df0abacf7ac4a7fc4df046e4b866c05db4aabf657af299a3b7d16d7c4d27876099924e5905d4d85d683988726e31b25037cb612cc166f2df9f0fe89f79e2b568a6e92d61ca5f5f53050ef8744edf74aced0fb49820d872869c2370f72f871556e9584aeefb7b7de62e6559c69f1503cbdb545594e4ff12db88b9c74fecc23b4a9bb35e999a5c9a6424ec47f3e0f5529fb655e7c49a3654ea5a5313645948de60749792de736cb3870da7b401e78734eac3b60679d98218b5d055c770d3a2a406e2e56a97083100bec05cb83f530632dc8c313", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5de66fa01fb4c2d708b3b1930f36bf7fa336c7abc044e75fea45cf1c903081e7e0bfbd664a80093a": "0x0000000000000000000000000000000004c94a444165f95b45857e4bf1c4b0f784eb2e6f16054a87dce443de41c6d09c1c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5e25f5c22e4254863073c378b0833da59cda1d49d711f37c9ae20ed30dc3dbb842ead63dde578331": "0x00000000000000000000000000000000046a7db4fd5d907242e97c2db57fa12f1eff6a103556f8e99f916483ac6674c372", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5ee8405cff42241194339db8b404ea216d60433f00ed67b0cdcd9e29d21355615d967161db0cb04c": "0x000000000000000000000000000000000414b04bcc309f1abd5fae50084923f7d14fc5b9eaf257c0e2c5dafcd83e3cb363", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5f1b8b6e45fb190ccca9cb5657907dcb0bb01d335b17564e77994536edd05ddd50524a9355c2221e": "0x00000000000000000000000000000000046eb0bb735fa04cc282b87141ed4d60afada62fc213bda5ea0d0569c2a8c25d25", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5fb6a4114e90fbedc87dd7c321ad3dca39e53d05541bf9d17306d681ab556029b0f172156e12b603": "0x0000000000000000000000000000000004e8fc1e37b0b57aae49b99fb66be1cd0454d275d34a1c031ae4b796fa30d38736", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6067f41bd57795d6945e90a1afc83f0c74a3ffe96b40c4ebb5397af04126bc2db23036c043be4a63": "0x00000000000000000000000000000000081aef0e83444feabcf8eda628195f0d756082152cad2aaea5dab16de839b50931c40595c253aabacb254a3a476c0ed1b1fdc9368157d2e6d85dc38f5eddddf13f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e60707c14d6e8780e128e3b8a2d3b98071ba399c17206f84350e65653537dbbd646cb5908efff9d49": "0x0000000000000000000000000000000008120460743583c4ebc3076d422b73bef41b48b87e6c07aeecb07df3cf95565eec4ec19498a19021a78fbf00ef07d366245bad3cc89f5837a7004b97a50c4a5e0c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e60b67be86271e2f36e99996cc6c41e39696f7c3bc4248e548473b68fe2ba26567771be07b7eb5b19": "0x0000000000000000000000000000000004aee302e198305536eef798b55edd01e28516bfd2d16888597da705ee0e74df0d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6244e474aa91e041ae9749dfdee466ed67835efa51f04d74db27d75e919d7050e4f5b7f481f77a14": "0x00000000000000000000000000000000041cf675676957827846bdae1e0518c92b31a6e0759b3616955445ba3cf8a8111d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e628acd4748784be3a2da2913d7db19baf0a41dc40a73d75bc6001ce1691c3ded78e4e86387881b4c": "0x000000000000000000000000000000000c8ab2f02be4ea327d42477029cd7e8ca99a1b1ec34a9502cbf42c1701cdeee77438bc883d8fb7ae97eb3a7862cff1252172f4a901264c84b7feee0a900a64f77db2dbc35ccf086294a0d24e1091d08ca3b5c2a487071c4fb54070e666cc99e02d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e62c6144c430228802e62b548856a9ff975d160a0df8219bd36a7807620ac1ae2eeeb34498ba3e470": "0x00000000000000000000000000000000046c736a063c16e476c5d534aedf7e9c95a40f13c95aceb085ef74155d4b37800b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e633914b3a4ceda021eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef4843": "0x00000000000000000000000000000000186a92b1cb54e218fd9815b34f7a3a35ed39165a29edae89c7086040b59d074c725059875dcee1d4a9908203728cea5bc20ef93a366beac56fa161e04feca0344316a025114b9898b0e78a9472f31364689261cfcb35daf692c62f36012706db1908ec5cff0e253ab3a5d73aa4cf0db459f5128ed41f6b4d3dfbd99924f4346c581c6861821c1863896ec24a799c6ad302e7173b8674e399251bcc571e4977c7293cf08a632438014746be9061a9a74ccd8d79204032cf03d8fc605d452647c133", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6354c3c5f32f80e56ce8f0f322c021ca4991c83240d0feb94ad1678835b51d228999252bf9223e49": "0x0000000000000000000000000000000004f954fd2279cdc545fb8b89133ef97c121308e4ca8e26dc2f7d3c3d9b2dc52dbc", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e63e8632182788bd60a439f839504ef07c5cf8daf62beb17546e808ed1026c8a683be8207245f300f": "0x000000000000000000000000000000000809f7f25aee06632399bd9de5e4a311cfbd1846ecc34f8abc3bb8118a45c98a2eb4b4df0af75ca82e3289a23c6c32eea3d2ad337ce4d335029798b3735c8d6367", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e63f4f567548c9f8c2843d91b23b106e3020b7a903da075113d1aaca1db7ac30e119d6250fb6f5961": "0x0000000000000000000000000000000004d6ba1aefd3bd5f72b993e0b6c5f9ab818e96e654e2500b1a547f5104896aa660", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e645a2111e24537a2c088a8a35f9a31008c7ac0d4103078bb14b3d50213e4b92bf03ea98c081f173c": "0x0000000000000000000000000000000004ea4565b84bbc645ba42d3ce16887c42062314fe6aca7ab36a1fd942d7f31c76d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e64acb2a5e7697e7428778f95bd35e3fec4ee72a0d252c47097380c3ffdf93a9600b364ea119c0502": "0x000000000000000000000000000000000424d573f4df9151235e457956765e6446cf33077033bbca48d8d5c6c9a1d7fd33", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e64fffce989e2fabc6a0051ef580a2b9dd19a368b82ec20f9a605b0207f2e8d364e6c985b5b2ba871": "0x00000000000000000000000000000000040a9e884e29b1c07ae4918e17e7ec48bbfe9622cd9badab882d14064c8d672b3d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6553c10b93169dc66e8a3622a7355ab70892bc48236c461076d5163f55309b7e5d0a459d17c6272a": "0x00000000000000000000000000000000047a1b5cf762b0c34865a94bbfb0382ecf0cb030a97e582c4f219c51441ec0b805", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6670b1e816a2cedaaa2b3e0a8702aebcb83d552838a17902b2403b0f16c4e52a4514fe02df532e3c": "0x000000000000000000000000000000002460a8e45eea9783d521beeb12cb15c6e9094e5d755749b801ff1a532d0934a90de88efbf462925faaafc04b00555e946a843a6a018de2e47cfca41b0804a9f128aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164aa5cd92797a91f08d3feb5b497e3e329800710e13726accb52d2cec9f16b0164", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e668bbbac68a19cb7a02f7333e25590e4f568ae8a2ddc93a879e92e48fa3cf1666ac56e020c106d55": "0x0000000000000000000000000000000010f836649df542b24a1b63d80916ee743d4734640aa796648649685dbdd430c3626418bc819ab0a29b18e03aaf851463e3718bdb8649f5b864ce9654febf64c95070610bb9d4abd640e545cf56c9be0e8886b9ec274ea2e4d7facf8dbc575a9447026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e668ce779b7a9f3801e76b9da6373b204c3db21d2a7097a79afcf32f642a516980ae26c910e70a35c": "0x00000000000000000000000000000000044e7dac693f453f3c407caea7909b1f56c8385dd3ea46059c9b0cdb32c19fba3b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e66d850d0167dfb3ff429460ae52548e754c712a7cfc75f1bf7c9295da165293ca52ccc686db5c02d": "0x00000000000000000000000000000000084613a2044c0cc5b2f0faca94f2d6e7b7533c1ca3610cca54ba03ab9c5831d82664dd9ec1480c8ae7a38a6566f4634c7f1b5253a0fcd426b3c712d8e2779ff71c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e68180e8198681ff7e0d744a6f291a2dc1e6d744d5ae0747e314b046739be170638ecc185ff4a9b5f": "0x000000000000000000000000000000000800c703a1cde92ffaf1f8312c1fdb3a81140f7e76789d55ae1f0683025c428649541a4100aab4ff5eed5dbb5245c488365a4ebe149b8c3d5462a8e7609dff226e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6823ed8df7d5f458c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51": "0x0000000000000000000000000000000028845c9d99f3070604aeab0b883b0f8774de633c1e7b91a0376df2342122fd41489e7b589d0d5c36284021ae227a2e2be43e1dd1b67c0df432648e5026dfac6f43c0f326fa9866f007e8ea4125d5364b3d7061ebbbd9a24341c40a3ad8de3d113c809246069a0bc7cee32210e5e5c1a523e10db11d0d86abd29a3979e68dc01725d6e2246ffbf94311de0e749da628bfe1b40ec0251caa056fc6c2050b09074a3d8cf5dbc7c0ac18cccaaba93224d0c254df33169cf4d38befa64b443b6c4fb75b600786fada3d88a3e440751d50f3e522f9b7b28dda4e0f674c9faa24360a082e7c50145c707078b4d38802058b2d16fd80748729aac222af64be9e55e854da2aaef5713b3583a5730c08c16d252f9fbda97536c8a26168256b998f7e9fc1c60200247daf7503a9b41fb6c52c11c760f769266b44fa97bfeea3e0c68f0e3db04f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e685887d42c2579e03839e4be40e252a56e2d7c8e89a0c8eb990df5910714fea61c6e1d3b1c4c5502": "0x000000000000000000000000000000000483dc7edbb29fe81e5e29f18ee1c35a90b6aad5637057e3087699d38e7eea7394", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e689a20d8714b51d538cadf9abf7492ce1df73d8b7ee82e10c2a0571970e2aa5ded4b9a6f91a49833": "0x000000000000000000000000000000000488c3d536bd6f68f296a34c8c3df53f1fb5321622d5f21739b6a76670500e413c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e697ead568e820ccfd2eb07f02043788e254d9e2df57be11566d241c56302b91199b4647947af3020": "0x000000000000000000000000000000000852ff057f98f0c1bed31b2fd1ccd8de4d4acf957e79b3f71eb69820bf0dc1d22d02881d4f53d1205e5bdf3864a12c724927270a38a1139e0d6434eed97b930163", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e69937a5fa154cc0722a58635dd1a211d33750333282985df00d84e87b160293d6b39e89ea4bc7d67": "0x000000000000000000000000000000000476497a6036a1ef7d02ede96d44f39094a5fd50e69d524990946cf5e6e6f1da2c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e69b743ba383eda3afe7d71599a2b67c5085142c626641ccfc1f44919270fcac28d2ecfd41e0c7e3c": "0x00000000000000000000000000000000044c9984b5187f51b9b35d16a7df5b38a2e069e568bf813532ba08068477772205", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6a2edd04aff025a00a71c6a0fbf9b63ac089c5395bdea4917a84aabb3475d4454147c4d24ce1013a": "0x000000000000000000000000000000000c2bfbb8610a814c9052c287849831e4e28789a020afae5a23c9a19d3f37864a4986505f7c520a5d79d531e99903d5a18615f4510652500f511c8052d8e6a42721f64689da7688eec693a364879994be8568da0f7ff5223c391b6b58626f827527", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6ab589167a0b898fcc9f261e20561ee1a137a7c03770706d09a6f85e36e7a313f04d92faefbd3d43": "0x00000000000000000000000000000000040002dd621e14bf09425ab305ae1139310c1c0f78f2d3632c7ea507feb7f82900", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6b6157a13ed645fa040298f71f02d7b6a67c0ecee7d7a62ea51dc6daecebf4dd9ad72e0510537a58": "0x0000000000000000000000000000000004fab7ede8984030252e6392d2201f91bcd558470d35785c4bf89f6d7cd86c6e66", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6be5d0bab82378087042479798003022a5753c8547cb0de8ef25e2471e40889ff3909fe714e24c5d": "0x0000000000000000000000000000000008f20ddf4f2db1f9f800d70ce19dee3812a5d72bc275f413de1ee186ea7473bd18e0169ecd64ca393045cc15687b0f3355f7c86eef2d25182c731a45e55f2d165c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6bf9c9353fd020348c33b686a457b74f9b1a61b4446404e522d122064d6713ffacee88bfa9a15861": "0x000000000000000000000000000000000438cd946bf9de9d576d29db5fc442e5078a03f73b67ba76d8717634b7be4c5a23", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6c4d2026575763437cdc1a6a5a7f23437b6528edcdf553d0685f940a4e6e85579727ef3dc574563a": "0x000000000000000000000000000000000c6366490cf9fcc50f7edbecb28e3b78330a0e35d3e073cfb3538ae6540f0542b0815e86a39ceed754266101e55e352c131c877e72ba6f9652dc45fb3fd3757be4373d025abe0b6342867c03f3772e5e3fcfa7b13d7d5451ddc934efee37894a6c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6c53b7f96dcb583d9c2b14c09923911fe0ff6918b7c7702a91762aede2c2cdd0f1f0bdcf7b9f2a5a": "0x0000000000000000000000000000000004a56bd842d168e9b1eae2ef3d1f6d323b9bd4b8db997ffd2ff52369e5c0ba5512", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6c7206770c39d9295a5f7eb7050fb96d8d7895d9afce428a064ce66e3b094805bcad9a8e68cb9934": "0x0000000000000000000000000000000010b3c0b3afec6c57fc99dc2656c38ecae97b5c01f2d44bc9da56714141676e3ff21239360b36af37935b370032d2306b6c99c2e06b0312c2de4ad61c263b82886c067a2e439cc384440cf187331543175270b479ba695e2c4d6ba9528bbb6be460f201e84471e485a37aa3988c97ad57db1297d862ed5405d864708654e430260e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6cd2b2fd45e2e3d0702a6dc9592ec94ce9e1f07e2a0559d7f43f932101bace2400d0e92419218732": "0x0000000000000000000000000000000008befe117ae4a987baebd13ac5c3b611ded994a75dc9ef2dfcab5071688ec9e2fbbefe117ae4a987baebd13ac5c3b611ded994a75dc9ef2dfcab5071688ec9e2fb", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6cebd0b9de064aab0e038990f47761a17f45c2bb01c4c7746f4ad67c7d0c1dfbd6915372faae911f": "0x00000000000000000000000000000000080c92d4e41eddd3bec4ce4caf3610213e3b3b143a6c0319766961aecc27e124ffa7f6170f731a0acda2c9edc8ac9fc21a0b33e448378730b2392cc0bb76b55546", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6d301a445678938ac43aabf384c6baf54ef9712a96be7c46533b538c05d4e6c687fe09b109664b28": "0x000000000000000000000000000000000875a6c848edd2d131588ed2fb322ef45909d4aed3b7ea1197fce14220a68fcfe3611f3cd11a51748d355ff0686f5c5bbc2a7b0e91b6efa0fb4f9aae77c53942c8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6d81d41850c8478a76016fc20a6457ff8953bf29686c5698c28bbfa860669ddd07b386c910f1107d": "0x0000000000000000000000000000000004cc4790e6ee2ebf4271fffa10d4bcc2a4460ab377a49ddbedfbb647090c6a97aa", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6de5c15d472fd831e4e00e63c3647fc8c0a3d1b163ac988b6f0a7c3d05a01e209d4adef8e285037b": "0x00000000000000000000000000000000041024e48276b150fbff7c44baddfce92ba5d90057d518d3b29bcfaa421c13ab7b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6ec642500076ba25a6c5f0595d6ed85d6260bc682d4a68a4b4e605d43c67d56f2765d19698549772": "0x0000000000000000000000000000000008e541547dbea2dac6e485f82ea71b8b1f6fb6696aa65cab783b20f9a6c574e6445c8186e944c4df5cbb64eb1080932db445d11f69fb4da145a98d0d6aabb4c009", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6f3d6f5d8945a2a9d896f718b4ad053ba53468ba0347060b4a80f03fa72e9c14da5e2e7ea80e3f2c": "0x000000000000000000000000000000000470a8fd1a49157402789a0c495dc9c9d12e87a64805374661b32f1d715ca22f5a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e6f9bf1c5c47f9bff1c378d545f64248bedae80ec34f8f29551fc9f814f8491f8fea50f10fff6e229": "0x0000000000000000000000000000000004599aa7c71c2716d534f7f4ec936d9bc547b4e32fad199466a389b09b139f3f8b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e70023b9d2a2c164748ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54": "0x0000000000000000000000000000000048e4dc1df8790688cc413fea804c4158d1142db0312e091578306e1ec9fcd6bb7772ae12a9ae7729206f6988826c71f0f3076971462d1ac94efff198392464a6574aaa077ac4202f4f7e1135489106099452441129dc5aad89cd5dd4335918fa3dea08268d10b6dd05b9db75c7b7abc2b95e9b24d47f7b2a6147a56dcc745a0b4f06929a0b268c8a51c457e031e971ba6d1624b2ecccfc94185a8b593549ef7b401ad58fdac86f68d5a3a9a8e07163426d717ef0426d3e03604ae3bf4ed481a9236ecbc9b76728dae4396541cd517384e9898d5bec4875bdd1971c97041fa281119eb6835f83b4313045b2a156d5af104e172dc687b2bd07554ff3699748c4105016ee0e830501e14db6f33efb672620f030b65bcd30a91152c9b9abb66f4c117c8a1e84fa7220a6f820ca42a6dbe689b545ba1def88a7f1bd98d7aa46a9ab742ede38c0e7726f26fb4ce2b3bc8a17ded6197309efbf24d70d0425728eff597d50e28ceca047d61c081d502fb5b66527b2dc7438684d607682e9dc082640667213ea6f0d87d39b6b348f609c20246f065864972f409b809e94636fad2e6e779059809275c61d0a44ede0bb18a54adf2b684d44d1759e516e46634aad562fff1c2f78905d56c02810911e1ebaf201ac246eff919f4e71a5bfa5b29eaf6819663944426c1e2855920b16c78a37f7b6f480163f2a876a889f78b1ef2d11ebc9fd14592cd1a4b07571dd2c61dfa5ffd65b190a203d082e9176e791a25bcf242de28501d41ef941dae80043db2c5bcecb8501ff3f159ce810271ab6fdcbf979de7cd373", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e704211a750c9b855eed08a5b10b1835610d66ce4fa273c8e2436b978c9f65442efb6074871b48a6a": "0x0000000000000000000000000000000004c83b05f03d7e0511d29dca7a11f3631f6a0bf373ee6f96bf99882421dd261a4b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7061508d0facf9d35a1a549172a49f7591155007c51680ad8ad77571cea04acd1b0b84459e779234": "0x0000000000000000000000000000000004ba65343515a46a4aa9932cbdf0105d123c9d4ba9bef3be885c46f52c8c058d66", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e718a792663e13c111e015452870e49b4e4c3e054556b19683e8895586bfa58638a74a5782ab4f712": "0x00000000000000000000000000000000048e57071fe8c6591960d214a1100419ff2e2e92d4989a99646354df48ef91e664", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7214db08aea29f4c2a5bd5797da40fe8be1b94dd3260ef86d6b01cfc891c5c1cd160ad7fa198de57": "0x0000000000000000000000000000000010527638f35f3b999cb645e1e70a49e7b798a89c36b289bd366056d39115c18ae420cbc85619baeb354c068a5799d8ffa8b822505221d5357d7e70f2a3ebe08ea11ea9ff7a769863d12182a9439c3666f3fbbaedec8b5427d3c3e93633cebb4ae00da80f8169a692da1a6a0bda931750ed897b1ef4b0bc9bc6e0cbc906981e2b6a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7231a73eec660398046ff960b0d51db710b8ca414171afd47c9612311b69fa9416622dfb42a33124": "0x00000000000000000000000000000000044f00d8607ea768fa23a0befe7cead74f5f99102a70f53aae2cf68922f526523e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e73006ea8baa58afe58f26dd10efac24a7fd1813d6aa72a8e60bee976f7da28e492ad033fc1822315": "0x000000000000000000000000000000000453b9577bbf862a61bfd4c7302c3a43bd26a9b50370e3cb6586c8e267c1b87180", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e737675dbae64b33e3284bc8ce3083b62e671d1c5bd61db5b3fea95a77967341ca8834a69cffcfd5f": "0x0000000000000000000000000000000008d21bad21a85a2c91d823216610c964d9fef7dddff9f1864b2a7b4a8e667c1f5326e07a9cb1d3b8827960bbbee94197ad2204ea98db2d54da63b57bd9eac4374f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7396af96b1f453f59e826b5434525d00c118f3f6b0a29b7f432be7bbd18659d472c5f07298e76949": "0x0000000000000000000000000000000008847074f1fb351eaa06337823c68f2a9fb28c98db976bc5cc16867e4b84bc1060b8e7e832b85afd9cac90cf30ab4477265f14901bc0f25b2142c2e488bce87352", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e74083880a0b640654a003aeae28534daddcc861d7d3e91b576683544217044cefcf4803ced1fbc69": "0x00000000000000000000000000000000049ca08cd9b7fdd71d23d3a07906fac5a51b77c703f290adb2b5099b4334407913", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e74e73ec4f7c76752d65d5c1484e5faf8ad32907ab729add8ffc2ffe0f29bc18015bec2c3f8ac7c66": "0x0000000000000000000000000000000004c99cae7c82bcc7d4c6d39b376a3f9a61242bf4ff1225866f5f93acbbf8ac922a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e752ce2fc0e55cd08ac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064": "0x0000000000000000000000000000000024463e61911efe5b07ac64fbdd0b388a7b9569d067a6a34f01ce88bbfd9357f29f2f9c09c8a70b63d73be60dfe13947a17839970667250b900c8560ed4d042841d06beb838b0ba3114b2d1342cf7011c397879da3fb4b4ffd4df534e6948d4913eb8270b6d0325eac9f3ffd34032017f7848eaa460ca9a96a90a5296e34af91f96ea073956416e6c3fb74d4423f458a028c9674f147468dc0e2ca6d2c140bcdf4d3525a2d8318f0a082d428d90eeeccba905e0001fdad3a04d6abe49dd79e1518670375a0d07a2172cf390b17cce40e34997aa99c1762e9fe3f96a91ed60c7354b5767532cfd7c17f35bb22551c3364d9737749661b25f431f04df8364c9db3954dde48b0a82d440116e0620963bfc19d1520435a7b64c4b36e5b258be8a9974e0", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e753ac717444b23dd1cf3e5e0a3f8f198a63f5f7284fe493c23e88161d92d2cd418e52d050e3bd22b": "0x0000000000000000000000000000000004b0495e49f3241a065bbf17983665997e582b1535c5410530897e3889993f711d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e753bb535f9a5c087d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460": "0x0000000000000000000000000000000024e2dfbb25f8e8e6047e14474e054090c283b6c8d34fbcc7370fff8292592f934eae8c6dd7bf2e52a684bbda1831b6eea8040b7fa459da6a487a9988a9d84f6b0c48f5c152ca97d46d67467f3b6c7e2fff11e1f95abc0ea7298255c026ff65d92b280daf6efb2a16974f928da1abda06f2997f18a8db3cc73dab3cdc97d13fa52094082abb5e84b31a7cb7e0e69fd711f013ac426d62f1e157b762d284ee6efe2be6fe75fdd65d00f6ea16c22ba1ce89e45441b80c597eca58690664288f1ca146f40945c32b5bb894f311b2a680d927a1d26080b3b4b1c8b5bcabb196918d0e2da6cf293e01355a99ab2429bc7d9f56bd24beb526079ac3eb0a00c3c70e4f64655ad5faadcc4848cc8acadadf39c4a9893e13e8993e270364eba8ce53b8374c6f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7571a6ecb5a2dbf4548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b": "0x0000000000000000000000000000000018f87441058c9c1d89f27cd68a74ced729f5393936f7c041de6732df7217d17cfcea4cf3795941a47d46c2b433ee328d7d2a71c85007251569a6e1fa5535af173dd38bb685e02bad927a5425d733b7f89077e5b2b6c09e8e8990c98dde3275067c97a214d9d7e4d9756f50d6b43a18a8ee671cb1512b46f2c2c8c1309694dc75bfeaeb9d2bee9133ac09633b0361b04567f3997d6aa139a401c12f929be161d9f65c5c5a4a025f3d8be84fa9ea36383c2cd168c8a018d50c88a34154afe9ecf04f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7661b26815a3370c9ef2c74b5a6820a16eb04205a9d177c4244a94cdcfe1275039ef8704480a3905": "0x00000000000000000000000000000000049ef2c74b5a6820a16eb04205a9d177c4244a94cdcfe1275039ef8704480a3905", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7680539dbbaf0658cecae006fbf10a81337d87455340ce6112b125a971482490e02d75a27bb2c33c": "0x000000000000000000000000000000000478c0205b88370e3af02a0d22ff0411cb0335a823f02f604c692a9bb1914f2262", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e76d10d82508ddae096e24e9b5ab82dc275b82318a52cebed1cae3e25be096d5f288229b256359e43": "0x0000000000000000000000000000000004c2de6256e9ff0ba9b97f862290f69ec0f72b31fa0a6843e0175e9e81a0165d6b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e782e7be4e56dc7e9ae963c00a7c164fce3f4a8ed94ba0a87e83cc1a7b192726836819cf1f63c522b": "0x00000000000000000000000000000000048689cf01de26619d9e77cfb38911661940f6fd4b6379d8bd5558b8b967d51db6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e78331d8cc49f0ef276f45a1045fe47a639befe802be7eeea599080222e2f45fba46492039609cc07": "0x0000000000000000000000000000000004ce52792eba24d1a81f5979865ac647e16fa810d48fa38b2840de291115171e06", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e78401030f0261c10a49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e": "0x00000000000000000000000000000000142494641f85af0c7f9d2e3c942fd250dd7c2ecc7e5dcc401fb3ebca0573edc571be6ac75cc8c52d2d3b88dd29c0352b579f4891c52f76508269f2328fece4d07d8c600da2883fe70c639e6375b81f45d5225acf4777c4586a3672c2568b9c676cbd65fafff9dc200e3945e786ca92ba36a9aa333b09bb500b632e8827f8f7ab380e8b9d19878dc5c50ed1ab180f4e76cf7e208851fc6a869b28dbc1ce6208dc0e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e78793b4db20d123c8e111a2e445cc0f64b5809496887b3130718d969db6637c0ebf1118c39b15c55": "0x00000000000000000000000000000000040a16d6fd4dc2954c449699e5f6e3c7d2f0dc64df5b8008135fd60eb3eac61e6f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e792e04f3dda19263a61514d5cabf81b3f62650806870ad83b2e5059538b846b6dd9963e010566a17": "0x000000000000000000000000000000000446105c0b02b08c1a4e094e2bbc42fab06c13cdd155bff92dd844d3bd727f2612", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e794c7db721956af68a56b1da8dc3f4bd58630c15f5754ee634528a007ab510c86a7e1fe6e62f4166": "0x0000000000000000000000000000000004b497cbcd9414ec2922ff86acf2e22ad1b49aa07be1182a9490c47d3170e6861b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7a0fd3be900ddd6b0a7ac5be69a8243f8880d5fd015b2e8f8f30ce6c7162f8bcb5ad1a1fa4246d32": "0x0000000000000000000000000000000004080bd036530545e5e07ad813a408fa757bdd643e76b9d1171417d7eff0d7fe4b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7afcd22bd458c5e66aa7f16d0ce7a6288dd1d2f1779fafb18d4c60ee78e89ab3dd3bc0979aad386e": "0x0000000000000000000000000000000004800bea28742b7e03bf213fd6cbd84e862ccdc18e30b94635f5778a8103133f36", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7bbbb302ea3c73fd6a1e7cf7558378809fa376f7eec7b065d30759f8a4e7b721ec2ae74b313f0855": "0x0000000000000000000000000000000004a8c96b926e3a1baf17e8f1cab2e0df7229b36c661e9d29f4c005b2dfb0835218", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7bc80f4306d5529f7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819": "0x00000000000000000000000000000000200650217af71d75baa1bbc577761208886a474cfe4c24435b0295586f2f66a571ce00415c4b594b4c5085fc803c7eb7872847b7b50fbb0ad93cf0fb95c7a0bf68e2cbbeac13b1017c8a5a32551d77e89017551a2f9438743446de2dc2ed13ec4d7c731b26739bf75d9607468391f9d743d3ee7f65f8e668d770174f74dcab7f433818c289aad92bbce3185cbc77619f99bb38a139fd9428ec6c2c97f964d0146770d4121446293f928e59d4f8a5eea096ebe1c2538002fcbf7b7845dd2e19ee6d424ecaa1e5d069bb89c743c3ddb44d9cb023aff0ad78e3c502bd39b0abbf7715e2c6bbc2bf8ac332d8f9f45013049439bd2d31008db521ffe472e8c4c4e0c348", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7bf2c0491ddcbed34e908afcf0fb6b394bd1a043bc8b226fac33b4742731b9cde5d324f450eb3006": "0x00000000000000000000000000000000100a750504f5da1835d98bf849ebc018742d544c86edbcab2525a8acc2178fed596cdfaeaa8c9eba3e4d30f66d1b53a97f830612cdcdb1ee1d203a797ef4973125c21bde30a8d12e4e5d4dd612ff510d84e23afe81bdb222e1037a7c7fafd8962b4033dc4a810332f94b2874b5aa564424b0583f0e866c908346ae4b2bcb4f5e0e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7c1466766d8e06522ce1929ab903f695bdeeeb79a588774d71468362129136f1b7f7b31a32958f98": "0x00000000000000000000000000000000048e9871679378b82009f51f30eec29bcddfe60c4f7d22c24f74883b47d935a565", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7c9b151305dcded7e26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd04": "0x0000000000000000000000000000000010e26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd04fca5925e677ffb072b404634eb297becf53c269e32c7393c9b9dec8d256dad21a434a662f5ab9e81bb83c07ab5282538bafe448f142d2b6b119362b1bebbe1767493915ecb44badd479418bd0ef0f753952690f6ceeb421a0fe567edf2fdb228", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7ce6fa220b1f0d1ba06446b3474c3d9dcfb759f3df134cf4b6620b2559c4e1b99d3be4d010378f40": "0x00000000000000000000000000000000048bbf421fcb86d5fd3e28a4762d295b722fae2260d0f3d548fe6eb8cd741c286e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7d26f412c600f65a48745d28d9e9596ca41b7f7bcb03f874757f4f0716a7237e566662a6393bc125": "0x0000000000000000000000000000000004483ea32669fca11e7415c4e24e088cb3df49defae82f0f9d069ea0aa75839e38", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7d2dd084386fd77b18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc0019": "0x0000000000000000000000000000000018c0dd6bb9243edbd211dac2b9b37fd29003be77cf21455af7c2c680af8812b6041c761954d8265833c4b21c7296a314229af2391b34fc090aa76a817b2e79836af4c68c01b58b381bcb8b1fe58cab96f90271910ec55c23214c68815130b5a81ba8ad44d6bd00b9ebeda2a48ccdad36d0ca29bd930ca2856cc8ce1c109f938625822adab3c579b87a5731f551e8f311cefbffbf514b27b94a6af35fc23562c945a6148a5ba31e548196ff678386e2c8792fb3bea265b6c2475e62eab64254946e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7d363e805ca7dc102e6dde560aa0f00b08d0db5e3c2f199181be3ca53d2e7a0a742aa5692433060d": "0x0000000000000000000000000000000004ed1d56154af1862efb63fc12298d73411b024a7b5312346ca95effe7011efec3", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7d3c67d22eef172a8c20d46f86242eea89c400d5c478207e05c76bbab29a748af8aac90d627e1a01": "0x000000000000000000000000000000000888624098732487bb9f92045e3d405bd1b7f9432dbd705c3ba58c5e86d1353c696679005100a874118c6c38e5b3183ef6cb71193480d1de0699f9bb6bfedf1f24", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7d73ff709d9ae6a4d53c9c6e61431448ceef1eb49542ddee942dd3d6c81c19d53efbab8acb02f00f": "0x0000000000000000000000000000000004f45c6d9ac359665373662814fb3b30355638036ee2aee6807b2f2b228ec1d6e5", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7d76b3fc859618eb1a41e8f79310cf5b804b038d19f28b535261fc5c1c3d1dcfdc49e6bf5a946d32": "0x0000000000000000000000000000000004a248e7a6ef290c55ae9f1383eef475298bf04a1a78fc22f186cce5a797ebf508", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7da4d6e045faa8163a731ac0ae7375a2cce5b504484d91f1c49923b3425072e36e12b0afd5f2a857": "0x0000000000000000000000000000000008a570c6ce21a0b2f432dfd11756cca948259a8b281196ccec975c681372a06280cd5f012106aaea7652374847b9658c8c300f0f0b26e484e99f7c1e3d32d83a10", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7db14798f78c92e409ed7dc92692f6d1b8bf5e71b68f9019a16f825e4eb71bb22c5bcbb9fec300d1": "0x0000000000000000000000000000000004e7934d8edca47f33d004647a350aaa7ca31871f8ffe6038f187e1689cf34dcdd", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7e1d98e7b551be5a30fd1beaa72357f61ba1fe7e90aa8c5080fcd49b2c82e1b8315bcd9a223cbe41": "0x0000000000000000000000000000000008e1926d2b7dcec1ba035361a2d58a3ddbbc4386ba5bd61d5dd57d22d508154decd10cd1c9ae335b7b25abad42b89554a8d9c9fdce81a11b856604cdfa6edccffe", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e81a8aa27b7c69abc7c7d2fe83c4af79c49136f0f8c5f1a00cd8d0aa91c94fe74d0145cb96d688f66": "0x000000000000000000000000000000000c2efecb509bcbfa0ebbe40f7bbc6a74d4a90cfd7e982ce06c2f11fdcc70efeb5a8057b9f8b71f7e97f0bbb2dd94b1a047992ff072d07aa77f0a3fba1c288840251a232a8dc0c50a8faa639ed22d11410c00f5b812bd14ffa6f3f554d8edad4172", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8337944019a68ea6a6500e450888dd3758b301a0f99d433264362547ca7d0f7631ea53871aa3be35": "0x0000000000000000000000000000000004007f0252d2dda00e8007d8ba227234f9407f28a0584158c1a74b2e4401ba921e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e83ad6aeb3e5890e926090dc5275e53b65763f135108a9111289aa1ca6331a8ddb3440059cd33d75f": "0x000000000000000000000000000000000426090dc5275e53b65763f135108a9111289aa1ca6331a8ddb3440059cd33d75f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e841c66ae33e977e77eb07fd02281d018a4c45bab914fc6e2a0f81620663b53ab62432ae62a07194d": "0x000000000000000000000000000000000448b36ca55541b8f8c030a3a844a247a85e731764d015bdede53205fb5b355a25", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e842664827980e15e54faa9f0cc59a977e73147865791a9272cd4980db5ff2eee27096d34ff2fab69": "0x0000000000000000000000000000000004fefa1659ff7e86a20f110974463d76eb0238f0e02f6b526df7d586b0657d52d8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e84ccbb22b59b800b7213534fb02c7638d8d7caf1f62b983225c5aa76b8c14d249f7a704b50ba850a": "0x000000000000000000000000000000000430cca6318e5c3cea1c72f33f541532ab6609b50853627fcd587bd5883d52f75c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8549b7fd2bfcfdd9bc0525c374a8198f3288a0733918321dfc26532e253d94da3a6a27a4c3e31760": "0x0000000000000000000000000000000004cafd506351cbb8a3af1f69479dc08628bcdc05de50e86e2f94aaa21306727b2c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e85d657f1acd3f2c92458c79f1b8d080257ba31830f364170c90b6b173be1832ebace48595d193b2b": "0x0000000000000000000000000000000004160e772b488c83753ee69cadc56cdfe71937dec6a69b4bee87e4cfeb4bf8d475", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e860033e5e332e23d6a2bd95c44c00bcad3fef2f7226ad90b8b93c3c1b9679236d5abfdb39c895844": "0x0000000000000000000000000000000004bf7c2411b8362b3beedd04428317c3eeb3639379c64eaa724d44eb77b15cc85b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8621671899b86161726ac63a0a6a700ad7e1178fef89a87620bbc152a19f74708defc7f08bbc6556": "0x000000000000000000000000000000000410a315981265a9951067374fb624c1976dcf865c9dc43d08e3031ead35a06219", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8641dd739c11a1441994df5bf0f44342b1719bfbb1561286bd81b6d84f577f55ef45fe7ad6f50e4a": "0x0000000000000000000000000000000004e396927763007571ab5c30a835b67c150993def51b98681dd7a69e87d7125cf7", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e86672c8d8603d645de7fc70edbc29190008415c3b6122dc6390b738453c6f1213b59942b2b76e54a": "0x0000000000000000000000000000000008c2e34786dcde41bcaf6c5c3dedd1320c792f0a0bf3c448e03275d7f9cefb765312ba1a34fc5e9b81ba8d7e486f223a2cb47e30c8dc185888aaac0eb25c5f605b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e867fc6e4929b002af04c95a6ac10a0db5af28ac44776f95949dd543f494f8b8787925c41fccf7e0f": "0x00000000000000000000000000000000045e5085f483896c9bfc341a80912faf167a1ef9229fe8b2989de7b6bad03c63cb", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e86e553fb01bfcb3d16f24ecfa07199b88f010d94f47864ace2c0357aa4f37898f85cb39992e2036d": "0x00000000000000000000000000000000044e6717194ee8da5cb1669a5636c8821f764ecffa0bb0e43b610b8bb1fb1f197a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e87843e0e467379078c79cbd600c63f0cc90b34e7301b7cef8c93f7a404cbacecab96901fe53d4640": "0x000000000000000000000000000000000418a06c67746e98a3cc1680079a706c133d5e77d0c8721728cdd7c8525b42b752", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e87f8d378447f4f51b8a038b439b411fb7c6cc2d7315292a3d1649601641cbbe0825ab7fa90ce3002": "0x00000000000000000000000000000000048e81ad73b19ae9a28e6e7020f70d862a8e379ce88dc1546a2a8724a7c4b5601e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e885ebea0f5080b1300f53cf59ee4bae1fc47b5df521d48a3cc2d02d5c15fd5d3bfa3d6a4a2e6a576": "0x00000000000000000000000000000000081af4af68069a4772fc4e73cba9d1479943982c64e124ec73bb1cbc70f66bcf3f3a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8876172ab0d0bba3f89b361ea400867da22fa6a069fdd840819fdc24fee6cc3763b6cf3a8a20246b": "0x00000000000000000000000000000000047a0d37cd4a96cb4e0445c91d19d6c84856f994d5e099e0f911b6855605833860", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e88de95e48f84c3689085297d964ea873a23b63151b4c82189c1314c31fda6f2d71f83133d0877c5c": "0x000000000000000000000000000000000cf25f7a8dd6b648eac453d60b0052dee3cefce2ff56830eb7cc98292c8885f958326e27145577ff5e9bcd3f75bba30fca9622705f65a07ecf04a5d692b284ce72547be45207a849ca9ec68e16de6964b581b36449cb04256febdfdad833e7e670", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e88f2bab6b4633034bee287e579da5137412f2c3bd4d5ae4c6a11c4c420e04261157e04842a2ea641": "0x00000000000000000000000000000000048cc54beb3db37569467a12154f037da2f6d859d11b72db7cc8f615c7456bc923", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8902cecf825f2867273e55ba58de0184bb96e5e691dcc9171ec58658d2b94c42c7e4ca7574f6a076": "0x000000000000000000000000000000000433815302aca0725e74939106884963f32a80056aba37aa94dfe6220c039cc87e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8954d9b6c7704b5c0a912cf4f0c7894598d81d26f2c24f6e5c2541f312462bb576593e9dc549146d": "0x00000000000000000000000000000000040c8bdf19914b8931589d6658da943de4de04cc1102902a9e30d3d3bc68892c02", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8997871f06793d390456840228e994122a2750c966571ca20d2456db20a7cb84603ed8e2d5503776": "0x000000000000000000000000000000000460384fabe173278be399e99aaafc7d5b3eb2547af81fbc8039eb6fc49ae008bb", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8afa4a7f5b70a3e0904168b519b2745aa1480867fbc7db364c79e03fafd6e30ccc1691e7214ef860": "0x0000000000000000000000000000000004b20ba612ec45aa1ccb1ede3e2838ed2b4f5eadad5d80a873d74ead94b9689850", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8b299234c2604004face99d3401cb9b45ee1bc0ec52f4cb35914dc5ad27806230534230eedb8413d": "0x000000000000000000000000000000000862be3477b75e8497245a053f1f51f752421fb039f6bfe04a397e85be7e193440f69837f9346b574bee364518dfa08ec7723533632fbabbab594623d83157a67b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8c1c29593b2d5db604c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b3568": "0x000000000000000000000000000000001c58ac509e6e93bcf6ac0800a070f28bd477fb9e9717ff7779d035094e361b150438833de858facacb267fefbade2fe127da59cb1d3653e5acdaf5aaa1c0bb6f255b7812d3e31417cabe45153f522a4047b09e9662795cc7c7372cfb02f6dc39192a30902e14ea5ffdb5135aed31d3940e0df7027a27d079c6a67d135981f4760146a4204de252ad6bb8587604684eb6b0d8d7c5f9f8e7ca0132bcdc6d53131e47c49ea8deb91aae7843e2cdfba3a91fb9910efab535670b9da55bd5abdb7e542a4ea8dd0f74def3f37653a2bc9932edbaa87ba9a185c55cd8b5bd733ea86c6257", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8c24c3ef8bc4c3e412c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310": "0x00000000000000000000000000000000910112c0e71d46088235059834f57282e18f93197b164a04be4082b6dfd88d86f53112c0e71d466c86c2834663f4edc4bf268a2746f02da7a7334344582db793062b12c0e71d489fee1707d4857f5f4cca6e9ccc10a81fb25b9cdf5c2d872d0f3a5c12c0e71d2a6032287a5bdb910afd1522f52f26c1d619395f3c8d1d18ed23c12b12c0e71d133bb870cfcff34b784d933b5ab71a4f90987f854522f076bd23f21412c0e71cee9f575993304f4b1b5dd21ab495dbad0b4613f39c8c4f49ef24140612c0e71cf3f161c02727017e5ce4f8f6e245fa61bec1a3a1ac960fe11e917c2612c0e71cf41a90f7205b9034bdc9380a95bc18669cd5b4d6b9452f73d468e74c12c0e71cf317d94584299468b9a292c7e69d3ce2ba40e4819166c78dce18e85912c0e71d0d3a5ede1ed512ea065c3970ff43788f057c99ffa3afe8ede608da0e12c0e71d10a91f1a202191134bc06e790e98829eb7d76881e3c8b42dbe8a6d4112c0e71d210ce61c449fc8f5f3f521209d2906e445239a938303741301d0ef7c12c0e71d208c668db313147edb94aa31af86ca4e55d4900fed5eda638862b80312c0e71d1e59aa52904247d6ede8d053ec5c65dfb3dc8c1e632acf34c030a25512c0e71d25be2e5d1c5893ed30710dc6c645e8f26b3e1c3ca43800fb99fcfa4a12c0e71d25d4ac0ea242b6e44fc9625e1a4dcfe17e6cf9dfdc0bb233ec58955612c0e71d364ec914b6b740ad7c055dbd9a15aa2cdf4f6b3349970e15b6b73e0112c0e71d43df157fee32bea33e2335ca841ecf4689f61b53af12109a990e8b3812c0e71d4b14d52ccb248e416cad1ddfc7283a09f2625c601528d29f9a294b4f12c0e71d4ebd6afa6a6462c87da8f8da65e320b207a3958a76e854432b5cdd0212c0e71d56bc0e445558b892aea1eb53639aaf99ec6f51aba44607213c3dfe2e12c0e71d6034eaeb56b1637b948fefd184ecfebeffe8dab40a37c6cdf3971a4012c0e71c47eb3e0eca577bc8ce7ec63eb978b1e36e73daea0449935e5496850c12c0e71c49ca78c235b4cc7c02b0dd42d2ba68cae14091330453206d11f34a5612c0e71c4fcce3bde2baa598b4b4b15e3674286d0dc2c03441be1bd48408d92a12c0e71cb40d9d91814a130bf4ee7008a6e83563520ad677eb2034209fa20e5512c0e71c6d383ed080fca5ac67242f4365fce824e3b989af1388d5a94f38b93412c0e71cc202669b8b8f008fd88fc91048ddec2434e536b37adc066ae2d1653e12c0e71ca519959bc745598c859160abc7bdaac3949ca44ad9712c4a35e80c3e12c0e71cd7c05aaf2bd4ceaaeddad56e206f8b7be033b915ca7e8391aaa56a0e12c0e71cdddce276170fdafc609d13aa23bc51e46a52772dcf1e378130b6b01412c0e71cd31ae09c2af44df1c49f572234348e1637127de385daad38c2bd363212c0e71c92f12577507a7ceef4da940099fd984e976858d6d4c6826ff76e254412c0e71c73acdcfb922d6d2daaca383ec2d7a0cbcfe42ac84bb16da1c25c8c2e12c0e71c9f53cee8937a8a3a30c639efe4e9e61faa222953bfff2cc0a782956c12c0e71c712fc750ea7987ebc3adbf181c53f54133d3378fa5d7268bace38a0512c0e71cac0a27a2fd30bc24907dfcf124197d52af6e9c9506f5bae59bf0887912c0e71c62cf1da0300cb62510765cc22eb8eaf487bd2abe160f4c231e28a34012c0e71ca560b3ce013e7ea6f20692d95ceba300e0b354cafdb4095a94a27e6812c0e71c651e27773fa58160878f81a68b7b054ccdccad776181f757e763e51412c0e71c512bfec8bb542308c909c7b50f401219848e9cd7ee84c2bf2519644912c0e71c89568cdf09515dad33fa70b04cb39e21d8be64dee93e17569f96212912c0e71c65c6d73c4787dc93561ade71071ffc5d78756ba4f606fe91a6e3452112c0e71c6c063c135438f8997461cbe25e61d7569fe4c3f9f07db032f75a581c12c0e71c83c45d50d2f831c6574ab25eabed7842fc69f51bba122c617531d72512c0e71cdeadb03446fd3519d1dcd4f690e40df4ab0d193b476a94a0b6588c2812c0e71cb1a9c147998723d2dc7ef44affbf359be54830a570a5840e2734c47c12c0e71d06dd205beae5054c937e4170b53866e429f4be7a98318c261b3a0b2d12c0e71d0f4707cb93bd1de1eeec36c3e1f995dc51eeedba0cb52287d2fd3c7d12c0e71d378b0a623f2b9eb1b44430061c4f2bab9da7943fd286326a98b54a6c12c0e71d2b06750f95b1dc2ccf25272d0e77de2fa9efb9499be95ef938d6d76612c0e71d5287b03cc78c4c2faefffc4cacd47bf65ba7bd0bc5d4facc08cf932312c0e71d4911dde07af70a1bafe6ae84ef07a43280a736d0c19395a58793541212c0e71d2f08b6d34a5103c892d4baa26995bf4b184eb7507f9e111014e58b7912c0e71d17404deaa91eca3e64e911f5e43ebbfb80fb21f97c4d453ed79bee3612c0e71d5b27b11da4fee8ee2b71b1535daaccd5775846c26ba02d082124466712c0e71d3ed7229dfea16555ba040cce63fba1fa33cd5296c4393fa61114a86d12c0e71d2ffe345813bd81eea02b361a65b0b88ef0e5ee8a0a2268a8ad9bbe2c12c0e71d36450dd3d651da12ea3ff51a9f306650744f4c164ceaa7b2cc08454612c0e71d122033fe390632d7275542273a8afc911afdba254ba4b7f33087906412c0e71d5e85f0442d53fd7419af7a23a2908f88ebcced94150e396bb64ef64412c0e71cb2e754bb49f1758439d6729debf9a30cf5b9a797ec564f00592a2f5f12c0e71c4aba6d53775e0a27ff00a6090b2d9bb4171096109a5aa2a59328df6112c0e71c4dd67a196937bcfc45ed0384d81a3b7e8a5b9746ac82081c4bf3096412c0e71c5200cf1cf22ac62ae2910eb3e485a104f610f1535ed1e844b78e291412c0e71c578bac3ac4c85fb1d9f0645451aa4503782c3f0f3260486b8d3e612312c0e71c6323105cc5215aec99c36c3931fabbe7dc4a439329be146133235a3612c0e71cde22f076b79de5a6fc30cd47be3f5629d4be7fde35d769e7480f491112c0e71c4b17ed34d92d3794d3cac294945580552a9200d74dbaeb0a17a2ce7e12c0e71cdc8163ee018634a900a6e973a87e8740b6c9c4400ca1fae2ac8f4e0412c0e71c9d62c402a345adadf6d07c72b92a9df6035128105150414c0f759a2312c0e71cbbe5966e17c328e1a6f43729e44d4dc326af5ea40f9c0e103b19cf1e12c0e71c74bc9329f210cf3871cb0df4e3139420f8cd1260ed214f6e310d596912c0e71c8c7444fd30b0ba7ccac70112280c31a7b57682c59443918e741b713c12c0e71c471767a1c8d1f0fbdc97763c8730745526c890b3d603d90337caca4412c0e71c85b306f02dce509fbd905815ba90fd450199f70a6e00a5634134036012c0e71cad505181147127f5267ae6187fe470ce00c91bd1d1adfd0227a7333a12c0e71cab33ca9929a6406d6634c55c8d28c63c99b18fb6a2c1eca3037b144a12c0e71c9fdf776b26f8b4def79ecfeb98cf14bba80546f54124e4725da6036f12c0e71c9c7a0df0270f56ecec10f80525ff477398256a84db44f8362cc9cb7a12c0e71cc0578209ed2ff07931f254566de682bd7407f07913ca1c4a30e7a63312c0e71cb50b65d27c7147f5ea52a5a805f8f75301ecb5d9577244659659965b12c0e71c782aad6c734c6714946bf965fe464aaaf2e15c7d43409f936540ea7212c0e71ce93b3b5ce42fde862b4d609631d600ee1cc3f3717268e7b9b3e1467a12c0e71cba3dffa43d603a1637f373c134f4eb3b0ca902a937e218cf992b4f1b12c0e71ccf0639294d8ecb643d6dad93d9660836463f91d1b66292fd9b1ab05f12c0e71c89b2c75caab9eb9b3ee5a918dc734c5c595ee569e64ed37a306de97412c0e71c8bc9217a6448d34afd0c1d226663a864a4141b65d13f8bbc743d133512c0e71ca3fd568c3120f3c6eb7825d957104fd5e9bd9848ef36a1d5de03b00812c0e71c7daf0347415ea3623b1441a1f89b5115bfe82a57a132f72d186a246912c0e71c9267977ff8cfbf27005fca3918833daf0d77537e8f879fb9fcdf2b0912c0e71c55443e88a1777244fd0816a9f44562ca36e5b9d95d45f3d79a1cb56012c0e71c508ea654da98971a9a27caa027e9478b84c319ecc1fb63288ffd9b0d12c0e71c536b024440ad0fd64324c6eebdc0e497207ff42489ca8a2489f6e32712c0e71cfab0ec8e02f65d8114492d2c9177d3add541219bd8ddc00ef4e9b66a12c0e71c648c0ea092b2481ad9657956548a531fa3a89a140d3d8f9359fce54b12c0e71cbe21aa863d666ff694ca4aa3a1f0e89a9e75ffcdb6c629fa1d00646012c0e71cb214fffe90a9fd96c396cd776ae64fe664bd26e6072e7328b1df575612c0e71cae4be30aa91dc1e77bf2bde98af86c4d385e9c0868d8af4a5025880312c0e71d330bdafa9c3a6218dcea201399a6cfe0fa73c2692e7a83492614e40a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8d136d7c7984d254da01077bdc025fd779cc21c9760727ec07e52aa132410b82e5fabacb6f45b055": "0x0000000000000000000000000000000004bea06b45bcad97ae3126af1a6e864197180af4b7e6513da3032228b2bdb26368", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8d5f7ebde4f481a866f7b3f3db597d3032c2d767568aa550249c946600a61276910b9c1d21a93371": "0x00000000000000000000000000000000049c674dc7b750bf4d5d5d0db23578adbd9602cac61f6292fd788879a44c87256a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8e029dc73c6ca9b6f00272047a1369138c7948e8d193757bd7d6319254926d2b91175398d8250e30": "0x0000000000000000000000000000000004ecd0f078418756af923fefc497d98efcdd243170af2694cb75a2becfe2811732", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8ec37554e12de10ab08b555a5a3b2725e01ba15eb40aa32dc5b781532854b797808ed45e752b047c": "0x0000000000000000000000000000000008d85561d4ee89c473f4220a4a5ca0c8eaeb01fe8d0740aed291ad796d4b2da175821bc7f162ddbc6418c08a018d072e2980a4257c8584435e5b6251f6e27cdf19", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8ec91a2d2c36d0707a8b217ad8d80016336be124846210559ebf720aecd25ea0d0d11c10f1839e71": "0x0000000000000000000000000000000008d84e08c6dda9a41fd1d44b01b65c7787b48723679a1d0c83d1d9a54798ccf01e5e11390e1f7b87f6e2a59603d7979e4e26259c41f011eba0e6f3ed6996e7151d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8f10571113e0ae6b447326399643ec639a0bfde97d8b37f8dd0ca9fcb3c74a1ce017f0476f3e2770": "0x00000000000000000000000000000000041644a3ce3456b8954eeca77a5b67d7e9d26eba9f922b82daff95057f543ed03f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8f88e4319e34d2ea16476866c0074663b7d9046023a2b3fbf447c833f4fccfa3dd7a482235f1ec7f": "0x0000000000000000000000000000000004848acf74babbd40295e54caaaf41e505891996968bee93eedcaa8e5b4105c779", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e8f943fb275b495a03e3622fb285dddefdf8f9ac2ab59aa34e2abb5a316e9ebdc020317220e75f879": "0x0000000000000000000000000000000008a227e750a30259349ff46ad36105156f552fedee92bc3b81470cea913d30d6cde81c8e2c7bc6a6b6de522487e8829344e992a3440f957a52c86d93038b9b3dc8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e90073106f69e036ffaba4f34d61e2defae2db1f7c712007824c194ad921959efdb4a65dd174a590c": "0x000000000000000000000000000000000c40de8fe2227bbb0358570c01c31ce0ebb4b7540c1302ab6a6d021cd0ae5d5942f206c1276f16bd43aca4fa9d596a7164a310b83bdf34350c1480ed4854cf9729a83fc2798fabbdc8d93db99a27dda9b8f6615cfef0b16a3a0aca93a49e527475", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e90b1c53cf7dcddbd8a320af9e031a3396f15acdcc65c43008124068226505ee7e12bbb0a12012e60": "0x00000000000000000000000000000000088478f51feef5a376deda20303e61c855e0b96451f692ead53d838130bce9cd086c98dfc795cd34290966dfa3a4f690a2c703dfaa31792854885295a61cfdd670", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e90b34a3937b9efce6482a21b7e92055e74bc9b182ded5b0cb86e6f7706090c916f60e8235b8fe51a": "0x000000000000000000000000000000000499a833467b3227e480dd06ccad8eb537c399e3851d8acd1b3d1c3e711db83686", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9155332d1321391214cd612ff7f390b9e90584767a00a4e9b740b61c0f2134698bbac79c6649764d": "0x0000000000000000000000000000000004c61e997a53022149bda8907ce19e1780b9ae75e23fdd6b44fd5a6adb4ff91801", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e917bdd412b89d0510cce9e210c473fd1f20178fe889c178956ea1cf325c54b1a439a88bc62fe7851": "0x000000000000000000000000000000000434fe2832004fffcc1e28aec7ac35d29142b892f10d8d0c301cd26c37860a0579", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e921d891bcf4e728ce683743954d0cb555a54ab21cfb8161f74e689a051d1ac1dbbb94df70be3d81e": "0x00000000000000000000000000000000084409776e3d248cea53e8d6fce41bc1795b83793fe794119a63b82a7e837e9f59f45cc1889ea605f6e375289fdb22c1acf7e99fc60cca3ba5cad46a21661a7720", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e925643626036602a9a92ad7c6dcc51fec9f6d98f8316406ca42bd04dbb029d3ce454330a20fac077": "0x0000000000000000000000000000000008148e8ac56079d875671a8e379e8ce3726be04f32f36a3f8237c2713dd354be1bc6379520320c2c68f6e75938afa22a71c7f3bdcd1308ba1e7795a2fa2d9b9066", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e927911426652f14cf4492a28ead0b315fc68069bcc39470c409d12b4e48259384d63da411bad0129": "0x0000000000000000000000000000000004d448d47466cd9abc75c90e52f3aae5d03e772ca2f13db8516aad2ec15d341d2e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e92b894b9740836cdce2e98564f421ca69a64608d68480080f5f317f4de4e400af3c065181e0c8a11": "0x0000000000000000000000000000000004ce2e98564f421ca69a64608d68480080f5f317f4de4e400af3c065181e0c8a11", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9446885b0b18680ae8e0ac0aa68a0c138a3aa84813f0accae4ed7d6ae4b4905495026f16eda4e069": "0x0000000000000000000000000000000004e8e0ac0aa68a0c138a3aa84813f0accae4ed7d6ae4b4905495026f16eda4e069", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9464a51c61bcb648ee56126859de69a3539f0e8910ca7e775243f18c6257954a65e020eb229be912": "0x00000000000000000000000000000000043e4473a8a5c626a2b1eab5002c13537480b487a04ce85ae09292a7c458b3be06", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9512e7cebb2ab2b2206dd955d4ade8d59bab18cba031e664ae888491d173084bc9a0efabf0be195e": "0x000000000000000000000000000000000454c3bc9063fba6c75163f3e051f1387121c0120d3bfe764e68764f02ea33bb48", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e95e5354b81f0f460da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a": "0x0000000000000000000000000000000004a65bbeb4425c55a611da4116e848b0cc39686a11f88dee6aacceac6bc5eca657", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e95f941adaa91654a28322946bfaec48af9564e56ee4134655dc1748ffc206c3694a9c6bddbe8332f": "0x000000000000000000000000000000000438684912197a8fb0da1f815281bb2f52f170d07b4d96450ac6ac06cb4bd42d6d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9639866340f488369cb0d4ddd32f9332dac7059de238b8e489afb55502d1756d7f50b78b58e20c70": "0x000000000000000000000000000000000cd07218db071b0b88f5979d57b52ad2b7706856f7be0021d30df75fc9ecfd2f64ce4f4b5eb5e648247f1796de1f52ccb6d6e763684ab786e21239f26af6d8d252703d07f2ac096e6b0b998fad5997c7c9b1e1f417603c350e76ad99e5c19aec04", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e967dd10b13066df77243fc7f5f476ee7c5fad9de673f1ccfdf59c3e92530c09d6d584ff19452c87c": "0x00000000000000000000000000000000047243fc7f5f476ee7c5fad9de673f1ccfdf59c3e92530c09d6d584ff19452c87c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e96f4aad0cdd32c3e8a6d7fd62a2ca5609d25c2574a275de76a6fc5322482aa0b0d29f0a8f8f83b53": "0x0000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e998cd9a07d23d28d50ef3cbba6eefa5127e662a1286c69c3f8cd10aa328d394df9e69919af449b45": "0x0000000000000000000000000000000004f4c6e1ea78fa82de3a28d27e20c93b4b8109fd93489d864a73fe7bd4eadf2061", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e99ad9accdb6256f3d8783497b4c06f05dfa6ca91a0502e77ea7ffbc5c33c7142a5d9d1f0322d783b": "0x0000000000000000000000000000000004740cfb483a7e7c4d04abc9fc3651beeaea5633eed75f65c0380d424312412357", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9a24c66abe29ea3716d5b643fdfb1b22d5dfd3a50157104df0580c910d2754987afc25fe0aaf5827": "0x0000000000000000000000000000000004c05795cea6af4d0bb72417772d60d0e8ca43f5790448fc92f764088b0d4f4b1a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9aea00c445f734edbaf3f15b9e83dcfc18b50fe91e601fdf446c008c72c3d17799c21a64877e8d3a": "0x000000000000000000000000000000000420f949b07ac91763cef16c15fb78d5370271add31799ab7ea2e940a89af4672b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9afb96de5bd6c558f6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a": "0x00000000000000000000000000000000a41a7938fede32e1275281b3eee5708706d88444a6dc898a4dec463f1eb298463fca2ecbecab066ed29eb6f04bc145a5fe6ee36cc0144f46a722862cf28dba2c6768ef8bec8b0e59e7c456392b9f560a48c0abc26faeb75715b1ec4a804f469f10d618111c1eb2afe48d95bf0501243748e399e23a538bad0db61fe474f4f2b90f14ededef8a62c8642099e5b094ef95519a5e2a1898ec9783c2bac2c71f71cd160cb5554f54c346c7996d2f6ad6c5bedcdc094b6ce0bb9a4afc7db6ae865cd378bc921beb233fc0c3ebb3f98676aad4aea89f81a08f57251e24e2c02f0dc0a901de89b93418a2be5e997eebd4b815754518fc3b7db32b2c31bf97c8297f8ff7528886a23f6aa185a4d262ade722584c6f1e384ce10b269bfb898abf8785cd934a92f63201ab158aa8283fe585a2bf19ceefb00c45eb7b9eb6063b2ee66a108532caa6c46edcc1d2a38bbfc4e200c3851762178268d7a3e565ab99728c18ae037654f79360caefa910ba4bc6e26760fbd44a07a9fd4244c6fc7f58b0ce620fe15c10448cf888bdc13a933c0d1d33653f83d3b34bd775038e0f5900c5363aafee013245a2e5ac185dedd4f63f9899990dc2d467a359dd573a7adf0817e06948451de62bfe4941f647a18c74850008608346ad2c9623378dc3b8856f4d9a17ccb17654ba6fba820d02b4f0def9908ed99ed988d415d9b7c272a1d9394fd670ea8950886a977a6d8063db1b9c58daf3906841f3e2577b07cee9595c5c7e98f7b3aa6612c7ad0576988c680601696eba2ec9b035e6f99fc5579637089d06a24d3ff650a057612349296f2777068dd47c499f36c5caa498c22b48f26c09b9498ade826fa6b7d31c38534c4c6dd648a247e5ed408172cd647084f554747823fe69304f43282272e3e8b07aa02117d8a80fee926dde3a9417a2809b971623dcad89445a3f9ef20ea6b98e87f656d7f23e0b2a310f45d6a6550a211e7df67540cd8b9c4b4aacf39cf23dd3530b4078b43141f0a0ce5c19549909b0ce4bc163984e045d9b652ad8cd53e45f24d5e7c2cacb60dfc3a4dc6260682150104828e62d3a0142c0082e8036bee650826ea445368d4643b0ad2341924bb357c8ee1596fd1235ecf32616bc1a5fbe6783b4c4fa8be371150435d5cace22115338b33a9966b4de2ef82df20bc9dd454ad586a9c7d259068e87412a8ea309a006e06857a04707041227017e437bd1edbcf02649eb8a4103c8668f5903ceffd5b2a4215c0d211affbe5f6cc20f540f6c1dc4dba60d21936788a5bc5628f26333e27b14cd091145d92d8f255055807b7c54a1143ebefe17d711170a5971227a8a8b593c769fdce803812028407201429e0f6beb3a79213b46c4f59f002ff4da66dbb0bfcb66cae1cc1a50749cbecddcf7044de2e7f8aff6dddd8660e28ef5214c59623dd37a62d950da795f70f955feb0ffd847cc972e17e979619e0bc0739673db8604848204bf61af00717afc36665eb89509814350a32bc136f095dc1c9224dac890c0112b5f4b53ac6c086f2422947fdbebd39a68f8708064bd5d9caab70d1d6a51abff895db91f56551244669ebe06bb78a7513e888ab43c70dd2f0c80e90189b02fbf62ecfdfdf66f54572de1db5ea15bc7731401c4fb92ba2ab3f7c387acdbbc2590a673bef4e2488ca5a28e878867689b757883005b39b269cc76cffb757bc672bd9cb1874cd505d2f17cc6203b5746b14c65b94077e29f02d0b1d56a0ba445458c2d7cf9d55a54e8e0a4bce889b5d71d9c9dbcd6687dfda6458cf22bca0a342f5db49d8258ca6a72f67d9caa91e4c5777b9edbb0f7297d7f294627685c9af7eab3563ef66ffc20", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9ba746407882e793d49fca4c127d246783d23e388e34c09446b624d2d5e1f7773c9590823d451019": "0x0000000000000000000000000000000004285f7ae7cc2580d54ec3be6fb7fa3ab6f2c1a32352c793b29163822091839e31", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9be10627200d7958fa65ad25c6a51ba28504fe803d9e3d542135924ba9fc0736cd3f1d9b83901778": "0x00000000000000000000000000000000048278ef29ec5edfc3f2694075448853b34a387e0299bcc326c41e9507a5f0ac2f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9cd04164b151c8211a903015b9ceaaf0f183eb409d3a38c4f0c9a685066ed90b32c834940c689e1c": "0x000000000000000000000000000000000444ed131039b1a6d98896aa12e996d928f7adb00a832fe5c11b719e7d4a4d9b0f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9cd0ac122701f28d7ec5e89c029a05224b2759566042a94c54966d125934a8ff8beb8e0b017cbd67": "0x0000000000000000000000000000000004e85558af1d02241a456725d7ae7370cd1a5299713a970a312c99d9b14d90debc", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9d20d76620b47fa66610405d8ddaba4dcfca1fe4d14f83496de1055fe97efca594f2813a82900e40": "0x000000000000000000000000000000000452acbe4b065282c5b36e7c1b552ccd1bae6039f9e2abc5fa4be566a8f5f10e45", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9d34cfa440b95864d3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a234": "0x0000000000000000000000000000000014d3247cacd091a8f95e795c76e84bc34db75ba76e13a79c1c4671f12f433ee83dd376b1daf289d513fd22426812d5a7c48a58dd121e4c043627e00fd216557873e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099e57259886f2db2014f3bcf26e8baa581816f49c13e010bff9f52d5d9ea3ae68ae573ce3c1ed2c09f46eef869e472f6fc1e1345949d22b585d2dab0198ed34727", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9d41368f1d880a3b3ef88f51188ea054ff03b902d8706c6d9b1ea56c119b34e0b88e915b5d02da5d": "0x0000000000000000000000000000000004f86ca83eaea9aace8ba08ee406a2ca470fb8d274a9fb496cac6e8797721c5977", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9dcc277753735b96e04ca25cf1cbc516ed1c138492a7f2e606f60c5a9ac96cb405eaa3914fd12973": "0x000000000000000000000000000000000884e7a9749fd2b23ce7f7b775dd0f3808d6cdab42ba064fb242afdf0283e60a20d6574db78e7c0315546032b1775930c40d4cca7562e9210cbde93344aad7aa54", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9dcee803646fe05ab0ef511fbed15d88d75933d12bb50b56d1bbed109380b2fe0c7ec72d44119152": "0x0000000000000000000000000000000008ac0c25ae153af1c54bd0eb9c02dbd01e3b462be18089e560a9cd19890dceac6e90255910ad0897e5c6746e33cf138d8f38a6b46b685d06da2802f83917827c04", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9dd0a74dfe9045f7184d701295be7bb38b2c0c58a35bf8edc592671c53d149d206e037dc7c9beb7b": "0x000000000000000000000000000000000c7a43965f93ab8e28323fe1c19ce8156b9d0a941e56661f2b172da1bf74a2de64163c64722e9d2ead4a7d5d88e4a3e565737094f0d4bdca0fc90d6870a8d1271e807a095defd81e409429e0f0036df659f3472f90e3b9376e669b71adb898702c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9e5b705cbdcc776ab4410d33f13c053dca87be657a0ae3cc87655baf43f7efdd454ff74e3a9d8a2f": "0x0000000000000000000000000000000004882b91920f9e4483d2910d72403ecc9522283079ff6770b58be852648e008d44", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9ed6094855a6dc83081c465a655cf27eaa73bdf9554abcb46ca2d56fe7fb0a20835c1a5ddec4a325": "0x0000000000000000000000000000000004051e046a4125b20b4a9df6a8d1d5f81f6155279dfaa2050c7970d4470b890e8b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9ef6562b57d1a60490c7f4e84347dc6e4e176f9156b2347378faa9b538a857b404cee3e341706305": "0x00000000000000000000000000000000082d2a9ef6dff17530bba04671deccf9754c7cdf0b079e0ac825a43c5c0e274620e50c1ab151d60148984c5494bdd23ddd7e5520a8b4873de12ca413a6f37bc3cd", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9f053c2746e722456610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38": "0x000000000000000000000000000000002c0daa7f988ac07541286ffd6ac83affa9d4f0e119c04eba5f1fb74e51719867c983b401968c58e31e421f96e07dd85ce91d985abbccc84bcea5e8f098d97fab563159dccdbf4c37ba277b4becdae7ef002bd7ab17d62fc7419dd68967e41a358b7b9a284d4e600ad4d23bcc2a12a3e52130d96586145ad8246bb3db4a7cb2e0f0e8f0c9814b8cfe6b4a46e4ee7f2b9fd93aa98485c646f07e973e57293a107059661242bc6a8ea761d8668371ad17f9d036982ffbc68af2c28ebcbf2d30ad16e1fdce688a422833948306f4aabf043af4be9fb2be40fc763787f30233b2510573dd2404caa71709d521271bcd64cb771df96abc1454c1bc2db5be8fd84f9f317dfdcd5afc6aaf6c47e499c5c21097386bf5eeda93a13448eb7b9ddc4fcd0e13a413dbe68838d76d77ca594e3e55c937ef7886fe2e8e46de8fe11f20cdf106b29cc09b9c71f2c39942154cf7749268d6978f82a55ab68d6a412c628b2ced7f9d3e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e9ffd1362c0ca2353c85cebb3f21b5e97737a7bbc14d8376a79dbba9c2849a28edae77c776d1e4a08": "0x0000000000000000000000000000000004ccba4ab664396955d9309b5ddad39f02b7cbbf76743a9e8969949c3e8a2f5ea4", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea062138be3539cdbd8876695e0680719107b9ccb595ad5d8bfdc4ccc8e8e4656091fcfe652c0f155": "0x000000000000000000000000000000000476ad7b338e915c739fa6055381d937bd4541d12ca755533161da8611aceca14f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea078de63f42f4d3d89abf449cfb7d9b862b775abe556bccbe647820fd4d7a50b63872b657c96506f": "0x00000000000000000000000000000000045883a7c739d00f1d125475cda89e7ceff0f406badf56a7c1270c16f850f62cd5", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea0b881b0063a363a02bf32e061073c44300056b416cd66a4fde1e6c120dbc0089bb65134f5693a3b": "0x00000000000000000000000000000000042eab66a1c3116f15f55dd2996db419e367106043a4c5491a5eeab1d33a17460b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea0c7bc8aeaa262f14ac4eaed36e5c54f045b46cb54f533b2d3949c0ca7137e89ef03ee3f56f8155f": "0x0000000000000000000000000000000010c0e9ec31daccb76e9baaa030b5780a85787b3f1e2ef54fa8f4b857c64552a4e0a28d12dd5c12e1bc0f85ba2935bff3b257089ef59869ad310056febaa579395996043b3a00f3e936328165ca3f780b594dc2ff0d9e72659a9e13ad74c3bdad4b8be18f3fe77e8807a0fc3201a7689f4742a12ff44622e1dc241d1a08088ab6ec", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea10e77c34a7d9ba5b8a2a7e1c5807c9b5241a00382d483537eeaac2fc756dfde564af6a368fbc275": "0x0000000000000000000000000000000004af5a44d6d0b15f2cf84afdea4c76b1321f84da230a61b0c73d755d9cf5171a6d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea11a320b9a8feb01f857311106c8d7b0daf6e096db9a0d759b52403e439ab23fd6559780a8b1c803": "0x00000000000000000000000000000000043a337becdfacffca71fe67fec208733754f035958d349d36b30225fd47798f6a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea17e7770b29efc26845498df40e85e2ba9d9e213d1f476e7b147aab6a9098f1bb250e00251ef8f5c": "0x000000000000000000000000000000000c2e05b8c395e198a2efa9bcdf3ac31424d984bb2b9a1cd6635a6e60c9b6a0097b28add2af7269292c685caa58101bae5d78297eff522e3f6b239fd4fff6b5213239083183c6b196c695c642c6e521ecf55a337cc2bd5df2df8fc6d6c0c7d49c7e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea20215acf2cee769a26f9a811e752199217945e52bb96fb08229d7904bc030f6df73b5b4e6bbdb6e": "0x0000000000000000000000000000000008645903e6212a6142af81631297af316fdd60dfe4f02cfefe20d20153e7945720ca66d6f03e32d64a1a0b23baf1da3ee469d7d63c69ca26ccf3b47752d1171d02", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea2aee766ebb6fb7c4edf81ba4fbeb6ea13cd45ba93cc1d689a6e2e5c6dfc35a458a971823a324218": "0x0000000000000000000000000000000004aa580379e5714c790f17e4af93773d158e30eb08f5a4d24abe4f535776b5721e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea35b58e91836d05e60c6e940d5c74596755e6bb1b31ec98958db10d841dfaf66954b5542c95c462b": "0x0000000000000000000000000000000004a46e73069e5a05c232b0487e1523e7a426270e43445d0dbc1744222fd4f6881c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea3833fe87343f3df36b5dcb29928d8a462f493e0250e895158fc4fc54eb5d00a2a6701fe36a4283d": "0x0000000000000000000000000000000008e79c699eb894e1a203b2c6deeaad557fd51fa352841d2d178d3bf78aa0bb1172dab0125fdf270b1af39164693d9bb3251d63b78742a99693632359e0dc6c4882", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea3a4e6df5615cbd134a3f0845fecdf74f7aeb569953da8cf8f8217a9a167a4e7d6b3438d8bb6d828": "0x00000000000000000000000000000000084194458149444dc0e0ae7addb00b669d89f3979309ef9eb635f148c2b879e8784e3d6c92a32e9ec43fd78e7d7b967fa28ed347d96028d73f37113300cfa565e5", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea409a5b38e9a0943eceb07c477bd40d22f83b08cce78f2375bc1e4cf188c0de1ffef592570383e59": "0x0000000000000000000000000000000004ac2fb3fedf57f058e0c786f94c46f57eb68ad57982f0b96f56d5d438119ebf37", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea443701cf93179113acdfb6cd734dd3e624b6512e0903724c1c90a516c03c81a9af756491ea8e15e": "0x000000000000000000000000000000000424102b17c177cf80ebd64796a17ea2c44b68aca3a03fc35be96f6d3ffc60716d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea46019660a76ac1f5889dcc187231dbcba0bc0dad136d1ecb09633bc7cd5e27e04daa0277009ff2f": "0x0000000000000000000000000000000004e6a1e58c3cb43cd4bc65bc251f9c7a1a3de5bc3f815a643d658c8c018158aa01", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea461cd7dfddc684c664b2886e95f12e168b420f06b90c11d8cdfa7ee747bc12e235a6d5efbae6e12": "0x000000000000000000000000000000000416cec430366d2ba6b46f6b084f62ec4f76967ec6fc65101e6de60c92d2751977", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea4ddec1e6dbcf011629c17f4f4a24ec53f85a7beb1c70b13379fb8e4f969560704d2c25133ba8d24": "0x000000000000000000000000000000000c468a99f3bf7d3a5ec5cd3932ffbb436ecd78a9c635286d544661acd5f9f8de15d4fda909c31173d9691cf6c488ffe22b46c795d0bc95aa062bcf08f414c4655a669bfe047c0962dc3ba330b1fb1a83c5cb5262c964fda49b61e9f98a8c759c4f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea59acabf7cc5c2db3a0b67c6e4b35133a18ff9c3b56d6cd28662f9e47f38afbfc508543087966870": "0x0000000000000000000000000000000004cacacf100cec1782c4f9342566de5b4132a012335481dc83fb4d42bcdfcca853", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea5db7a2686e7ec402cbac2d6ac81d2169fa6e455b0497cf0389bd5dd2a11b24a53e6d94053765a77": "0x00000000000000000000000000000000042cbc13e6be77e7af272d495780c1b51130e27e41e95d8d651733b53630b3900e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea60dad8905663a8126acb4e6372fd11f9cf419b845964385848977d6e37b6221ea9d69d58d27d623": "0x000000000000000000000000000000000826acb4e6372fd11f9cf419b845964385848977d6e37b6221ea9d69d58d27d62326acb4e6372fd11f9cf419b845964385848977d6e37b6221ea9d69d58d27d623", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea64992f36040c17f4866f45ae7b07019c03464e3c8c1324e96d3f05a2c5205e889fe597b0af2a70c": "0x00000000000000000000000000000000082add23627ef63d51a47ec9d5f0fa0d06fc3dbfb0e84183b90a13f072cf735300769bde86b6f4610d3b75a775d3cc411da01222b117e84073f9fb18e5a89de715", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea64c3dcbca109f3eac1d2d82c4a69b16c3ce9eb5d0b6f34f948a34efe62488879a514bbc837e0e50": "0x0000000000000000000000000000000004502d8f8870937f44fb43dbda57dea5b07eead72982b0712bd52a5e033be3b031", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea708d9865081ec8abe4bc35b26cdc006c69c1f827d4bfa75e4bfd4ac0094ceaeec8ac70469cac51f": "0x000000000000000000000000000000000462ef7ddde3d6fa33e5b617265ea9af26a64e1248c80b7ac1cf2df7b171889b6e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea88877471b8c0203f6944b2b5f590f132203e5dd4f04c56e594f43b5681a48b210899382c3880b4e": "0x000000000000000000000000000000000482f53c176ea7abea9092ab9b7ccb5506dd3c81de6fe0a5d2b29068f53dd3706c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea93c6e207f351cebc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d6": "0x000000000000000000000000000000001831918cb9b9c9414a2cd4dd7f720cb98fe98cf852636fc4860845767989127e7d6621dd4e5cdd0ba737c572710c13df35b316d39ecd12c1ae1320bd6db069a07adc0ac1271ef05bf490a482a38512b68548cc3c244285635c32ed242b33d79dd2b18c6f19f15297b4a80fb9f6f29a37e06bc31c723be672d54b45ed42feba74c0ebeb68d26988495f05130309042532d32304be1b171fba3f5f2ac94ef7d33dcd1907bcf63ee4c58723b0457cc8207bbb53841e33ce3d2876f8cef269c5d4d3af", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eaa66c809e7c7caee244a202cd6b29e2026b65a07c3fb32422138a122e581a627e35791da331bc905": "0x00000000000000000000000000000000049083308a14f56003ddeeadcf3e12c5f3685f05393380a47adc6be23c88d8b40a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eaa92eeacb2f4017c0a409ce1eed912358015a8139383b02292284b392bf23ef9eb89c7f31ed7e10b": "0x00000000000000000000000000000000043c667aac50304fdae4ba9932ebe5628ff1e133986bb2e1ce686f28c6a5d4ac27", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eaa96f99f2185e3646069548e7913a106991a40988bd63d25996d6788f9302ef0a86ec40b4e6bd36f": "0x00000000000000000000000000000000044ed4af096401134ae34367a42cf8bb5da1d3c878fe08b512baf5e9a4f7e9bf43", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eaaa3cef8c09f417f2a807fc9b3748a0d6b964bff11360e00040fb5fc569a9595532f935286a45f47": "0x00000000000000000000000000000000047cca5de8c58ec8fd1a269c3e51acf6ad45a8b9b32e4a65a4d4c481c5c449d826", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eaaff4d5a3b6c0d71aa7880fe9ca2bbf331fc13e40525dcb0da661f143df506fed76d8ada3db8f551": "0x000000000000000000000000000000000c5ad7885e61fefa8373066bbb08ffe85c08ecd11bafb3a9f85af75a4eabffaeae3f25ee912fc878195d9904d4474bf1ffa58d1570bdc39af3f8fdd88829b15655a01f4cca8129d5e282faedcd6547e6676e91c46067489a28711f89da641b1737", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eab7e3e98c718729f7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a": "0x000000000000000000000000000000001c8ff2fd995727bb6c776dce0c1e127955c1f191db6aff56c434a6738fc83d4eb8ae47a2ee72d479b5ae8c2237b156a6c584d82884c37be50958ea32c1aaef7832d8151ecb8e8d11e6c6bd81ae49216b9ef92d2b83b3ae39702a397922f14777680aed675c9de132c2b598f6fe8d256c8057b2d2cd28b2ae3fe6fad5475b407324bcbb3c28aa69648bcb3eb9b493c06256abecc144fca20c90144dc4dc920bff767cf5689832c7f3a596de7cf58e6d764884c33fa5bcadc7038e65e9361108b10fb2f9413214ee983786be59b316ce9fe3848ca7cf5cb20f109b3e31d09f213274", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eac3727c0a32917e62c5bca9fd4c92b051e35c47617175d8f28aba000ccf921cb24bdf555662f2d41": "0x00000000000000000000000000000000104662cd48d69f8c1441434bc2c80a825ded8eb41d2c360f6ced694798678af7ab3cdf73c789cb02811fadd2fc2fad69647e6a22e18ff3b20c03cb9ed07ca0e69e3ab6cfff71e91eea05d195a10fc0a03a78667a6ee5a915fcfbb25e90bc258f088bfca4af1ecfc9a8af84f239f3f3198d12a666452d0658069c451723e7d922a8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eac6f1c6373257f1a4284fa7c290fb6052b9437610cfb2e19b3b37081fc72140e444d5b57ca01924d": "0x0000000000000000000000000000000008e6f485794ef2701691b1508c90cb2d3bbf6186bff0716c43915936439e0645a9c0ffc934cf4bfe0fd0cbb0153cc1f8c1f784ae59bc53da0e1833056c63b157a2", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ead35c1615f01572956d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e": "0x00000000000000000000000000000000544ad16debf0db0329b8fa6806c88a774c6d4873579225919e24c856728b575d4de62e1df098a40f24df7e2359de24775b28736ded030da69a7ec3c809b10b6e5c66f3189c8351e824c55ea40817590b776431599273c4bd4c853b255e8cfb1b100071d7ea9d85cf0a22365cd41cca3f63121fbef0e1eea72109db9b12af8d4860649bd677aa43958fdeedca2f9159ce5de8d5a278c08e73c4ab9a713a24d0d47f1240c5bddabe0326741d3653bff06d6fcac311846cede93f8aa44a86a971924f42d7c710711e3f6a4d282c46bdc093a1796b6878a45c805827b838756ef78e18ceda44cb74eae64cceb6393fea849c84b6e7c0c00278b6339b14f882fabae15f1cc49a4b3adb82193695b2dc7507d28e72567060373e1e82206a0430005b694af02cd6695698754c7d8a82ef80e87a7c753c95c028557d15c393b9955fe74151048bc4da5e4289eeb52244056c70c535f165d37ad921c08b9d00466a1fbfe442589d797b259ba12d5f74d118a2f63fdd5b519b69003821b9da81614225776a2a9801988b622814386aa36c7aeb697cc35596ede2bcc7e3c7f7c83d99192c611e046511c11fc56b5492bf9fdb92b3ecf551ebb98b73241db611b2a44decbeb85618b8c0db8e0d79d681abc2cde9bcdf73e8b84b9e893952d5528d849a465f9a25c234c72214c38e8cb025a2b0995370d26b4113bec935efcedeca89dd30d21275ce384d806d03a4618c1365850015bacaab7b19a86849f627743dc2b1b6c90573ac5912fc44a3f886271bf2e8f0dd2d5f102f7bc313f1009b771526114fdc2d70007b26343e6ebaed9459ffaae9358c5b2460902c2a0d63d68a748e1d8eb1503364c23bf3c5f9b5c2b83e9bf6722b1a6c15671dd610c63009b0f67d4daa521b4d049590cf81393b2630cb72573fff37feee32bc143021d79faf80abf0356d5450", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eadb4fe3a15170520a6659e4c3f22c2aa97d54a36e31ab57a617af62bd43ec62ed570771492069270": "0x00000000000000000000000000000000048c21fb36ae0d9d838e3e635f7d867a4eb44fcedbfc8f3d03f22f342f2a64b38a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eaeb7ceb911a5fe458c2f8f1570391214b89f82df1e2e0c12f9e2e814cc8e38b3d8baf3692724a311": "0x0000000000000000000000000000000004c2b69f99b0ddfb88c8fa9df62c4865ca4e69515a21c16bde93c726b1e678a156", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eafa63c93073adc978e06bfc989509d6d625c085209adb405867bdbe4f167ded7e61ec126c683165d": "0x000000000000000000000000000000000850d1a6eb9d16f107a16aedb586c8d08259b212a3c54563f183dae7e1964d931e600456bf4a3edc3d8ce8fc483ea6b102c620264661f24c3f33b4b41ca8e54450", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eafab87883b2986dc6ee5ad3ea0da40510f11f42c3281fd543f5a6bfad54ebef7381a7320bb509a0d": "0x0000000000000000000000000000000008524c4404c14e7fbda3e893815a3eca9a05f453ff0f73212319201a2f46d5382a06bd7c7a1535c6be092a798d558a5757ce89567f7cd939fe203163a8c4264e6a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eafdded1663a63773142eba87db082b693b5f35e88d7a70409b0ddb61d430abf218884d4467af1024": "0x000000000000000000000000000000000497d5a706146081fdd5ce77ad4ee232f351c4bbbce94596c12d300efae588ce9e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb0c27f90ac9d10a58adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48": "0x000000000000000000000000000000004840e877da5560adb4bb476e067659f4446675875a5e49cac2d3a4ad207adf450a346c4cf9a3d4e2bbeeb47694406ec7bb64e9c25e695f5a9051cb8119ca8e216d0ede8b484ae583e43b011ee69f561cc3d145aa542269304d76b034ec0df99f3f3e94cee09a8718b5957b697f388b7300815ae76c15d0ca5c0b0cefc84d5a7d4b980e50eb048a8102b537fad10ac389068a37e29e93ed6cdb700ee571eb98811626e1393aaa4e42b5d40f234eeeff068825d5cc50a3802e8e2e488694527b5e7cc0c6960f5ed4ae55f47327fec246d858b57f0d4baafbb54920e0bd47e1dd721e58a72e119fd6922255ddcb1b3f89bab2286d43b9bb3f5b3fd1d3df6a6fb727676cd55c3ecbc354fceb81b0ac3ae860ef4a3794e1aa9e31477de7c2cd36ccf11d9a3bd9c292ba18b98cdfeddc8e45fc0a4eb962baa86c5d839ff3e433de19944ad8900a50ea497ab51afd5227503f91b03a91584b72146c2e485d149cf67f543f8e2ca3235e29d530a16e44fdc3a6ce04c42aaff4ed9b7c275bb9ced877bde9790033f9ee5f550181bf234c12c2e07ef74652d9323c13ab31ea9c2b053eac74580036d9a09a0a63e987a6c67a59b52f9eedf6215852cdb4fd034ec99475a17f1e0208bf1b4851b0e3013141e274ea24d6a498412f2703e598e87b7fbdfbc2a72d1015f23420ba4e90023e3df81d423db7fe2b2691657d45e98f02816e5a832b10a872a2b4f736ef9a7242e0a0d8e64d616ed4c2da9a103707e9ac7807a764292f86434ea1ed238bc9c3106178b9371fda26e3d4333adc04513d188844a789c844", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb0f0b3ac307cd751749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b757": "0x00000000000000000000000000000000187c7c8105064a32c52de4d09d9b9dc358756f37ccae41c1ae71178ce302ff5374b2f0176465f8cf99c213696538dac784ba8c59e4f577c6fa88555bb5f28ecd35f69f5924c239023e8555b80a7323494f03c76357fac283664c131a90d13bf9719a7994a63250d77c7cf6ea9f364f136dfd163cf4ee30d1fbf5de6808e443f25cc8ceb3b9d38e7a25f5016eba5e885ade09042c214623524d78c73f6ce9bcf95fbc97eeb4ec96658e0ec1d15b07524376ed7e1444bd35f3c4fc21526176f4c979", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb0fe6b98334d7d6cc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed8054": "0x0000000000000000000000000000000040668103daef522e6916064ee8e27db33ab950e2d4f065276f7c9d86efbdab3b7d0cbb4adb01af79c560636910430458ac44cf5fb9e24482279191e6ad8aa33148bcc2112d8a9de4645c4ff651aa6efa2f301c9d6a2355f1bf0e6a80826f50016e72f10843313abdcc3fe2ab623e213c561d68539db6f9b47f72a41f2946c7fc45b64bfb076e6685695cbb09316f448529f41964fbbc9520059a0aeed64d63761bfe0dcc8db8a90eed611a4510a8131240174ca310a563a343fdac7fc1060b0b04166a40c58fac1476b58784d0ed59ae59fc516a4b072ba8daeda31d638a53023a5e5167d2749eb21e8d257aca0e738ebdf309e9e0ef503e1184463de7db3d0b28ec194255613dc072122c8330dc7c18e15b12e5eb3093a442224e91e50cba7d3dc68dc89f99b0b46b9e3a10f9b115283e27b7f6fd591a9f6cf53fbaf1b1a4685f90f218ede5ef0e08fcde53a9913c8c01d7cc28d31d21d89071b6a8d9262d8376deaefd68c861d01a4472a1c518bdacd7f99b6c4a0b64ba32d74995a21405797a4caba24b45e5bb6eda6ae45de9e1fd6aa64fb43bd9086694c4935d21872a5502866f40b96e6ca6405ed0c44747726b3972ca4773aac5273dcc25ffbb5003b07536a8ff1b35d2750c1d8482b5f8290d835f5e497bcb9ebf11928d9de622fc30532c21eb7992f79d2d844f3006382236000c2b1eeb4c8985c6ed6db26734ec2e70", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb19b71d671b6baa2aad8e905d4c09ac501fc3f74833019107288077bdaa77291588b5e021330657c": "0x0000000000000000000000000000000004fc2dda4a648f70d73746458b1109134bbda7b43b46ab3546d310823e36966d76", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb2f651117e3fd34c84bda1949a2b78bfc3b12dcc8f2c8e8822912efe0c693a23effaf7f3b54e9a5c": "0x00000000000000000000000000000000049257672efbce6327e97783808a8feb2ef8dfa71bdff401f06700337dae17a253", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb30a0d7012b77142a86620314a174486a9938856e3b939de3bcd73458780f542388be0cd66379e28": "0x00000000000000000000000000000000049fb287e33d2e6433438c3584150a857912afdca0c065f86275b53fe95d3f8192", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb357e4ead78873ac2aa53f55efa82a9820f3c2569d4e52dc467475a1a11cfc9861ce5440316edb7a": "0x000000000000000000000000000000000c3789e73dd3cb036f57dda3ed96e000aa87721b8e19205610d2625e3847f1a06bba7e6ae859516ab7792519d1ccc7781409bc58e534f54f4edd0981118d53405a30ed0348562c1ed74187bf91ab00d4f734ce2505a6d6f5d189ca1f8dc966e665", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb4736827e2622569824651190f1d20237fea2d5953bb53ec59df25d581e54f291d6978c9a8017741": "0x0000000000000000000000000000000004f4ecfa7baadacf1a3aa65baba89f28312db782c43e750e677dc40fca086f7b01", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb48b1b8f79a7433f88b9f3a722747e8f637b2583963ea7f1215adc8c75c3957554fdf92fcbfa5034": "0x00000000000000000000000000000000048c6211892518630b6e583e09dd395211035a508358a80322614f9894bdceb605", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb5421b6506f7f790ac59122f8bc8c527a8efde87156403558ea66ca0ef049cf3fa4f671f98517d61": "0x000000000000000000000000000000000436ea3b4376625f8f5ac0cf7b48b7a186f96bc215f34976f9eb692eadb46ce29a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb5c8f247935e6ce99e0bb283b2d2522a090d71d9c8fb484c7966d3e28b21bc513419ef7f70d6a563": "0x0000000000000000000000000000000004da466dea606e6a603356cbfece746254c6585b90647714222fb59e42ce45c601", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb5cbc9967f19afa3e295650fdd71d7046633b1fafd0881a3207719c573f17725fccddf854a8b5628": "0x000000000000000000000000000000000458b16e3eabd2cb50029bde70c7a7ec0123d1e710bbf45322f50be3f21ebf8747", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb5dece0984444d31a0c077265fa8ebb05329c968fe13efc415460cc5c379fb392a652ac07c9c2f7d": "0x0000000000000000000000000000000004cc710cc1444b51d4cb4d22fc47a446df6d8371a8831a515040a52d7cea1fe70d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb62acaa32f7e218efcc5b90bc1891b7d905423f7a00ffb4e8f3d59aa97491b5a1d45b82548639936": "0x0000000000000000000000000000000004d85148f0fd5fe1eae1bcafc4f9d970f692415245ce7bb7988bbd76b8dffdf02d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb67386b3a2bca62fa6805c6dc7757cea227e11839257d4e24ad39520621e99e6016ee0e1907c3315": "0x0000000000000000000000000000000004663b801c02f2b76565f5b60d817e7dd805babdc276b53d20e19cebd199c88555", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb6cfd687de7a23b4d60cf655685824e9966b0a10c01dc8b17b37e24944fdd760e4dd73ff1dd4ac14": "0x00000000000000000000000000000000089801bdf93fc1d4b0186e1295d517b03a5749b90c94a5468d74331a6ff529a953a830e5f0091c9f1c5da8a2a9a1a7a0de5802c6bdd3d9e23175d8c116ef226251", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb76acca59a92ef07ce072084c159fb3547381b718ac1660d14030e7bcbe9db68eef0f7c0e340f33b": "0x0000000000000000000000000000000004a620a613e0049a85c71fab0328f7449b0a9963195eab763760e1ff50a10d4404", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb82ca38b993a4d8b5a7aaed28c23b0b10d2fc6a0a914c93ce965749d67d7f657facb010255e4852e": "0x0000000000000000000000000000000004009ea4dab5c62d5da4b72e17b5ee5932a3098fa728b996bc7ed07f112702d32f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb8ed6b693822d4a77825b33ec8baf2d437c19856a6ce74f09bbf49c284602a18ecc0683874dd596e": "0x000000000000000000000000000000000876b2a1db526de647dd7aeeebd328bc037be6795e79e7235a23f74198387be12aeabaedff8f91f5afd170b1c8252522e76584565bda69f49ca2e223fdec4b5529", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb9206afde78e38223a154cb2e55ed80b9b671b240ccf20a8e2a47a7097a61f156eaebdc98fe4780a": "0x0000000000000000000000000000000004403c772cc5a0320a23db863c40b5780a9390665df1e3b4255f32df1a0afc396e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb9f65131235fe195ce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d68": "0x00000000000000000000000000000000f0720436c87f73ebfaadd5ff7748bac986ab74277d57e5b946066d922884a5d80dc88752d6f18f0d5c804929cb727ce8999603dae997b121267ed59d5bb229af3b1ac5cc7855b95a4ea69568546a9e38214f4b6dc5de6cf1351649afd6b0bc800b106b2d295a9a3de6efade304e1efcd123cc66ec27ec92a075964ecac7229f54b26eb2cbbeb40e98cf9d5f39918fe54290600520ccfc9e519efb5779ddf48225f803f3ff57158c1e5483e88d4dd5d04f7f8ca3c5203c6ac29344f314099f96a314ab3e893de103d05f3e6e5f210faf6fb40fddb03be173eb3723cb33a074faf34feb86644e89b8c9daf871b44f7111264cc15bfd8efa38a255124412b9bcc58699e98a7c353052e4ff27d50ee1dea0f7379ccdbdaad823c457b755413243e967fa28ef91b1509ab5a2d494b230780761fb5e5ea00e01f7ce4296907b8b97f4c1e6e5bea81107431deda89d3b05e7e1656354c48d0a5cb767851726ed359371f7d70cfc338f687e55d944e8e6867f90a05085cfb5e15e2f0d5315ca27026d0aa5d6cd8d0f1e2161523b73cdde28b857e8d4c281ee0825d88c3658675561a2bda1d04961a29fdfab26086e085f26198e4839826299adf5158e0de4d266528642b5a22b6c1ab9ef945b7279a730423cf50ca4e25feeefd4953abdc0fc8caa403f70e8219020203f8d92b4c8ae0dc2a5a9c7c5641486ac27a4b591d3560b434650658386d313e669622ba62d89b48b2d4e7be50308ca20ec56fdb89ca5844952b3953a4242b97bcc4600c1de9c6f1a6ddb74b69d9521127a377d2717f6d9fed5ddf4ed47e15ef535a26d9ee0e3199ea99baf7cae9d94a05581316885d0b21549ddd4ecaad545c5c3d4c99b7866e2bcf2483dd7cc7cf578886586663aa25a96bc64205063e0fa2cd4f4b448d507f9d5b2ea8c85e8947a93d92d214be8f4b752807886e02a6ed2142a394d0f42a51281478530276f88d15657aa277b62c54bd1576f322ba91845c6ce9f14ebbb24f008964bd395a2c1f92149810d6f6133a905706000ec282b526ff533bee49db3c9c7ecba02b951f63f8442cc33443a78679d5246829fedd35f51de7e439bf432926351c41500f30fe78941f325c69dbb642f35095479c4151f0860839590586185a1dd97ef4f3fa86a6c0ad4eeb24addd8bca2aa758f60f07a15346b938937e245a9bc5f757c0a516b249d11c40ba8b0742109d573d148152531de95b53fa605b79b786c7f16397d3226ccc2f0beae85e2d7377093726053f965308328e14c097fbfc2b09b6b97256bd6a14ca1459ff9c1e8dec3556f8df53c69120d27f523d11d1704a4dba9448aee78ea4f1481cee14fa15124511a61366bf4c8e9f8fa63bdf70263753a1d34a66a616dca43b48c9f99d2c641c7e20912c81e6895f7b27bb4be5f6cb4750a326d3deeaba95ccce9a6bf6d1b9fd29661712f60a13d05e0c478d73f3a2dea9766c5d4b54a84895ed8b7f6a3f9506146c4d3e81cd1909e980648a1d2b7820cc93eafdf0151002f481c0b874502db473e45d4839be5ec40b585c1f08ac284e656075327d7038aaf795d35789ab10f15a5e26900b9067da461527acdd9856b0934eef5f0c099a2acdce01b51f02be2351c24dc5f34db1ba52471ff7e38158a4dcc3a19b6137b8e6023b72f889cacfe535240246fc1579b9f65b2c83cfa020ea61e54330741399b8acbc8b7215b8dbcf425e0a33a0fede6d4995303cad923ea9cb39de708069630184e76f3c276b76c772bca1d58132476c8e285668c7c1505e248d79821cc2244724f026d438a27d470ffc8d39aafef0cd3cc978a3b1354b65853a12b9f4ee0a55af14311a4de76b7b169061deeb89b61291cb59efc126c4add37ce655a7954f8e2b246fdad18c07d358fa0f5c211f7844143928941e88780961c972b189e6269ca6e0ad98fdae5c994d461021bfbc5b35676c92f37d8cc0205b39ca70fe448ddf0fdcf203e2b4ac4d070c2fb774bdca7e1b4627e9af2a9a66a0b67e7164af0fa26f20781e4b5fa2dc42489553ecd89d7eda44e51d14dd217fcd4e8f183036ebc916ebb32844bffa991574a0fe5948a9e16263adeced4ac5592a4e15ec77d223be684d9229ab3659fc702c34b3c3d2a9e4c126b3e6152b8ceeeb75c43d7530aa56ca6f41de5a5e76a2708e21a74a8d65c99c228e22e79b3e016bab0eb656a5235af8132c2a9a818c7a2cb43e9512a0b56f6e9080b36543163cd843c3816854a331c48cb107c63ee42f210cfd5ba5a03ebfcf979f3bb7d68fd694bfc64d37bf04ca7b2e87d4e38827f94c86b81e36ea46dc1b355c79bf38968367ed63d58e7b61e9aa5c97fb6fd94dcc3a8ccd612df568bb9b459480879224e360d0d8c3caf9365f1fe7d54b458b010b5084c45682961f27cba9bc64fceecf20016338daf42fef5cac7fd229d7727db1685c7c97a0165263b9287982692ec2845cdf8ea293108d3cf51f598b6e98da1f7d2cc63957be519774cb72783eef49a4a1dd53905dbf49a4a6f180a957e05630211ac452bda8e177f52bae23195e506bee27b7007bfbeda4f2010fa6220e029940b89b1a8c5532845c171dcfc78c4bd5c42c634e7d6548d6646c83fdc25bd4737b5a3b1634ed187e0ff740fa52e33f2748d0e88a19cec4e5c185cb00408a89b60578054da56ab2c696de80350f00924db18c896c3b9d66c26750628082750b332c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eba594f7276ff200c4e531ab22f712634089201978511b49aa987322314dcd8f16fa241f0055e3737": "0x00000000000000000000000000000000042c1800d8039258f2722009625f77a8203729e8770d6ea72358f165350233ec25", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eba6839973e6e9ad1e2a0a933d2b1e2dfd0c06baf42557bf4aa2ad84866859e6c869733d6baadf152": "0x00000000000000000000000000000000043eeebded302e53d488d9b063922447cf63e7638e60abdce4259c72dec9126a35", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebadc22310930427ba763de880dfe6c4bbdad18fab60e27002f648c221df5248b7d44a575b4bc7342": "0x0000000000000000000000000000000008b5adad0de4385f3ad6516e39fd6479b85c22886cb0cb9fd91ce52919fec98bbe6d192ca910ffc54858d1b7f553cae619803b55c69af50ee3bb1846f1715e6db6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebbdd44aa00ffeb9790174218ad9d5531fc97c3b347e073d347d157cc40a470ad89b75604b0d9dc33": "0x00000000000000000000000000000000048056875c26b0b99303e102f56af5b7cd6494578bfaf7eebc0f251a93a98c0710", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebca4e93e46a1ee7a83c75b56557a84fe8261cadc0c308577b0709cdc54311afc5ec8d348b939f589": "0x00000000000000000000000000000000104e8c56b618a0c3750e9f005d58590bbd6b088c326a1fdb075294a8565b4192e8eaa9db4e448cc0b93c4cc1d5059f9bb7e017c51964e21916f2106cf56b702f646d3ffc8efc1d719ddf99d29c8a1b285ff855969c4fff0668f9985a6b41c4b49992b53a95c31152cb0d95a968db4dc8e14cb7f4495f4b3215db38d0fb6b8a8287", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebce3132e4ef55facd425daddf60b2545e07c695d32d6bea2b9343f1528052b4edd1a777e93058565": "0x000000000000000000000000000000000464aa224ccde37501e8661ac74a75eb9c2a6793b13e40828860deae744d806346", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebe092d7e5aeb9a7802948b18cd5001e68a33499343bd8ed974fc8398bbfdc3dfafbc7c478544f67d": "0x00000000000000000000000000000000045c899bdf0bebcb57f0f68da86b80f8840407e7388ee52cbbc1a60f18a7a2eb58", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebe3990dcba28e51a80dea82a6a4704d208bd43d1ea1d5a0bd97a9d20c5237beb348be8c82f37d93c": "0x0000000000000000000000000000000004eea34392724db7a397808df783a7fe52ae6436bd9c2d86af32abe8dd81f43c33", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebe3a70de3dc8981a02098b5f718885f0d6f0f18359a7d16b44c9229857934efe66daf4d9f0eb7a43": "0x0000000000000000000000000000000004ee9862cf3f7401d7c82461127102626135ac670ea079780708e1ad2c537d9c2b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebe6eb4fcd98b5e48225f2459239641fc50300041f8980fa044cb07705db61fefb340804172b1c25d": "0x00000000000000000000000000000000041884855fe5ccb84c814252cb959d599ee9f90de9d3b7c65058b75c39f21b2802", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebe87f9c4b210b250122ff96f07bd9c9b3961c4387d71362315d05addda58f1dcce642888a643f930": "0x0000000000000000000000000000000004bb3daa994e809e4484afce1c63b8737a9adb8a91ccb78d7002386a087b382de7", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebef054a6e8d99eba983c5a0d1f1e697c1a0f9798bc25543603751b41102d41c3b0e23cbc6e3fdc0b": "0x000000000000000000000000000000000c5edf939d9f238bce8f74fdb215d853697a5a515b0f8b3a9a9d64390265f2cad9ec46a834c9d9bad9de24c9d4c6c85d4f942e2c52134f408e7fef2381bcdf2dc2941acddb878c9380546d8e08a2c94431dd6943d8c238428364d4eaf95218075e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebf8e0379b44b6804dcf2917d37c64e3d60416e47b5185b4d6c3965ca531ecbe29e1d2cf759f5f871": "0x00000000000000000000000000000000041adfba8c2b21414451ce19bd06d2e9ab7541214eb3285ae73da678a755432237", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ebfd1adb8160d3d9cec8c97edfab0a07c37625d53be2075b8ea64a00ca71d80cffe94edb44d215e00": "0x0000000000000000000000000000000004f67e4658ee318d7985399480025fa332958346cd623a025948cae8a7db36a81a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec0e968a177335220aa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d": "0x0000000000000000000000000000000014c8c3dee0510e7e05a5ac3e8ab4e13befdeb0366408b0c47c5a41c887d7dfdd58206c097fd6569064a918b1fe42c9a302ee3762daa035b0c44eb771d6c34d1d08b4f54529b00e5295e6efaacfad2de17a22cfe1466f2ef142caf1328b5a701005e2c726e24b6fd7c2bf7bd253448f03cbe350cd0e36bcd621a82fd2732bf9c2069ac3a89771d2fc8c62e9d37bc6548f67306caeeb4ba49e7aef7c09b68a260665", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec11b1c3f82b75014e4d733aa6e16d24e220efa69687f6ff198317062ab5ee12a059d47b732c27624": "0x000000000000000000000000000000000428e3a8ec56f21d20789923fc326898987dbae48643c059d5ba9a8afe843a6f45", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec2531fceab22368da26c51051a9031ebcc5ae2a4eb9a72e444a5bff59b995ce4612ed8cabe8a2a70": "0x000000000000000000000000000000000472020fdf0cdf3cd952082b52fd11ac0df4cb360850efbe0d096126efeefbb6ca", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec3125cbfe931ee052c08cfa5b2dbfcf6850a3b836596d82a9ed7d2d743b42aa5c69798b502b29b57": "0x00000000000000000000000000000000044b514120fe1efd6da4118dab0e2b1fa66ff2eeaab54af205b2ec6c506b52fb76", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec39daa94631294ae14ce4e09b999c54351c75b74d0bafdd17d86d98b6aab5176b9068e1be13e096f": "0x000000000000000000000000000000000c55a7b1fbf19d76a12b4cefc4009405905cbea3fc16452627e6a01ff866e9b6f1bd19630ce7a6e94431c5f771e66232e46a034f3cd18006febacf02baad8311323ac5201c3a4b0b032e701e34988ca6a06831b69aadaf9a388dbd33d85ac85f6d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec3f2c1579fa4e27478baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07": "0x0000000000000000000000000000000020003afd6023b1888ca027ee106726fced92608aa111486ac2b82717744009ea04deea74425ab90f984007c4324ff21437aaacd212a1a5f349d31f03f735cce907d8ccc709448e61b19bc01bbe3be7d7e74c2303883ac6d06c19393f9c1140840f24177bf6f8ef353988a83494a9fd6a8ed1f89ce97daba4d8448c48035b646960a849df65d3f404d80ceae8a840ec60cdfef83ae70df3a6d681870c87d5a78f3110a89404fc6e546945ce58e433c4e88a17167caf4e763793cd3b048e4b0b594010a89401749948f217611353ab25e1789474699fc06ed1dbbcf44b7035f488759a7f00455c8ddda3532450ad2eae9a5405522b11b320e52851ac6fd870b12d12", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec46ba4a0042e414d9ee1fa0d8d4e022ed5680b5925d19718a7ecc9f8f2ff77de54f0822978d27755": "0x0000000000000000000000000000000010ca0ed2d57f858e89592c76cad4ac00258041aaccb971171ea43b6fc39a4c4c1ac34542e51274a1c23c1293574ed5da6a1c28d092ae4362cec0eca403c02244d040d1c7929a103e88681731f954862765bb66d96c36e22f82a35fe75cf7a72c205a3116fd94d5f079378c4b1f2066ff567078ae68d97100fa408185a98ee92fb2", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec4b6532d1c37b711aa18b3cf52cb27fd19d5b80fe7982ff955e0d5124dae26ac360056f401dad846": "0x000000000000000000000000000000000ca6ef8a1f259f84d8e435d119d7c0b8f4d91c7ef95bef739c81ff66a2cad2cc45cc2797a71c48e7e7f6defcf2dfe8c379a521c8500c9bbfbc13c8513cd5cdfa3bb06e4c7fa18e7887887e5b7424e8e2131e2a244163d4a70829f311a571d57c2e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec560adb2f53e7fdbba0518b2408a0883ce26ff4ea90f8639ac05332bf82260fc45033d7b5baa0a20": "0x0000000000000000000000000000000004d2ec0a695435c6324bfc9b27dff217e5092e2972b0123529514006e278914c7c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec56c778db308e44b8e32641448f9a5ec78ad04a33b7874a2942ca7ad4c7e8ee2e45409cee1883e06": "0x0000000000000000000000000000000004681559f05e3544030950899e305d923d8e11e244943c1520c35e801253d28008", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec59c65c996cb7128c8d887817cd801c256ae0adad712737a18a89e23eb061b7002839d16530fa0d8": "0x0000000000000000000000000000000008e2612e76480388dcc8dfc46219130946f276496403ecbdd37a6d1a14c35701aad7a7116db2d1bd9dd4c7b37c204dc775888f9310a1a18877ee913901bc95281d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec5a064463897ec28ba98d1704adcb69b1d50aebfab39709c03713555e3d49e75690492b0a02f547c": "0x0000000000000000000000000000000004c1c0081353c756023d47df0da1d4c1b9eee95b9bb90058215e6b42ec5b00d525", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec62d71f1d9e80b5e284eb76f4116f4b75a718fd1a374cc5b6e02fc18f37e02deb3054e57539c5328": "0x0000000000000000000000000000000004284e0442b44363d362b1194b107f46ec28e76932170fdbbf8077dbe87aa26001", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec637b13dd6b9ed4474c76b2bb6e2e4b16fec1849aefadeae913aed26e72e2101a4dc34abb3e40776": "0x000000000000000000000000000000000846911250513cf4880a89dd8ee3e32cd8363d0f3a064767a4fd19635f2605475eb06c021615bf00ced6ccd77c0bc8c820a71e819bfc48dff36ffb12d7ba044338", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec67401b1f25d1590b45b073f1e692d18c2dcebae861b2f166a4dbfd95d9780ffef603c9e61d00935": "0x00000000000000000000000000000000082dc4deb5830a5e765042800fdbf03927e72ad3d40644360b07cf9ac241638701d76236f0c5d432f6e6b99845a7eada1491dfa6288c36dbafe21b45a0d90488d0", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec6bbf3f9dd9143a5fe6c31fcff28694469c3d4c1681270bdacf6edf7ec39bda6c68cf25738268b79": "0x0000000000000000000000000000000008a2fa6c11ee56da6d5e51439a0d0ee776c8b4f0f6a914cf6bd9ed8af27db80252164f70bb86b671d46c1748f38329f50db8fc5461a4ba4dbbfaca7a47bd063962", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec6c6796a808b7f32a8a99a7f49f1d3d72656674fea67bc18454325f00c9a5921ec6010c43409d43e": "0x00000000000000000000000000000000045263f205d321ac0063c4275a7daec9c6b5a34b3f0cb835ca2f4fb22bd9e55e5d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec7e9bc04cc0841dad6030dd61ad78ca1900865d2b53dd163bbbb5b40c82f94d25cb6ecc750a93c25": "0x0000000000000000000000000000000010e6ba74e93df6c3e3cd1615c99708e867e1f3160e324fdcce53be8e3b733e663a4462badaa1c9c6bf3e368c5de7a206c0e8c1ec70ff0c8c5d2a51545e0514ae309810e91f40b4c50ff66c7d228a9e4109e677c406cd6d2417bfb11f0899345e00c44a96f5d752d040b443a98592bb0d42719b2cf3ebe538fc10f76637bc054e7a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec9c02a3bfc8b9747e2b3d30136a5bf1ad99ed78efc1c0cfdc6a2c65d3e30d86b3303f3533e155032": "0x0000000000000000000000000000000004894b90350435a6f04536b6a1c0f50e83344ac230902f07fd5e69953e8824d63f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eca8ae099693f9dabd8004911e882a05affdcf81aea45f611077f07a29dacf6b754bb69ab118ae067": "0x00000000000000000000000000000000042d3568072e73e8e73a9a8cab58e10779bcca9cc9d3da70ee41af6b5682fa1170", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecaa21989ef628ddcbc63ced3f8fec642128f2aa9c37e989a9313a67e9635dd85e8bd689ae8d0ce1d": "0x000000000000000000000000000000000c486e705093cbe54e60dbb3e63ecf3ffbc84bbfa2a1efd0a3a9282585e2f50772a82cd9ba02bdf8241a35d6a434c019a6078547e238df7a55c6dde5c4deb2f12c8011fa4c76d86408e873beeae9385075b1f735e05b59dca7fee6147c14952770", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecb3200a490ec72062033f1e89095d22a9c51162dbcce5e28a6b12957fdcb4c3cf11ea8def5ea1e22": "0x00000000000000000000000000000000049862f63cee080f43d1d4de935b51b615cd7a15682e28e41f0bdf6565deaadc06", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecbc819e175aad208ac2709eb9569c861e63940eefaec1f51ccb76eaa84544e56331adfcdec859911": "0x0000000000000000000000000000000004460fbb15abc6a11bacac5accdd7a64ac63bf649e22c4efb879ff0cb0446b7e8f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecc718a6b9e9964318ef5289702f6b8c7d22b3562ffda7d5593a5f6414226925e72097efbf9b25720": "0x0000000000000000000000000000000004e35a5bb9f11f2d71940593c4ff87fba89a7ab269825da6282025c43bf0b4c07c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecc9822c9da4c837c86b7409a11700afb027924cb40fa43889d98709ea35319d48fea85dd35004e64": "0x000000000000000000000000000000000cf826721deb8c5d5f99d57fab56da2e28286fb7ad92f148b05d1aa353fea2b26ace10c51e89ab2907983cc8b846d9d1afa2f9700db18e176c7fcfe709d0406339de4a3a5ffb49ce7652bd6a9f98cb78bc68c2360c6e55fcbd6d6d5aa6b0f2347e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eccf50f8320382ca644da8d011a0f821b2e39d6151f8e17c417c0e09b664587dfe2021a194ee95d74": "0x000000000000000000000000000000000441593cf289a037eaf22bfa42c5f10c5325340bd4f488cb37fc72f65cb83f51cf", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecd07125b43213e171c82102e4554587f23cbd4bfdb0f43c9d2879d18feb6102bbed977930f695f22": "0x0000000000000000000000000000000008f6f9a8d8e0eb8f9113107b5f2bc4c3bf64a31c6ce51913433873e4357bd35524e64a8c8a0cd5301afb20483923ad8427c597ba471a6fa868947270768bdd2713", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecd367e518a4206c79653ea6fa2a3e4072178c4de671464a69d9c72c7ff7170bc76697b46b3947b0f": "0x0000000000000000000000000000000004f204ee949a256b7e81637b358f1d8519458e9b79cec9f1e345ff9d2ad4516370", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecd4a30ce889e7a55c04f1633da0ab6cb71f71ece4d1a5c32926d3f707d250f66ab712d65eb374b2d": "0x0000000000000000000000000000000004407ffe0ae098321e72b2b6fe6ba331285a2967a27430f04375910007010589c2", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecda070697bb44382d2cfdfb80cb90a4a5826c98846a367489fd25d3a2561838fa372f39f3f7fb138": "0x000000000000000000000000000000000897a78ac6bd50295c46bc350d252714c70dffccdaa6c1740dce1da940acbec1d19b1e47be56602b6fd57d873573f8e1cf67e97ee448fabff165be2cd9b7b6a777", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecde110fa4c51bbb438a48b1b98077c557c474ad091c854286fdf929b0e710299b16daae9e0ae4a77": "0x0000000000000000000000000000000004f2e0c893582b2b34b415274bf95b65f52ab82079a097a9ed28349eb9a7bae745", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ece0fc9b4caf7f03d56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b115": "0x0000000000000000000000000000000014506014a02fa72b89b1b4ce899d40e369b2ab4d06fc1ead4663c856bae3d9db60d05bd77a93988e8d68d67733df1c5c149fcaf773e6a74e70428b2aaedb018ac93c0579545b855f0070c2ca5c79342e333fe698081f709b7da3c9117b0b6b3e66ad37814b38fe39243c36ec13d832f06e178267058a03d5011f4e06ab78f67e0d9a73a50c79a8b6552ac4628486f70e2efdc87020ce5460f6c7c5153429a61f58", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ece591cccc3c347d0fc90e922a45ef6a5dc3c8abed38bb0aae5b9aa7efcd388fab60e329fe9c2d945": "0x00000000000000000000000000000000049a48686506ea99e3f79e0643854fd07392d8e59f7249b61557e1662de58ee059", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecea9b7b0be6d4be2f0e5ac8e356d7a3867e9919b8cb1984ee5a070b1659b6195deb85039a3b69928": "0x00000000000000000000000000000000041ccc2a2abfdd492dc72fddeaae0b32888f3397860a31b3fcc88430f7c5338c40", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecf1172ac1fb91b86c07040b1be7aedb10ffc0f136b7e147e4a1ad56944c1c76d6c2f6ca089cf316b": "0x0000000000000000000000000000000004faeef086f38d55942fa48bacc018724b488f46ecfc2828d879c7b780c8f57b0e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed0524a63ed8afdc650df6ec6f3dbb1134df6fd1d572d4dfdbe1058fca0e7197ef8d0f3d05a720f5e": "0x000000000000000000000000000000000422dd0bd944bf21712d577daa894b5d2def3b907ed1ce8cb334dff3c8216e1a59", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed0fb318e6895ef127add073714bbf9da81fe49db63778e918217e56c55e4f81f68e7d2e7d0e59d0e": "0x0000000000000000000000000000000004820f781b839533ebb3f3606d6bdb794136b3da9a8eab8ddb2f4b2c29cefb515a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed13778bef3c90858128b1857f835ab1569c06a71e4de49df3154a9d5a5fabfa2a4f1ab1c458bc140": "0x00000000000000000000000000000000044445d3cb2872e596cdcab7e8ac9815a369a6d4277f831287523ad9da7e60a53e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed164f9f8d9b541902e69ac91dc2b3e54afd2d74736e7dfd95faa1e738dab066c80328980c7c9076e": "0x000000000000000000000000000000000c0ad8b4f94dc8e6229e2c448d995094cdc1bd356dc14c6155467ac07ede18b8720f6987ec94f7c186a7c76fd7792be048d9e73494daaf0f86245f2f68cef20b2a6e63e1f89c023383484d1f16ea1d9fd66d46387f929dcdada62f8e5dcfcc9221", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed21b6f71d23b15bb1ea86f3c82538c486a25d8abca26760e57e76a01212419c7f1c8b510121fca73": "0x000000000000000000000000000000000815a946a44e88eac4fe2568b67d675983e9617e83d70d3ad6d9ec28707203be7eff07f170fb1e51a81ed96a4ca36d82decd18c5aefabae24a03d36ec5f8ffb257", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed25b2b83caf5ac06d857fcac7bd9bb03551d70b9743895a98b74b06e54bdc34f1b27ab240356857d": "0x0000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed2f1f3681fa9bb4720112dff656489548b0a7815a06d3a59f93880ea46ee2662a6439bb431bab046": "0x0000000000000000000000000000000004367c5a125977696926fd9820f8282c73f7a2cc8fa0dff0f0153cd7519d6ff316", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed3b4bb9b7ce70c8d4e3711ff0fdcfc953c9ff93355ed42146e442c256b6010ddd5b5fe0ee8b8ac1c": "0x00000000000000000000000000000000083012b3f9f22dfe0f9f29a97eb2fbcd227e5bd4f9c27df3a24816f9fd3a4b17130d3fb75084e9d91405dffa8b3f1396968dd935308d4dddc0e119fbd6be444482", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed3ede878555e1dcebebf5aa73bf19935376f19460dacf00bf0dcd021ca37d6a2284cc6347dfbb13b": "0x00000000000000000000000000000000089a3e193ef4ff85f45060902986dd3ba10afd3e4a0749b6718119298be183bfde7cc30da54f59bf041de60af0a1eeaea965edff0ba95e43be290b08ff15f91716", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed4351e7307bc37c8d82318297ca7af51ac2546ea6bd24acca272e1627db952e2ca35df527a3cf257": "0x00000000000000000000000000000000048c6d54d22c18c9072a83594d805c1a6c4a06940528eac4c3cd44359dcf9aee4a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed435a9777e7ecc393c5862ed65c524b7bb3564776a81904218f44f3d7c35162a608e39dbadbcda05": "0x00000000000000000000000000000000043c5862ed65c524b7bb3564776a81904218f44f3d7c35162a608e39dbadbcda05", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed4ed4dd340a2cebbbc486ed2f394da6e6b58b130687b48d3d19f756ba6d0655d37bf58ff0f59f974": "0x000000000000000000000000000000000c64563004d7fde7f69c99e461d43e799f2b8bc69c9c6941a265f5fe1e7e50c4646268664daaa26e11b1691bbada389dcefe14898f05214f50027c797d8004f777513b35b8d169fb8f713504d252be09827c6e9fa2197df14bbe563efe67af51d6", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed509c5c59195b1ec5c3739d60301126756a7510e34f9d656d4435cd4fe64bbd001f1f3473bc9c333": "0x0000000000000000000000000000000004a08c23158a93a3aa7de94d3ced1c9e1b4ed1efbb1e29dab0363b1c8ca4904e06", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed5ce1fd9020fbeba60b791f8467410a5ce2e880cc222933ad50705664917bc9d190a52596b987121": "0x0000000000000000000000000000000004982f4a55b705be63aaa88e069f4f93a955cc2e1c7dab295388d4a739ef6cb34b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed87333d9765befa4e643e4515fa656d6d830c088ec251ab76ba6cebd85be7e7d6362eafff654e222": "0x00000000000000000000000000000000045c9d4bed4df1d87e33b03c63aef108b00b23253cc0cda93b528ea9f95c33f522", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed87f50ab0b5f9643ec5909db1fe8581fbe80eaf39b4577c12a99d5abc87131bc3d4363f623412f42": "0x00000000000000000000000000000000042e0c76ebaeb0ca61c682a80271d95abff7bd6249acb3f90cd702df6f23368b16", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed8c344e11655410c54fda5a0e241e5497283afebd81b53f6a0235abf62a9bd39594be3f42d291e7f": "0x0000000000000000000000000000000004867c63888fb81ef44bb0d5b761d8b536abaaaf5dae3b5d23891554e924049a4a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed97b21772959b4b83870abfd18505f673c1808b61dd0d7067a810a9719c2ddee18f9b879752f4c50": "0x0000000000000000000000000000000004ca4acfb773d3f44cb7ddeef0caf203eb82d3366bef8d775a0533ef152431b633", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ed994ff06d05e1d5898989f74514aeaf57d4f41069770242a83d619c9ae5d46cc05b85136edd53776": "0x000000000000000000000000000000000424edcf58959173bb907319517828c0e5949a178917099537bfa4895695e5d00f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eda1658728cb5fb3c82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e745": "0x000000000000000000000000000000001438f0ee79e61dd2bd100c13719c468038ec4d722104b0a95fc38af7057c28fa502ab862c753d2f6331a4403f28cdd60a942d5611882e934c079a55145f49f9659b8296804203c1734a4dd445fde8f702f106965c6a6b33e44896af15ad093c0697618f7a742a744daaea9f6761f81fc54933a584cc5b4870a47e9525f42cb176096413aaaa130817e645a00e8f380264161aa37a6ef35c2328f4c79565ae9e408", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eda569c826c2fd86b76739ac0320c03658b64366855bd6ab037488fb23fa0d183f53b989106e25a2d": "0x0000000000000000000000000000000004203fade9dcd70e45da97d67ec48f8c5d8176be2e27cf3a612b6d6d7473c05577", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edaf69a211b7a8ea508a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f": "0x000000000000000000000000000000001c1bb5e480e154b39b0e8e272ba015da6daf3f9f634fd357cd5f8611b29b7d4e51e2e0c7c189cf04f3600624f5fed3a2107ab6ccf9625663babd571b492bb27cf942091485cb911996df13bf18b2ced631569a74c5e43790f285fa4ec64142d5030d32b36853f65bf42ac0bdd182edd4601c8503e927fcbbd1f34f1f74048cee6ac2b0f22e091372190ee2f4f79357f9084e1a9d3bc9af30e41db16a3fb31fd3d192def6fae3d1c6c1598aaaa7dfbd7038c3e047da285f993929e25bfea8d04b40a618dac7de8bd9fe8561c672d303c542f356e8f27be541bb6e54e80141d8187e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edb564ac3abd62540844152eccf08725bea8ce898d6fc5362ff2d0bc9dfc21ed15fd138438d160622": "0x0000000000000000000000000000000008c419b5e959b021c52f9afc64d96ab1130da2a03f08f820789a20faa24a206163e4f861ee16e48158f3a84e6e04f1959495fa8b39f13b39c2d3a9a464151f595e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edb70f2601c34332880a135db57d4d35273d9a4f661d3dad8f153a1b5bad478f9b0e5223657aabc0b": "0x0000000000000000000000000000000004d6c6649ddfbc12a755845a05072148efc0d82ff7cf4491ba4e63cc97495b3735", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edbc1bb2de0590492cca2a0719fad006090aad6536ca8b7d8c527589be01b0012564dbdd36d9a4923": "0x00000000000000000000000000000000083f9bd8000dedbde0a47dbd7bf089dee1fa558ac28796942a5883af07ea59fce1c0266f91841edb77e30346c6da3975b5c3ffce4a2b1ddeb696527bcc0279f3ce", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edcacdfdedda85ff952e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818": "0x000000000000000000000000000000002c4a4ad21f7448e3183c18b8314ffecf0b382098635efdd056e0af7c53228ba4262a5a25fb22ae60a8a24177845715bb880e16ad84344e91d1269ea6940e929f5b920799b25e259ab600be83eedfa7807ac27a842f005dea4a2bd49799840f4b3a449e6184747b236ba5577c3560b7739e35718c65039b8997b7e723722512b310fc53b8a54a21149380351cadce380bcd0028cec8145c34fbb67db6176dbcd31c6c8bfefb8ac4b47696a47ba939ccc48415c02fe947afd32437190cf5a36440024e9807808e2487f1a38ae21d64de700342dd7feac9c23a7293da4687e668e71d109507526c7136932a5129122ab622dd17ca59db69ebb7ab94ede6f7992fe854ee67b25f8646b574d06dda6da0b74ececa842c48cdc5bd8fabb48276f28a6043f444730a05ea7fe71e53277384e8e78bc1c8b8c6858d2b177e16d6d1b05c12654e8b6fcf0dee98dcb0d710fab325fdc6b158964c7011e9a43be877bae760717f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edda1f8e340e37b261c39ef78e57f239200072aa865312f87edfcb4d4133c6ccc0a7e33f5c799e201": "0x0000000000000000000000000000000004d45b3d8d71f6ca469454a375a951d272db9426e3712e172272f951d8b289d300", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ede17584cd268e75b0277ce02b2ac78ceeb9ae4fa0a595005489bf3f5f77898415e32a3e9504a5314": "0x000000000000000000000000000000000c544e2e588c90a2e53e051d2f87d40e222e1f034913a30f95a9a2f39114e5be3810230b53a6fbe58eb3eacc65cd3ef675e0456529cfb02a97eb43ff93bb6f8064cadcba686c8bd7b8579cacb9e1233fee5eba81db5e7c25328b724198bc499b2b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edea8918004244b5bae0ce04d8021516cbf0a10c00c4e721319c1e91c729402b232942f9e2c152320": "0x0000000000000000000000000000000004c4ceb4225a9a168528d1264733d5b6bb5176c0eb31bb4ca3c962be4cdcbacf71", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edecae94c7ca0c861584d715bcb7a2d3b6a3120891dba91b19b12df42cd50f1c76103e2581d5b4274": "0x0000000000000000000000000000000008c2bf131a9bc49208383fce6b0ebd78517ff563ff812f146c441d917dbe726c4dc2bf131a9bc49208383fce6b0ebd78517ff563ff812f146c441d917dbe726c4d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edfda9759c850e63fcad4349f82754f223d99182a3f9de949c41ff94e672f7f548e7f4e66c04b5c1b": "0x000000000000000000000000000000000486cb4a7d71b52b87a0ba07d245f92cc52dd40259d14190cd15f36b509f7ff511", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37edff9d344c62cc1a2a89a9920a98f3591ccc0a1a4bc827a0adfba37b75fcc108ae3c7191bb9a32750": "0x0000000000000000000000000000000004cefcdee5940f8e74338264c625fd7fe4c671ce205773f69e8bf4cf1b372f8e26", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee0e206491404b059c229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a65": "0x0000000000000000000000000000000040b046bbfb0ab2a461c916bd646f879787adaed72992ff0182233cc798fc9a2c314c9f8b6c9bbd518b19a4fe57cb38df839f9d893c577a9106579de22ab1ebbb36de670277a4ec31a0664f1d47eb01a7fc351952d63980ac1246ae1e6751f615041883cb0c880e437370dbe0ab6747e1d6fc6decf1e0ef4f423b815f14e3ffc00956c33c3e6261199d162ed7e756297752416cc7f7dc0eec30460a12a0a7e0c577c08ef34fd7c513a00cc447d3a01368dfb0df9d3c84ee52182b8749e18573e14d80de9a994f4ebfe1053baf13182362e06fe78b159c319be596fbbd8d027db5768a51fcf7cd53d24e15d85b8180f31d5f9b295af7841f9448f80b7264f381875222caae65e7ded01a955d36299f613aa1636767c9944621bf5eb149290339b97bd047791087bdd0caca708a478371eb8dfc056a36028504ea64f4cc43713fa9180069c3ebd00f7ee39c7f8affd0d14205768535bf95633e60e26f8c8006c27f5366e499f4ab6510c9b071eb403111b1d51b97195af9cc2aa65db79f3b84f0976298735853f4d1ce4c0e545e53dbbd8c65fe5f89385fecbb646a26fe00cad7795952e2931449f8d897dd10fe7f753414821fc90698d940050169a863db5093bc3bfaf6136c1b5c48e96fa266bedbb262f30748b53d9da7a435423272e1e67ede7968ae914b1cddf602f7e775099eb62db646dcdabf6c32fc0bb1b951e94130503d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee26aa6ab4f40124e083f39607241c8ebb62919ab2ed816cb6b20c7d0abad78a92570030d2f96c63c": "0x00000000000000000000000000000000040119766bce9e7ccb7adf4b74870a29b352995478848ad500f46166c797f1c326", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee31e32af7d282fd42cf0838b05fb182718de859525fa1e6d53d557e5fcf631ee9ff44c619810d43b": "0x0000000000000000000000000000000008426cf52dc5549d7f8fee37c20ba68afd3443973a05bf692185cb913fac80887320430a70d2db1bf57c424e5e81de47ade7f1f0ceae2b568b9182ecf9b025aa35", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee3e9a46b476478204c4769cc1bf4774f19c7433e31a5b8cb686944cdd758e193d264410d4918b120": "0x0000000000000000000000000000000008742e6def792a15d4b2518cd2a957f9bb7f75525308355f9217a2df17a701128a4729298bb2a53d0e5974d34d14932af4d4905334d5f9a57d7931ed1eb04eae67", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee424960c1224933864e05e73625f3f0991e3062733ad8480c5589a710a24beacbaa555f1c4a7f064": "0x00000000000000000000000000000000040ac2e966527ec0e3076ac6ae05402fe763d6cae60a8c01e108dfbb6e92d0863e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee4a7b18b604b590ebe4b9973a7f6a5586a38fa295ec8e64d4026aa878c840630a7ccfa7f3914d162": "0x000000000000000000000000000000000428e219b7c6307a185ea3d7d203fcbf5b78176fc0601cd62b1a3ab95e81e06116", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee4b5facde9bf411dee16a0a68c6bb00ee88ee56a12ad67e778bbee540f868ead35fb6851fc522c0e": "0x00000000000000000000000000000000048e74741b4eab0c60f4b1621f8d244da79dc84785622e52ac8e4e5d3da9f9e512", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee4cea58d581e6c8f707c9246c1c227f1495885cb2f4c59297248ec5abeff2d0f68495075a16bc17a": "0x0000000000000000000000000000000008289fad9cb619fa9f9b77fd385d003476fdacaaac6ba7191bf5486aa09e1d83298224620901db3a08a236f1417e7f865c079b41c0b2e6cb0084109e4be3fb1d0f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee5ec7a33cbbb8d9e04f3da939fa351c562c7e06e1e3716976b5e14230e83a45995cbad9086f49e17": "0x00000000000000000000000000000000046d6f646c70792f6e6f706c730012000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee6c2c15d71b57c80a8cc040d5d391967b6c50b54d81dbc18acf06fd13a704decc7df6f464679051b": "0x00000000000000000000000000000000042a646f536fec9eeb72210c0a5ae166e0b0853846f4d052ffaf438696921bd725", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee806de170873b7f5bc955504a40c50ded178a8082516a78a68f503348c16b106fb2a1aa2c594743e": "0x00000000000000000000000000000000045ff5a4655138350a17e2dbb4ed130642abbe12b52ed03867883f0af9a1ef0cc8", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee86ac2d54fd84df0f4914e62f037cdb798c40ea01fd56e555b77635e0e9b7175b98bc9514021756c": "0x0000000000000000000000000000000004d228fd275f3f92e8b6ccc56a9437582dc59db70153ab33cdd77562661adda60f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee94531e277a1ad52dcb38c186bf97625f108b4832981d966ebed50d939349d4437a6f538d40d5676": "0x0000000000000000000000000000000008473d3b1ef58c6170dd0d8e4f61cdd1d594cd17280988b52a7333b3a98fed4269eccb809fabe7f585098c7e61345f71c2e651c9fb61f16ea74a5ed6279a644d74", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee9521ce485bf220366a4d150e1799ed9ffa721e7e95397c4484db801fb7f26fbc4f27e1d158ef839": "0x00000000000000000000000000000000043650aa13fb0f5a4c3a5ae264eb820463be11b8fdbe5fd09cb34df93c19430a22", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee991a1b779e8a17838ae9a751c06cfc8b4bfb06f4d0b8d88df80fc88317415ad6f1b9bb6ca114941": "0x0000000000000000000000000000000004f16a6e2b7183e7a10f701d357d224e9ca87bfbc49a663fbfa27426a8f5e9b1d7", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee9a6cafc1c447d4fc2a82d0740d343bbcf853665019f2afe81ddeb884f76dbb5c74533610f72a732": "0x00000000000000000000000000000000085eb5606f625995f4a16ab77fab23443b28b5ae51964638b6c6d1020f5cdf5d04568538b172c522826347235dd841d08c6512bbddf1fcf91a10c9bb9542b75ca3", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee9a938ca9a4abd3102b2b0de562a79b5ad9c666c3f9e7752955f3b2c2b4a17c71125b2668ea9ce5a": "0x000000000000000000000000000000000420188a2097650af57e7cba4be37d595ec1884b69aafc65961210f295467a5313", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee9a948cc19db68dda45d1343d565c182e0e1cd3da2d6c0b1ab5b17a77ca165457d9620db19439a64": "0x000000000000000000000000000000000443dde39c254993375b5d7905319e7700ebdbf57acd84e44b3025d869ba7d8e6b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eea41c7234ed3632dc50f089e43c19f3f4ce606cd994bbecc50bf8dc53e970c0c1c592304f651966f": "0x00000000000000000000000000000000049654bbc25d7891d49151110003c37da87fce6eb551768c02e47eae754b61b466", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eea99648ce61b6d52d86dba437fa4388bc312e57328e808cb1d37cd49143b90c338714703867edd7a": "0x0000000000000000000000000000000004fca784faea5287b50efffea3b8ec2995d80648fcf5292f38deeb5bcec2d15e2b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eebb9d8077a7da3fe98672c4edf6d578c3151aa2e8d55431cc874360eff95c4592d917fb09a6b6316": "0x000000000000000000000000000000000898672c4edf6d578c3151aa2e8d55431cc874360eff95c4592d917fb09a6b6316d8c5a6bb60ac4bf7517a02c2612d122e389ef4684a34b5f7be058113e9e74c75", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eebcbc6c0c66547df8c4c81f382ae2c201eed4b0b519f352aa9c0c8593122418b30ac9760844de2fa": "0x00000000000000000000000000000000103c53243e05c79ffbbc910d8df74e4d1ae0197db16b7f00662e2aac74c8ceb3021f81e872efaf12f97f5a40b31afbf874bde9c0225e89511734f749b4b1d680ae29c22701c5675f9a1d0c99c86c5bd43a5c781b5029d080077926cd3d3d17a81f15ece2a3d6a57419d76a4a66bfb72185e128e3abdd1e13345052f43f21548a9c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eec9971789d54b940607b422f959ab305856c1621be625a1776d2ffddfac9a03446da3052d7cd3a58": "0x0000000000000000000000000000000004607b422f959ab305856c1621be625a1776d2ffddfac9a03446da3052d7cd3a58", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eed170e36fed4d7829c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627": "0x000000000000000000000000000000008d0144ab70adf9b1a6402cf14b3c61f98acf5bccabaf0030d537510166a21ee44d1676c26a1fb9acbdd56be00d4c44901856929b9d2a879caad6119ad0417e9949495ac7f6af5aeb5364188840d02f0e74e813e6d9cc0398d6994b66727658a4fb306cf4b9ce8d60ca73a35f036cd58afbc52ecea4d691484586967ae1ed45a1c4235627b276d86cb8de65eb9b261907a0134f1eeca33e423eb357ed4cc339e68d1d2c61f078a240b295eb8d19db50e5b27b39225ede1cf718c0872c441cb7ac8d54aec16460ec51be05e01406f39af4e8adc9d400e511cac7aebc10c31d42540f46c0c86652faff45a0e4a86f5749bf813d9d40aac848b8c672123d7ee2503a6d5302c1151878ea5c35d75c7d4f879fb48ea7a4199e2d3ac9ed79d686a157384d2fc6a8eba5ee9f02ca31a31bf5de2dd406adc9c55df94001f6efa28370b154544d72c76dd7083bfe6b601d39dca6288bb8adaa0673c914f3b0c40ed812fa4b5429c2b18a21865fc3da2283153ebd44a5da61f33753f6f20eee1d8e41fcbaa0dc67c0d0a4ad7841c483d4cb7813af9550c9d7c1b182613bf27a900e5211d9b64d6898ab313fb0a6faf344c680e6afda715f41179d993ab86f25e481a6259c97634380ec6fb1ab57be7d791fa9bb7e711b2736c6422e0b66932b54f3e95f614b4b2de852fc4a048379bc123ee21bdeb4c6a4d94ee131b0920ad219d6cc280b0a09651e25c43583448b07d9e3ff3a2c67c1674ebc968258e42ac4ac000204f6298774063dfccb3cf16ab95e3af6fa877724d2ec90697596897ea59069aefe5c223f58e293a27231ba1550c3767df641d03102ad153acf8b4bdb7db7f180fa9d544d65faf6bf2c43d534d180a04d58c2838ebe73f3c98e0c3699f224ef0ac156c65e23322e857c9fc42bcd84f6f4e2d1f7f892baef31f1da5731d22796cfc40e4fdd5dd4c6173852da2969c43006a3806502c5f6bc23e1f3e8d5507baff2b5e2f1774ee040d1b984526d7e5222ffbec6cbe8bdaa73f9190a9e3d7244a54fc99cf37a6574b215d61cfbd296a81d6ead301607072d2bbf9dd308c3606eb1b795a62bcf2f68851551f073cdbb09116a1e5b1500042b1376b440f967b0ff961df638fae8675ef2424315d83ff1d4199b1151f91ad9c0e89306512b02f846f7acf17f00da67081c3d2269ab0253aa2d2c40fd37ab6e7304b0daf0bd6068d0d689fb51f1c40f3a365c988f1b8bf6c4574656c803938a4e0250e25837f74fa6046f0ccf225123345e9fdb6c477d50a5c7be50ff581405ec6c151ed4ca2c25cf21a510e6bc7e6b603d8b10a42a8be5f7e755820b0c4241732614384e039536c8e43d3b414430566cbed2071a6b6848b4d170409de00af2da5ce2245166c9a5c32ae79fcf44876f7e91f2c936482460b397eea5923867efeb2635679ca776cdfdc62bcea000250de6897f5eba9ec46ed569cb3c532d193f04bccc3971b065df4239a18a1e5e527cdc89c6865c029c1088fb27b41c1a715b0bb611b94e1d625fa0bb8a1294187454623ad4601b91806226421ebcc2af8a4e60b4292b52e9fa8bc1c57131da50480048636a9fc435413c12d7c7524f6c12110ff15938dff2da4dd92cbc87696c721a6c6ed8531e6c0b882af0a42f2f23ef0a102b5d49cb5f5a24ede72d53ffce83174c08de8a66557f63521d871087a9290cf8032705cab1ece83bc4e5a230f13020f29100ef06c7724dc32404caf185c03adcfe64e92a3a4885e08cdafab2594d2de635bb7c13379f6b759e79aa78b8852d750afe7da16ec7f01139fef08849147b645c0ded9084b8186ef4aa2d83ee1c5ab326757267c41c05444e15c657438424f4642a032339376577e3ff7f6d55a53fb6519c5a20633e30bea2bd4d2eac3a0540ad8a6c92b5be3305a78ec0ec67cc600e791fb2769b9cae21cad79c40f7c92c04f231f52cd2a234dd3a72a7c920ea6e10a7f85abede1a9b4062428bc303ad7d5a43b9d3a39997151c4d745c1513b73ea440fcd50aec480eb4ddbe65fe692477a4b5a3630311d5cf8919e20be535ded925f210724ef5c78f8e3754a32ed43841d21f6f288702a2646b5cec6d0cb5f77d48638af67cf77d6dee823e2959ccb967be03f2946dd310eb0212bd2c44122eb48cf77c834699f6bffa88e2697e7fe04f545513938fda2f111c89660c78998fe45547148b9c2c0891f28ccadc27313a4516c4a4dfdd6c04572aa9c3fbbce888451c65cb1a1c96f611aa638e609cb6f609007cf8c189e43ad7cc1eaabd0aeb82ae7d62e5ca915f6bb87c4a0d85bb8c3772ee75ab2836d2ddd324049b86b224542d6cf8a12b601045ec14c454fea4e9cd470e2515bd2e4ff6a32fed6306b3fc37095cf875c65f987c19c2b2691d8545fe51463b64f13f694e789b1c89d219210b4aaef27fcaf8621ce8103f88e3951d054ea00b6ded2d4d0101146c5f76452f6900532c39cfb36b911e38776c782cfcef5940e488d3a17720b2cc51ddc6cc6c4afb23ed4fcde97698aa2cf374fa7fadb37db0820d7db40e2a9fe96c7ef2e810cc51a7da195bc995f329ffde72fae04e7b3e2c85e23060a9c8b4598f2927a796f8062aa3843dab76f9eadd8b2f36179c263e1a765697eb319802107fc3eb312b686bc335cf4456be1c46d6482bba3e1eb038dc7a8f82a2faa5ec9326f6970edcd577f8ed603104845ad07ce5c5d8f4a49d551233533732bfa8bcf7a95e0dfca71309e49a1fdd70d43fd5c405505a6826ef725ae96556bd15eed67a54fe5f9191835994d94c18a764ea4280bd03faaba617740cb8ca7ceac36a246a8295a56068d2b532fa2c61affbb34bc5a80777d91f1805702ffebbe8d46bc7b2d33457e61ee616e16c56d726244a6ee549a2572345987348ff655461db0e896365cea6351beafb80b40f19a3c453fc27e6609f872e4238a42184be9cd7657a019c2624c045f4ef80df884576b0f2e1eece434410537a3708c74cb0df1d73c69a078a6dd56d80ea94e08a2f72cba07ce6c5b471fcca8976c89604d1a2388771784ef80c5577fad1e75bb2362d5d578a94e8dfb3d982e938b8774ed1e7c90fd0dbe40fe7c6a8d810484ec59624b59374a38a8bbf9d91ee1b54bcf53ff5d97b41b38a3a5ccda86b3a3b1d7090a20747e2bdfb2cc46a38d514eaa00abd5e6449dd46d8882c6024f26cb5247d26becbfbb4f57314d342b96a653a620493bb740849dc2f946560976cc5f8fc004b038cd61859f5be0b2ae3643f545e8064f8898a29d4811e09b207cf3302e5cefef16615f8580fcd8fa63a624e90549dacdddd5bba278515f623f95197c97a6a7793e1e350c7492a9436e4a90db0b7458638e3862d435924db213a27b64b5029bb2f06f68bd337b1c3de43fe44e816b1ea4928a0d642ee4b4fa99aecfb717bcd47086edb11316254c2e5844d2950bf01d23906f2dd19d8cd71dcbd3033af5fa1dd042dc4dc1f3f5f86c2e9ad5b50c63f86e505700906b9303be612c11427a137eee64475e048ca585562f79c50e8ce09ecba19cbfda0c26fd052cc50a5365b22ced871d32fb6a2eb1853d2bb7eaa672cf29483bc35d2991a17f143213bba4fdf81050113c483cd205f689032368aae19fba03bdb71cf735646aba2d56fa5b4b83aad3d96804d70e9559ed8071efc036538dd0a7335685f0b7f62f6745658ff16bc2d61a8830e70dad3e1749355129129bd5eb2ac144f5d28695aa11f2f14153863409d08656f7e34c2963dc1128866bf5337468c1c81b265c4d9f352ad6b0e50b7fe77c4a660fa9ce31e45154abec1f258092973881a9591a5f751a5ca2b305c6bac9f4500c0e56ba02dd8581d42e37b2268e7e97d6345f7611dba1f4f58baa27382b87cf536ebdaa23c3b811ffc0b298393d72240ea0a06586ea1227e8c84f786c7fa05879e1ff28422017370b65d8d7707042e22fbf2213c687b330cafa3a792598536cb5fef7aef40cdf07c1aa9d3c51f17264aea16d04dd1b899fd311853b2bb2944487ac2c43f1e3040482ab01782078bd1515a3027895439f31237792568ad0eded4af3d31cbf30d951756a88434d91c219575e30f91afe0ef870901772375a33f006fa82b7c743b49176804069db501a5d23ad862cb312892bdb603740707c1948b797d4d30dcd76d1bc83bf4af534e16af8aefbc56dcf58d3488c77601bb1abdebafc2fee50534af7facd6b218c883c8ecc7a71a6b22a74261f1c2394399818ad3f3939ef31e463e23687a846146ca3cae0d51993c0e186d6026b2134ca05e213562c0141a85b4ef5ce85a54ca5474be7ec4f0e149232199a19f1f962331e1ebd5be36cbb77d8b0c3e4c6a12b41192cb3355642a4de4fa55ae61387c23673f0e8c8637dd864eb0c443983a3e49a6aef7637adde845d561274ddf1d66ce267c81b3b0bac979ff79106f2c0f99b106126a14a19ed92af1bd9055ca4c39fd9ed5ed2305d18f6730ac5470", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eee577071e47d1ba7b8a40f17f9fc62194fe1b12c10e8a2bfb5efc7057b119f4ca3b05ba96eb7da6b": "0x0000000000000000000000000000000004b08c0a54f1f153adae9df1b746cab08c40e3b949cf2458f80ac43ff256f2c17a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eee9be5f0b44a2889287e6f010e50f642775dab59f39ee4de313fe6325181ca603824399cf4d42c08": "0x0000000000000000000000000000000004787f2dc3f07598f255932ee1fd3cdfea934389c61a31473a87d270655f70811d", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eeec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x000000000000000000000000000000001480c546b7e44391d7f7832d8cd5456f7ca1a76a73e73807544a4184bb59ce60481a2b2effb22453209445e66e170f7beeffb3b66c900fa8fd49cbe9efe9eb49423e4f57a212fd4403b083d956909c66b8e492e24c48095c3681a5a282088037445009e192ec169788c9c1f0202fe7c2bc79405ff8b6e1d1ac78fd6152006e606dd091cf86d04141b1c17c70826c08d074cae1b00d6f82de1b8a5406ea10ce723b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eeec1d763f95c70cb16eaf9666bd95a04bc6ed619c30a4809a43fd7265e414284c11b27b8c666fd23": "0x000000000000000000000000000000000894ee7175041f3293479d3abab6dd9fd5e5d463f539bf6eb18a2bfc85e6c5bc54c63d0c9d2b2f1b51dee3c65bb2714871c2913cf646efe3c775d5cfefd4e1bd89", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef035a0d786dbcf44868cd54faea1a0e45836635b2bf658733436ec69c5567d651be592392cbb69dc": "0x000000000000000000000000000000000c60857d3958e4e8809b36403726468f6b336e952d7cdee4a16c32126719dac4113472a370eb332c43576f14f315b219aac6f86795a580d50cf5454b4c293b811f300685aa838106c3737c9e6c6086481f3daedc1b1650b84cba9405389ade856c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef04fc71c9051dc296467fd4e7038b925c2422357380d8cc0c5f17d272f639af8fcfd1f1156de7040": "0x0000000000000000000000000000000008bed497470a04ca4c13caccd69c7827e3ddc64473fd2d7c5d496c71061f452b05f6be65cc16c65708bb6a0e4b9958ffe23d1c56ee5683670a69dbbbb70c10d507", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef1352327dc3be8a0948223bb2e7bcc8a55be248add34b625c1c0826c58fe037fa5c8e4591440dc59": "0x0000000000000000000000000000000004587fc2461b55e47619ef522b4bd986f71f7adfd207166e6dd2ba381117a2dd08", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef1697a69799d08e44211b834beac4f35ff92e0dcbb0167f6ae7a0c43b186727d581d3f69f10fea34": "0x0000000000000000000000000000000008e68e209129894d176228151c41e67d96f9d8ed4da38338fab5c964f2cd2c61562860f5267cc37b8ac5cce7fc5e1e00aeff5c951ca71a7075e75e5be1136e8e3c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef1fd5669b551e9dca43b2797bd4dd454d7fb0870a2a4edd62b39eea0801f6baaf09b05c8634b5a25": "0x000000000000000000000000000000000c384e257ac2372c996a4180f6d9a9a0e16631cc76929c600468583e8d798c17603e586d68dad3baa2426853204a502f7476c280a7cc3bcc4f25bc4bfa3e1216015c3e489388961303bbe308673f7faba33bae973af37d6ca444e1772a750c9775", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef2148a94f5867abb148a35cad2b2fe9cf6ffe0baf5f4f2f4ef894263baefead0e797a1e3e6d0a07f": "0x00000000000000000000000000000000042aa7daf7650583460d76859d7f4fea90eaf792ad9cc03e9bcc2667f165f00b36", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef24d4d1adb36534d96f7daa1a00790f8b168d3db7f0175e5f8dfd3430dc7edb4c5b807bce2b9d93a": "0x000000000000000000000000000000000493bd14a518853f72f3deb5357ee12fdd6e77151580b082bd468bca1358250d2e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef25ef82af77881fe240cc50e90684f175ebef583b904fbc0b9aef4b38aaafd53e6436ad3e70ba366": "0x0000000000000000000000000000000004d2c2f040d9b3546eee26f30efecb97e72fdaddea5d4999845b37742841e95f57", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef2852cbaf60c5e38269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b39": "0x000000000000000000000000000000000c269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b3944a8bb3fcbbd5b54617b782667c7f8c5a89ca53c1f878cdc9dc1766f447ea30f922988e0c062661a2af3df12782ee38f6df030390d1874d113bb8a53c165f147", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef2b06e2ea680db3c12d9c0035dd422388e6d346f61df3d9f3667f8ab761c8c57120dd61917976e10": "0x0000000000000000000000000000000008b466b09ad7c824d88e8548f5587ba158415f7514a0d0dd7c18144f6503507f473c1cdb7f10555d9e080e83ac20acbb4880b32d3d30319f055e37652c7ef3d36f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef32bbb6fec42f4b03e89cc7fecc4ad46cd7ba606522a8d1679863da498718cf9acdafbde8cfe4b78": "0x00000000000000000000000000000000049e7fb05bdd2dc88013e77f26a37dc19e1c1717fde8a27bfd1f2fa8231ddf8538", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef3e3959f84b063bcd6c29a7c39cee45b0e045a94081bc188ef73be2be086d66aefd850fc7eeacc45": "0x00000000000000000000000000000000083ee307326a809fbca23841d62753a3aaa5d3ef29e45a4f810ea1011c178f302d4e1f1d2881471357ea697093e5e68d46712d2b0e5b650945c4ecb571ea43757b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef3f9a9fea1c2bb71688f2dd2918739ffc90f280131b7d8bbfeaf9f0e2bacfe952a88bfa3bc168045": "0x0000000000000000000000000000000008688f2dd2918739ffc90f280131b7d8bbfeaf9f0e2bacfe952a88bfa3bc168045cc2db6639c1895e08c384f618c9f215e32e0fd23f2ca0ff3b013d1c658287a75", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef5695ae6155ce7ab243612f0fc6c935d9ee0cbe21c453a83f58a9427054ccdc74966890ca57ca719": "0x0000000000000000000000000000000004eef86cb3454d5d2d17aceed4598209af5d3ec6a09cacc00bc88d86bba7f34645", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef59d68b847bcb2beacab23f327e732756f5d76a43cd32830d5d8a9a489cd9c5c6a8554a3374da056": "0x00000000000000000000000000000000042c527cb7d17e0fe6df0e0da303a71f3eb46ea5bd309858389666ce6dad8efe15", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef71158c0f51bb8fd5247e73b8ad3c36bb4e01c93a9bd6a6048afce1e2a45863ea5fe99778b530b61": "0x00000000000000000000000000000000085247e73b8ad3c36bb4e01c93a9bd6a6048afce1e2a45863ea5fe99778b530b61deb5320179cd1dab5b17c203384b7ec2fa9e73577a82954f9c526ad535552422", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef71b1777c4c6a13546b4eca928ede3e8075d86e25581d46adf3eff915646eab110d13e2fbd947b5e": "0x0000000000000000000000000000000004b4adbb4e711987eb53c39b12dfd79435736f1317a869db5f50d5a913e4045550", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef891e0d61d95d2f9ecc96f0e735d4677e64728f5300b27c97c3413ba01e7a60dd29cb89123990a66": "0x0000000000000000000000000000000004c0020cde3bd8293eb5d5b61b072a9f6b19cdce1624a8ee4a27ca8c57e3ffa628", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef8ef4c38a66ac4223cf3f47f611c9dd952bd9007a85b0d84383f91e2f25edd0f13d6be20b5805110": "0x0000000000000000000000000000000004be0bc39e129f4ecfac3d20c50d78472dca69f693150064093df5edb3a0caf14b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef94e92ce97ad9912aeffde5a4dc7117e4cdde2d3fb3d2afc7b2f710d5d66c55c5d1d7c5873598706": "0x00000000000000000000000000000000044415d4ced8c9de7ba415022d5b356f25eeb4d9dcd522732b2c87520e29e66044", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efa4f3e525e10f673faeffbbb88ab949b51abcacd45d7f9addf608a6e6ddc3d4b39147454e1a23a16": "0x00000000000000000000000000000000045f58951d682a66090492f70ce968af8b8d39a6308aebb3cabeafd44bb0213d91", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efb1e196ecaf7c6ef54ec6a7bfcee3ac00ab63b98e084f1a1c4d0e82ff63c31387aee91c9a721a81e": "0x0000000000000000000000000000000004f063c0ba3d0dfdd209dc5b98dee86531ad264283fce758952e49f8e6b7f85c7c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efb5bc1ff496d8054008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a": "0x00000000000000000000000000000000201560de907974c342ad34bd99ba8b530cbf89b39a10be019f9abfed3649470718a00505eb2a4607f27837f57232f0c456602e39540582685b4f58cde293f1a116bb4e1d9efbe50d88f02dc608509ba4ef589646abb8dde69c9398738becc8cd48d34e07fff5d2c51bf316d91599d98e2e1ecc8bab38f57caa40a4206967dc8ac013ea937fa9da7a04ab5ae026b321323ffbc3f6ffd24898500ef3eaa6b2353613deb536d9d2138242abbfb7d0f1b7b2905d8316566edd28c2d029996a89e51e09b53bdc896b61a0c3facca04307105b99e44841190d41b655c127dce9447ce2d4e848eff972706bdacaf38bc657028f303d44bacde7b359b8595fe7a4268e7418", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efc6a73dec7fa79b18c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c49277": "0x00000000000000000000000000000000d84248d8caebe59dd27fb0606a3640daab22456c80bf8449bc0f9ca721ad2e2074c6150d4b20644caff90e355c0740cf211f04ec624a65acac57608e7390488f0a2cb40effcc1bd1e91c49205a599b87e3a49dfae2ce9644f3a431e974c721c54fb22f3abb5bafd42556aaae871a79acac48e9b874703cedb7f8f5ce219860ae08dec5377d25559444879fa2dbfc018dc9bc4b574c73e7cc4ff17301e6f0404b0ca6359df267482f0eb4004f12f3189cc44d1e70441ecfcbc1a2d5c6c32066003b7291c36a6b23990b023acb5bddedf227b9688372d4ae99b442b031cadf13f66ee26714e05311dfb5e182d27b7f0e2c399c96ccdd81c25cf47e9c61315274631fd6d65677fb307c3ac6c6c0405a1ecd9a47d0ade13ebd9fd340038fc78d9d883672b86a19da9f10eab2fffdb74143afea62356c6896c265dd18207867f25751109a9868ff02ab61c9603e98eaf9560a864870596f58a7144203636bef6d04e269927f1c23cdd2161cb6bf0da7abb4dd94ce6a98ff07e9fbdedfe96acd3d7dbf5abee52eddafc82ea6226864dcf0583e034f6510d2b390ed60129b6855fc020c06868615ece4f03d149458a8a54f26f7b3992f687e066d7c50e6713f72dcd6285adc19a1fb8d9519f281e155457a5ae5e30ee6cbe81b70db34a18c3bd72c67244b0600cf06f1c8e912c9d968f1de9fe6ed32d033b8e87bfac698602c25604e2b4ea6e5748915493258986746cb3e58f9e76c69bd65bab4fc620dc649c102baf716280774e8e4e6118ffded6250a1b6b1a50285b5a61cf184e19a2bc8e8de8808583ea2629ce3574dc7dda1f20721f7d7a1109dea19ee434885d768c5c9f671271d10002bfd652b0ab50a36adb9bc74163a4385c6b4ad8d3cbef794c07716ee0d6cb04789c005102f21fd271c09568a78047f581710323b5f91b7c2d5743011e1286ec238210f082cca5552aa2ce9a0d1c4be9c7bf44c04f4524ded21f8cbcc611dccc10f47daf388814d58209cad72e4c07dd9131ffb7b2b909d39746577a971784a18d3235c574d9f25aa3371f0190be83bdc423f5b77fc310390e753b229a952644f5b938a2bca8d0b0d5b0f08bfa3faa67acf54f9d45449777022fc23cdbc0fd8c68f5ee90ef5d4f3a2b0d3e827b6b52d6d42c66f0789546e7672128891df61227d3663b23d3565e9f07343f2218b47f60b3221f8bc32692ac60a22c7fb936e021ac11f4e66c8e210deb3f90609d0be4335e8c434912a92fbb1f67d3800452f260707c021782450fc2707ad65e0ffebf1f9e4025b69b8e192378e4835b05f74ba5a53f10121888c3b765d7a0e4ad64209bb08abed45cf9b6f72eafb3af9782a1a7df77359ce352ba50059ec6e2635d7964a50cae9012e4a737f5e82c353aa0d2c13d8c2c4b4445943ffce2d55a39cd4c982e5bd4181d30f712ccfd8347ca45d74e6950dc3144fc86b2f190216b04dd5f75c5ee52d7d3d0a949bb697d48430072c35a5568d679cc0a70e5b714a16a87450270f8ed184d35e961629aa7c364f726e32e6b0a35b369455c50fcaf7153945fd6d92b850a593ea33b5c3b51d7e5a2acc9732afe3d57624b8bdd1afdaca3f940d0010ec54c6eeef52b15ee1da15b06924c295ae61b1b902e08f1b4939f83aefca9d3cf3c6048f1bee7ca71dc5c20a2e58599575b1d7994d5f588624fa628018dc6357f6a90f488a2d880525e582a914565e801907aa5ceae0511572155aaaed09c8ecc03b7dca4790609ffe26bdba0ccab8f3ac8a49d03d47e037a2f63bcb5f38a180115c70db29ee4f379e2e04c3354e346e6bb879c076c4b6290aaeec0a06ebc5cb198245f31343ac1160e16e942b5e4a7f6fd9a8525d277f96f3e758e51fb673c6c28a7203b1a57f6e90c9f81349e81628fe7cf9e8c5e313f1d418b48778051a756de0f652496423cfb3f1be28363c982ec4375d3b3e9c950f540316fe84dc53191424fd073613cf4dea51cd156eb00533dede137ae3424e18ed36871d41e440bdf62952275f43c899e1837e31612482fd4f47789ed517ae4bf2672eba2895d1b6a85e5d963e82cc77c48e57f17614a4ee7a1c85e78b96211b9af1d020030203a9d13c0eac03f4106dbe42d683140ed01c71965026d33ac38506cc0590b2ceceaf2a3cd648e16e0a1d4c105426719c2df8fb28c6749d31d1716854ef3548aff85aafef3175c5e49030715c00fc2506b7a79b3d933c72bb9ae21b97fcb67d5dc1811af6d5d9c412545e6ce7eb9a0362832dca982c4883b26bc9eb5f5af530535e7d216400578738ef04ef0871de73a26c112ec96a277c48e91f46d5385fbdfee248c6ee7c3a66a9f8e640b31922a840d9bfa0963116a9e97d84f9888882bdcb6faa12332997b7f5b83c7c75532216b6d4569e33bc6763785b94b98ec57d07573650e35e682492dd515e0a064d8958", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efc7f2ed947ce60905842026fdfe358c9320e35012deeedc83c1e19d2b677eba10a1fad0d93c82b66": "0x00000000000000000000000000000000085c0db244fc6960005482b5e6c2896bf2064efd1e5be17e851dc8139f839cf062d237627616a57f2897c778f501c919d17ea969251d6b46cae60ba3f01dc0c72f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efdb56e406bbd33003c1db08dfc6786bee3b0e1b4aaf51e80b6f2ec9badbe3da87d30ad7605a2bd16": "0x0000000000000000000000000000000008e34c880765bf4cdda6ab2045979a9039544bbae925cfba4d6421286296cd9bdcbacafb0ea22a692dea279a648b8cb44649ca71629f9fce6d69e03a4869cd9383", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efdbb17eb6b8c97966c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc128577898676": "0x000000000000000000000000000000001c38aa672a41872f698aa995f14f0bd9e54cfa4efd97350e742d68a0c44da377d9e1cbdb5c7c39209793cf71d71ccd0a5eec8ee530069837073032da3ec4a5a714ae3aba9a0f0d03d9fab3ad97a367fe66aba07ac0f7fc58d8dc18eed82f8c62f0a6f39c26ca691bd958706b03619b5579a313404e93089bafe5760b2a9db4b5518a989898ac32a8333eea5bebe65671f63fbae7c43756c21f8507be73a53941d1d6ea41749ba9fa1ea5fb094593de0726ce6c1ae997e000b3bbd66ef09298f92d5611f54264f980f8d850f4fd87ab8eb7e6c86b99b396f50d1aed3c5cafcdfd88", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efe0e61bb6b0e225d68170716ab7c6735dd0a1012045d9ea33891b5f6596cf97eb217d0962d86a518": "0x0000000000000000000000000000000008ccbb21d7b5bf0b08630681c37ebda5b98b5454c8916463a9c2b50262466deb76d44824ac8d1edecca67639ca74d208bd2044a10e67c9677e288080191e3fec13", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efeb09bd923dd400cca437639da37528d8edc0bb6b31966fdc0263218f4bd60c6f2cc37e963090371": "0x0000000000000000000000000000000004dc64ebe91ae1dd904651525eb5fd91eb0abf458cb0f5986158803e0075604153", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37efec4b60935b1627f3ecdb909643a31da23e3dec041ef8920632ec16fc5157297084eda7515badf68": "0x00000000000000000000000000000000043481012d5c43235dd891fea6f46c4745b4c6f9ae37e756f7da67f6af35831a23", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eff27f362e41c7ee9487d7703ee644d9a9b59ad29aa7f27405851496306f69678965f1d18d1478740": "0x0000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471400216b615048534c12bf9efdc9e4e25b4dd72c560029152b6546ba2fb62eca400d7edee7e5f36b5a": "0x040400000002000000000000000000000000000000000a447265616d62697a7a00000016636172697361676c61647940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714002e08e91d4d456f22f6f9f7bff5f160c25d09f3dda01266aa372084f68e73a49a6f75ffc0aad46a": "0x00000000000000000000000000000000001053756e7368696e654175746f732d5200001f4073756e7368696e656175746f736e6f6465733a6d61747269782e6f72671c73756e7368696e656175746f73696e666f40676d61696c2e636f6d0000114053756e7368696e655f4175746f735f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714002f96199afbb10962dc0af0a0af60196831c33ef674915a18dcb54ed293ac3733b128d0faa0a66c": "0x00000000000000000000000000000000000a72756274736f7631370000001472756274736f76313740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140044864097418a79480e2e9b103634bf32ba2c955634796a44cd1c6924e87b2596dc252a28383959": "0x0000000000000000000000000000000000096e616b757279736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714004b6e7aeec73523a6d28a83827355f149db71b1ffffafab9ecce641629c6aea5dfbbb9f4917b346": "0x00000000000000000000000000000000000862696e616e636500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714007dd9a9e7c493d87e8b716984392ac7a4282ae6ac5b35317dd2cf838cd9d388bad322bc11d3ed31": "0x0000000000000000000000000000000000076b7573616d610c72616d7a7920626164657200001672616d7a7973616d69636f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140085d1df7366a986ae8f7726520ba56f9153c9e7820015d462a71c6ea0035ce0fef5dfae0a98b228": "0x00000000000000000000000000000000000454656b010101010000094054656b69697575000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140093ec78bb21bfb2680407d00db6705819710e2f6dad5a89cad6a28b24c184126fd8d05476bd6202": "0x0000000000000000000000000000000000097368796f6f6e373100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471400ba2794d92fc826e4269547e0e9a8c162de9215bd45921be44dfb58ec95d2f627990d5189001440": "0x0400000000020000000000000000000000000000000010436f696e20636f6c6c6563746f72730000001a636f6c6c6563746f726274636574684070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471400cf4acd8af41f16fcdf10bdd1d597869ff3089a69395c153847bbe208b6b42c71edad958fa7442e": "0x00000000000000000000000000000000000541413248001e68747470733a2f2f7777772e7065746573706967656f6e732e636f6d2f000000000e405065746573506967656f6e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471400e0417f161433ac2658c2083dcab9b118b5e828fb81344c4245deb8eed43fa890c8c0ae9cae526d": "0x08000000000201000000020000000000000000000000000000000004576569095765692054616e671968747470733a2f2f746861742e776f726c642f7e7765692f10407765693a746861742e776f726c640f77656940746861742e776f726c64000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471400e44be06404dd23f621dca649d16a5b33c9955e6a09a5cf3a881b4185a1930a02c7fc3245ac3333": "0x040100000001002ca07d51000000000000000000000000000000000000000000000000000000085069636173736f00000018696e666f40636f6d706f7361626c652e66696e616e636500000e40436f6d706f7361626c654669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714014380e30ffcb2a672d2666b9ecf591f655d98e1800a37d63f454fc915cca7c6412cf55d98f43d67": "0x00000000000000000000000000000000000b476176696e20576f6f640101011c467265656b7962696c6c696f6e6169726540676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140148d7da0c4eece04cef024c8124fea94800b3d508aad0c474045b69144cfb3c24012bb915fedc10": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140167335afc9508e06aa2d675d46b5eeb0d922f4188b525daacb0091f6f31ce7d9409d45614eda803": "0x0404000000020000000000000000000000000000000020f09fa6854561676c65f09fa685207c2044757463682056616c696461746f72001868747470733a2f2f6561676c652d6e6f64652e636f6d2f0017636f6e74616374406561676c652d6e6f64652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714018d717cb9219f862cb783d5c0ddcccd2608c83d43ee6fc19320408c24764c2f8ac164b27beaee37": "0x04000000000200000000000000000000000000000000056b6174611041647269616e20436174616e67697500124061647269616e3a7061726974792e696f1a61647269616e2e636174616e67697540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714019d8773aba33ec5c48cbd210165097e4955ba0b35553db067e959752d454331835be646b470d15b": "0x000000000000000000000000000000000004426f4100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401b8e16c4ef5704b081bfb25dd99aed0b3d899820c722788535f82eb14cac2ed0adc9daa5a4fd72f": "0x00000000000000000000000000000000000678524d524b000000000000074078524d524b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401bcc09d733aeb61505e685f12b11fff499400211f38ea5a8cd9f1e72e9883b58fddcb66c563e84c": "0x0000000000000000000000000000000000055775766e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401c62b08e0f1d3292eb9ad501926b86b6c074a5a48bc16503dfc910b13e1ce2a8bc4440cca43ab2f": "0x00000000000000000000000000000000000e4365646f75782057616c6c65740e4f5549534c5920434544524943000013632e6f7569736c7940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401d4c9b3a23a716c824388cb8ad264b43a93320076e3f6690d707c3d1d53dd022a645c0127a78267": "0x0000000000000000000000000000000000095865726f6e696d6f0c4a65726f6d652048657272157777772e6a65726f6d65686572722e7370616365001867616e77656176696e6740666173746d61696c2e636f6d00000c4047616e57656176696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401dba54cb1c92c2856aa4370ee3d21b98ec19f0cbf2106a036215937a15bbe517b24ae5fef4d3870": "0x040400000002000000000000000000000000000000000a4441524b4c4947485400000016616c657373696f646f633740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401e3012609b6e0fe77b377299bb54afbbab70894a10e4ba1370f6a60914c8ed37f9b2484da37a335": "0x00000000000000000000000000000000000a4e4654204775696c6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471401e66931ebe7cc802a82fb6c3dd0269f6977b022fc3abfa2f1ed9783de2d7f26672b7eebf4fa783e": "0x0000000000000000000000000000000000057072657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140205d71cb9b4787812eeb34296344896ba0be07383211f262b76cffae3d00aa91d0c3d10e7abd37b": "0x00000000000000000000000000000000000769676f72656b0000001569676f7279616e62756c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140214f0b5b1672e56729f8acbb64cb60b5edb62beadc9ac05430ede0086e29800ee32d106befc7825": "0x0400000000020000000000000000000000000000000008416c436861696e0000001a6b65697468616c616d6272756b6f7340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714022078fbf54f7d762fa1b6d109d1876820d529c1a53f5e59ca5a05f01d8833439428e811aada3923": "0x000000000000000000000000000000000000000000000000114053717561644c65616465724d61726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140223d09f1c0c1ef00ce0bbe155c5f116187af43bae0bd493872f436a139e23d9b26289d0721a310e": "0x04010000000200000000000000000000000000000000094c6974656e74727900000012696e666f406c6974656e7472792e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140224acf1d46b915ca048e9318fe2e6a8b6f9174800c44caad3e44d22f92453d1de685afb39089e2d": "0x00000000000000000000000000000000000b54484520425552524f570b54484520425552524f5700000000000e404348414f535241424249545f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140224be9facd8c216c2ce97485afd4c6f5cc11da558f0b28b62a277fdb50d7bd0cf3d88dfed968217": "0x0000000000000000000000000000000000076175726f72610000000000000d40417065734e4175726f7261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471402273ab7613e5661d033ca16a330cf722e09b908a545818f8e2880a221d16d902923ada564b4b646": "0x040000000002000000000000000000000000000000000c416c4d6974726f7669636800000012616d40756e697175652e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714022895ddfaa9819ec423a2dd622f907c00dbf99e423c4e3c9e937684b6ac14fa49180637c6eed61b": "0x0000000000000000000000000000000000023d000000000000034071000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140233abfcd4caebc1fc8f0be99f1dc3c1bc20b122eb888761ffa281abc9783f910df8b57ffcf8b572": "0x0000000000000000000000000000000000095052494e434550530000000000000e405072696e63657073526d726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471402492b2d8deb67a91862b74508884386ca63e94959b33773bf0f1ba6e3aaba793e8975760ba19a21": "0x00000000000000000000000000000000000948454e43484d454e0000000000000d4068656e63686d656e5f3531000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714025081289a767e3f04b72fd6c91c2799dd0f0c74accd0e5d6dce0f665b5a175ba3fd80a122416078": "0x000000000000000000000000000000000009616c7068616261650000000000000d40616c706861626165313030000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714026bed6843025f8466357ad0e7451c02f6d53fa777f394c31cc2680c4a7cf448c48a91d78ecbc565": "0x00000000000000000000000000000000001150616e74686572732043756c7475726500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714026cd546f7bcbf83ecfa264fd1da282eeb7b06b8c7fd5634e9f5da8eb1163c79b789d943c310ed25": "0x040400000002000000000000000000000000000000000c53555045524455504f4e54001968747470733a2f2f74686f6d6173722d666f746f2e636f6d001774686f6d617340626966726f73742e66696e616e63650000104054686f6d6173525f537570447570000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714027f0a2e5771d1390ea95a5a9a64e338318cc9e38b07fb0dcf75e164f4b968d3b206296c2663e059": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471402a74f185bfd81d73ae9f951aef3bab402292d205c9ea5f850e5b80b563a9b5837ac40ad97c22469": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471402af845724d240cefea7e94482e6aae6ba684414c251845b33b1dbd8cfdc035959f4ff948089dc17": "0x0401000000060000000000000000000000000000000007636865657365156b6f6e7374616e74696e6f7320446176617269730000126279726f6e7333407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471402bc718576057bd5c0914fdaf5815ff54b30fe11a656cf17539b090c36d5f5650260b12a7b94a945": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f33390f62696e616e63655f6b736d5f3339000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714030bf2a06d3af7df887b2f85c74b58160bb1659de7f63e0dffb480a46f99afc1d1e4002a44aafa1a": "0x00000000000000000000000000000000000d4d6172696f506172736f726100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714031326492a87a9c14631954522a90e4361e6b9bb3876cf6213bac251f99d456ed4703b47f289b95e": "0x0400000000020000000000000000000000000000000008446f746361737400000019646f7473616d61706f646361737440676d61696c2e636f6d00000a40646f74636173745f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140318c1db47739db4d030ca0b2a60a30e7d1a0fec231f6f36c3b608036d25ff6b2b9ab9576d59c252": "0x040000000002000000000000000000000000000000000c5374616b652d517565656e00001840717565656e706572736f743a6d61747269782e6f726716717565656e706572736f74407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403195376b973a33e30b25a315eb8ea1ff57e39183ddb0a922cd08e2443e6fdf4cf28bbe34b103800": "0x000000000000000000000000000000000009736d6a756e696f720753616d65657201011473616d62757433363940676d61696c2e636f6d00000e404d61736b617261436869636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140323373f05a102e67e99b3bfa6f2df6433c885bb45dcdcaa0cb01dd07079d5e9b1f687714322672c": "0x00000000000000000000000000000000000c7374727967756e656e6b6f074d616b73796d000000000009404861636b733732000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140328eb74cc6d2a41402cc6cb8ec16b5648fbc7be76657e17291d855b4d2dfc98511586789bf6c01f": "0x04000000000200000000000000000000000000000000174b696e656d6174696b73204c61627320e29a97efb88f000000136b736d406b696e656d6174696b732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140351153466a702772a326eec0bd3f6db6e6a17ecc5ba726460ff351045fe63ccde53c971944aa84a": "0x0000000000000000000000000000000000056d75736801010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714035c8158e47e1177ceb5a9283e6ff1b5ae17a18181220657597cb476fbc726e2ca302d1e7a9f6d2c": "0x0000000000000000000000000000000000124b7250726f642053747265657420417274000000156b617274656c726f636540676d61696c2e636f6d00000c404b617274656c526f6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714037dbcdc8f46729a2cba024614ea8ccd1ebf7a634f30b38d65c082be6aaa92551b9c3b4d1f15ae6e": "0x040000000002000000000000000000000000000000000b5370696379205461636f0000001a73706963797461636f70657070657240676d61696c2e636f6d0000114053706963795461636f506570706572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140398dfc6cfa0cad07e7699082933c3da2328188e77d3ed6f0d6044e5b0e1a3cef907339b823fca62": "0x0800000000020400000002000000000000000000000000000000000e4d697463682d576172696e657200001a406d697463682d776172696e65723a6d61747269782e6f72671d646f742e6d696e6572732e736369656e636540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714039ea54cb812a324847194325a12bc4f4faacb6aef973eda31658195c26b934318b960aa69050819": "0x00000000000000000000000000000000000a73796e636c75622d330a53796e636c75622d33000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403ac99c30a0f9cefc87323333f6c7ed668bddfc05f00d058646f87df33589d4b3f3b2d159ce3e831": "0x0000000000000000000000000000000000074169204172740943727970746f204a00001561692e6e66742e61727440676d61696c2e636f6d00000c4043727970746f5f4a5f44000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403ba33ceedadcce5605ab29b9b1110fc5aecc4d1604862282fd58887d45e7b47a875901780a3103d": "0x00000000000000000000000000000000000f53686964656e204e6574776f726b135374616b6520546563686e6f6c6f676965731e68747470733a2f2f73686964656e2e61737461722e6e6574776f726b2f00156465766f70734061737461722e6e6574776f726b00000f4053686964656e4e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403bdc0558aef9e267eba793f6c8b72db5ccbba0972846a41dec11d3e62da13d9c09a868863f50848": "0x04020000000200000000000000000000000000000000085765623320564315576562332056656e74757265204361706974616c1068747470733a2f2f776562332e76631440776562332e76633a6d61747269782e6f72670b686940776562332e766300000d4056656e7475726557656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403bfd6fd4ef57fa5a0ad3e520332a754892d7a16de9de871b9f20e982d62a498b5d9c7e5f93d433e": "0x040000000002000000000000000000000000000000000653696f33340000124073696f33343a6d61747269782e6f72670f696e666f4073696f33342e6f72670000084053696f333437000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403ce064f38ae56473816e99372dd086042bb6bbe15f082d70849a371070675e3819980b50fbbfa6a": "0x00000000000000000000000000000000000f614861796c65796672616374616c074861796c6579187777772e63686173696e676672616374616c732e617274001b4861796c6579617274776f726b73406f75746c6f6f6b2e636f6d00001040616861796c65796672616374616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403daf1ed6a71ceeb484a68f3a30ab11bfdedb06f43f5bb9aae28c3caf66a67fe408efee66e7df46d": "0x00000000000000000000000000000000001d446973634c6f736572202850656e736976652052686f6d626f696429002168747470733a2f2f6170702e737562736f6369616c2e6e6574776f726b2f3633000000000d40696c6c756d616e61743333000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403e65d4ca28086078c2625b0e10c7bf65f283c576878cf00f67478d3dbb6bf39ee62b3ca19ce893d": "0x04000000000200000000000000000000000000000000117061756c6f5f5f7a61676f20f0938582002068747470733a2f2f796f75747562652e636f6d2f5061756c6f5a61676f595417407061756c6f5f7a61676f3a6d61747269782e6f72671c7061756c6f6372657374616e697a61676f40676d61696c2e636f6d00000d407061756c6f5f5f7a61676f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403e9f523ac424d6258c88b6777d3a1d2f2dd03cfd6f3bc37634380b273fa9e3fe2cf0927a39a0411": "0x0000000000000000000000000000000000074b6f6f6b694300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403fc9979d20d8f4376e282d7a7eef593fe7a9a8c5d08a21f134e8858e1b1753bf347057c4db9b234": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403fed7fe7c184ba490bd3d091b8837f2f41c38b6e3bebd28a31ee280f82d15e687f95d798ef41c17": "0x0400000000020000000000000000000000000000000008457a696f52656400000015657a696f2e726f6a617340676d61696c2e636f6d00000940457a696f526564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714042590a80582f1a138a93e60974816d78c774a853979d3327de0e119fe2606d11d8de3d13bbd0d17": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714044f0e81770d2fe4d42eb2efe47dd6c0d5587693d706b6ff988e1fb289c21afb1099c3eede2ea543": "0x00000000000000000000000000000000000e484f5420434150554343494e4f0000000000000d40484f544b50554343494e4f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140454cd0bd8fd07803ec587860fea3a47649fef7bdd6be7786fbcbffed789f454b52613b22358850f": "0x00000000000000000000000000000000000e42617261636b204b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714045dc4c6b832bb9cba718c7f73c24fc4bb006f6aee231c6764560a69f5a8c2d6bcebeaf59b886836": "0x04000000000200000000000000000000000000000000097468656775696c64000000197468656775696c64736f7572636540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714046409e5f145bc2af4f95e82d3eeecfde0058a399005262a9709101ddf3f2a564ab34040678ece15": "0x040000000002000000000000000000000000000000000b574542332d535041434500001740776562332d73706163653a6d61747269782e6f726714696e666f40776562332d73706163652e636f6d00000e40776562337370616365636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714047021104d1ffe0a329c95d5190b434b204b6ed49f23129aeea1cb38f70aefa1af621b4c01d48311": "0x000000000000000000000000000000000010427269736b426c61636b4d616d6261000e636861696e677572752e61707000127061787375726640676d61696c2e636f6d000011406c6f6e67626f61726466616d617261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471404bafd1de148721f84bebc905613c15b1464d94e00068be0a67edfb4b274b180fa00573e4a41656e": "0x00000000000000000000000000000000000478666c0878466c5f446d700000000000094078466c5f446d70000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471404c7c5013bc5e632ecfe133cb8a7eb6248a79ec2838c5982a3996db0c69c8427dc1e4ca3fdb0732a": "0x000000000000000000000000000000000014f09f90b2204b7573616d6120447261676f6e73002068747470733a2f2f6c696e6b74722e65652f4b7573616d61647261676f6e7300186b7573616d61647261676f6e7340676d61696c2e636f6d00000f404b7573616d61447261676f6e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471404cc90b988a75711683e24f78a248b20b2c8805cae1d228c1140da7d15f2d92c91dee43da6df3642": "0x040100000002000000000000000000000000000000000e54656c6f436861696e5f4144561e4d617263656c6f2050c3a972657a20646520417263652047c3b36d657a1768747470733a2f2f6269742e6c792f334d6863375573001d6d617263656c6f40636164656e61626c6f636b636861696e2e636f6d000011404d617263656c6f506572657a446532000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714050595b2a27bff0328bc337a98b458dece2c080a545fe7eb38ab06f7a26b9dc576357443285b4c79": "0x00000000000000000000000000000000000a326e64736861646f770f457667656e792042616275726f760c73756273717569642e696f0014652e62616275726f7640676d61696c2e636f6d00000f40657667656e7962616275726f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140505df941b88d8a60a725e79b9b6933c684a19923c69eb95ed2bf60a37f418e276a4ecd9d80d8961": "0x00000000000000000000000000000000000a50796d2050726f6f6e0000000d6c656d40726d726b2e61707000000d40416c706841697264726f70000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714050b93a25349a94f32694dc2fe7ff7637b26f93f51636ce8beaf128eb4bcab5297d13dbe555d2830": "0x000000000000000000000000000000000008414c207c2053490101010100000a40616c617a616b7279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714051fe135342851ed0ef762dfeb3c0cc556212597df740eb320ad5b10e526a93e1aa32df8dc3d8c44": "0x00000000000000000000000000000000000f43727970746f42726f436c61726b000000000000104043727970746f42726f436c61726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140524d45908638528248a8784f67eaab3daede6b3367277040f38ad93339171253c1698daccfb4f6d": "0x00000000000000000000000000000000000b4e4f42554c4c534849540b4e4f42554c4c53484954000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714053f986ef1b208a2629a4497433e01dc77b48378a2c9f90059f5a6386c4d0042fe1c9751cd29bf21": "0x00000000000000000000000000000000000847696e6f4172740547696e6f1d7777772e696e7374616772616d2e636f6d2f67696e6f6172745f372f001467696e6f617274303740676d61696c2e636f6d00000b4047696e6f6172745f37000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405536af493f9e4a9c29f38d97fc79f3c60343d96cf6cd3e334fdf03987c50a7fd788ffed2a5ec928": "0x00000000000000000000000000000000000a43727970746f4a616e10616c656a616e64726f20757269612000001f75726961616c766172657a616c656a616e64726f40676d61696c2e636f6d00001140416c656a616e643437383530323535000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140556a86b11fa77913c7f40746d04d77628d886dfd469c9bf606232dedaa248f5c219d32da93f4054": "0x0405000000020000000000000000000000000000000014f09f8fb5efb88f20464c4f5745525354414b450c466c6f7765725374616b6500001b666c6f7765727374616b654070726f746f6e6d61696c2e636f6d00000f404265466c6f7765725374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140557741ad8ff629b30ada415c8cc022b6ae05febe4df84af44b09b542490887b11ab3df04714bf2c": "0x00000000000000000000000000000000000864697374616e6b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714055ca836acf0447774422321a842adfae9419ecd3983c4fa2da6e879ccc1db031e54c742bbb9bc03": "0x0800000000020400000002000000000000000000000000000000000b56414c49444154484f520000001576616c69646174686f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405600578c1e1169728b2f7bef7da67014627c1f7e36683afc5a9b1a9e071570065dbee9eac414b03": "0x00000000000000000000000000000000000a6b7573747261646572000000146b757374726164657240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140573bb60d22fa77e98bdd9395e86f4d48a442f70fe2513fd3fe0cdc7e95105ced193ba2666c8fb41": "0x04040000000100902f50090000000000000000000000000000000000000000000000000000001c536f7665726569676e204e617475726520496e6974696174697665001c68747470733a2f2f736f7665726569676e6e61747572652e636f6d00197061756c40736f7665726569676e6e61747572652e636f6d00001140736f7665726569676e6e6174757265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714057502993decae27be3d23293857895d14cd4b30e1823365792d89c77776b238e4d883e8d2261338": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140587e6d391ccaa424c44f3e63cd28ea42371fea311f977e701ca31749ec7d0262461bc41591d3607": "0x00000000000000000000000000000000000e44565f4d6f6f6e686f6c6465720444616e00000000000a4064616e6d636b3138000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714059bc9cf5ceb19d4b2801b3240cd70a56baa1aab6d2b26252bc804c254f8e2942d365e3207b46a6a": "0x040400000002000000000000000000000000000000000748554e5445520e48756e746572204569736c657200194068756e7465726569736c65723a6d61747269782e6f7267156b736d4068756e7465726569736c65722e636f6d00000f4068756e7465725f6569736c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405a60c9d4c41f598de9d02d7d5447ea749e3c33f38033ecbdec8f4ad6abb3f0a17d6023db1988b1a": "0x0000000000000000000000000000000000064a6f65205100000000000009404a6f6571753135000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405b079eb94353bd94adf51a47b72795366d52285e329229c836ea7bbfe139dbe8fa0700c4f86fc56": "0x040000000002000000000000000000000000000000000e536861776e2054616272697a690e536861776e2054616272697a6911736861776e74616272697a692e636f6d1f40736861776e74616272697a693a6d61747269782e7061726974792e696f17736861776e74616272697a6940676d61696c2e636f6d00000e40736861776e74616272697a69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405b5d46c57dc301d8c99cd908a45bb7973537ce461ff349904f6b3176ca9f594a2e83d720e09cf72": "0x000000000000000000000000000000000002520252000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405d31d1ec885004a5a6e6d7f1f5af2300c1b721cde7f08238ffef321bcb45cce819b00557fdedb00": "0x080000000002040000000100902f50090000000000000000000000000000000000000000000000000000000f507265737362757267204c616273001a68747470733a2f2f7072657373627572676c6162732e636f6d1a407072657373627572676c6162733a6d61747269782e6f72671d7072657373627572676c6162734070726f746f6e6d61696c2e636f6d00000f405072657373627572674c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405e3f970c23ff63cb85d101c656fa86dc284f34f7583b5f178d9e9b619df6031fe2c04b4c5f07e26": "0x040000000002000000000000000000000000000000000c414e47454c20535441534800001640646c697365656e6b6f3a6d61747269782e6f726714646c697365656e6b6f40676d61696c2e636f6d00000b4044796d797472696934000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405e501157aa27fcd22240cd28aac3cb675651ddee8045f1fdd5d532c2b149e3e68b0b8f606b6e075": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405e51ec513573d8d8eb71ee062ea6e33ef20d8ece22607a4ddce26104535141b562a84f31124256d": "0x040000000002000000000000000000000000000000000c4d41582d524557415244530000001364757a6972796e6140676d61696c2e636f6d00000f406972796e613235313432303332000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405eb675fee1282900e6bd67d5dfccc6180a5ad07870653d1a8a57ab09efcff251a49c234b649f423": "0x00000000000000000000000000000000000641694172740000001861692e6172742e3432302e363940676d61696c2e636f6d00000e4041495f4172745f3639343230000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471405f8e083dda4d67b66e0b6ed9ffcce16a6e8a77fad73f6029f289139229a359380384929ba8d093a": "0x00000000000000000000000000000000000a524554524f57415645104461767964204b686f726973686b6f00001a64617669642e6b686f726973686b6f40676d61696c2e636f6d00000a40646176615f6b3230000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714061c4dd514901839c0cca7d600db0542f7d46a623c53383cb24ee7ef9122c5b42a5f63551c054438": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140635da251fe445574e449bcf3a54b723c9897abf182e125d472242d1ef0676052fbacfb900b9a044": "0x0000000000000000000000000000000000165370756e6b42697420537570657220536861726573000000000000104074686567616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714063f98a01f914d5d7634ddf79f2e749774d401cf31cc4565da1627f6857e2bb5c29a219121512068": "0x0000000000000000000000000000000000066368696c6506456c656e610000146c656e6172696f343740676d61696c2e636f6d00000c406368696c6c655f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406464a684f7b7a0d1c6681030fd4860fcfc1dfad9ae55fc0181229b007b6365dc4c8f5fbe162554c": "0x040000000002000000000000000000000000000000000d45786f746963205374616b65001968747470733a2f2f65786f7469637374616b652e636f6d2f184065786f7469637374616b653a6d61747269782e6f726718636f6e746163744065786f7469637374616b652e636f6d00000d4045786f7469635374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140655181280220c8b6280b912d54001e1ac0bbc1023ba9a16974a6c23d22e817e97d418ea94d29642": "0x040000000002000000000000000000000000000000000946726f67f09f90b8001968747470733a2f2f66726f677374616b696e672e636f6d2f184066726f677374616b696e673a6d61747269782e6f726715696e666f4066726f677374616b696e672e636f6d00000d4046726f675374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406885e6b6b0cc106068c252ec614ba3bc04e729d590bf21ce3b82ebd4285b8319fc56536027d1460": "0x040000000002000000000000000000000000000000000d3036312e6f6666696369616c000000173036312e6f6666696369616c40676d61696c2e636f6d00000d403036314f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714068a83f6750959f2b4af44560bd1a1aedded0deca4f3a57548b4b70d63f69c7fd16b41f6599b7f75": "0x040000000002000000000000000000000000000000000f54656e7462616b657273f09f8db0001768747470733a2f2f74656e7462616b6572732e636f6d0017636f6e746163744074656e7462616b6572732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406962b7186669a025e5f430170298c557cedc08e8f2b688e59bc2a7e081a6467eb7a0b7b5ba4c90e": "0x000000000000000000000000000000000004766c6405566c6164010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406982ce1b07dde21ce8ce1358c0f5ab2618e38a9c853948c51bcf3ad550f7d65af1cd03f959f2843": "0x00000000000000000000000000000000000b6a68656c657a6e6f6666114d616b73696d205a68656c657a6e6f760000176d2e6a68656c657a6e6f666640676d61696c2e636f6d00000c406a68656c657a6e6f6666000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714069b111e5a0fe7089a8260623bc5831d8c2b343584a77007782cf231f8063e2caa2abb4ff686c466": "0x0000000000000000000000000000000000195361696e742773204469676974616c2056656e747572657309437361696e743032000014637361696e746e303240676d61696c2e636f6d00000a40637361696e743032000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406a51bab8ef99a0b50d987e17e9e6d29755219eaaf922c92870657adbba3a3d0208e30b0e9651c38": "0x00000000000000000000000000000000000f412047686f756c20456469746f720000001c6167686f756c656469746f724070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406ae29fcb31f2504fcea4f4585d2d271139edb4c75a70445cf84063d0b7a05955af4620daf56e238": "0x04010000000200000000000000000000000000000000075855414e5f32000013407875616e39333a6d61747269782e6f72671b79616e676a696e677875616e6d61696c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406bc1957793c67e8d2f05ac62ec209254a2796a6e45f599195b90fb78de0c915e2b49d557332d56f": "0x00000000000000000000000000000000000d4e696b73696b66696b73696b124e696b6974612047656c79756e656e6b6f217777772e696e7374616772616d2e636f6d2f73696d62616c696f6e735f6e6674001667656c79756e656e6b6f6140676d61696c2e636f6d00000c4067656c79756e656e6b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471406fef9da176fe6b5504f8379d55a37d9b91937eea092e2d74d85bd1894cab557bd791b92f47dd566": "0x00000000000000000000000000000000000e4c554343494f5f4b5553414d4100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140703fa0ba498f4c1d6aa353e69dd58d0298d9d5cc2000b0b279f90e3d6a8e80de5932e3f1e300b06": "0x040000000002000000000000000000000000000000000c456c204c65c3b161646f72000000166d6676617267617339363640676d61696c2e636f6d00000c40656c6c656e61646f725f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714071aba1c4fbe2c7afea2b3bd4635b227539d7b4894ea4b09eccc01acd424d4e811b2dbff5670f726": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407215386cd0fce6716c95a9cdec3df8ff80ca21d4c9f8fec3f4c7c9fb940e0ac2d1f8bf486acd35c": "0x0401000000020000000000000000000000000000000008677265656b647810496f616e6e697320536f75726469731e2068747470733a2f2f7777772e616d706c696679676c6f62616c2e696f0119696f616e6e697340616d706c696679676c6f62616c2e696f00000940677265656b6478000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140737c7a9c60b7040b26699df67dfb10499cad602d1eb7680109097abc955427dac056d4ff0915757": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140760d903221d52a2d6260d36b4f57d17c0d1214f67f51ad72b44ca6a5b28b267a057df44a4ffc75b": "0x00000000000000000000000000000000000a7468655f766f6964790000000000000b407468655f766f696479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407628049f99bf7d7a46c0a25bedc15be8fc45d5d9bf710247c4cd6b7478ac3d71f71e67937522e15": "0x0401000000020000000000000000000000000000000009417661204c6f636b001468747470733a2f2f6176616c6f636b2e636f6d00146176616c6f636b406176616c6f636b2e636f6d00000d40617661756e6c6f636b6564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714076a68a64b11f79daeeaeddfdd71854dd03402c966ccc5daa5c3afa196f2591dfc22ccf263f77503": "0x00000000000000000000000000000000001154686520496e7641726368204d696e74001968747470733a2f2f696e76617263682e6e6574776f726b2f000000001040496e76417263684e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407715dc9ad8895a8e898988dda904df740a306d0c786ed5668d1344720b102be91a3956bd480f35b": "0x00000000000000000000000000000000000a4368696e674c696e6b0101010100000b406368696e676c696e6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140798b555f15705031ed39a4aa544b98ebd1243abe6264730ea0921edd5e279e2c7c5f136bfda7e4d": "0x0000000000000000000000000000000000096c65696265727479000000167261792e6368693731373140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407ad6e0f21f25f78887ddc26a5efdc1bbd8bdf8e1051dc07279de6abf830bad4998e44d848812458": "0x00000000000000000000000000000000000b4b7573616d612043585500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407adcfcd16f835d4b2bac0ce6ae2d74d54b020ec4f2ced833d9d9367ce9b44fd03c47b2955449e03": "0x0000000000000000000000000000000000076d61747379730f416e64726577204b75646c657373127777772e6d61747379732e64657369676e0015616e64726577406d61747379732e64657369676e00000e406d617473797364657369676e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407c7d38f8167b3b8ea868dc748fec06ebc5409c01d3a3445b49ff65f9df353a5f6a45582eb001522": "0x000000000000000000000000000000000006646574306e0000000000000e40416c656b7365693032303231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471407e3699c0690de378835373096d1ba3d43eab5289f28507faf3f5b7c7905cc2cace9903bea43154d": "0x040100000002000000000000000000000000000000000e5354414b494e4744585f434f4d0e5354414b494e4744585f434f4d1668747470733a2f2f7374616b696e6764782e636f6d16407374616b696e6764783a6d61747269782e6f726713696e666f407374616b696e6764782e636f6d00000b405374616b696e674478000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140823dc59ec2f7a204eed7cf3f4f6560d58db4eb78bd24b655bbd1d7a5c6b454e77c8dc5e2721a54d": "0x04000000000200000000000000000000000000000000164d4f4f4e204c414d424f5320f09f8c9520f09f8f8e001768747470733a2f2f6d6f6f6e6c616d626f732e6f726717406d6f6f6e6c616d626f733a6d61747269782e6f72671976616c696461746f72406d6f6f6e6c616d626f732e6f726700000f404d6f6f6e4c616d626f734f7267000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140832e37ad433bf330093c7603ddb81760e5c90ba6c0fde51812e18e6cc14121c081f5a573a868142": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140842535831df92d1f47c8e560ea22d951dc1d11f507e03cf84d24b763ac809f65b0cc96a38f0152f": "0x0000000000000000000000000000000000066f7a7a7a6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714084526527aebc960f46d9672ffd7ed18f87db293545cf8443b938604cdc750370efa50af4d74e603": "0x0000000000000000000000000000000000074a2d54686f72124a6f6e617468616e2054686f726573656e01011c4a6f6e617468616e6a74686f726573656e40676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714085391a2cae90f2cb0ad422a668631d7e1deca3ff382cdba5899815abaa63f1d3a5c41ea5be4b930": "0x0000000000000000000000000000000000075a414942554e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140857cb9df490db87c8e9e95dcbc6b16730ff59ea5883c581d9a8468c6c9a8491282d765dc79e8b07": "0x00000000000000000000000000000000000f527873747564656e746c6f616e730000000000001040727873747564656e746c6f616e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714085aa13b537671b97ced45565a0da076fdffafc5b516479c72f4ad5c4a932ca1656b029bb79f8b61": "0x0000000000000000000000000000000000204d697373696f6e20436f6e74726f6c207c20436f6d6d756e6974794e46203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714085fdbb7e912dd07e2447f4fc17d2e0346ff5033dcfb1125d965384a3f2dc1ef86ced9346f8bb942": "0x00000000000000000000000000000000000f53757065726865726f2048656164000000000000104053747564696f536b657463686572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140867cd2096d96b96ea6a0804e0024beaa87fc072eb250446162310017e52147d18fada54a8ddb57b": "0x0000000000000000000000000000000000094e6f6465706c7573094e6f6465706c75731468747470733a2f2f6e6f6465706c75732e696f001268656c6c6f406e6f6465706c75732e696f00000e404e6f6465706c75735465616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714089158aaccdbbbcd36061b78bcd9eac1f33933dae70291680fa0718170cf24431cced2274e8e2916": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714089745272fb1fb5054bbd380dcf112ebfe5500ce634b45349943063e90651ab0ccd0eaa53baaa27b": "0x0000000000000000000000000000000000164576726c6f6f74204f6666696369616c204d696e74001868747470733a2f2f7777772e6576726c6f6f742e636f6d00116c757575406576726c6f6f742e636f6d000009404556524c303054000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408a50dd1623e5808bc8299cd873cbc489fb2b4f86c0220fb82bcbe6f87c419d4f82e258fbb11f11a": "0x00000000000000000000000000000000000f4b5553414d41204b494c4c414820000000186c6567696f6e2e6d616e79313140676d61696c2e636f6d0000084037333631304e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408afdf9f47614de486c987ce4f2f3af1bbe573bc5062e0d9369142d2f941758af4f5069e93ddaf42": "0x000000000000000000000000000000000008656c6d6965646f115061626c6f2056616c646f76696e6f731e687474703a2f2f696e7374616772616d2e636f6d2f656c6d6965646f310017656c6d6965646f776f726b7340676d61696c2e636f6d00001040656c6d6965646f6f66696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408b12c769aece86816433ddf1a483df91e588d4f5c677d25e99ee2144a6dc2e8bf38df8ce0970156": "0x0000000000000000000000000000000000054c6f707000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408b34e7e2acff7a2e2fd73bf97986a65ab0771df0eb3bc9fce592a2579562834f3e58ab28c760422": "0x0000000000000000000000000000000000084d696368616c5a0f4d696368616c205a61647562616e0000137a61647562616e6d40676d61696c2e636f6d00000f404d696368616c5a61647562616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408cc79e8d56c8beb7c88cb63517049b0569ba773b2cd7be3dea4c7c88340ba5f31c7bfa2e847f65f": "0x040000000002000000000000000000000000000000000b57617465726d656c6f6e00001b4077617465726d656c6f6e6e6f64653a6d61747269782e6f72671a77617465726d656c6f6e2e6e6f646540676d61696c2e636f6d0000104057617465726d656c6f6e4e6f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408d021ac78f6fc34ee1605fe949a127bc198df93f5fc6e420168e5656d28770d0e9e9402ac842c51": "0x000000000000000000000000000000000010486f706566756c204f66204e46547314486f706520446f726f746879204d75727068790000177468657275676761626c657340676d61696c2e636f6d000011406b6576696e6d753736333333363831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471408fadc8547f2d84d901564894dc37fb1719defd3063b29e6496544b7362fddece74fe06c88baad18": "0x0000000000000000000000000000000000134d6f726f6363616e20747261646974696f6e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140911084e9a4894bcac99f396388330ea1200432287395014e1bfb65195705130193212c656481e2e": "0x000000000000000000000000000000000008746173685f327300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714092d9c51c43937f55ecd23f062fc8fb0405c798c00b5759f52bdda38ebf10bbc464c757686125236": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140932ed16a6ce31dbd08450b51426556a9e61b8e928b97c6075d95cda58b433fdfca36a2b69d9766b": "0x00000000000000000000000000000000000d43687269732043727970746f1243687269737469616e204361726d6f6e611d68747470733a2f2f63687269737469616e6361726d6f6e612e636f6d000000000d404348524953435259505430000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714093c88d361b492968e76c9299f5a2046beaa5266ac0ef8b7b310c929704f15d8e6657b371302202d": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714094ca67c6fbadcea0ca2923ab15eaad6a04c929078d754253249227ad18927018f0a2c3be0fa5621": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409621844aea6b395108a708f579783ecb399a6e3f7a67b997440e4925737e9bcecbc49558d505d5b": "0x000000000000000000000000000000000005646f7431000000186661726d323032324070726f746f6e6d61696c2e636f6d00000840305f6f705f71000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714096c13bcbcb0791226104ba050f385c19450c62d2adb3e9deabed8783eee0059d582ff8918c03b10": "0x040100000002000000000000000000000000000000000d456c64726f6e20636861696e1d416c626572746f204761627269656c20546f727265732050696e746f00001f616c626572746f313640636164656e61626c6f636b636861696e2e636f6d00000a40416c746f625f3372000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714097cc1943b09bfaafc155a7f9fa6dec3ed3ce1edce6adabc9c0d1f3a9268ed34d499958d72dd6e22": "0x00000000000000000000000000000000000f4b7573616d612053686179616e3100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140997afed24646842ce9d61eca43a43e6bfec323df5c1e7084c1281161b82edb584027649766ef73c": "0x0000000000000000000000000000000000054e696b6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409a23974df7b0430c6038c7457c93db81c307499774a52b6e0a6915c040f1496c9baa6efe15b9704": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409b0fa30b4583caec82fcff0545821a3261f43a4956d1bec8f73ff13cec3c5e6d2788b27b7403547": "0x00000000000000000000000000000000000969736162656c6c6c0969736162656c6c6c00001945647a7a6131323334353637383940676d61696c2e636f6d00000c406c6c6c69736979616161000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409c590716ba75942788dc4de3ced2049b97d486b9fa84c1b4b442bc85ec2cf6dd67629f689a1cd72": "0x00000000000000000000000000000000000e50535943484f4e41555449434100001840707379786e6175746963613a6d61747269782e6f726716707379786e61757469636140676d61696c2e636f6d00000d40707379786e617574696361000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409c71da7f0f4f7aa98edcae85e6eef98ba192a51fa0efd89aac0541fa264d46adc9d8f29d3e21047": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409cedc84fed5609d6c1c40574832dee06228c10e43537fe6b3bc4cc78cdb7d34d1586d8904d8fa7b": "0x040000000002000000000000000000000000000000000447696f1147696f76616e6e7920476f6e676f726100124067696f79696b3a7061726974792e696f0e67696f407061726974792e696f0000084067696f79696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409d05f5fb1d062ad503551a752e49ebef1b6988ee561cbbfe0f442a56fe624a58ae80ff3b3b9cd7d": "0x040100000002000000000000000000000000000000001f45617420507261792056616c696461746520f09f8db4f09f998ff09f96a5000013407978313178793a6d61747269782e6f72670c4f5456406570762e6c6f6c000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471409e2ab1c6ac2e7039041c96d3710d0a1abe9f550306f252e363a81d717eddae45201284dd8538842": "0x00000000000000000000000000000000000e526f636b585f4b7573616d613306526f636b581268747470733a2f2f726f636b782e636f6d0012737570706f727440726f636b782e636f6d00001040726f636b785f6f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140a4afe501add7d8e2a9ab96177cbb3a9002cc0f132d4226537b14469ef685792839f47f15971d047": "0x040100000002000000000000000000000000000000000b5052494d455354414b4500000017737570706f7274407072696d657374616b652e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140a5ed2dc88d315840e534d4d97bb282068c705fa51611698a6c6680ded8ef9ad9e3ec644a4a1691e": "0x00000000000000000000000000000000000a57656233204368656600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140a7a36431e6bf788600e047c97181ac8d0b9d5a6372f6018f556d68b2b4cdb529d87da365f718d40": "0x040000000002000000000000000000000000000000000b554c5452414e4f44455300001740756c7472616e6f6465733a6d61747269782e6f72671976616c696461746f7240756c7472616e6f6465732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140a847e530cdb1c2e56217b7de1cc11317965e5fbbcd5befc40472e060042a6f69bf1aab0d2f08632": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32320f42696e616e63655f6b736d5f3232000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140a875f4d26e2532608676ec0e77c681fb1f96768ff752f535fce573b540abd2415087938e1c44456": "0x00000000000000000000000000000000000d4d61746861642040524d524b00126861647279736d61746575737a2e636f6d001b6861647279732e6d61746575737a383640676d61696c2e636f6d00000f404861647279734d61746575737a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140abb2bf22ebf7bae9efc577205550c1b254ff059895120f132de3e3b5fe0b9d22370e116257c0659": "0x00000000000000000000000000000000000f4b7573616d614d696b6520322e300000000000000c404b7573616d614d696b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140ac3c356396cc02a160a6f4320d23a7715715fce96136dfa55616525f135a9868bcf1ba6f11acb25": "0x0000000000000000000000000000000000096e6674787469666600000017746966666465717569726f7340676d61696c2e636f6d00000a406e66747874696666000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140ac7b83a778623410cfc58e61cb62c25fc3f45a56005f7b6cec22fe84eed6ac7c8992ce3209ab024": "0x00000000000000000000000000000000000a42756c62617361757200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140adcc02215ec15f4def30af11d3d4068f7418b757cd81b67176367423f5ea96868fe398290ae2669": "0x0000000000000000000000000000000000094b534d5f4d4152530c4d6172696f2052657965730000166d6172735f39323036406f75746c6f6f6b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140adfdac33d62d66a58e7e4aec9b2e494e77ea7aa2ba910d82923c91adf3c4a85cd912a16fa7da527": "0x0000000000000000000000000000000000105061727454696d654c6f766572585000000000000011407061727474696d656c6f7665727870000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140aeb5541d86b4845cc2f2f205d3d20d5a1f879ca5c20dc701fc9ca9aac3a17cfb7cf9527e2dcdf49": "0x040100000002000000000000000000000000000000000966726573686665720f4665726e616e6461204f7274697a010118656c656374726f2e6665727a6140676d61696c2e636f6d00000a406672657368666572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140afdef9f452d50b7c210bd52d3613aaeb1a76e1927e26284338d1ebab34b6b6f1208c7de97099b2c": "0x00000000000000000000000000000000000f4a6150616e646173205371756164094a6150616e646173134a6150616e6461732d53717561642e636f6d00186a6170616e646173737175616440676d61696c2e636f6d000010404a6150616e6461735f5371756164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b168c54499a2304bc97fbd07eff9c15a64279ab2c35c3c9aaa0e2c6ac35e2447dce59a7d528cb62": "0x0000000000000000000000000000000000044e454700000013646e65677265613940676d61696c2e636f6d00000a40646e656772656139000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b1bb76cb1a645af0ae6793d3b38c6903b70523d5a93579a7800fa29644ee67224b1b42792178c0c": "0x00000000000000000000000000000000000b737566696479616e6f760000000000000c40737566696479616e6f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b28cb00eb8fb1c6366e5d037b1dfbaea9aca8c05fa5e5d36147fad2a2ae114e33379a6b06bdbd54": "0x00000000000000000000000000000000000f676d616a6f722d656e63727970740f676d616a6f722d656e63727970742168747470733a2f2f6769746875622e636f6d2f676d616a6f722d656e637279700018676d616a6f72656e637279707440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b2d46548eb3753ccc96f77c66f0b96cfa65755b8d15bf9de55e014725c696d4f8e385701633b415": "0x0000000000000000000000000000000000064b6177696e064b6177696e000000000009404b6177696e4d50000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b3a777104037709f221049df41595b4296f7cdf47a38b5b7c3187f9cad55c48ad60277ec92ce869": "0x00000000000000000000000000000000000a73796e636c75622d340a53796e636c75622d34000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b490dd7c2add7ac567e17eb14c080fb53b263d9e08ed4259b3da6bfeacb088f3476752540b8f909": "0x00000000000000000000000000000000000d4172746963204b7573616d61001968747470733a2f2f61727469636b7573616d612e636f6d2f000000000d4041727469634b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b4bb8bd516529ad1cb12b2bfc64acd31cdd6d603e4d2752f952ce53346f87155acfdfd3f5d32304": "0x00000000000000000000000000000000000c4465782d53747564696f7300000015696e666f404465782d53747564696f732e636f6d000011404465785f4172745f53747564696f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b5975a00e39357f7e6df0b6f8d257074021c3bf045f9a74c020908f462edae423b2af34ddcaae10": "0x00000000000000000000000000000000000b43617374656e72696b6100000016707269636875646b61303340676d61696c2e636f6d00000c4063617374656e72696b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b78efadc03e987f66241b171bd08521a33dc807061373a092faea04252f58b70792e7c7ecfd500e": "0x00000000000000000000000000000000000e4b7520436f6c6c656374696f6e0000000000000f40636f6c6c656374696f6e5f6b75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b83cb57ee6e53be78277862099de58a7be0c6472923086fc92cd75c12beb02fe9fdbe0c8411b409": "0x04010000000200000000000000000000000000000000054d616b73000019406e6f6465732e6272616e63683a6d61747269782e6f72671b4d79726f73686e696368656e6b6f2e6d40676d61696c2e636f6d000010404d616b73796d3630343130343331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b932747c4dc16804e89698cf8e1e4062df1e6994e7491d1b05c22908a4131a57bb753bebd99d82b": "0x00000000000000000000000000000000000b576562332047726f7570001868747470733a2f2f7777772e776562332d672e636f6d2f00116a6573757340776562332d672e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140ba79531536753bb707c94e3ad62ed919cf1eebeffe3381161c4daef849a306d698539931a08ce14": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000e576f6c6645646765204c61627316576f6c6645646765204c61627320507465204c74640000176d6f68616b40776f6c66656467656c6162732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140bb2cf3340206487cc03adeb1111b9cfc802ef169d0629ec766a2588ab7609ed7363ce19e584ee5a": "0x00000000000000000000000000000000000552616d7a0552616d7a00000000000840307852616d7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140bb6f52935e1627fb8293604e2a0be96865b68a39d42cd4f5d53fcac3ac44ef060158ff7702aa419": "0x000000000000000000000000000000000009536c756d646f6745011d68747470733a2f2f70617472656f6e2e636f6d2f736c756d646f67650101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140bc06185ac12eb70fece00a202f0832dbb17324ef664cfbd18ce6b0625fca47f0931f0d7785c7445": "0x0000000000000000000000000000000000135275746765722076616e20646572205461731052757467657276616e646572746173187777772e72757467657276616e6465727461732e636f6d00000000114072757467657276616e646572746173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140bcf942d23af458454aa43748f98be9e3704f9a2a95cae73b3b03724b19cd79ec06f383b2daffa2f": "0x00000000000000000000000000000000000c6d6f726964696e2e657468000000166d6f726964696e2e65746840676d61696c2e636f6d00000d406d6f726964696e5f657468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140bf3579ecdcacde0362f7ac49028175d12576f48a1cef9e71c533ecd9221237c772132cbf5168342": "0x00000000000000000000000000000000000f526963682056616c656e74696e6f0000001a776869746576616c656e74696e6f6f40676d61696c2e636f6d00001140526963685f56616c656e74696e6f6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c100cc5eae89342e659339aaaf44f9871d9a42595bece9cc446cc4dc321dcb30c798332a5780846": "0x040000000002000000000000000000000000000000000454555a0000164074757a2e70657465723a6d61747269782e6f726716613935323435313430383940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c2040d8da8b2f132053de39c4b63304c65a0cc0d93d1b81537a4ea78be0e09404dc74f3ee8e276a": "0x000000000000000000000000000000000019506f6775657a636c61702d506f6c6b6461646f747b4a537d0000001f4d724b69747479536179734d656f774070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c230db7b4eecaf8c4d023d2b04cd11112b689517d5e8bd20a66aa5c62f9bb7830e227ff88617f2c": "0x0000000000000000000000000000000000045a4841055a61696e00000000000c407a68615f747765657473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c32af425ecf7636aceff65e3bc5a9cc1ee6dc90a3acc03f65cd6a66c7c23104d7d21a3f4d266a3b": "0x00000000000000000000000000000000000e33394b7573616d696e61746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c388e1358813ebd801e4481679d2522f3f9cf41a66df264210fe9780528c04280a33003e2022618": "0x0400000000020000000000000000000000000000000016416c78566f79204b7573616d612d3120737461736800000015616c6578657940766f796e6974736b69792e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c3a9dcfc81a3cfe046677c468409001b6cb1e3a1043cee8fa919aca71e27a8f65ebb965c6ae717a": "0x040000000002000000000000000000000000000000001170692d76616c696461746f722e636f6d000000157461754070692d76616c696461746f722e636f6d00000d70695f76616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c41e5ffb19e12ae30a11a36a48739b8fa4bee6844af919e22aa50f114f9e395a1caec59cc157102": "0x0000000000000000000000000000000000055365756e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c46249d82bfb0b0d074e77a0de68e6cf05f748acb4958d062f29eb223b87be225918f23d9bf6866": "0x000000000000000000000000000000000009756469626162613100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c50403091a3fe08acbaf2c1d45ca4529a36ed37d0197fce11c1848cb62c607457c5629688ca0554": "0x00000000000000000000000000000000000846334a6f756c650d566c616479736c617620502e1b68747470733a2f2f6769746875622e636f6d2f66336a6f756c65144066336a6f756c653a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c6834f1c2c76bf29aeff1e8a9d96bcdea1837651f64dd248d8c2bf13b76759fae5c60f6237e641b": "0x040100000002000000000000000000000000000000000f313132304e465447414c4c4552590f313132306e667467616c6c657279001840316e667467616c6c6572793a6d61747269782e6f7267163131323067616c6c65727940676d61696c2e636f6d00000d40314e667467616c6c657279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c6c6f483598e787deb2bef705dcf0792c4027cdf5fe3cc6f064446f80d5281c11fc0883a95a6761": "0x08000000000100902f50090000000000000000000000010000000200000000000000000000000000000000055a45524f0d5a45524f205245414c4954591068747470733a2f2f7a65726f2e696f000e6d6172636f407a65726f2e696f00000b407a65726f646f74696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140c8734e9ceeea871e69ade711fa80a229815e5847e1041104fd08fb5a4e77e2a5f0d912b16aaaf03": "0x04000000000200000000000000000000000000000000094d696c6572756e6f00000019696b61617274696b61776174693740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140cac97255720a64876323344da3952acb9f0a654bb3402f6a95eeee8abc97c3b13c2848ce9bea600": "0x000000000000000000000000000000000010417274456e3639736567756e646f73144172746520656e20363920536567756e646f7300001a617274656e3639736567756e646f7340676d61696c2e636f6d00001140617274456e3639736567756e646f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140cc8f64bbd2e71ea820050e114404eec82932c59bedbfb6c1b58981e8f85af37e5d4f26a34226960": "0x0000000000000000000000000000000000104d6173746572537061726b793430320d44616e69656c20426f6f7264000014442e6a2e626f6f726440676d61696c2e636f6d00000940646a626f6f7264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140ce0f91c97c65aae744be50accad162e5162a2499a897f5cfd792e0ebf9ca6ed7d13b5e404b36007": "0x040000000002000000000000000000000000000000000b536e6f7762726964676500001d40776861747265676473666f64726a6b673a6d61747269782e6f726713616964616e40736e6f77666f726b2e636f6d00000e40736e6f77666f726b5f696e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140cea71908e309bff28cf33cbe014592a6f11c9133006203591ac206fce44a0d3ac5519667aed0706": "0x00000000000000000000000000000000001167c3b66b68616e207461c59f7465706500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140cf71787521e6de28a04ab3a66328e01112d81c15314c12bd4b6411baf8e05225e47a13daa78dd18": "0x000000000000000000000000000000000010446f7473616d612e4578707265737300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140cff0134bde4ac18abb9286b2b288f2af6eb392d95b12a64768174de723047b9ae0f86283dd5e34c": "0x04010000000200000000000000000000000000000000115374616b696e6734416c6c20f09fa5a9001d68747470733a2f2f7777772e7374616b696e6734616c6c2e6f72672f18407374616b696e6734616c6c3a6d61747269782e6f7267167374616b696e6734616c6c40676d61696c2e636f6d00000d407374616b696e6734616c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d0340c34236dbdc923059e1888ad3f7c623b3f84c113bc75975e5dd8957590104b9c0613433b67a": "0x00000000000000000000000000000000000a4d696b686173686f7611536572676579204d696b686173686f76000016732e6d696b686173686f7640676d61696c2e636f6d00000b406d696b686173686f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d081f1081222619c8937715d6516a1081fc4e2757dcdb7a687f9f3a4021e0671f1ff7576a88d55c": "0x00000000000000000000000000000000000d42726f734f6643727970746f0101010100000f4042726f736f6643727970746f31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d09678fc53ebff9b6ab520cbb6fe9b6bc5433fa4193074bd1aae212f0dc969d6af584e140a08a5d": "0x00000000000000000000000000000000000d52616d70204e6574776f726b1852616d70204e6574776f726b2073702e207a206f2e6f2e1668747470733a2f2f72616d702e6e6574776f726b2f15406a7061756c696e613a6d61747269782e6f726715636f6e746163744072616d702e6e6574776f726b00000d4052616d704e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d227a0c675a37dee0a1c40e9a37cd51d6b644a33e8e4952d576accdbb13c967bf8ea3474a583031": "0x0000000000000000000000000000000000105375676172436c7562205363657468105375676172436c75622053636574681f68747470733a2f2f747769747465722e636f6d2f5375676172436c75625f010100000c407375676172636c75625f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d39c09be41728d25271937d9336b12c2801a62938d27878729a7987c705770d5f19c0e42ffcc64c": "0x040000000002000000000000000000000000000000000a455645525354414b4500001a407669745f657665727374616b653a6d61747269782e6f726714696e626f7840657665727374616b652e6f6e6500001040657665727374616b655f706f6f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d39d429edc8d0712254479a21f40fd96f3ed15a8f08f6d289e7c9d1701ebf89ad6ff6d5755b824f": "0x00000000000000000000000000000000000f4449202d20537562736f6369616c0000164064656e6368696b33373a6d61747269782e6f72671564656e69732e6967696e40676d61696c2e636f6d00000b4064656e69736967696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d3c3a7016e8df8e500908d663623ee3c05935758e1f056d70c0a8ea33fc0c00384845dd7f3dfb56": "0x000000000000000000000000000000000008444546496b736d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d4ca3ddcf99187b260a01d4ea712ce6bf0fa166b6aebe2ddfc86bf523307005f6c87c2ca654916b": "0x00000000000000000000000000000000000a626c6f6e646961646100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d533a9fec9db13002b47d21483aa953be67636583cb184f55d575e0f71ec75f45383a786324a64b": "0x0400000000020000000000000000000000000000000015f09f8d8120486967682f5374616b6520f09fa5a9184e6578757320496e666f726d6174696b204475727265721768747470733a2f2f686967687374616b652e746563681640686967687374616b653a6d61747269782e6f72671e686967687374616b65406e657875732d696e666f726d6174696b2e6368000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d5ce2f7af07c1b88afeae9a945866e010eb1bef5082c9f0670e484984b6873e7f0eb297cd4d8e54": "0x00000000000000000000000000000000000d307847686f737452696465720000001e6b696e6767686f73747269646572303037363940676d61696c2e636f6d00000e40307867686f73747269646572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d65a8f206f0572aa67b45909ab82a670809e0eb1dff23c0d4f296974b62d8d823cf45471044c516": "0x00000000000000000000000000000000000b45736554654c6f70657a0000000000000c4045736554654c6f70657a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d7e595debaf7057166a8e85fb2ae8e4bb6815407ab2e17573050a080e1babc5022264fef9e96f5e": "0x00000000000000000000000000000000000768616e6e657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d8bedb75031185630734713c5ab53cf7cffbb321ced799fc7d49b43f385234b15c2ca720a222573": "0x000000000000000000000000000000000006706f6c6b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d905eb3b2787c26d495b0e302e1a577cd8ac5bd2681568e809e706bc32ca18d0a3921680530fd19": "0x00000000000000000000000000000000000b4e6f6f646c6544756465000e6e6f6f646c65647564652e696f0000000010406e6f6f646c6564756465706d7673000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140d98f82850d6b275f2e9d52d264f1d78a2f3379ac661de73255cf80b6b54a4b80de6d9c31f748a0b": "0x00000000000000000000000000000000001b5375706572636f6c6f6e7920446566656e646572732046756e640d5375706572636f6c6f6e79201868747470733a2f2f7375706572636f6c6f6e792e6e65740000000011407375706572636f6c6f6e795f6e6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140db5079f95a9bf8dfa7c3aa61ad8c8ddee5e79e5cf0f0094d4ec0a1c5ce1b74064a3001d0ea2b64a": "0x0000000000000000000000000000000000084d722e484f444c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140db9aeb749b73803bea5add43dcec81b15267ff88d61106f1640f5a8c84bfe8555fcfddc64bf3405": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140db9d7828adfae319e7c6c92b95381eda2995d8b4b6f3926b694c74c3643dddf3e4d182c316a3a13": "0x00000000000000000000000000000000000c4444204d7974686963616c0d44696e6f2056756b656c69632168747470733a2f2f7777772e6c696e6b6564696e2e636f6d2f696e2f64696e6f001964696e6f2e76756b656c696340686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140deed80c472e7c7c686a3a22aef015c34517659f4f96c5f1768aecc308f1467dc621e85c709d1809": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30320e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140df42bc818c9fd1ef89bedd1de864245baefc341997957f57eaf77620e26ef1aceee9bb50bce4220": "0x00000000000000000000000000000000000b617065586368696d707a001d68747470733a2f2f6c696e6b74722e65652f617065586368696d707a0015746f75636840617065786368696d707a2e636f6d00000c40617065586368696d707a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e032f02dea784887ec0c61a682519e78e65026c51ceea52273870636814605a33518f02ad543317": "0x040000000002000000000000000000000000000000000d737765617479627265657a650000000000000e40737765617479627265657a65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e08280eb46d228ef69de233dbbad30fd78a5a88bc8fb4d38bb9c0caa6f0e73a4a4f8955ac5ec253": "0x00000000000000000000000000000000000941534148204e46540000000000000a40415341485f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e0b3aa196d8924da44db018b0966000a7601da48063c535ab23ef856aaec13fa1555260c244143c": "0x0000000000000000000000000000000000010c4672756974792d426f797301010100000a4030786c756b656f69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e211dc5b0982117b47a017c3ebaff5fc5e7b686fb511d9d8b7065322339274695f8fe1d38200172": "0x000000000000000000000000000000000006666861696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e21b1928b52b99a9adf3209ba3436e0c3e7b87ed6aa40fa1a88fe68ed3a00ad0e922a147494324a": "0x040100000002000000000000000000000000000000001847454e534849524f20425920455155494c49425249554d0000001d616c65782e6d656c696b686f7640657175696c69627269756d2e696f00000e4047656e736869726f44654669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e28c8c63d0620b0c84c7013e7639f5ce15c6b51d9a33ab040dedf1851c71d697f3fad5f14594549": "0x040000000002000000000000000000000000000000000f506f6c6b61646f7462616c6561720000001b706f6c6b61646f7462616c656172657340676d61696c2e636f6d00001040506f6c6b61646f7442616c656172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e2df285221b11002639d5a44f52ebb752039a5def9e776c12b8ed3ba1a12e60299cfc00fe546c2f": "0x000000000000000000000000000000000015504f525455475545534520434f4d4d554e49545915504f525455475545534520434f4d4d554e495459010119706f6c6b61646f7462726173696c40676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e60e74a5190baf65ae72c7ce8ab9b183909c1cb1eaf21f02850c872130f391af72c4380efa3e738": "0x04000000000200000000000000000000000000000000084e6f76614e6578000015406e6f76615f6e65783a6d61747269782e6f72671669726e64656e69736b6f6d40676d61696c2e636f6d00000e404164696e64614b6172696b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e73707fed983955ae1ba2069c434aa22b860314674b862a23eb53ae9603316439d3cab44e6c7e20": "0x00000000000000000000000000000000002047616f20746865204879706548656c6c207c20326f6636204d797468696373000000000000084047616f417065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e77a555b20dfd069642d0db9f3b301b44df74b63b0b930011e3f52154c5ca24b4dc67b3c7322f15": "0x040100000002000000000000000000000000000000000a536f72616d6974737516536f72616d697473752048656c76657469612041471868747470733a2f2f736f72616d697473752e636f2e6a701d406d616b6f746f2d736f72616d697473753a6d61747269782e6f7267127440736f72616d697473752e636f2e6a7000000e40736f72616d697473755f636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e7ebd7950f6e71f663017d73b55d4f4a7fd5adcc62006ff49b12f6056f2f30fefd21b4a0ee35610": "0x00000000000000000000000000000000000c5a68696c696e5374796c6509566c6164696d69720000136d722e7a68696c696e40696e626f782e72750000084058616c6c4861000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e8cb1099f1092089cb4a8212f1c823c25693c15467047378f846454bad62d6c947a2ade36563851": "0x00000000000000000000000000000000001f4d6f6465726174696f6e205465616d20426f756e74792043757261746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e9910201efc63d224eb144dc285fd665819aa61ee6765b27039ec6d4c6c9993a7c163f063cdab07": "0x0000000000000000000000000000000000034d52034d52000000000009404d525f30303431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140ec06ed16827147be2c0f5532d658a0c0d9e12c26bc062e30d309adf8e39b4a0c29e489f382bfc49": "0x040000000002000000000000000000000000000000000a63727970746f6c61621243727970746f4c61622e4e6574776f726b00144079616f6873696e3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140ecb33ed71b3de7b708eeff6aba393c24d89dbd6bc74e46cef9ccb7be321647b624781b76d9ba304": "0x00000000000000000000000000000000001054686520506978656c205661756c74000000000000104054686547616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140eedf7d25e7a7bc88063c56f76c1dec83d0cc13abbd248d438d512f5510a62dcd6e98d2fa9e38e41": "0x00000000000000000000000000000000000a74616d614a6f73686901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140eef1e0dd5e940a8d8e704ee02d595b8622d1d1901dbae3dc049118e36e85317e2cb7f9166b7c93d": "0x04000000000200000000000000000000000000000000095072617368616e74000000157072617368793230313040676d61696c2e636f6d00000f4050726173685f4167617277616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140f177f5acba9e6e070661c356f24a2cddc859fbae974cdff149661f165f5e622df3060bcb8e7b373": "0x040000000002000000000000000000000000000000000e53796e6572576f726b20496e63000000167374616b696e674073796e6572776f726b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140f75f7e0ac3e676454273ca13308c2a9f40b322ab6c192da5ab9f8cc8be07326dfdca1c59689bf08": "0x00000000000000000000000000000000000c432e204b616d696e736b69001b68747470733a2f2f7777772e632d6b616d696e736b692e6172740012636b40632d6b616d696e736b692e61727400000d40434b616d696e736b693137000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140f7722ef9e3f0c3bb0d8ce5256f0b5a51a38ccaadc6d21fe930d8ff3da1dca198ebe1807802da753": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140f7f00ad7cb619c008769738ff8d53c17d6e0f0344e52c50a5ef6b61a33389f4dc4adbb7aa2f384d": "0x04000000000300000000000000000000000000000000105765623320466f756e646174696f6e1d5765623320546563686e6f6c6f6769657320466f756e646174696f6e10776562332e666f756e646174696f6e0016707265737340776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140fc514eab423f9a784434de779e5fcbe6da08b123b0d1556c5ded43cccd6a9b1f6efdc9ea4942032": "0x040000000002000000000000000000000000000000000f4b75732056616c69646174696f6e00000016686579407468656b7573616d617269616e2e78797a00000f405468654b7573616d617269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140fcc6386bb41988e76d82b70c69c1fbb8c15260720357f8964dde4621520267051b69a86d46be767": "0x00000000000000000000000000000000001050726f666573736f724875676865730000000000001140726f63686573746572736e69746368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140fce6746c0fcbe63c2fb8933d2f269bfc83970bcf019e9b9204fe40666ca00494eb9c6560a53b01b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714100660e0aeb247211c2a9af7bdca199cf341b9fc1315c3fa625849d6e9bff3e7361f40f4889ab57c": "0x000000000000000000000000000000000009446f746576656e7409446f746576656e741568747470733a2f2f646f746576656e742e636f2f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714100ad1333a8758d9d8cca15fca39d01fde7d1eff1cc8529dfca033c40777994e23150e81c72a1640": "0x00000000000000000000000000000000000841564c204b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141015fbd7c4e0657c321b74ce57dab7e81fd0a29d2d5eb705ec3f0950df8d9673d2f0e9188fecd867": "0x00000000000000000000000000000000000e4c6567616379204c65617665720000001b6c65676163796c6561766572736c6c6340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714101dc364cacca331289d0e953caa48c4e7e416022169d1a71ca9ef7726571d551b3fcff2bdc59a73": "0x0000000000000000000000000000000000094879706548656c6c094879706548656c6c1e68747470733a2f2f646973636f72642e67672f664d63386862506d354d000000000b40687970655f68656c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714102148a1017f00501a393b336f8230565ac033b4e83c4a1711f87eff586d2acfb351a1254c41235d": "0x0000000000000000000000000000000000097869657765697a63077869657765691d68747470733a2f2f747769747465722e636f6d2f7869657765697a63000c787763764071712e636f6d00000a407869657765697a63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410285ff7a2dfaaed30dd6b5e5177c32a64cdb0f0e601d77902c2833062b3cb7f5800e7a2c497640a": "0x000000000000000000000000000000000009f09f8c88f09f8d8000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410373f12dc9ab897a4a045fee5632d07206b047972efbf41de0351885f7d0c8d7bd2f272dd98c053": "0x00000000000000000000000000000000000e4d6172696f2056756b656c69630e4d6172696f2056756b656c69630014406d6161722d696f3a6d61747269782e6f7267176d6172696f76756b656c6963407961686f6f2e636f6d00000a404d616172725f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714103e847acd44a834c8c0c1fb9bb3902b9e4790461bec2c33afa31c9a3b72a4e4ab6c050b4a284507": "0x040400000002000000000000000000000000000000000b436f6e6e6563746966790000001c78696f6d6172616268756c6c617235323740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714104c4a90570bc5fcb01a8d3e27c8f4a2f1ed53bad7d240999ec076bb23155fdc020b70e2680efa1e": "0x00000000000000000000000000000000000943727970746f44560000000000000a4063727970746f6476000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410547c88eb5e1280f889d7a8087639059b95b1b3de84c8f80361fb2309a7497388b6ded2e815d766": "0x000000000000000000000000000000000015484154454d207c20444f5442454c33415241425900001940686174656d656c73617965643a6d61747269782e6f72670000000f40686174656d656c736179656464000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714108d9a2d402cd7cd82e813a68fe066b55cfbfb48fb99484e96f813e3f2b98ae3dedda80f5b069243": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714109f2a19e0b0e38a20d4b086bb5326ac9896b0a3ab4f37fdb680a09706c4460c98110b1a7aae4f12": "0x0000000000000000000000000000000000000000000000000f406672697a7a6c657a6c7a7a6c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410af15fa81ea76ada81e54507ca4f6fa30932b96d35e8f073556c99f4e3119e5f679893450192109": "0x00000000000000000000000000000000000853435954414c4500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410afe0be04153ccb6e7a5ea5f4113720dab9d89c4b7f949ea67731df7421ea069516115777b2ba6d": "0x00000000000000000000000000000000000d4265747479202620426c6f6f00000016626574747978626c6f6f7340676d61696c2e636f6d00000e406265747479626c6f6f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410ce5b49d79045fda2b8bfb3c0c1f04346134e7b27cb5b63de8a7af0d57c502d09c05ba7b3dd1e28": "0x0000000000000000000000000000000000054475636b010115406475636b77696e673a6d61747269782e6f72670100000b407468656d6475636b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410d658671f80bdd8baf077e92aca3921fc948042653b85d2c7cf1dae44eafdd35270943ded113425": "0x040400000002000000000000000000000000000000000c50726f647563745f4c49540000001d6665692e6c69752b70726f64756374406c6974656e7472792e636f6d0000094066657977756465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471410fcb033412d7d4970882eac544428a1332197cdf4e46f0ec005b083f30c9e00beed9f0c0f48817f": "0x000000000000000000000000000000000007576176696e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141109d1b0b3898be6446130ed95427fedb36702f4ab2eae7612e5f2f5033cf0f8b51ea97e13f1d219": "0x040000000002000000000000000000000000000000001e494e20535042202d20f09f8dbef09fa582f09f8db7f09f8db9f09f8db8000015407370626472696e6b3a6d61747269782e6f7267185350424472696e6b4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714110c6956c14d8038f81fefa90f5199ca0d60d147602cf2f9001266e557483d41ce8c671d51605313": "0x0000000000000000000000000000000000104968617665427574745468727573680000001744616d704372616240686f746d61696c2e636f2e756b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714111aa70eba23115bfec58ced993f959b9e3f61848eb10caa2a1376941d30c06be2425b1e31f50e23": "0x00000000000000000000000000000000000c4469676974616c205a6f6f002168747470733a2f2f6269742e6c792f4469676974616c5a6f6f47616c6c65727900186469676974616c7a6f6f61727440676d61696c2e636f6d00000f406469676974616c7a6f6f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714112601944f90bca480e7d9cef14591225c0e2a135224b576efd10b38cde56f71ef231dac8973b524": "0x00000000000000000000000000000000000d236d616b6f746f7069616e73106f6666696369616c2026206f6e6c7900001362726f6f6e79636f40676d61696c2e636f6d00000d406d616b6f746f7069616e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714115e48078425c5c92aa70df8bfb5ebf58cd2bfcdabad29392ed53b1d2f2ab81e519e6bc4f490c13b": "0x080000000002010000000100f0373a00020000000000000000000000000000000000000000000000000000046e6a690000001a6d696368656c6c652e6e6a692e313240676d61696c2e636f6d00000000096e6a69233536323800", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714116a7dbbc41fa50e64b011ce64137258e47a08cab6b492788e03e74f44c7c3a22c567217af20645a": "0x0000000000000000000000000000000000026a0000000000000b406a656e5f646567656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141181e386a86037f2d269f40cdc569d0855c22874f24a81b572d76d8d08469c33d1cf70db2d5b206a": "0x00000000000000000000000000000000000970617374614d616e164d6f6368616d6d6164204875736e692052697a616c1968747470733a2f2f6963616c31302e6769746875622e696f19406875736e6972697a616c31303a6d61747269782e6f7267156d6f63686875736e697240676d61696c2e636f6d00000d406d6875736e6972697a616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714119a0f76e4d92fd98c68b0748032acd289880d004ed59fd72856fcd75133faf360f0e1652a23276b": "0x0000000000000000000000000000000000064c4f474f53064c4f474f531e68747470733a2f2f747769747465722e636f6d2f6e66745f6c6f676f73010100000b406e66745f6c6f676f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411b8ff944fec6dc1d09a1884c8ca6641e644447f160be702de9c6748da6b51c553d6ff35cd8e4e08": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411ba561e194c5f74d897ab7ef91822fe787ae9e4ec865e6aed2aa20e59e6ca0df2fb67d266497d4b": "0x0000000000000000000000000000000000174b6f6461446f745f4672657175656e745265616465720c4b6f6461446f742e78797a0c4b6f6461446f742e78797a0000000009404b6f6461446f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411c43684ff6dd5c2426d4caa9a620d37f530756d282dd41b1105cfb4e4e3bcefc18609d1ee199d1c": "0x000000000000000000000000000000000006536b61646500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411e075ceba8e3f4524112dbb17e6f83bb832ee26149c8b00cefac96a1a668ccf0645898c3c271d04": "0x00000000000000000000000000000000000c54696d204a616e7373656e0454696d19687474703a2f2f74696d6a616e7373656e2e63727970746f00177468776a616e7373656e383940676d61696c2e636f6d00000e407468776a616e7373656e3839000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411e755e0b2a267d8a8a2e5461f346cf0c23d1ca613437432a160525b6487dbb718afa51439d48d04": "0x040000000002000000000000000000000000000000001a4b7573616d6120537465616b2d4b696e67f09fa5a9f09fa4b400001740737465616b2d6b696e673a6d61747269782e6f72671a737465616b2d6b696e674070726f746f6e6d61696c2e636f6d00000c40737465616b6b696e6733000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411eab7306fa8072a201551760e53240d8229b7c99fcbce0ade237854dff91796dd67c5a00cb43672": "0x0401000000020000000000000000000000000000000005636c696f000000156f746f67656f6e69636540676d61696c2e636f6d00000c4065617269617332383238000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411edb4162e9b96b85ecc1b0043fe1fc18950cef3726fa74151bc41f77438ce924c11a9b43823ff43": "0x0400000000020000000000000000000000000000000018f09fa78a2049636562657267204e6f64657320f09fa78a00001940696365626572676e6f6465733a6d61747269782e6f726716696e666f40696365626572676e6f6465732e636f6d00000e40496365626572674e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411fbcd54abb1de419ce84f6cd845ac3fb2a009aae8e99b1a2fb64aa3e7ce1c7867f3ab2db0c9bc00": "0x040000000002000000000000000000000000000000000d6c696465727461626f72657300000018736f63696e796970657273696b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471411fcae71b9124914ea2cf269fd21f2df6e71e5df234b1d1e5e05c145e02d40ddff3b6f0a7691c64b": "0x0000000000000000000000000000000000065768616c790000000000000a40796f756365617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412060f617a53b90efa99c57636163b80492e7748882c27e82074cc76ae723804e0c8f222aa1c9879": "0x04000000000200000000000000000000000000000000144b726f6d626f70756c6f73204d69636861656c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412340500c577b01cfefac151cf58a64b79b329b7ecf23bf592066f4af0cf1a17c61ab61f4d71cd63": "0x00000000000000000000000000000000000c5a657573204d6f6e6b6579000000186976616e2e7370616e6963333240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714123e32f295726d2f301075ea9032e7e039d63b38ea075a276cd2f0f7087ffbeb1eb4320213048955": "0x00000000000000000000000000000000000e50756e6b205661756c7420233100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714126b274fcd441f701054d5e79d6343876329914f0e7264c1f7abb9ab83c6944a08d1e1c594b4541a": "0x000000000000000000000000000000000007486179746368010101156861737372697a6b393340676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141281300a3acf4a3efea6e9d55bb4b00962d6ffa48d1305b1e7c90f6cd08858ad5a7a2b86e6394470": "0x000000000000000000000000000000000011416c6578207c20444b2053747564696f0101010100000e40444b73747564696f416c6578000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141281736c37e85f535829756f059fc06840d26ad9c75518aadfbf125314f9af67f67b7f5f66eeb97e": "0x00000000000000000000000000000000000b536f6265722048616e7a0000000000000b40736f62657268616e7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141283d5fd7b76f3b26ee23b9c2e8092cfaf9a22eb3f6167f099fa3a0413cc379b666684e5e944f242": "0x00000000000000000000000000000000000a4c696c204d616e676f144e677579e1bb856e2043616f204e68e1baad7400001a6e677579656e63616f2e6e6861743340676d61696c2e636f6d00000f406e677579656e63616f5f63616f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141299152c90d9cc99f27087b92d180452a367b385c93e4ff2f9206ad87b172471a8d54b721d282910": "0x00000000000000000000000000000000000a6b756d61676f726f770b6b756d6120476f726f7700001b6b756d61676f726f752e6d756e61676540676d61696c2e636f6d00000f406b756d6135365f6d756e616765000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412a2b27991e12dc3f4e082da663ec16019fc9db34386a4b0c4571ea758f19f75b5ed496817816c79": "0x0000000000000000000000000000000000044c784d11416c656a616e64726f204d696c6c657201010100000c404d696c6c6572416c656a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412a67a04b3ff6d1cb8e3827ef7f013ffe0684f2a2463cdb6d81a74dd0f34b0b7e0761105f0dedc45": "0x0000000000000000000000000000000000074a6f795a6574115365726869695f566f726f746e69616b0000166d696e697374723134303840676d61696c2e636f6d000009407a65745f6a6f79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412acf616659be35f9866ec0c1204773a4b95a1b374d838b5820f704a65deeaafb97f4ab96c351158": "0x0000000000000000000000000000000000164b6f6461446f745f4775696c645f52657761726473164b6f6461446f74204775696c6420526577617264731b68747470733a2f2f6769746875622e636f6d2f6b6f6461646f740000000009406b6f6461646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412b1ab7fbedaeb3e100c99beb21e35628a5e0d811d0e6637b1e43b5deba5b3e555ca78e071f4b803": "0x0000000000000000000000000000000000095761674d656469610000000000000e40746861744d65646961576167000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412cc628ce2af21b01837232566f19190ccb14bf5a1e60a805398032d38e87eab9ee18f90aa0e721f": "0x0000000000000000000000000000000000096377696e656464730643687269730000136377696e65646473407961686f6f2e636f6d00000f4043687269733737323630343530000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412dffed5472b77a54a9086ffb666eec156b216247f7daf9f5eb73806ee501ba87f7ec8f83a19d86b": "0x000000000000000000000000000000000005c2b06f2e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471412edd5e808c61a4696eac06549b02180ec91154820531dd78640a234d3f1f6efd9728f0416851f41": "0x00000000000000000000000000000000000f4275794869676853656c6c4c6f7700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141307eb650f06f8f7721cd1fe88d1d2df420564396ad478c84d9bd66447c55bb330a4e7d8d454057c": "0x0400000000020000000000000000000000000000000008477265616e63680000001667657274696b657274313240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413102e0d3c1339e244135eb8cdc82a9fba31b0c628faa21e6a6cfc80396883a553a2766339b03078": "0x00000000000000000000000000000000000b4954417374616b6572730b4954415354414b455253137777772e6974617374616b6572732e636f6d17406974617374616b6572733a6d61747269782e6f7267156974617374616b65727340676d61696c2e636f6d00000b6974617374616b657273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413266de9c03a53de50b9bf10b8cffa9a694570ef350b8191d567cb46a04a361bcfa618716b78d715": "0x00000000000000000000000000000000000f4d6574617665727365204d616c6c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714132693d807f6c23df804dcab1236fb910768d4da27194a2e66172165d41f8b26d95a23e051d86c42": "0x000000000000000000000000000000000006526176656e1154696772616e2053686167696e79616e2168747470733a2f2f7777772e66616365626f6f6b2e636f6d2f74696772616e2e1440726176656e33653a6d61747269782e6f726713736865676930303740676d61696c2e636f6d0000094074696772303037000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714132a190b2bc6eb70a4f12c896b5de927b41124a79d0808d61c32f5c3105f58e80369321888d2a351": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714133d012d7d60381ec218093851955159d042164ec55bf7aec8e4bb8754b34938dd58603322bed771": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f343500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413464ebee1a9be7b46c9c30fca4d06ed3cde1cd6ca25392fec9e27d6ef86f786118a53416401767c": "0x04000000000200000000000000000000000000000000124b7573616d617374617274657220526561000013407265615f63683a6d61747269782e6f72671472656173636865676740676d61696c2e636f6d000008407265615f6368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413470468a7a63147c214e403c5a7b459b86bcab68e6d21241c1bd20b91aee546c787e71b877bf460": "0x0000000000000000000000000000000000134d616365205468652050656e6e696c65737305416c6563010101000011405475636b6572746f7468656d6f6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714136bb08c596dddb97ce2421f6b3c80a00c8fa9476eddad55f7bb9cc2f54ad916b4969c103b5fd438": "0x040000000002000000000000000000000000000000000a48204120562049204b001168747470733a2f2f686176696b2e696f1240686176696b3a6d61747269782e6f72670f68656c6c6f40686176696b2e696f00000a40686176696b5f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714136cca57f11634c0d29f3ce17cedb01b50312d7318ef8e9653d15682dd2511984fc963623bbdc272": "0x0000000000000000000000000000000000094f6a72614f6a726109416c6578616e64720000166f6a72616f6a72612e717140676d61696c2e636f6d00000d404f6a72614f6a72615f7171000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141386b80bb27232f3b8060d01712e6c73c63d799537517c6eaa4cc91aaff645802c824ad857dd8e28": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f353200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714138ed61d7d4e581400725cbb3eb7e1fda5b19c7ab123a08c1a28b16d17fb4d6d09f679012ba38c04": "0x0000000000000000000000000000000000055441592001010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714139cbe44f2633cf6d6793dc7dde7b0d936b3e1748e322422c6f61b0a88d009af3556118b28729143": "0x000000000000000000000000000000000005446f7473000a646f74732e70696e6b000000000e40706f6c6b61646f74734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413a4e7699eebbe52e6ff88586d3166ca2400929db69f53a8c80f5aad9dcd88e2c2634596baeb4a0a": "0x00000000000000000000000000000000000b676261636920524d524b001f68747470733a2f2f6c696e6b74722e65652f706f6c6b61646f74626f6f6b124067626163693a6d61747269782e6f72671767696c6c69616e626163636940676d61696c2e636f6d00000840676261636958000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413b3f7e5a93f07231888d8cd7f28c49bef8d47726228213023b7b83604937b9149df15278dad014c": "0x04040000000200000000000000000000000000000000194c6974656e7472792d5265676973747261722d50726f78790000001f7265676973747261722d737570706f7274406c6974656e7472792e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413cfcb660666c8624ce1f78bf64a21a6e2eeb43328484cb4be5f4e16487ea889ec097601ba8adc13": "0x0000000000000000000000000000000000056261687506737572796100001b737572796176616d73692e7065726c6140676d61696c2e636f6d00001040737572796176616d736930393132000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413dd0435c4b8c522b4666c60cc9d87c3915b4baeca2d36c35099e9ca0ddf514d46af551fb0548b68": "0x000000000000000000000000000000000004617a6501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413ddb460718d6739042f0f21da287ed2ed87cff8265c769b29dcfbdb31ac0139f932e7995953d53d": "0x0000000000000000000000000000000000084e696e6a61203200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413e1cfc174c1683df6888bc9300f5ea591906c10ad794b79074905bff2bc972efd81a56a5223366e": "0x00000000000000000000000000000000000c7375627363616e6e6575720000000000000d407375627363616e6e657572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413e46ed7773b00617e2de5c0a266241928cf60949b2ed8069cc0485d93e4a1dd17ccfa3a28de8e32": "0x0000000000000000000000000000000000064d696e7a7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413f09528ec25d9e786f5d655731e62ff3b27a5ded3e2615c01821d00362624fcde163a2d5d62de71": "0x00000000000000000000000000000000000b4d616368696e65456c6601010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413f69efb52055873ec5b49a3746d88c99e3f3598bbc2ea84dd98ad0249dabfed2cd685b1ce636d5a": "0x000000000000000000000000000000000006475250564e0a477261706576696e65000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413fb96176f3e8aa424c8acf190cbc2c5b2d9bc0df22d2cf0472ab02baa7ce7cb958c90e8a5b6e04b": "0x0000000000000000000000000000000000094f736b6172766c72000000186a6172616d696c6c6f2e766c7240676d61696c2e636f6d00000f404a6172616d696c6c6f5f766c72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471413fba91067ee782aaefd2727ec65732fec6ebfc4a824345adb093436abfd5f53e0fe421c6f5cdb0b": "0x0400000000020000000000000000000000000000000006445053544b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141404625c59d62180187c76f60b8e91032091aacb1ec79764af51e796a0c962bd2f2e766e9e5ade45": "0x040000000002000000000000000000000000000000000550494d450000184070696d6574617261646f783a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714140d4d149491fcc516789770d4f032a7a6a43d03493704e8750ffd67090f8d763874d1934dc65b66": "0x000000000000000000000000000000000008446f746369747900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141440cbe3e601dca1749e34ce23a7934f79736024a100897a95873e4234e9fb64da3526a3c1cfd60f": "0x000000000000000000000000000000000004545132010d74713262656174732e636f6d01147461717561696e747140676d61696c2e636f6d00000c405461717561696e545132000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714144ce51a8d1e9d772004a0ca9db782903ecf235bda84dc084ee57ace3183dd9c52ecb1f4384a2108": "0x000000000000000000000000000000000009506f6c6b61646f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714148446d6e27ad179566511e3d396022cf986a5a86d09bf77db45af3ddbae12a8bd78948072505f4a": "0x000000000000000000000000000000000009546172656b6b4d4100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714148fb0f115ad9c603c36970e4f759294ab646c7f67b040039321069951f955e3e9daae8c0df00e7b": "0x000000000000000000000000000000000006474d41373000000014676d616f71756940686f746d61696c2e636f6d00000e40476572736f6e5f416f717569000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714149ddb66d3286a35ec7afe6fbfc9947fd177ed118016e403dbc14803a0432bfaf0337e3bbc3c820b": "0x00000000000000000000000000000000000853435954414c4500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471414a3752d9508a99f06ea5e92916cd4db2e18257272c868997978f28b079366197242626da7e86837": "0x0000000000000000000000000000000000134c6564676572776f6f642053747564696f7300000018667574796f756e676d6f6e657940676d61696c2e636f6d00001140776f6c666f6663727970746f73745f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471414a9d939bb55ac3e6eb452fa37b17f70343b605f204004392380def7958b0743c14fee14e8feed54": "0x040000000002000000000000000000000000000000000667616d626f0000001e616264756c6b6164697269626e69647269733240676d61696c2e636f6d00000c4067616d626f3030303034000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471414b749bf7b2b2249c4727ccdf094ab0897e53c8c3a9537a78109daccc48241b5b991295d7a511432": "0x0401000000020000000000000000000000000000000006444552454b0a444552454b20594f4f001c406d656368616e6963616c77617463683a6d61747269782e6f726714646572656b40707572657374616b652e636f6d00000a40646572656b796f6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471414d831e44cf7b70cd800934b3567595ef527a3ba5f962f8594024a870ab4f25ed9ca51de8006e01c": "0x0000000000000000000000000000000000064454444944001868747470733a2f2f6c696e6b74722e65652f6474646964124064746469643a6d61747269782e6f72670e646f744064746469642e636f6d000007406474646964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471414e7f5695bdcfeb7fca6074f8a41b2f8b52e71dcc4273c4012ebdd8701d3ced2e64332475f7b3175": "0x0000000000000000000000000000000000076b617a6b617a0101011a6b617a756b696b617a75746f31313240676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471414f43fb7c9ca8d300cf88657e8a5e5005c67c0ae58b0ea1137b817f32d30d80aba618a70b13bcc66": "0x040000000002000000000000000000000000000000000d504f4c4b414348552e434f4d00001440736f6e676875613a6d61747269782e6f72671b706f6c6b616368752e7374616b696e6740676d61696c2e636f6d00000b40706f6c6b615f636875000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141502f6b55d13fb36ae619a936ca92134102dfb470cdf8529756bf2270e661cfe322b1851f151e370": "0x0000000000000000000000000000000000035641000000000000094076615f735f7661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714150b14558bc6ee972ec748871d5079ed3d19a3bd8bb029f8b02d6ef1820fe786c703ead515b52d33": "0x0000000000000000000000000000000000094c69736f756e617300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714150dc822f025a4b3ac2306883197ed88bc2b4c27541c85b0b7754e4f8cdc6b2ca8c1d06f23eeba35": "0x0000000000000000000000000000000000104d61726b5f56616c65726576696368054d61726b00001b6d61726b76616c657265766963682e6740676d61696c2e636f6d000011404d61726b5f56616c65726576696368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714151958930b5ee93dbe40e9fb89b6a296813c638eeaa8e0cc3d04acc3edb8c55db7691da053576a32": "0x0000000000000000000000000000000000186461726b667269656e643737207c20616a756e612e696f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714151f26dae857e5e4640ee7e0735e1e7f68ce1d600f9eafbccc311cb1bb25542721dc6d6432d86971": "0x0000000000000000000000000000000000074d6172696e61074d6172696e6100001770616e7479756b68696e616d40676d61696c2e636f6d00000e4070616e7469756d6172696e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714152b5d77fe21288c1cbb9921ee063aecedec0d33588aff5943da3374e172a78395a75228e82215bb": "0x00000000000000000000000000000000000a4942502050726f787900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714152efa862046d2aea2421e1acb1f1b912f1a020979c61899f1d53e6d967760f7446b660858485a27": "0x0000000000000000000000000000000000074d616865736100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714152f5e61256c5cb31a95c3968b83520b8e43f82edb0f050b1ce7281873a93bf9c0798efd50f5c41a": "0x040100000002000000000000000000000000000000001243727970746f6c61622e4e6574776f726b1243727970746f4c61622e4e6574776f726b1e68747470733a2f2f7777772e63727970746f6c61622e6e6574776f726b144079616f6873696e3a6d61747269782e6f72671568694063727970746f6c61622e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714155ac70cb4838b627acd5cd13cdbaebd17c3118f06484e10d23fa25554b5da3e5b088c25f757e737": "0x0000000000000000000000000000000000074459443433420c44656769204475646165761b68747470733a2f2f747769747465722e636f6d2f44594441454200156465676964756461657640676d61696c2e636f6d00000840445944414542000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141566fd1ee1ca92c40cf6f55eafa3e54268f4de745c8e50afdaebddde55f33a4dd19d0a93e552dc05": "0x040500000002000000000000000000000000000000000f41736875746f73682053696e67680f41736875746f73682053696e676800001b61736875746f736873696e676831304069636c6f75642e636f6d0000104041736875746f736873696e676768000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415693d619c1eaa27282a304d8c9425a79907218152427905b9e49974b64da3cfc2eddeea71958559": "0x00000000000000000000000000000000000c4465722053616d6d6c657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415712b2ff79535e5c273794ac33c95766fae2316b99e80398db94d6fb5a7ce605d729d2024bff14d": "0x00000000000000000000000000000000000748617573656e075275736c616e00000000000a4068617573656e7561000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141574c008249b324302ea6389f75ff1996c75777891c4b0464e1b50ef040fffb1e0f86bd071324d21": "0x0000000000000000000000000000000000000000000000000f405379726f74614e696b6f6c6179000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141580ba7f98ba82640a6919d7771b79bd1100c2c98d53b391faf80eefca6849ba7c55270f31163f7b": "0x000000000000000000000000000000000008417573416c65780000000000000a40417573416c657835000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415903495cbc91581406bbe4ba309d9a5347d0e04eff4f03970a9eb55f2dfd146029375cf3ce66f2e": "0x000000000000000000000000000000000008526f757374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141596b645522e66dd2c4f99c0f8272e38f7169e264234dc13a4da815517564a538382e5828f61fc28": "0x000000000000000000000000000000000009706172616c6c656c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141599a0b4e7422a9ed67f7ef8999964790cf4e6c0815b1a7015e0c55d87f9a25d692d30f54a20a976": "0x00000000000000000000000000000000000742334e4e3354000000000000094042336e6e337441000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415a1183d2b1701e754981a7d9f137487f5a99c7b9b65beb94d2bd9c7f157550334eb020164dfa27d": "0x00000000000000000000000000000000000c43727970746f4c6f7665720d5a6965642048414f55414c410000136d61696c2e7a696564407961686f6f2e667200000a405a6850616e616d65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415af92d249d5d2bd828ac4562ae8e39f5d5b11dc1025a4cafcca85bb229a393ecad83ac2d26e6a09": "0x000000000000000000000000000000000000001268747470733a2f2f317061722e636f6d2f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415c94120ac277390b621338096828389f1fcb1e0141a937060a7fcaf834c7661c0fd57acc1fd5554": "0x040000000002000000000000000000000000000000000c53554d4d45525354414b450000184073756d6d65727374616b333a6d61747269782e6f72671673756d6d65727374616b3340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415cb248f0f9af445fe56be5933800b45a21ee8e9817eae9f49099fdf4a20076718497092ed43c62b": "0x04010000000200000000000000000000000000000000064875746368114368726973204875746368696e736f6e00174068757463683a776562332e666f756e646174696f6e16636872697340776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415dcd927177e5b7aaee65bf22cdf1f98c91b6c176854d8072f1328e027d2e84d23607b517b1b9429": "0x00000000000000000000000000000000000d446567656e204c656e6e6f6e0000000000000a4044617a6c65514254000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415dd7df6ad3b6cb94457c23aeab0f27293a09da367f8b8dd0a615c19e6025a2e896d255158683851": "0x000000000000000000000000000000000008766972747567720000000000000d40766972747567726f776565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415edbcc783a17ddece01379052888c89928e0352e33dfef3078c9f6401965e0371e87ac1cbecc83a": "0x00000000000000000000000000000000000850726f776573730c49616e2070726f7765737301011963727970746f70726f776573734069636c6f75642e636f6d00000f4043727970746f50726f77657373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415eee78443792d00346ebc3380be6816f828d1d1df372c51fbe99c95a321d7510403bb98f067695e": "0x040000000002000000000000000000000000000000001450726f6d6f5465616d2056616c696461746f7200001340616c65782d6d3a6d61747269782e6f72671c706f6c6b61646f7470726f6d6f7465616d40676d61696c2e636f6d00000d4050726f6d6f5465616d5044000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471415fb3d63dadb3c7cbebc314286e78316762fc56c14d7472f22197b227cabfcc894d8a5895ca94662": "0x040000000002000000000000000000000000000000001047494749204d415354455243484546000015406769676965736d633a6d61747269782e6f7267184749474945534d434070726f746f6e6d61696c2e636f6d00001140676967695f6d617374657263686566000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714161735619834be83b8be96d986897797d117987e4368640ffdf32bc967ba7467d012136c22dca33c": "0x000000000000000000000000000000000005636c307700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714161ff3e3a856b4f6f45d6d4a8639fe14436a978b8a2e5aa3ff7e66273e765498e94c4aa29c8fd41d": "0x080000000002040000000100902f50090000000000000000000000000000000000000000000000000000000c7777772e6973672e64657619496e666f726d2053797374656d732047726f7570204c4c431d68747470733a2f2f7777772e6973672e6465762f706f6c6b61646f74144069676e617465763a6d61747269782e6f72670d696e666f406973672e64657600000d40696e6673797367726f7570000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141623a7cb16b84b252c01c386876d1675bc75dd5d14e83568ff4b7da0b2a3ed4e85dd5bed380ef143": "0x00000000000000000000000000000000000c43727970746f477561726401010101000011404e46545f43727970746f4775617264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416241458d0b2403010f9466b8cd5c4011f48acddbe50369262afc63c91341e75b43149f26e03c732": "0x040000000002000000000000000000000000000000000770616e7661640000134070616e7661643a6d61747269782e6f72671669616d70616e766164696d40676d61696c2e636f6d00000b4069616d70616e766164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141624238a93c8c530a242df8ab59ef53f106f818046753ef02bdf49a9d4ca25f1037ef77eb1556b00": "0x00000000000000000000000000000000000c4368616f732050616e64610c4368616f732050616e646100001e6368616f7370616e64612e73696e67756c617240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141627a7ca07c7aef778dc106e241524180b2594b639d2f0eca4d41b1eb7f9e973c253402a7cd2ed4f": "0x0000000000000000000000000000000000076d6179616b61000000156368657a696c69616e6740676d61696c2e636f6d000009406f72656b6b6969000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714162d191a925aa718de943b956ea058ad55b4ec09eb895a3a9d1034bbcd9c98757d041740b39c3125": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000d4c65616465724b757361465200001740737461727461726f6c693a6d61747269782e6f7267166c657361697264726f707340676d61696c2e636f6d00000d405441525441524f4c495f53000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714163390f116bec9ccc82b9f35aa042379ed3d348d95985dcbf148e38621ffc7cdf7efbc9a03a9a729": "0x0000000000000000000000000000000000047062650000000000000e405061756c6576656e64656e35000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416446fc5f8e8b0567e982817a217352323d960736af202f8f9b69e57f213640302862798d2575031": "0x040100000002000000000000000000000000000000000c7a6c7563686b61796161610e59756c69696120536e696879720000167a6c7563686b617961616140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714164b9c1fd02f19d330599dba50b5f3ba0b36f856a761eb3c0aee61e830d4beb448ef94b6ad92be39": "0x040000000002000000000000000000000000000000001043503238372d434c4f554457414c4b001168747470733a2f2f637030782e636f6d1640696c6c6c65667234753a6d61747269782e6f726714696c6c6c656672347540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416530c8e1e5dda93b43ec7322956d133d41e28758fc64d2da34d2888d93af64eb41f7afa26967961": "0x00000000000000000000000000000000000741727475727312417274757273205374726f67616e6f767300001941727475727374726f67616e6f7740676d61696c2e636f6d00000d40415374726f67616e6f7673000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714165d81fde4784f18e2c0bbb663dd3508bf5538c94db4505f736c8374071934ff8de4b38522620016": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714166843d53ac1c5d58a0219142b23ba0a4ad6d232fbcc3e6f0959a357d40f53ef4635714cedb24c28": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416709400d558465ddc20836f2e4b88c1858d1e3f918e7358043b4a8abcd2874e74d91d26c52eca2a": "0x0400000000020000000000000000000000000000000005476162650000194061727275646167617465733a6d6f7a696c6c612e6f7267186761627269656c40696e76617263682e6e6574776f726b00000c4054696e6b6572476162650012406172727564616761746573233239383900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714167c929df558b1f3c6d12fd424e6cef84c929c04dfe79ac7172fc84db2db0d0b607158d97cf20b38": "0x0000000000000000000000000000000000054354525000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141683ada1ddb8e9cdd8a79369cc8a25a7c8dfd684bbd27aa8545cdb458e615ad53d5ba91aa32b3729": "0x000000000000000000000000000000000008406461656c786500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141690453f12c9d5688876fc0567bacb2e5e78fe3ab4b8c711343d3d0c6a54e33bcb038dc3d542ae3e": "0x000000000000000000000000000000000017486f67204c6f72647a204e46542054726561737572790c4b75726f2043727970746f117777772e686f676c6f72647a2e636f6d000000000a40486f674c6f72647a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141693037ad1bbc4c910eff714e067c3037940f23485a42500956a5997bf5a0e6d80285a165ea7ff72": "0x000000000000000000000000000000000009737567617275666300000013737567617275666340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416a09d0fe8fce61c09a7a5c8cf9ac932cc4a84b295319371769b54a19d6dae4b0b92778133a99b77": "0x040100000002000000000000000000000000000000001b444f542056616c696461746f7220416c6c69616e63652044414f001b68747470733a2f2f646f7476616c696461746f72732e6f72672f1440706d656e73696b3a6d61747269782e6f72671b646f74616c6c69616e63654070726f746f6e6d61696c2e636f6d00001040444f5456616c416c6c69616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416b87c95a1b585d36a98646b16346b02b1be34f9274ff4a42b76521796aefe30fd12bab2e5aafd18": "0x000000000000000000000000000000000003572e0000000000000b406e6f6d616e6f736565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416bb7ddd33f15b4828bcee6bb03eccb17bdda4e9ae32a520be410dd8e99c23145c067f93bb342e16": "0x0000000000000000000000000000000000104a6f686e2044656172626f75726e6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416e8fafb94c43111fa6520668dd6ae84ebb91735e7e5086a16873a11256c58d4a2609e69b171974b": "0x0000000000000000000000000000000000075279616e2056125279616e2076616e2064656e20426572672068747470733a2f2f6175646975732e636f2f7279616e766f6666696369616c01177279616e766d7573696340686f746d61696c2e636f6d00000f405279616e766f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714171684044d2e7dcc72544d5b200e2e791aa6afa994b8bfbcfc51ebe00ad850a01a9977353a79d527": "0x0000000000000000000000000000000000054c6554690000001056767431393836406d61696c2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714171ca88a3597ca4a1097c82198eca584e8d9bedca6a5ffc1f1eac3c1fb91d0ef4ef313b842b04c3f": "0x040400000002000000000000000000000000000000000b50726963656c6f676963000000196e656875656c6e72616964616e6940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714172675ad2d8df76c947c59725bff412592b6c1ea91e7b356bbaa8dc7412834bfb2a4c81c069e810e": "0x0000000000000000000000000000000000184d61676963616c2041727469666163747320546f77657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714172c6fa97a3aa682e494cd7bf392e1b283b46af06353294fc463b52fd5ff8a3655ef7fa57ae82738": "0x0000000000000000000000000000000000084d6174696c64610000000000000e40547275654d6174696c646132000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714172f5474abcf5643a8b5707defe6889dc178861ea7b68861fd0ab5427b54119950e6788afe1cad2f": "0x0400000000020000000000000000000000000000000006596172696b00001740796172696b736c6f766f3a6d61747269782e6f726717596172696b736c6f766f406f75746c6f6f6b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141733b5dcae3127ad6c8c82eae6fd28b35a4f5dcac9f1abd1ddc48f2558995de75647a5d628221b4d": "0x040000000002000000000000000000000000000000000a486164657241726365000013406172636530353a6d61747269782e6f7267156a6f656c31306172636540676d61696c2e636f6d00000c40617263655f6861646572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141734c607245624b99429cd7476ba80dd82059e739251a8700e975927f18aea27455223e0155a8b34": "0x0000000000000000000000000000000000044d5853044d58531868747470733a2f2f617263686976657273652e6172742f000000000d405f56756c6e337261626c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714173c712e406fc7a20a54e1448806b2c0cbdfd5da73198f12554bc972045fc9dd3f2e22b6c5a97c1d": "0x040400000002000000000000000000000000000000000a4665646553616d6d790000001853616d6d796638354070726f746f6e6d61696c2e636f6d00001140466564657269636f53616d6d617233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141753ca6a40031261f68651982a6ea4d1308c93fcf09afe6715991f38e750d577f2a264a50a44ce2b": "0x000000000000000000000000000000000005496e5f4b04696e6b127777772e6c696d696e616c6974792e636e000d726d726b40696e6b782e636300000840696e6b786363000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714175f30d1aa274e0cc6017764e7f85421a0fd04dd3c2b916609ac77049eec9d33178dc51ea1d03b5e": "0x00000000000000000000000000000000000d4d6f6f736520506c616e65740a42616c692047616e670000176d6f6f73652e706c616e6574407961686f6f2e636f6d000010406d6f6f7365706c616e65744e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141768730a1a57b3f1621c276f370bf87cd2a2f783b068d77f5cfa93e40aadee1467eea589ae000624": "0x04010000000200000000000000000000000000000000096b736d6368616f73000000136b736d6368616f7340676d61696c2e636f6d00000a406b736d6368616f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714176ef9e475846411e84348ac16a3cb2d199bd5cac4e10f3e304428552c44203ed54919b04e80af0e": "0x0000000000000000000000000000000000075265706c76790641727475720000147265706c76796b736d40676d61696c2e636f6d00000d407265706c76796879706572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714177d87d70120c0c15a9e357de87525b67cf9ed1d0f06a15a6363665ca1c9f43ff527c87c0945597c": "0x04000000000200000000000000000000000000000000114341504954414c4e4f4445532e434f4d000000126a6b656974683440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417933400a0288c12e486d93536b8055694c790badd03ad1c868ce5a6624740dfddad1d30e4e60735": "0x00000000000000000000000000000000000b4a4a204d6972616e64611d4a75616e204a6f73c3a9204d6972616e64612064656c20536f6c61720d6a6a6d6972616e64612e6964000000000b406a6a6d6972616e6461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714179dd96996e1932802e9b1c0fa28781e31ace481a848fe28de05f52d5b4c3889714eddbf1f411974": "0x0000000000000000000000000000000000104c657069646f70746572616e417274002068747470733a2f2f6c657069646f70746572616e732e6769746875622e696f0000000011404c657069646f70746572616e417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417d1a13d5f1f6edf700e71acb30246769cfcd04fdecb96b35bfaa74a629a6515c0031043582d0323": "0x0000000000000000000000000000000000084d4f4d5f484b4f00000013646f6b746f725f31323340756b722e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417e2bd7d0c1ac830dc147d01e94744113a08f1eff356f9a55fa0fee362936cead0d0238e3f395356": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417e4668fc5316ca9661a725c195aef6d9c12fea11f866cb0ea649ee958ddb2de88b4e561295d674d": "0x00000000000000000000000000000000001253656e73656920436f6e74726f6c6c657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417ea820fcdf6ef6efc6a2f393e7206dbccb882cc74dbc1e96a0d678b4990ad768f6e0bcdf3951733": "0x0000000000000000000000000000000000094a75616e6d6130780000000000000a404a75616e6d613078000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417f2428f049676136029b5b2d1d0ff3a0a4aed8721f480386c8c866d79d86386e5780a6454cd7f24": "0x04050000000100000000000000000000000000000000000000000000000000000000000000000a5f65636172646f356f104564756172646f20436172646f736f00001a65636172646f356f406b7573616d69676f732e6f6e6c696e6500000a4065636172646f356f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471417f938a8129122a8284492a0069965cc3f671d9e4d583cdee2bf11356546da5fd6a0e0c19f50f93f": "0x00000000000000000000000000000000000641726173680000000000000c4061726173686472653231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714180b27ec3ca0969990c85597a7a30b57bc3c2a76ea47c370d708dc8879ecbd51c7997ee88feb2576": "0x00000000000000000000000000000000000b4c6f737420536f756c73010d6c6f7374736f756c732e696f0111646965406c6f7374736f756c732e696f000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714180fd664cccfede652408fc260667fc591756cebc976059023dc79231650ad542fa0af5f836a2c74": "0x000000000000000000000000000000000006436f636b73001568747470733a2f2f436f636b734e46542e636f6d000000000a40436f636b734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714181824b302aefc4e54eea4ff693f65e8c7e7804593d04a14abcdd1af82a3a4671ff17fbdb8f03873": "0x0000000000000000000000000000000000114b4e524420636c75622073747564696f114b4e524420636c75622073747564696f0000154b6e726473747564696f40676d61696c2e636f6d000011404b6e7264636c756273747564696f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714181b85c49f4a19a78e8d9c0952b54c45d0483df33c8fa020079cd1787a6e2c5f7425bde850058524": "0x040000000002000000000000000000000000000000000e3136384e6f64652d417269657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141857664d3a630f31ac4e247ed1b3e51a17ab049447b706dd7e9d0e3735ef7e62e155d006cbc0a846": "0x0401000000020000000000000000000000000000000009736179615f6f72670d5175616c697479436f696e730000197175616c697479636f696e73383640676d61696c2e636f6d00000f405175616c69747943727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418871df8131a10a56041e8f550869197a24ed9e968eae648692cde7bbc04077114639c249cc0a043": "0x04000000000200000000000000000000000000000000074875626e65740000001461756b6572696e636140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418a693a77c144adf0cfe5be1f2fa7957855cdeb45af84f6598c581c13644650468d56d162580062f": "0x000000000000000000000000000000000007446174446f74001468747470733a2f2f646174646f742e6f72672f00166e696e616272657a6e696b40676d61696c2e636f6d00001f68747470733a2f2f747769747465722e636f6d2f646174646f746f72672f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418b39c8e20e6adbea2c727e5b643684209178c8b6ec45b5ad4567edbe8ea5bd14f2e87ca853dbe39": "0x00000000000000000000000000000000000a4a616d65734c696e6b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418b47e3024d66dfe628f36dddf8cdb0242104a2531e7d3efd4860a9a4633be69aaf30f63ccb25a5e": "0x080000000002040000000100902f50090000000000000000000000000000000000000000000000000000000b537769737320426f6e640000001c7377697373626f6e64706f6c6b61646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418b666b3bc75a17480947c3d3093c4b634138253abe071bdc1086af52ac8aae1afe79a7b60bdb030": "0x00000000000000000000000000000000000c524d524b204576656e747300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418c421afc6f1c1d600f41077d32f48fd9bb2ad2561fbb6cecd1f19a99f68a50838619534436ce342": "0x00000000000000000000000000000000000741757374696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418c42cb719c881dd6ed537e76f1ef68764d7544cd7a8be19cbaba2ef8af181090d281d80105fd963": "0x040000000002000000000000000000000000000000000e4c4155524f2020e298aeefb88f000000156c6175726f677269706140676d61696c2e636f6d00000c406c6175726f6772697061000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418e1b02fb972087a40c6e021d4d80b9b38d850b1c5334ea88b2bcc148d07e83f5be1b45b8ceb3740": "0x00000000000000000000000000000000000e6b7573616d61536f63696574790753657267696f000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418e56cb66eec57a80acc4b263efe14a089124745b4ae3ccf89eefb0cda261e8b876a7464120d634c": "0x0000000000000000000000000000000000144e5249207369646520696e766573746d656e74044e5249010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418e9b69f585d7a7d3c10da0654ed968b149f27cf9db0203337c79b6d86f6741f156598fb7699ab78": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000074c6179657258000013406c61796572783a6d61747269782e6f726714696e666f406c61796572782e6e6574776f726b00000f404c61796572586e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418f0062e466404f0976ce4203c844a11164d1b3f8342ad16a4cc5d99ac8eaae5cd74f4b1cc68c764": "0x04020000000200000000000000000000000000000000085355425343414e085355425343414e1868747470733a2f2f7777772e7375627363616e2e696f2f14407375627363616e3a6d61747269782e6f72671168656c6c6f407375627363616e2e696f00000c407375627363616e5f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471418fa2b57a84d2e6d28d64ebe3a8db9cf3e59929c85a4a049fdea156a9c6df6e94c34bfc08d104f35": "0x000000000000000000000000000000000013414c49434941204b5553414d41204341534100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419099c64f6b6cb0284aea4a8a382252eaef972d54ddce03f274004d28fb542d41d9dc2d1789c175d": "0x040000000003000000000000000000000000000000001b4b534d202d20446f7473546f4c696e6573204d756c74697369671b4b534d202d20446f7473546f4c696e6573204d756c7469736967000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419411887ef1bc949ca4a9b2c4e29603522c99d328c25a962c45aaac963fe90a916c02dce24404f09": "0x00000000000000000000000000000000000c204d616f20736e61696c7308417368204c656500000000000c4063675f6173685f6c6565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419522f0465b284216cb2a6e7b4c6451a1a1fcf05a4545dfbda0215f15ad77851be9f7f7e94171e6c": "0x0000000000000000000000000000000000094755535f5441564f000000126775737461766f4074656d706c6f2e6363000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714195e7803308f4eaf7e5f11c88bb727fe14d78f2196451ee57bfe065be7056e4328a3ea68a4139716": "0x00000000000000000000000000000000001050737963686564656c696320417274000000000000104050737963686564656c6963323939000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714197cc6b330ccc49f1cd0839b944fa3be33e09d4248cff45f9ba0c69b3c4063534bbc891026946477": "0x0000000000000000000000000000000000000000000000000b40426c75654775697461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419818e7a5e77f11fce81499c6c1257670571c97382c0301d19122da7168495a09546b7e53b28db4a": "0x04000000000200000000000000000000000000000000064d61726b6f000017407461636f747572746c653a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141984b2e10bc954a21c7a70feac4745c20ffb33960e4b64f9a154ed22fb58fec6ed0a0db885046869": "0x0000000000000000000000000000000000087564697669616e087564697669616e0000167564697669616e7465636840676d61696c2e636f6d000010407564697669616e5f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714199500833949f719f60db3c614a6d05747e20325a2dbdd4e5551c19964410b4f4c669dda1e82f97a": "0x04040000000200000000000000000000000000000000084a6f686e2057750000164068696c646f6c6672783a6d61747269782e6f7267126a6f686e406c6974656e7472792e636f6d00000c40426c61636b33546f6675000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141996041f72713a580a1e687a718e1ee0ce04385054cd2b23b8f73e0a73b5ba8ce0bba59bed388178": "0x00000000000000000000000000000000000456697408566974616c6969000016766974616c696b3236393840676d61696c2e636f6d00000c40766974616c7567617a7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714199f24e2487e567b321ec507203650141d2ec630b967b76ec45dd53d852b9cb25f220dd3a3fa2e51": "0x04000000000200000000000000000000000000000000084e4f564f534942000014406e6f766f7369623a6d61747269782e6f7267176e6f766f736962726672757340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419caab1fd4cdabfaf287534dd5ead6c0247a1b0d3ada5588e578602c2ed64caa6f6fc2a5efee6f23": "0x040000000002000000000000000000000000000000000d4272696c6c69616e74696e65000000156461726b6d697361343340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419cdaeb61f1cf1fb9aaa22e75104164e85637433e174dfeed603a9aefdebdcca5d27ea2a445c1e72": "0x00000000000000000000000000000000001054484520415045204f46204e2053541054484520415045204f46204e2053540000167a6163687a69676779393340676d61696c2e636f6d00000d405468654170656f664e5374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419cffb91b0e9f1d9e2131969a7a7e3fb17cfabeaaf24e4ffd9648275a675007df661d81594b3e05e": "0x0000000000000000000000000000000000084d72526567616c145265697a612047616c6968205065726d6164690101010000104070616c6f6d61636172626f383032000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419e56ebac4e0e2b6deef1b2ff187a7da287e1bb52d607937e42d625fc973d4cd06438639d70bad4a": "0x040000000002000000000000000000000000000000000c424c4f434b20414547495300001840626c6f636b5f61656769733a6d61747269782e6f726717626c6f636b2e65676973383040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419edb33b4c8af5aeaa738e7a216d2c1ce1428e0a27d92d13c04226dcc6b7a7b19db8f5defaa41a64": "0x0000000000000000000000000000000000066b752d6b750000001369722e627579616e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471419f3c2d4255caa6f62728347d414dc13c2cc74cd0d13e817efd069147654f1ffbcfc90b34e1e877c": "0x0000000000000000000000000000000000104765745f526963686172645f536f6e1143617365792052696368617264736f6e1968747470733a2f2f696e76617263682e6e6574776f726b2f001d436173657972696368617264736f6e34353040676d61696c2e636f6d000011404765745f526963686172645f536f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a163f442e4b2bd9aa4852c7108621b0eb5f5f8f8cea3234047089a41e843aec51548bed8135dd5e": "0x000000000000000000000000000000000005546f70650000001574626c61636b363940686f746d61696c2e636f6d00000b40647574776f7272656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a3b45ae59c7404966b69f1a4704f62fe379ce2ff60a139520330dfb53ab5fb94455c928fae88403": "0x0000000000000000000000000000000000054d61696b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a3e1d1d8b70566f4ccb039d696dc732bd51d48022d1cdf4d8efffa839025086962614436c01ff25": "0x00000000000000000000000000000000000673703463330000001c63727970746f7072696573744070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a67626b57e204fcd4a31711fb281fc5ed03fd717e4528ac92faf96c204eedd0d6243c144cc7e067": "0x00000000000000000000000000000000001142656e6a6f6e692052696761746f6e6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a6a978ce3d0119272e18096821e06203efc1c77555b2776299b24b3c73602dfd5bcc6690781a12b": "0x0000000000000000000000000000000000074b75706570650000000000000c406b75706570655f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a80421515da8bfffcc72d3d698e28a48179a368defd26f420b7dbb123b91405b03ae150f0c18069": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30340e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a8ac12411fafdb1ccd85718c89027a619892e7abba120a79ed4450f4b782f59cce83ceac03a864a": "0x00000000000000000000000000000000000d5265686162204b7573616d6100000018746174746f6f6973742e65746840676d61696c2e636f6d00000d4052656861624b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a8d88fdf65d76e7fefee61c97340537e49fdf7be4ebb5e6f16b2a30e3b8cc54c96f703353e0d270": "0x0000000000000000000000000000000000055465636806666c6f6f72000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141a8ff977452cfabf1666ca0ab5164b168be0188697042111e9185ae90c13d4a6c197c7209338a34b": "0x0000000000000000000000000000000000065a6571756900000000000008405a657173696c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141ab9ea3b498f5eb6424bcc780141fed6ef6cf2d08091a1a98055bd04d7c10b9007d04894b520d729": "0x00000000000000000000000000000000000f53686f776d65646163727970746f010101010000114053686f776d65646163727970746f31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141ac1fbed207ef96bd640e992a6d2d245f67a7307f6fb14a4d0481284217b99444dc9b6c9cb3f6844": "0x00000000000000000000000000000000000d4a6f616e4b696e67f09fa4b401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141af418c70ecd35e54e4ef936dae8a5cc6cdb24ab8022a7cd037e618d7bedaa0ea669610ba5e0e07c": "0x00000000000000000000000000000000000742727568686801010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b2d52234edc009738f45bd8f6341dac4486eedaf00f2357cd19b8d4b8f0271c7340d56fe02bca72": "0x040000000002000000000000000000000000000000000c53746f726d5370697269740000001b6d696c64726564616e65796d6579657240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b2f4ad5ff2cc79f808b67e6130479626822fdab4428ed964bdf693a1117c2423fd1bd5a1ac57a2b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b3451eaa48abc21fe7ebc934f2a7d948b99c431a8fd8a7d79b072ed207de36a980c95e45390442c": "0x00000000000000000000000000000000000673616e696b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b59abca638b56cdac646de777448f2e8286434406f2491c335604874953bb2276c068be20838222": "0x00000000000000000000000000000000000a4b7573616d2741727400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b8ed26348cab57d4eedde4b28175a6f6f119e646dfd4e47fde33e63409bb06e1f33b1217245fa2e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b9caf038b0533985ef5ac84c374d36cf366dd2bee433b8e98b205b9e3abba931f9131bfed3df862": "0x00000000000000000000000000000000000b526164696f4b6e69666500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bae1c6e2aeffc6736e5e3c157d3d1fe30f47d4317fd8f984ac02d891d3f15b18e49fa6de5ed6123": "0x00000000000000000000000000000000000943617074544b313300000014456e646572544b313340676d61696c2e636f6d00000a4043617074544b3133000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bbd03cd3ab6347c6817038f23e3b1e7d91f641929205495b7be633fc2247d0bcc5a6f9709a8f82d": "0x00000000000000000000000000000000000bf09f9088e2808de2ac9b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bcae011029977921b0fa0b1a8e6d3ca06224ada945bd41785e55822a36102e48d584ddbb03e9573": "0x0401000000020000000000000000000000000000000009506f6c6b61424f54001c68747470733a2f2f6769746c61622e636f6d2f506f6c6b61626f74001b63686576646f722b706f6c6b61626f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bcec27087365f75b241c5dcdd41f564d5ffbc53b8936742796f1d0ac688e42c76233281183de826": "0x00000000000000000000000000000000000a6c616e64736c6964650000000000000e407370726f62696e736f6e3935000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bd7316875d7fcf8a0340d617b2e5fecf5813d12bf441eb025f610edf738af8f79a98a9e168f690d": "0x040000000002000000000000000000000000000000000b54616977616e203030310000144079616f6873696e3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bd93ac250c3d818068678e139a4ee538b249b95483d330fae73b3cdb1bcf98394341448e2254c19": "0x000000000000000000000000000000000006415045203204496f6e00001466657261726938333940676d61696c2e636f6d00000d4050756e6b324d6f6e6b6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141be2a3fab16ae5e58429c11f2ff4fc700087c7fdad402d6e97c6df5e73988c3a36c2b6fde7daee21": "0x040100000002000000000000000000000000000000000c5a4b56616c696461746f72000011406172726f3a6d61747269782e6f72671668656c6c6f407a6b76616c696461746f722e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141be91660cfdb5962765d8a5b7f3b10122cf3e3e010bd993eb2f61b47e306fe7cefc8b1fecf6ca579": "0x00000000000000000000000000000000000c6a616b6572756d626c65730000000000000d406a616b6572756d626c6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141bf7451ef7153ca24cd019a2da5b645d6477d1c0237c7c8c36c7bf692e8b89d12a5858f97396194f": "0x04000000000200000000000000000000000000000000074175726f7261000018407374616b656175726f72613a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c018fecf61bedd2f7034438a748412760539f824f38f3f9ecbf77ced8716de97c5ade5d2444c8c3": "0x00000000000000000000000000000000000d4a61636b20456e74726f7079001968747470733a2f2f6a61636b656e74726f70792e636f6d2f18406a61636b656e74726f70793a6d61747269782e6f7267197468656a61636b656e74726f707940676d61696c2e636f6d00000e406a61636b5f656e74726f7079000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c2d8deb6a6e3afd008cb31b41ba9432b9bbfb2928d7f18dd71606168df3130d56406ccb4e1d1514": "0x0000000000000000000000000000000000085250565f4e4654001472617269626c652e636f6d2f7270765f6e667400126e66742e72707640676d61696c2e636f6d000009405250565f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c41a9e87e8a611f3667dba518c61e944f337affedc80902c018f24038d71bd055b4a591b783e351": "0x000000000000000000000000000000000008597564683336300000001579756468697368333630407961686f6f2e636f6d0000094059756468333630000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c41dc4bdfec08cd34cd97eea8d7958109c6db5e35eb407390555d9d07313768c374358cda816412": "0x000000000000000000000000000000000004434150000000000000094073756d5f636170000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c445a00466b4840ee56cfc4d1c1d71960386cd613829467a547ff9e30e060f95291378188c5d21a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c60a329d8935ce844cacfd17802a80e37f5db9ef661010285b5bd3c52530edcce377b2188912a36": "0x0000000000000000000000000000000000046b736d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c62d323cbfdb49f6c80b666f924d2789063014747b0b9f68ba2944a5a837ed43b01cbfc7f626230": "0x0000000000000000000000000000000000074d617269616e114d617269616e6f20426572746f6c657a000000000011406d617269616e6f626572746f6c657a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c7999ba22fd7e800682ab4f191b4213a69ab58265de100201a6589461006c4c415f253612895c65": "0x00000000000000000000000000000000000743424e4b4b540743424e4b4b540000000000084043424e4b4b54000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c8477920524dc7b0ea98f531883490cdf295130f08044ec2a2db498f07b8005194a96ff561fd82d": "0x0000000000000000000000000000000000135468652046757475726973746520326b32310000000000000d4043726f75744d6963686f75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141c8e5b0e240c90b788faa93b49dc999c0d466cd7f50fcd6f20f31bdd90aa6dc74d082de84763c43e": "0x000000000000000000000000000000000009417175617269756d09626c756520736561000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141cac1a7ef3f230dafe5958a79fa0df10dd6462aa2bff168669b1254d53d22e435e0190f8736db843": "0x00000000000000000000000000000000000753746f726d7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141cc61414be64fa4946781375b828cd1e774103d484f3c54877b8e88d9689db40ac0e3285fdde4b05": "0x00000000000000000000000000000000000a4b696420446972747900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141cdb2accf576d950527361b149506f93445192fa012f9118b4ecf0db2a1570c7cf8a4104db9e7758": "0x00000000000000000000000000000000000552756479105275647920436f7272616465747469001640726366726f6d636c653a6d61747269782e6f72671a72756479636f72726164657474693440676d61696c2e636f6d00000b40524346726f6d434c45000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d06728f5cf68e4a96815bbe365675730b16ac7f3d50224673ac974f548ead737ef65e6d6a51c965": "0x04000000000200000000000000000000000000000000094369707269616e69000015406369707269616e693a6d61747269782e6f726719746865406369707269616e6961636f62657363752e636f6d0000094043697072694941000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d2126e97da297743a969caac23093c1575d9a76f274406e59f2b1422f52930924b47ea87e641960": "0x00000000000000000000000000000000000b54657874437572736f720c5465787420437572736f72147777772e74657874637572736f722e696e666f0015746578744074657874637572736f722e696e666f00000c4074657874637572736f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d235a8aff868b2764038661dba05e6560cd16e0e7f6a3c6aade4438b3206c656b198c447f8a7a7e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d2375e335e2ffe0c000439b3c05aee26b38c1116874efa9e7cd6cb73633c9aece8287d79ca84927": "0x00000000000000000000000000000000000a43726167204861636b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d2acfefd1a8740906d588674d7859e56ed1ddcd2e5bde1d56ae61294b842a2ede11f7cab494771a": "0x0400000000020000000000000000000000000000000014474f4245524e414e5a4120504f4c4b41444f5400000019676f6265726e616e7a612e646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d31100cfcfa2db62c01c4cef5058330f7f9641903c18f4faadfaf6f7756eee49d27b9ed38cce66c": "0x04000000000200000000000000000000000000000000067a6c617461000016407a6c6174612d6b6d763a6d61747269782e6f7267147a6c6174612d6b6d764079616e6465782e727500000a407a6c6174616b6d76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d3a4b2bf76f654ecac24813f1c9e61fc9cc2500bf4eb8b8d9af7548714cb0b1c1ba4785b46bb37f": "0x000000000000000000000000000000000007486f686f686f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d462405631809fa2aaa5497ddea7e16416a7e7cd668565cf10f67763d0a9143dbbbc1104cb19817": "0x00000000000000000000000000000000000a44756d625f42656c6c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d4d1c3fe955b6e940c6413e8373b0e702dd0e04ecf51a6c785e76dd910b5907512969f3cdb9702a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d4f0e009a9528d0f2695f946087950cf6d6082c331294f31d23ae54ab2dfc3739fb4def83676e23": "0x0000000000000000000000000000000000054d65746100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d6bdd6d8cc672c232ad1a9e5ecaa5b5f3b88bf41e24eee2591dfd5d3a53d9c09a73bac517f28a58": "0x0000000000000000000000000000000000066b7562657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d7259e4eafa026b88e89854ec5f225c9a3b8889d4b1afc0cf6cf473d4265a96463c08cccf38905b": "0x0400000000020000000000000000000000000000000008316b766e6f6465000013406461766534343a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d77b5b5e1a11bfd62a79f3b924342c4f634d8ebdf77f50ac051d41387a72d22f2f38155762c125f": "0x040000000002000000000000000000000000000000000a4c6567696f6a757665000000146c6567696f6a75766540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d7c0832ef85bb40ac8861de74cdf782c8261d2c36d27cdec982688f6d03311e53cfd65402211856": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d9735b2d16e21311c11f14c57d6a787a9a317691e40481a394591b7af72e22407016b498737ae38": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d9986fc3246a26b4aa5e51e6ca0b24646f378404ad16b7f1fe9e0ec864147011db66265813fa02e": "0x000000000000000000000000000000000012566c6164204973204c6f766520f09f92950000000000000b404372797074756c6c6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141d9e0e4a748d5f2cc805058130871797c503fd545ffeb106c470953d95f88c6814bf2ecbc0c9986f": "0x00000000000000000000000000000000000c42756773794d61726b32320000001662756773796d61726b323240676d61696c2e636f6d00000d4042756773794d61726b3232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141da8bd150ad49b557886c5a642b89daceb2744feb76cf20cc06603fa2a652cc8be5e5e155f57e33f": "0x00000000000000000000000000000000000c61657468657263726973700000000000000d406165746865726372697370000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141dd245eb6059ff64e29c5c2a82d191bab4e3d4a573d0e5743b19cd8ccd2b4a978bdc1784d5af1c7b": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f33320f62696e616e63655f6b736d5f3332000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141ddfd86abf974afab47109f622b8dbf0bbcf84277b807130c085082546669b0d15c739843e09c109": "0x04010000000200000000000000000000000000000000086b796f73616d6108626fe288826869001440626f646869736d3a6d61747269782e6f726715626f3668694070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141de11c43602580500e15e7844eae688a5a8d5bb2239878e14e49c73534a0a3fe258e0869e9ed6727": "0x00000000000000000000000000000000000f506f65706c6527732048616e642001010101000010406c616d61696e6475706575706c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141df3fc920874707bdc5d17441dab98682c0b6d8819768ce2aa4674fcb1ad68f609b7c620ad45ba4b": "0x000000000000000000000000000000000009706974696d696e6900000019706974696d696e692e646562756740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141df6123c2d60f917b2471fd517548674e0710bcdc4961033f6240c4c5c94cfbe38cd032a493c5e74": "0x00000000000000000000000000000000000a4c6f72696c6164794f0000000000000b404c6f72696c6164794f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141dfc2330c656d5231a890513e2c8835cfc12813248806f24436f757f0dbcd8696a7f56bfa2c3f17f": "0x040000000002000000000000000000000000000000000a4541524e5354415348001a68747470733a2f2f7777772e6561726e73746173682e636f6d16406561726e73746173683a6d61747269782e6f7267146561726e737461736840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141dff89fb25833ea0a616a89a50c3a144a2af6202dd4550d067dce77c8775cf713cc6e34b93a00b45": "0x00000000000000000000000000000000000b417274656c6c656f757301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e0159188b70dcf6941f8d212a457540ff86a877ea367c1a74c43a58e7d3382a987ca12cae0f7524": "0x000000000000000000000000000000000011446174205068756e6b79205661756c740f546865205068756e6b79204f6e65137777772e6c75636b796672696461792e696f00147279616e406c75636b796672696461792e696f00000c407468657068756e6b7931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e023a512a423fadae0d9af68f58dde7e3279b2dc61e51c29509b10e29605dbb6df2fcddd083ad22": "0x000000000000000000000000000000000009776572747971323000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e1bdb5f0bc06203e8072c43338f9819be9bce372ed1afd9e945d4c827d4e3e02cfb7b32122df764": "0x04000000000200000000000000000000000000000000094e616b6570656c6f0000001862617279636865762e64696d614079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e402acb5899dbe10ccbbc7077de681489e3548876c3106219899576c0b9e3a9abfc93559449da61": "0x0400000000020000000000000000000000000000000008476f6e74696a6f00001740676f6e74616a6f6e65733a6d61747269782e6f72671c6172747572676f6e74696a6f4070726f746f6e6d61696c2e636f6d00000e406172747572676f6e74696a6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e495b9d3175bbcf109e87a012b2754d0b23501fe1fa775db374927f09c228f07948f81ad84bf617": "0x040100000002000000000000000000000000000000000e5061756c2057696c6c69616d73105061756c20502057696c6c69616d7311687474703a2f2f7061756c772e74656c13407061756c70773a6d61747269782e6f7267147061756c40626c6f636b736d697468732e636f00000f407061756c7077696c6c69616d73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e517fa60da3439f60fee6404e47fe7fc88c2df8f2ccbafcc2bb76501c0f082cedac9586cb7cfe3a": "0x00000000000000000000000000000000000b53706163654d696461730101011961626f6761646f7363726970746f40676d61696c2e636f6d0000104044616e69656c3636363332353734000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e5ed2f050989443765e6df27b038557938e92d267e4d3e9a7826f3e1c628443b72c54ccb2530f7b": "0x00000000000000000000000000000000000c4269742e436f756e74727900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e6c109558238bfd8cf8184ab08b4b112452b90cfbe958b9573939bd0dfd0dc78b77f3248f28c025": "0x0000000000000000000000000000000000000000000000000c4050617261436861696e7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e76c389661c3a415cbf9588da096c69d2c6f3cdedbbf146d31f0f43f39d251d09f9b368aad1a852": "0x0000000000000000000000000000000000076c696267656e104c6962726172792047656e657369731368747470733a2f2f6c696267656e2e66756e0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e81c54a25bd302dc09ed6b82e56f934bddde307fd655fc512c88c9a66ab77325d6d8d804de95e0b": "0x0000000000000000000000000000000000054861687a0b4861687a2054657272791568747470733a2f2f61727672746973652e636f6d000d6861687a356440706d2e6d6500000b406861687a7465727279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e88363895c100068c4bf3ba9633b121af862532bb08432c3cd450f363e04a2862b07d50abea775c": "0x000000000000000000000000000000000005616c616e00000017776a6837363232393032313540676d61696c2e636f6d00000c40736c6976657266666f78000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141e9839b3a4a537a7ee8d75dede514ed1aab7fb1db5e6a959c3ee250062aaae12d463a7b8329d1224": "0x000000000000000000000000000000000009536b79204b696e6709536b79204b696e671c68747470733a2f2f736b6d702e7375706572636173742e636f6d2f0012736b79406d6f6465726e73746f612e636f00000d40636f6e73756d6572736b79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141eed9dff4cea873e1635a4853f034ba42d82dee7d8eb4eedead8c2350de115251dbd6d4e3b65c713": "0x00000000000000000000000000000000000b4e46545f5061756c6965001d68747470733a2f2f6c696e6b74722e65652f6e66745f7061756c6965000000000c404e46545f5061756c6965000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f2628d8321b371238be8006279f7e6c45bea9c49ec6148ff405719f6b66357308246a04d8f8dc70": "0x00000000000000000000000000000000000e506f6c6b6120506f74696f6e730017687474703a2f2f706f6c6b61706f74696f6e732e696f000000000e40706f6c6b61706f74696f6e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f2feeea09705452f6dc9f6798b0673697a24cc012c6c63b2634557893f3231ac186afddbb421435": "0x0000000000000000000000000000000000000000000000000b40656c63696432303737000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f4321336da7ceadf4d95d4c5c0131969148d3a16b3d95ab3d051771d971a1955d7e745b0a3a4f16": "0x040000000002000000000000000000000000000000000e5044505f56616c696461746f7200001440706176656c64703a6d61747269782e6f726718706176656c2e627574656e6b6f407961686f6f2e636f6d00000b405061756c4241636944000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f48bf37f549334442c6245ef5eb308a001e79ad19006295ca4f647f53cf848a654986bcface4042": "0x04000000000200000000000000000000000000000000064942495a41000013406962697a61313a6d61747269782e6f72670f7265672d67616e40676d782e6465000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f4abd8814aa23d512e468b6c0ef22342134f181810fc0adc14a6aa964e9d2e8d6d89840b69b603c": "0x00000000000000000000000000000000000d53656143726561747572653100000000000011407365616372656174757265686f646c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f5112fb03b23ddef2a85c638724c62596fd6b39b96940e8469b445fe79c6416e00d055ee895f211": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f5305062ef877dbe24f4ca2f10d6a709a24b0cc692ac7be7f8d273b20301b48ad9ed4686b7fd319": "0x00000000000000000000000000000000000643495649540c4f73636172204369766974137777772e6f7363617263697669742e636f6d00156f73636172636976697440676d61696c2e636f6d00000b4061736369695f626974000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f638d3271ed7e11f246c69b8f8c849cce66563b2e98d4d92c3d310f0a71c961f52d998faf83f67e": "0x0000000000000000000000000000000000084f6479737365790000000000000e404f6479737365795f4c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f7fe908aea4a3c53289d9f38247655a5018d093324d3fd1b9daeccca5336b69577ae6b466576b1c": "0x00000000000000000000000000000000000d414d45524943415320322e30002168747470733a2f2f747769747465722e636f6d2f416d6572696361735f325f30000000000e40416d6572696361735f325f30000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141fb2ba94e04f61c026a31499d0df85f8053df28ee11f7c0a3715892fd57a92b4edcbbfa322475a4e": "0x00000000000000000000000000000000000664696b6b7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141fcece1cdd847b0ec86205a2ca8d23217fda44d2d969447b9c02ef7949442473c2991a6e60212f04": "0x0400000000020000000000000000000000000000000009475247544e534b4d0000000000000a40677267746e736372000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141fd0382f79e2a2d7ba55c080cad203ee8e64deb867ffd6c628a36159aef2bd90e1ca99669218d566": "0x0000000000000000000000000000000000064a756c657301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141fd33ae9ac7ec1387e3301e524b5134478f3705cf85e4999ae44f8ecf7732884ae18c3480e2b9a56": "0x040000000002000000000000000000000000000000000b5374616b6520466f7274000015406770617468656c613a6d61747269782e6f726715676f75726176407374616b65666f72742e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141fded061878099ed6cbce2cc9280bff6f25382a49f2f6ae459d8c96e53e72fbb7de120955918df14": "0x00000000000000000000000000000000001042616e6e6572205468656f726973740b43686164204368616f73000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141ff46b051efecfe4806369b4f04792b7bd1a0d8586b7aa528591ba732362e3fb3d52d7b01e741b18": "0x040000000002000000000000000000000000000000000773336b7269740000184073336b7269743a6661697279647573742e7370616365000000084073336b726974000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142018212ed22c14c0a44871a6a8764d496fe18d5f9044e3c62cee35d0b30ed9e707227bfd8a9c0711": "0x040000000002000000000000000000000000000000000b636c6f636b636861696e00001740636c6f636b636861696e3a6d61747269782e6f726717636c6f636b636861696e687140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142022778741b4653e1434dd9ad7d65aa4fd7befb0af4819a25a022402d55489fa8c290c97b38df230": "0x00000000000000000000000000000000001a456c656374726f6e69632047616d696e67204361706974616c000000000000104074686567616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471420326aeae6bc2643a4c7753db70defc6fdcc8efc9c9c050207648b35b7e52213f8963b03e4f56c0c": "0x040000000002000000000000000000000000000000000a736b79657264656b6100001640736b79657264656b613a6d61747269782e6f726714736b79657264656b6140676d61696c2e636f6d00000b40736b79657264656b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714204538a0dc29db896ad41858c3abc9bce8dc8ed3b789112bad138dbf9c62472aa881c6ce1b985204": "0x00000000000000000000000000000000000c50523046495442554c4c59000000000000114050726f66697442756c6c7931303530000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142050d45992f4c9ef2652c2a0824e6d3803d9616e5499b32741fe224108363f2423e5063978885f07": "0x0000000000000000000000000000000000074b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142055e641717d8d1e567c29ba7c8504fcf16d91413a5a71f8e81c33752c743506cd26198997f48421": "0x00000000000000000000000000000000000467756100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142056c8f9b2090920dc64ebe91ae1dd904651525eb5fd91eb0abf458cb0f5986158803e0075604153": "0x040000000002000000000000000000000000000000000a546f5468654d61727300000018746f7468656d6172733230323240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142057c2e1894e9a819e92823bda563f6821bc3b7af00917608d454dfa89de101414ee0b51ac3ab57f": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000045450420000001a676572617264706c616e656c6c657340676d61696c2e636f6d00000f405072696d6572426974636f696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142067c893ca23078d2899477496b6c390ee6a83d1e533d860d1ed9d3093e9f74103185879c65de25b": "0x000000000000000000000000000000000007726f694c656f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714206b45f2fa65a57512b21d2798eeaa9401e833534b50cdc8cb63dba399374d291f223b691b35de23": "0x000000000000000000000000000000000009736861323261727400000000000011407368613232626c6f636b636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142073848901eac9089068ef7e2275c53204ce2f7fdc06eb8c5b2b7d6e67a137738dbf9708f207ff23": "0x0000000000000000000000000000000000064a77617769064a776177690101146465636f6c6a656e6540676d61696c2e636f6d00000a404172744a77617769000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714208d340a192a7ce08433eae795936e63871cbcf0410517d1dad4755f2da4a6d88c1cc1c589b8e86f": "0x0400000000020000000000000000000000000000000013535452415742455252592d5354414b494e4700001740737765657462657272793a6d61747269782e6f72671d73776565747374726177626572727933303240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714209e98ff9424a50460750d915c81e3c139cffb0418c1c712b3ed7486694f4ab51032735d4a7bc628": "0x00000000000000000000000000000000000c6b7573616d61686f6c69630000000000000d406b7573616d61686f6c6963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471420a0096c7425466822f00d3001f42ca632c44bc08b5832edfc5b68f71bba9a5489e72bbf36759675": "0x0000000000000000000000000000000000134b656e6e792773204b696c6c2053686f74730c4b656e6e2053686f74747a0000156b656e6e73686f74747a40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471420a09cd983d185ada625107ed5deb9bca0d319ec0614f4cec7442d7d1d834c94edb2ca33dfefa041": "0x00000000000000000000000000000000000c4e696b6b69205269786f6e124e69636f6c61204a616e65205269786f6e0000176e696b6b697269786f6e407961686f6f2e636f2e756b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471420a8c6d581b4662724bd4f1c895eeef95b593114f9f5ba0abd74c95532defed6a94e56fbf4aba642": "0x00000000000000000000000000000000000a46414333205354523800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471420acc90488da905fc699cbb879646f36ca046a3d26df97d1c83ed24d2a4975d823ef00ca4c94f509": "0x04010000000100204aa9d10100000000000000000000000000000000000000000000000000000c4465736372696265646f740c4465736372696265646f741d68747470733a2f2f7777772e6465736372696265646f742e636f6d2f00166465736372696265646f7440676d61696c2e636f6d00000d406465736372696265646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471420e84b09cc5488ab56025b6817d74310f334c8c7b2baa3cf708f6c1501aec104d91d951751f88643": "0x000000000000000000000000000000000007422e492e432e13736972206261736564206964656e74697479000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471421101bd08c63245f043a5cddc14c4ad1fbf90999e4efe595993c71e0be149400f5f1e6b3e073050d": "0x00000000000000000000000000000000000e4a6f20706f6c2077616c6c657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142132d2b9d69b1260a8300f53d9cda28b136491a9b18b937eae584f7f08fbb6aac29e0ea38e38f864": "0x04000000000200000000000000000000000000000000104c45545241534352495054494341530000001a6c657472617363726970746963617340676d61696c2e636f6d000011404c6574726173637269707469636173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142137b4e662fa80a05a37c441df3f0fed7ddef5581ff70437b00fb071e0b09537caca8adc4354913e": "0x0000000000000000000000000000000000094e696b6f76657261135665726f6e696b61205361727661736f76611668747470733a2f2f6e696b6f766572612e78797a2f000000000a406e696b6f77657261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714214241a7a6830640485a526526a8eafc2c5705aa658cbe9c28fa11d29b0595e9117631ad7b370f61": "0x0000000000000000000000000000000000086c554f536b736d05416e6e61000000000009406c6f75736b736d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714214343ca4a50f9b586b151fa5df9e1c7f5530a1ce12aeb4957ffb6d2e15304fa6b9b5f40bb3ff31b": "0x00000000000000000000000000000000000a4e696e6a614d7a666b0e566974616c6979206c6172696e2168747470733a2f2f73696e67756c61722e6170702f73706163652f476562583600146e696e6a616d7a666b40676d61696c2e636f6d00000b404e696e6a614d7a666b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714214a284ee9e9b01cd61813f456c8f11087d572921c67afff25605aa712899d6a6b04cc42c3d2d417": "0x040000000002000000000000000000000000000000000647335251300000124067337271303a6d61747269782e6f726719673372713076616c696461746f7240676d61696c2e636f6d000007404733525130000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471421545827f452a76be49cd2b1bb9e68033d664d63b4776bc51f900147cdeb6f009fffa8c1d497ae3d": "0x040100000002000000000000000000000000000000000d536f6c6f53696e67756c61720000001c736f6c6f2e73696e67756c61722e61727440676d61696c2e636f6d00000e40536f6c6f53696e67756c6172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471421610a341cde1430ea466b06c8c16712d05c5f607b740a39b72f8356f175320697df6f2a73dbcc4f": "0x08000000000100902f50090000000000000000000000010000000200000000000000000000000000000000085669746135363700000017766974616c696b647a656e6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142162588dd88d3a33aa48a9775be7af0521acefce054dc7e9e461814dc167a5cabf52aef8534d8249": "0x0000000000000000000000000000000000194c6520436f6d7465206465204d6f6e74652d43727970746f0d4d6f6e74652d43727970746f0000126d6e746372707440676d61696c2e636f6d00000e405f4d6f6e746543727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471421667555f2586f1cc852bd64d95e1c2fc164ba7ee6c2cce6e87ff8cef81c60940d46f710ed712b7a": "0x04000000000200000000000000000000000000000000066b6f757469000012406b6f7574693a6d61747269782e6f72670e6b6f757469406a6b76632e6465000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714217d6680e09965aab2b62cbf89a7a9265639614f153be16189006b3c0b51cce22227f4af703c9e1b": "0x00000000000000000000000000000000000d4b7573616d6153656e646f680a416c656a616e64726f00001a616c657465636e69636f706331303740676d61696c2e636f6d00000b404b736d53656e646f68000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714219805b19867f93320fee6eafec3719729d9c5ca944da46b05443e2e8f6bf199e0011cd0e2c7e148": "0x00000000000000000000000000000000000f506865656242206f66506865656200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714219c4cf4d922a8a65e6943dbb9c8cfd53377a67307290efac1aff4aa23f2862bd8640af3756f792c": "0x0000000000000000000000000000000000174b72697374656e207c20573346207c204576656e74730f4b72697374656e204ac3a46767690000186b72697374656e40776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471421aad0a24a729734c0b881e2db47fb95982cd5c364b87e6cdf5a5c8a336d980156623b53815c597b": "0x0000000000000000000000000000000000054b494c4e054b696c6e1068747470733a2f2f6b696c6e2e66690010636f6e74616374406b696c6e2e666900000e404b696c6e5f66696e616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471421bd505b865a64bf380b24a4886b392ee4659b85f5605cdfab3eadce66eaadd848c37f4fde65fd06": "0x040000000002000000000000000000000000000000000c474d2050656e6775696e7300000015676d70656e6775696e7340676d61696c2e636f6d00000d40474d50656e6775696e7331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142200b6e2483bae501aaf37daa4afffeb0d84c47f52330d8293ea648e1bba5fe0e35355057e63c167": "0x040000000002000000000000000000000000000000000773656c6265720000164073656c6265725f61693a6d61747269782e6f72670e6f70734073656c6265722e6169000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714222fa12fb4681a4d0e47ff458bb2f80c4bc89a6a7bd022a555e9c1bc719726f475f8a1841428832f": "0x00000000000000000000000000000000000761706f6c6c6f084e6568656d696100124e6568656d69615f736f72616d69747375186b72616d65726e6568656d696140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714223452b8432e93285edc25673a48cda235c2d234b8cce6fc441c1f2edaca141226509d4e34443f32": "0x00000000000000000000000000000000000d50726f6a65637420495a415205495a415200001b70726f6a6563742e697a61722e6e667440676d61696c2e636f6d00000e4050726f6a6563745f495a4152000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142237b569888e1b73789b24f57aaf20f362378bb7b2e560920a5c09e18d292ae991365283fbb63d46": "0x00000000000000000000000000000000000a6b7573616d61676f6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714223a4a6652ff6ba41ec5e682f355b27a4d5a5cc933edcdf3a4909fab848b5c36ca82c6ed9518404e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142246a94b347c9dd6d4af1aa1af17d814c5da505868f6c55d53371fdf90d774e5d61d6e02a29bde35": "0x00000000000000000000000000000000000c467453342e2e2e664653300000000000000d406b696e676d6f6f73616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142246aa733317c875da16e9adb79c6c6264ff8c115577bb33b4ee54e8dc9abe25a91ca670b61bd552": "0x0000000000000000000000000000000000116d6f6e6f62726f776d616b65726d726b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471422501e6d8f21e9dd5e97f331813198763da88ad2b1f5deb3f42373a93e8895c43de399aa6255da47": "0x040100000002000000000000000000000000000000000e47656e657269632d436861696e1554776f20506562626c65732056656e74757265731968747470733a2f2f67656e657269632d636861696e2e696f1a4067656e657269632d636861696e3a6d61747269782e6f726716696e666f4067656e657269632d636861696e2e696f00000f4067656e657269635f636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714226c1e0df53526ed80460dbf1dcc3ed518c81067d27eb8278a7a1abcd834ffc79dcc1c35e4a9b64e": "0x0000000000000000000000000000000000064241444552001268747470733a2f2f6261646572792e636f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142285d6ef6ff9cb66120dbd220521490559af15d7fb3b6cd95c313d06180901d2de5a54e63d9cfe22": "0x040000000002000000000000000000000000000000000f395374616b65206279203947414700001840397374616b652e396761673a6d61747269782e6f726717397374616b652e6b7573616d6140396761672e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714228f1b7216fcfd78ecbb4ad02852dc96234c83eb42528d08e17ef8e787f503caee5fa0d687d74025": "0x00000000000000000000000000000000000e416c657843617074517561636b0000000000000f40416c657843617074517561636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714229b18b3f2754f1a429599ba5f521844f2332524dec987f9cfb116a2570f83b2417184af0c74ab13": "0x0000000000000000000000000000000000064772657461001768747470733a2f2f6465636f6d3838382e7370616365000000001140526f636b657442756e6e79426f7373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714229ce4e5e00a4f0b1e6ea78e3190ac2cfde9c0041ea7a0e1f7b89d52f4a58f01f69258150b782466": "0x0400000000020000000000000000000000000000000006736e61696c00000013736e61696c407473657276696365732e6573000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471422b4e5d0ac25c3f4f0221438819364133d39e26672983929d4656719d10ab15c8f974b8856daf664": "0x000000000000000000000000000000000005466972650546697265010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471422c077d1ea9a54d260f2cec43064a352b55aec95917a2935c01ae5d9ddaa47d8063991d65b4b9450": "0x00000000000000000000000000000000000a46616d696c796d616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471422d261d77c92c974201f968f24fc0df93fe98dab905ff103d00a9a232329bfe78c22663dbe60a12d": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471422dad67368716274fa24d4027d0a467580d44b1c89896a8bc1bb9c77d1a29f555c4ba85b7241d84f": "0x0000000000000000000000000000000000095468652047616e670000001674686567616e672e6e667440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471422dc4c22ba0bc0065c05d5f192c927b30b33c85470b53474f2a736a01c3c5da905384329a430f22e": "0x000000000000000000000000000000000007446a7562726500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142305e79ce427e9ee14173ee9728c9186c8e72b474dd743f18b0169106f8d63e2973bd9563882347f": "0x00000000000000000000000000000000000968616d616b61676f0000000000000b4068616d616b61676f78000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714230d1532b07653236895ad261e06f09bee24fbadb2586f4c5ef811ab95debdf1c683025e12665858": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31320f42494e414e43455f4b534d5f3132000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714231960a7d766214bac5090f086d4848d1830e5aa59349a24ccfa5dc9bbcbf97580c26371df64d904": "0x00000000000000000000000000000000000766347573743001010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142319f3e78aede826d4621034776e25cee77bb87bc6a14a8e0f74dc45ec194bfb8ce7fc5f97c42406": "0x00000000000000000000000000000000000a486f6f6b61486f6f6b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714233517e12f6d46687ef6ecff86959a7b564427a3b66d0352b3f513c990accb1a836a41322d08d311": "0x000000000000000000000000000000000005526d726b0000001a63727970746f7477696e4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142337f11734e7573816e0eeb71e92b68959e490c6e0c5dd54a61fb9faabbdfbb4fd7a6ae353dcf573": "0x00000000000000000000000000000000001653616e74612773204c6974746c652048656c70657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142340baacf03bc2b65865da029ac7366bc43ae9d19382b3a85f49d2a660fef29259f9bdd742767d0c": "0x040000000002000000000000000000000000000000000b4541524e535441534834001668747470733a2f2f6561726e73746173682e636f6d001367726f77406561726e73746173682e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142340d0950ebd480968fae6be10c90d572388d42129e074005005baf68d116a993073c5648ec78865": "0x0000000000000000000000000000000000064b414e525900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471423439dff64c47d6062f21f6587843801d599ed5855ae0ebdd2a84c822919e80cd6f12899e5088772": "0x04000000000200000000000000000000000000000000064c65676f73000012406c65676f733a6d61747269782e6f726711706f6c6b616c65676f7340706d2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714234aecb53dfa52ee846537d237047bc2784332bde7c2495a8ced463b2470834c989ab0221880b53e": "0x0000000000000000000000000000000000084d414347414e470000000000000a404d414347414e4778000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714235333782a45d3df229f2896c2bd6f30162c9cc0f5899432515f2cffed36a4dc6b42d48bd2b2910d": "0x00000000000000000000000000000000001044454144424c41434b434c4f56455200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714235e6cc48616ecf948df9c1a60044840351ef0fbe6b9713ee070578b26a74eb5637b06ac05505f66": "0x00000000000000000000000000000000000e537472757473656e6b6f415254074e696b69746100000000000f40537472757473656e6b6f415254000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142366851b398c75ad02f6ed445ee9bf4e2f4b4c017439de5df61f85059a05faf2d0bce28d7ae2a755": "0x0000000000000000000000000000000000055333335200127777772e736565722e65786368616e67650000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714237b203fe8adc4e71c351b39b792e67cf1251e87877511ce1d302a4048202a7a66f130324c39c171": "0x000000000000000000000000000000000008535552494b4f560000000000000940564f4b49525553000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714237b38e4959de64e265a775a6d7ba9de83f9584dafe39e8329019c1e881b4c5097048fa72d392369": "0x0000000000000000000000000000000000057272656d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714237d0c1537de97bd0cbdd520a7494178d304b7cd4d6b5ab879a78153d9e594f4900b615caefe5908": "0x0000000000000000000000000000000000175468696e6776616c6c6120496e766573746d656e747300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714237dfece766977faf655bc5071b58f4e4789e92567ede362496ffc8ef0f0d9ebc00c2ad4c57bfa7f": "0x00000000000000000000000000000000000d74776f70626c7374617368311654776f506562626c657356656e74757265732e696f00001b61616c624074776f706562626c657376656e74757265732e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142380d19831504ba65a2d8e3ab4f6b9d9e0f920d4d2b6877be7ee0b1b28c2f6a8d83751a143510b1d": "0x0400000000020000000000000000000000000000000011686f6c64706f6c6b61646f742e636f6d00001d40686f6c64706f6c6b61646f742e636f6d3a6d61747269782e6f726719737570706f727440686f6c64706f6c6b61646f742e636f6d00000e40686f6c64706f6c6b61646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714239d9993b7848d1956f5560a9a7cebbc2b81e92c3f080f384fc7bc0cb8a20484bc42cdcd423b7863": "0x040000000002000000000000000000000000000000000b5354414b455a494c4c410000154064637a6f696361733a6d61747269782e6f72671364637a6f6963617340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471423c2022a748dbc54406bfcf1fc5e75a39525555d86756e304fbc7fb4d74f49feca2f02cee457167b": "0x00000000000000000000000000000000000879696e7a68656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471423d4008003cb78a9582c6d97aa93263387550545127dd79d0bb69e0b2f792867660b8761b8551a1f": "0x040000000002000000000000000000000000000000000b4d59544849434e4f4445000018406d79746869636e6f6465733a6d61747269782e6f7267166d79746869636e6f64657340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471423dccf7b667b32e5dc399b0b033525131eac94bf1432ec9112cc69862dac20a16c3462ae8c64c017": "0x040100000002000000000000000000000000000000000e4b494c542050726f746f636f6c0d424f544c61627320476d62481068747470733a2f2f6b696c742e696f000d6b696c74406b696c742e696f00000e404b696c7470726f746f636f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471423e2879b116fb58ca6e782e566e272302b2f81d98f84a883eca8dcd86ff3c05ba0a98599fa86a516": "0x0000000000000000000000000000000000044a65680945766768656e6969010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714242a4e67e17b982ad890e8221d99486fbacc20023108a5a1411cde82171d65a531495b7a47d5bc76": "0x00000000000000000000000000000000000c757365726d6f642e6e65741447656f72676520416e67656c6f706f756c6f730c757365726d6f642e6e6574001367656f72676540757365726d6f642e6e657400000b40675f757365726d6f64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714242d0d33e8dcca4f40137e2016218754a9ff93a24dcf522a8533be538402e496929ac91f7c9e5900": "0x00000000000000000000000000000000000844656c6761646f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714243536f899777cccb892b5e5793918855e5fe7c16b78b94bcbc4bcabf6936ec3edd1c0043a026545": "0x00000000000000000000000000000000000a496d6f62696c697a650000000000000f40496d6f62696c697a655f6f6666000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714244c1487133d32acf2718a102c908ff26947b45596237f761fae16f30499dd9e9ad99370f38d490c": "0x000000000000000000000000000000000006757262656e011668747470733a2f2f757262656e2e78797a2f6172741240757262656e3a6d61747269782e6f72670f757262656e78797a40706d2e6d6500000740757262656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142465e11c805e40714487e71c1a15539cabdf996a4383b96221d6c4afb071b29e5e344c085c1cb706": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714247b27e4de021f0e443f4ac4d297be577e7db2e5ec57eabd33c10dac033e9482b33c508d1c2e6878": "0x0000000000000000000000000000000000097873616e746d616700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714247e5b51518dcd9f7ca164245d48ed5035eb6fecd7557ec58ac8869c54855c6663b8a3439960d611": "0x0401000000020000000000000000000000000000000008415245534c6162064b657269631868747470733a2f2f6172657370726f746f636f6c2e696f0015696e666f406172657370726f746f636f6c2e696f000011404172657350726f746f636f6c4c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424883d27e305ffe5f89d4c543e6cd62e62136614f7b98a423cedb9fd863584a2f4ff887259432437": "0x00000000000000000000000000000000000963796265726e657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424899ec201da1fbef4f9224c619c930a1c5d86b01cd4bd1d454809ee83031f1442fabf12355b426e": "0x00000000000000000000000000000000000a5072696e636970616c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142489e525189c647aa4e129cd956559c21c899e2b0acccb250e14a8c072d03a2cb3e4625f8c9ea171": "0x04000000000200000000000000000000000000000000094d7973746971756500001740726f62696e2e686f6f643a6d61747269782e6f72671f726f62696e2e686f6f642e76616c696461746f7240676d61696c2e636f6d000000000c726f62696e2e686f6f6f6400", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714249c9b2b424049dd50d6ffaad41dc59e96f29914ae09f4f618d8d24a649ade27491dc74b09945a70": "0x00000000000000000000000000000000000e5665737065722044657369676e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424bca730e73f4adb967cf83e4ac7ec8f62925eee4b90e459522a323fbd50b5408561657562546531": "0x00000000000000000000000000000000000962726f772e7765730744616e69696c2068747470733a2f2f696e7374616772616d2e636f6d2f62726f772e7765732f001564616e2e7261626f74613131406d61696c2e727500000a4062726f775f776573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424c80eb0f73c29c48402585743ecd763fde5b8582caec19198b04ba1b6b57b86855203203ffb2b33": "0x00000000000000000000000000000000000744696d612041000000137569383766696d6340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424c849079ee8bde4921d3fe712adae750defcd81cbd13fc63226c907ec2961204617fb4620f4ba15": "0x00000000000000000000000000000000000753494c56455200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424cca5c49a0392d3a6ae3f09425544ce2f852a638e82b8a9ae49486b34583e77436984f13b824754": "0x000000000000000000000000000000000010426966726f73742046696e616e636510426966726f73742046696e616e63651868747470733a2f2f626966726f73742e66696e616e636500166b6569746840626966726f73742e66696e616e636500001140626966726f73745f66696e616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424e34420f18ed441e8fe2f9cd7b9e68790ca9ffbc328cf496162907a526bc335cb51cb5118f4c43f": "0x00000000000000000000000000000000000761656d6f6e6b000000000000094061656d6f6e6b31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424e872fcdd80ae390229fda198aa937ca03036032b9b1680acf37d6366ac18a5133d414e7448890d": "0x040000000002000000000000000000000000000000000d4775737379204b7573616d610000001667757373796c616d626f7340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424f00986851bb8956af63165579ca558359619fe514fd5b89adcaa5710bd25ebcc789c2fa7602270": "0x0000000000000000000000000000000000047975750000000000000d40365f73656e73655f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424f992f424aeeefd1455048def79ccb4e4bc0d59baaf2a8a0d2e734ca0100bb8040fe7ab8aac1e30": "0x00000000000000000000000000000000000b4a696c6c204a6f756c65054a2e4a2e1d7777772e696e7374616772616d2e636f6d2f6a696c6c5f6a6f756c65001b6a2e6a6f756c652e73696e67756c617240676d61696c2e636f6d00000c404a696c6c5f4a6f756c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424f9bfe2f5f566ba2a69669a1ed766923a30b1e7cca2c9826f8a0e488afda158de90d7d5bb3f2c24": "0x000000000000000000000000000000000009696e7465726e4c460000000000000a40696e7465726e4c46000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714250ef6a5cbd72bfa16b034f4bf8ab3117bf2bf4feb2babb28379bb9899870303ce71c91dd0d48355": "0x0400000000020000000000000000000000000000000018556e69717565204e6574776f726b206f6666696369616c18556e69717565204e6574776f726b206f6666696369616c1868747470733a2f2f756e697175652e6e6574776f726b2f001568656c6c6f40756e697175652e6e6574776f726b00001140556e697175655f4e4654636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425235c4616852bcaa6c197a5b757309578dfde7a02e19aa9922b8f81a60e81bb0c6b7295090b3456": "0x0400000000020000000000000000000000000000000018564953494f4e5354414b4520f09f9181e2808df09f97a800001840766973696f6e7374616b653a6d61747269782e6f726715696e666f40766973696f6e7374616b652e636f6d00000d40766973696f6e7374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714253268461f29d2acccb0f65823925167071b3eb927035d1343bfaf8cf417b92797a6ed086e89a102": "0x00000000000000000000000000000000001070696e617475626f2d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425353340b14f223feca02a9b52d76d20af3ae90bf5b94103c133d5527e16efd65a35dfaa37985d19": "0x0000000000000000000000000000000000085469656e2043501b466f756e646572206f662043797072657373204361706974616c1668747470733a2f2f637970726573732e776f726b2f00000000094043617962616368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142543c8452e8934bd38772a0fd7eb47babc5fb6c790dec561f05e2adfad50dd61c8b8d173af2be865": "0x040100000002000000000000000000000000000000000d4464656d6f6e20706f6c6b61000000186464656d6f6e2e63727970746f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425469260aabde91ea8c5c990641c47a3a8469c4ad213eeb46f2801980b10dbac0e9017cfb33e083e": "0x04010000000200000000000000000000000000000000114d61746575737a207c2046656e6e656c001b68747470733a2f2f7777772e66656e6e656c6c6162732e636f6d16406d61746575737a63613a6d61747269782e6f7267176d61746575737a4066656e6e656c6c6162732e636f6d00000f406d61746575737a5f706c617a61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425551d356c585aa2ccce0525a37c12d0fac63ea107465b64b4c17a3909264bb6bb415d12afbe5233": "0x0000000000000000000000000000000000054d6174740101011f7472656e64666f6c6c6f77696e677369676e616c40676d61696c2e636f6d00000a406d617474686c6962000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142596b8a2c5a7ae9c3e7b612fc6c728479e6abddf22f53e7069268b1f87dedc584bb4912fbf42da0c": "0x0000000000000000000000000000000000084d61785f44455600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425a03b4e2357699ce0b8c79103a2b1c659912f45ebadf84a78b84562ca27e3b5cfa4af706be20a56": "0x00000000000000000000000000000000000f4269676d616e74696e67313939350e4b696572616e20436c61726b6500001a6b696572616e636c61726b6530323240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425a7fa8b48b0dc6e1896ac947535ee6c006b54dbf3e01a0de2b718ba3b38b14f540d8d71e86d2d4a": "0x000000000000000000000000000000000015546575746966204b7573616d61202d204d61696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425b4120dcbbe9fbe2e3f0a9ceaf7d69fed8e15a7e2b1477ca3f16195815d09b9508dc87cfef97203": "0x000000000000000000000000000000000003444400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425b4af64c3e38cbe46996819b24f30d5fd5dc85ae9d4c7b7943e72f4070bd9f2a87ac77198ee5f48": "0x04000000000200000000000000000000000000000000076368746f6c6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425c679865a91ba59c66f4d91ebc7dd0065a5a2837014e5f4cef5d36d36d4ba7c915137d885dd7640": "0x0400000000020000000000000000000000000000000016626c6f636b6275732e636f6d206964656e746974790000001a706f6c6b61737570706f727440626c6f636b6275732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425dc4c79b17138074041c5f5872efdc4fb7b09ec7b6e68b6ce3196c799ad3de2982d8ebc9baca81f": "0x040000000002000000000000000000000000000000000b4e6f7661537068657265000017406e6f76617370686572653a6d61747269782e6f72671673686170616d6f6e69636840676d61696c2e636f6d0000114074616d6f74696e6563313737383938000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425e76612e7693e49429de6ac8a65ed9b4c69bbd0f2ee9c1bfd11128756886505fb8bcdbf6fa79d0e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471425f12f3d544b80bd34b05254d36fc7ffe4b638171bb90a9b468c3de832375d46880204b9ff253d53": "0x0000000000000000000000000000000000114f75747374616e64696e67204f776c73000000157468656b6f696e62657940676d61696c2e636f6d00001c747769747465722e636f6d2f4f75747374616e64696e674f776c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426211b2f2f0598491e104b112afb4a9f23112f3eeb28f0e7a707b5a05d9a2d135b6022fc4b01bf25": "0x00000000000000000000000000000000000e537065637472756d204c61627309436172696d616e421d68747470733a2f2f737065637472756d6c6162732e73747564696f2f001c737065637472756d6c616273747564696f40676d61696c2e636f6d00001140537065637472756d4c6162736e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714263009f5614f119d3aaff7070b2622937cc10f63da0c5ce84b487bd2c83eae3bb7054e7089a9dd05": "0x00000000000000000000000000000000000b67662d6e6574776f726b0b67662d6e6574776f726b1368747470733a2f2f67662e6e6574776f726b0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142638a30dc57d656ec085d0dad974c2fc1e90f79317b3703c5161f72e5d22bef963287f6ef23cca44": "0x000000000000000000000000000000000007506f6c6b613200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714263e102005892ac7f8d2eedd093b0a70e25c5a48bf9a499d146ed4992658523e97b3ff165768cf6c": "0x0000000000000000000000000000000000154152544f4245205820504f554e444d4f54494f4e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142643c0564bb7e30e26842927c98a50ab1d439ab45f21c5beb6970556e1fd7b52df44977e4344b148": "0x0401000000020000000000000000000000000000000011447261676f6e5374616b6520f09f90b20c447261676f6e5374616b651768747470733a2f2f647261676f6e7374616b652e696f154064657266726564793a6d61747269782e6f72671b647261676f6e7374616b654070726f746f6e6d61696c2e636f6d00000d40447261676f6e5374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426539dd1197511f342669bcaafd39bc9125bbd0199a6cb98ee674008cd2920b82c8357207753e803": "0x0000000000000000000000000000000000054d696b65010101156d65746177696e646f7740676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714268082072d3e2d0b9421c10cb74e62cb8f5e6ca928c519587c563f9516037cf193f720f0a882e930": "0x00000000000000000000000000000000000b4c656d6f6f6e6b61746500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142695e8a0520bfa9dda6b80813a57b98ed3b95c6dfa6c5b0fedf8ed8547bca16e7310a7354f85d35d": "0x00000000000000000000000000000000000a63727970746f6e696b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714269ee4e3b1539dc2acbe56e4e00aac105c15e7cde200eac5232b9ee4f0d8122b02f847134bfc136e": "0x000000000000000000000000000000000012426c61636b736d69746827732053686f70000000126f7065776b6f4069636c6f75642e636f6d00000f404f705f4b6f6e7374616e74696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426a2abbc21cd770cd88a4b558274e57737ffd3fc9741848596199a29d77fe511804d20810cb76050": "0x040000000002000000000000000000000000000000000d5374616b65506f6f6c323437000019407374616b65706f6f6c3234373a6d61747269782e6f726716696e666f407374616b65706f6f6c3234372e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426a6a8ae22d0110eb2586fbb5db54f99a3aa3a99b2c87fda3498df4f30f8fab356fc86a842dec01c": "0x0000000000000000000000000000000000124d616e6672656461735f4576726c6f6f740000000000000d406d616e6672656461736d69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426adffd4419ace43f6fa0cf7d27491e295e6a4f2709e8eb8927a97c46f7dae68626cbd313684191b": "0x0000000000000000000000000000000000064d696b797300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426b35cf487044dfd1ea3706798fbbe6699c767dab7560171c3ad1ad972987d18e63c23c9bd736369": "0x00000000000000000000000000000000001041686d61642e6773204b7573616d6100000014646f7564792e31303140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426df78e6ebcd1d0c3662167b8a0a620ff11573a953f92c9da6245a263efcaf2b61af65019ee3e55d": "0x00000000000000000000000000000000000a626f6e676368696c6400000000000008403078426f6e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426e7f4ebcd01d4dae6dd0a94c6dc8091d357cf0092af2f8e108daf432d02d27dcb7ffd019d98a509": "0x000000000000000000000000000000000007496e64696b6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426e9d47393173c428a65f2773ad69cccedc0a58ef7ebd2d446b882231b4b97044105b2035a8d9546": "0x040000000002000000000000000000000000000000000950524f584641524d0000000000000b4050726f785f4661726d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471426f51cf99f66fce5e41f9361b1bd23844ab32b6f1b635064ff5c99769c05eb09f5a3c9fa00de150b": "0x04000000000200000000000000000000000000000000174f6e205361696c7320f09f8fb4e2808de298a0efb88f00001440616e647265793a6f6e7361696c732e636f6d127374616b65406f6e7361696c732e636f6d000009406f6e7361696c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714270aa664dc019028d02c1edcd16c17e8e1a9b6d3bf8c20df4c1427225868599d0e11da1442eb297b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714270f33fa5ffc88e7fe98d7eebee0a3c28cbb5b7449632fe9b13cae934d94d81e586c2ea9167c906f": "0x0000000000000000000000000000000000086179796c6d616f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427183e524af681e5420a3bb7932c1b6694b1c93d9e9790850e2078b8cbec088a627ca8b9b5dc6967": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31360f42494e414e43455f4b534d5f3136000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714271ff91c2b1791ebb441c495bb40425f2fd7462637cd29bd01c9dc55ca02a673ef072c7a9bc77c7d": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714272d85207cb7341e54563af23dac19e85f9bd579b947129c25ebbb716f24cc68c969f722ba417622": "0x00000000000000000000000000000000000642757368690b487970652042656173740c6361742d64616f2e636f6d001443617444616f4e465440676d61696c2e636f6d00000b4043617444616f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142730809323ff3aebc29ac3c17a8bb1145487c9f80bc86e6982b95bfb522b6e191ab95ad8f248f07c": "0x000000000000000000000000000000000005486f6f6e09486f6f6e204b696d0000106d61696c40686f6f6e6b696d2e6d6500000b40686f6f6e737562696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142738f0604af4e9680c641da3001395ee6a8d44faed230e8cc7f039191fab991021ca58dad3172b60": "0x00000000000000000000000000000000000744696e657368010101010000104074686564696e65736870696e746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714273e2115b33b2f4960a964547185528c66b393c996dd1ea1a2fc678ccfa4f28e03d60827f49b6542": "0x0400000000020000000000000000000000000000000011536f666969615f56616c696461746f7200001740736f666969612e6b6f6e3a6d61747269782e6f7267136b736f6e696e393540676d61696c2e636f6d00000b40536f666969614b6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142759a5301fcfb0872e9416cca9f463361a1bf01b274de3e4af349dbaa8132ac4a9e5566c5dbef43f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142766b6d320142106cefea2b648a56b300b4511b7feace87a8dff2b99f163ac2ad17cbbea3432ab45": "0x00000000000000000000000000000000000b4c6f6e64757a626f756201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142777a559c125897fb8897a746ceaa53376946a3da353c1c987df8c0caa4395ac0eaf0e6c74874054": "0x040000000002000000000000000000000000000000000b4a656c6c6965644f776c000017406a656c6c6965646f776c3a6d61747269782e6f7267156a656c6c6965646f776c40676d61696c2e636f6d00000c404a656c6c6965644f776c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714278fa2422dbf57da1a7905c207ba3df34886df12a314267e511c90f8ef357424cc6af0477661a37c": "0x00000000000000000000000000000000000953696d697374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142797bb0bbacd54cfa8eafa89c9862249c89e31d6d78bf5392b4659fd33e66016a789653677f9125b": "0x0000000000000000000000000000000000086c6553717261780000000000000a406c65537172617831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427bfec468e3649a946869d994ac3ddc5d2ce93cc76f9f92b675b41ccc7b31fb60d9fadd663084552": "0x000000000000000000000000000000000005486f646900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427c0c7503f888af4507c59dd084108f16b86c906157a8249cf5f750652e76b937a22e3f551a5ae31": "0x00000000000000000000000000000000000870756e6b4d757800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427dc7bc51117cc44d46e6f10cd59b0f6d7082dffb33d27c9f29801233f8e28fe3f5edf2d51762c6a": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427e3665867fc087e60653ca4d287e643df8f9486e158c6eafa04e5d8feb9769009ab627ef1dd5f2d": "0x00000000000000000000000000000000000c4261626565617a79417274054d6172790101166261626565617a7961727440676d61696c2e636f6d00000d404261626565617a79417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427e9a7919c98f38360052cf9f18f47b46ea52cf4473db3ca3c959b2112b819a60c1d0f36ebccd61f": "0x000000000000000000000000000000000006756e7a656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471427f56a6db2b3eecc9451838c59891cd58256365f2d308e0144ef49acb3cbf5596367c8afaef0db66": "0x0000000000000000000000000000000000095a6172746861617800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714282a8872a6cadb12700066767b3608dcde8ee2786b93d9c2e165713b53b6cda62ea106816fd99275": "0x00000000000000000000000000000000000b54696d65202d204e4654085469782e6f582e1c68747470733a2f2f646973636f72642e67672f3432716876613452000000000d40456d626c656d5661756c74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428850aae739e89a2387d4dd17e44506ef67c50ab4b10bb102b9666ad954a3fb1977aa46eb6ec5928": "0x00000000000000000000000000000000000a466f726573746f6f6d06416e746f6e00000000000b40466f726573746f6f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714288be1c561b186005c4704c11534f0e15a863cc2cb28488c9b8ae614d1fb783cc852e39751415423": "0x00000000000000000000000000000000000d526f636b585f4b7573616d61001668747470733a2f2f7777772e726f636b782e636f6d0012737570706f727440726f636b782e636f6d00001040726f636b785f6f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428a876cad533fcb536677e8e5d84c1a25bdac951e9055abff3df4c7a656abd841197a8726ff29a3f": "0x04000000000200000000000000000000000000000000094c656e677569746f000012406c656e676f3a6d61747269782e6f72671530786c656e677569746f40676d61696c2e636f6d0000094030786c656e676f000c4c656e676f37233236363400", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428cb5aade7584f6236d7b7a05501f3e93e7eec83c53739147dd9824554e4907136371ca062820e3d": "0x040000000002000000000000000000000000000000000c4d414d415f4b5553414d41000016406e61737461736979613a6d61747269782e6f726714696e617374696b6e6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428da33985b8d542b60db22642e7a1b7f871e2013ca39ab20b15b9416a5b7e9ee91e1e17fa92d5393": "0x0400000000020000000000000000000000000000000015416c746169722062792043656e747269667567650000001468656c6c6f4063656e747269667567652e696f00001040616c746169725f6e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428db6c1e91cbc43002385caf9a08b92ca458a0b817a8cc303cefd5a0c6e108cb939e04242b9e007d": "0x0400000000020000000000000000000000000000000014537562517565727920436f6e74726f6c6c657211537562517565727920507465204c74641968747470733a2f2f73756271756572792e6e6574776f726b001d6a616d65732e6261796c794073756271756572792e6e6574776f726b0000114053756251756572794e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428e36dda90f16500f4589b70331ebfba6b8234b1c07b16147d6078068532b53c1a6cd8805e69e851": "0x0000000000000000000000000000000000084c6f72696d6572104c6f72696d6572204a656e6b696e731b68747470733a2f2f6c6f72696d65726a656e6b696e732e636f6d14406c6f72696d65723a6d61747269782e6f7267146c6f72696d65724077616c6c6574792e6f7267000011406c6f72696d65725f6a656e6b696e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471428fb6c72ec6fc14e848c56fc8974dae17c36f18d1e913ded6985fcd583df94391d0fc4a50a1c0924": "0x00000000000000000000000000000000000e546865546f6d69657374546f6d0754686f6d617300000000000f40546865546f6d69657374546f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714290aec17ae7c197466fae573cabe4172bdfc60dfd00dff703a4323854715c151f868293db828190c": "0x040100000002000000000000000000000000000000000d4a61636b20456e74726f7079001968747470733a2f2f6a61636b656e74726f70792e636f6d2f18406a61636b656e74726f70793a6d61747269782e6f7267197468656a61636b656e74726f707940676d61696c2e636f6d00000e406a61636b5f656e74726f7079000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429318d8841335dc7701eaba887e5794e19bde970c93ba68b9ea14c2d48be3f2d9a12a789f2902c27": "0x00000000000000000000000000000000000a496861766563616b65034d6f010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714295296813f75420be0499159353e5c5651dea2347d516d5ffb1e3496e62a6a087f7439b222d1e665": "0x00000000000000000000000000000000000853747564696f4a0000000000000a4073747564696f6a5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142960a5a23c329652582e9acd4386d60a8d3de206a575ab9ab0c383f3b4ee88d2a2ed144afd356504": "0x040100000002000000000000000000000000000000000b696e74656772697465650e696e74656772697465652041471b68747470733a2f2f696e74656772697465652e6e6574776f726b0018696e666f40696e74656772697465652e6e6574776f726b00000f40696e74656772695f745f655f65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429654c28b22ab06086c19b8337e75a61904cb730732c64c378b2922700da9818668a94ec35829e0e": "0x0000000000000000000000000000000000056473746e0d44617374616e2053616d6174000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714297025ac0a2861c0fcef6b2f12605598c64baa5ec72a1db7a6e7654360badcd2e67dbd1d2b2d9256": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142982470e0bf01d0a9af05930538bcbd3d1528f59c4df5d615040cbe411289089cfe743ca48be7319": "0x0400000000020000000000000000000000000000000019f09f8f8e204e4f444520464f5220535045454420f09f8f8100001440776f75746572643a6d61747269782e6f72671b776f7574657240706c6179696e672d67726f756e64732e636f6d00000a40576f757465724466000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714299784d2cc9f99090e29197ee74a3422dda534d19a173a3dae9afc1773191a37c85590d25c67be4b": "0x00000000000000000000000000000000000d66726f696c616e63727970741346726f696c616e20546f676f6e6f6e204a721a68747470733a2f2f66622e6d652f66726f696c616e70746a72000000000c406670746f676f6e6f6e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142999edd4b53f027ecc91bf4a6540ebedbe7ab2bb1a2ee957ad2fcbd832598cbe4e9854d5157fae11": "0x00000000000000000000000000000000000b4f7a7a7920426f62627900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429a258cec4ae7bede4791bfac251c2d421fc66581de126c16b072150c9af2700fc1350b948184819": "0x000000000000000000000000000000000021536565722050726f6772616d204e4654204172746973742053686f776361736501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429b138c94f24ba807c4e144380357ad3e690e74f5b7bbbe4b7d6ab1579d4c6d7c844ef003cad9a24": "0x04000000000200000000000000000000000000000000094d65676154726f6e000000166d65676174726f6e407473657276696365732e6573000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429b9b611bc58a5c6b85a4656256013cfb7410f0febbc9a1ded0f040b7e5b7b865eb0ab16a5742b2f": "0x04000000000200000000000000000000000000000000064261736d650741647269616e00001f62696c61736576736368692e61647269616e406f75746c6f6f6b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429c4999a48e5667768f6e4f77f043dfcb9fe88519996ee25ccae674ccda259bc49efec6b6eeb9607": "0x040000000002000000000000000000000000000000000769636869676f0000154069636869676f39343a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429cca489d7d2fc39fadbad8979264e72d837f2b49a43abcd743143676bbe11ce1cdfd879c5def616": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f33300f42696e616e63655f6b736d5f3330000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429d473e4b9c6ee4e2cb14594939f2e2e92e4a59865b659d80be0098ac588dc505f23a9a920cad53b": "0x000000000000000000000000000000000008536161616161610a426f79616e67204c490000163234637572696f7369747940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429d8b41991794e5af304702103a2e260caf32e751ad3118da93f5d63fd2df34d2e712cdc73fbd885": "0x00000000000000000000000000000000000d746f6b656e65636f6e6f6d7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471429ead3ff3726eb80ca4b7bbbeac7ff1d48696fb7cdf933462c6c88a7ebe705f9b78f6ca1118a847a": "0x000000000000000000000000000000000006547963686f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a034e76d17b70ce66823a843da63136d51a51334c6a771685c15258684e29d2821c3c395646187b": "0x08020000000203000000010010a5d4e80000000000000000000000000000000000000000000000000000000b44616e205265656365720000154064616e3a776562332e666f756e646174696f6e1464616e40776562332e666f756e646174696f6e00000b4064616e726565636572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a0c6cd2b29fcf6d60c48535dc707316c51bd853d9b05b977a3760c501706ce9478115de6559663f": "0x00000000000000000000000000000000000a4b7573616d61446f74001a68747470733a2f2f7777772e6b7573616d61646f742e636f6d001468656c6c6f406b7573616d61646f742e636f6d00000c4063726f77646c6f616e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a1134d83a717cc23ca3ed66a374595d4e050482af14bc60b90bb7d8df76188c71d634ee96c35d53": "0x040000000002000000000000000000000000000000000e50657266656374205374616b6500000017706572666563747374616b6540676d61696c2e636f6d00000e40706572666563747374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a1320a99290f3dd9ecdab6f55231e079a117c5f06f01bb8bf0cb3b67c376852d8af206c355b191a": "0x00000000000000000000000000000000000f547269636b79204e4654204172740f547269636b79204e4654204172741768747470733a2f2f747269636b792d6e66742e617274001e6f6e6c792d747769747465722d646d2d406e6f2d6d61696c732e636f6d00000d40547269636b795f4e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a185e7f1e6a0461ac03820d55ca72a6676284bb540a1d18c7746371f450998a5ca3e0b1354d5e13": "0x0000000000000000000000000000000000074b656c6c657200127777772e6d6f7573652d64616f2e636f6d001f6b656c6c6572636f6e6e656374696e67646f747340676d61696c2e636f6d00000f404d6574614b656c6c65724e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a251205d65518b0e6b912626c9dfa3cd9e65b4412b19eb9d123edb1aa22d492a58a88091c483a7a": "0x00000000000000000000000000000000000e506f6c6b61686f6c69632e696f001668747470733a2f2f706f6c6b61686f6c69632e696f0013696e666f40706f6c6b61686f6c69632e696f00000f40706f6c6b61686f6c69635f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a3601b2926d2aa7ee5472873e774a1879d8fe0912f0a136413ff823109b9c068e8a7cd4bd0ead28": "0x000000000000000000000000000000000005686f6c6101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a5c73c6ad046c7c067b80b3c8b6fb55b60cb6521bdba3d1ff34daaabbe4644e3ae75c8e7bccff28": "0x00000000000000000000000000000000001145636c697073696e672042696e617279001a6d696e64732e636f6d2f65636c697073696e6762696e61727900196d61696c4065636c697073696e6762696e6172792e6e657400000c4065636c697073696e6762000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a65c9799fef41adec3d304da58d77a4384fced1c59dd3cbc9618dd1ec92e6feb64293147272a21d": "0x00000000000000000000000000000000000a526f636f20536170650f526f636f202f20446f7463617374000017726f636f63727970746f343140676d61696c2e636f6d00000a40526f636f736170650009726f636f7361706500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a71ae4fc6878ea9141511ed1278bc4166aefccb1eb7b6d8dcde86cfd02dd6e618107ba76f6cc905": "0x000000000000000000000000000000000009414747454c4f533100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a9b352e5eaaff5751f78769768fc88c83546881a768523b3c70c2500159047a970ac4ef16768af6": "0x040000000002000000000000000000000000000000000a436861696e5361666517436861696e536166652053797374656d7320496e632e1568747470733a2f2f636861696e736166652e696f0012696e666f40636861696e736166652e696f00000c636861696e736166657468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142aa13e08bfb58aa40e4022c39c8e100f36455fc8ef6a2a0999baef80c518e806adef3ee7608e2218": "0x00000000000000000000000000000000000a496c6d6972204d455806496c6d697200000000000840746865773071000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142aad13c977c6bc57764ae05560f633f233c4aeac3330e9a926c32ccfcb57f901467a4dafa879752a": "0x0000000000000000000000000000000000084761627233616c0000000000000e406761627233616c6d75736963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142aada661b281a2ddf299e83c04aff581d1178bc3dd281429d9943509d7eae0324bf8d78584fda712": "0x00000000000000000000000000000000000a486f646c2e4c616e640000000000000e404c756d6265726c616e643839000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ab19abf6982483e78d53a2db8434656a5620d77fb78b554ad096691357fec6d7fa8da47a2478e22": "0x00000000000000000000000000000000000f464f52455354204457454c4c45520101011576616e6176616173656540676d61696c2e636f6d00000c4076616e61766161736565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142abb6322ab12c37de80dbb410667a153e62d495a9e0f9bd4b903879e531fefa123aad127e8d33f67": "0x00000000000000000000000000000000000961766568756d616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142aca435ad8607d4a7a53e11bad682523eb4fa9d18bd1dbdc84b50162e2005c0ee93b1cb235414732": "0x04000000000200000000000000000000000000000000076879706e6f7300000015696e666f40706f6c6b612d626c6f636b2e6f726700000e40636861696e616e646d6f7265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ad59b47893766e9a215ba2d1b408fd5350b93f2566124331dabc06e94c16d7080d3cd5771d59958": "0x04000000000200000000000000000000000000000000124265737456616c696461746f724576657200001e406265737476616c696461746f72657665723a6d61747269782e6f72671c6265737476616c696461746f7265766572407961686f6f2e636f6d000010406265737476616c69646165766572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ad67d457f83cdba42988a08e2e4e44a78abcc93d99d458eaf9cb23daf6de093ca2aaca1b2111025": "0x0000000000000000000000000000000000096c6f7265666176650000000000000a406c6f726566617665000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ae9d42a8da3cf5b1cc30a09ab89ebd5c6750f7df34378d6d750a2fd3be256735fae11dd04412f6e": "0x0000000000000000000000000000000000086d61636e66747900000013646d61636e66747940676d61696c2e636f6d000009406d61636e667479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142af56ffa9ecf488b30743e11bca3faf36dc95314e5640f330c12669b9d90a800fe2c1fa20c890777": "0x0000000000000000000000000000000000084d722e4c696f6e0000000000000b40636c656d6f6e635f63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b031c075ea343ce443c76dcde19df9387486ded7845c6d85ec2a4c17f38f8b1e7a0a14de7968d7d": "0x04000000000200000000000000000000000000000000064b414d454c0d6b616d656c7374616b696e671968747470733a2f2f6b616d656c7374616b696e672e636f6d19406b616d656c7374616b696e673a6d61747269782e6f726719636f6e74616374406b616d656c7374616b696e672e636f6d00000e406b616d656c7374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b0cbf1e0fccd13f6e829382b887d84d8fbb444ae215bac5c1b639e7c5cae2bddb49f35110b16213": "0x040100000002000000000000000000000000000000000b5368616479626c61636b00000016626c61636b736861646565407961686f6f2e636f6d00000c407368616479626c61636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b14414c029d53fe7e02cb4148b7af9c92f176daf919bbc75df1ba8de7446788d07846817a9ab85a": "0x0000000000000000000000000000000000076b6f6d6f7269114d6178696d6520546973736572616e641d68747470733a2f2f736f756e64636c6f75642e636f6d2f692d772d73001573686f76736f726940686f746d61696c2e636f6d00000b406d61786b6f6d6f7269000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b1965d612c430d2087a435025db114c8c7f0778e86efd968ee4a60bfcee8dcecd19099e28daf46e": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b2a875868c6b85caa32859a54b9ea9d36cf5af9ed03febea761fb5d9f380b6d517874b96d87866f": "0x000000000000000000000000000000000007616461636f7907616461636f79000013616461636f79313340676d61696c2e636f6d00000a40616461636f793332000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b6e818ad6aaf2194425333101d35f55eccfe16b28f0e65007a0076ca42eecb050405f6e0ac4737e": "0x040000000002000000000000000000000000000000000475616900000018616e6172636879636861696e734070726f746f6e2e6d6500000f40616e6172636879636861696e73000e616e6172636879636861696e7300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b732c11caed7a5626902bc2f712f4c3fe8d6180e162376ba644cc80ba99e84cb9bb8e50c20c546a": "0x0000000000000000000000000000000000094e65772041656f6e0d4c656f2056696b746f726f7613687474703a2f2f6e657761656f6e2e72752f0117736974652e6e657761656f6e40676d61696c2e636f6d00000a406e65775f61656f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142b757a72ee144495f0d30ae836bb1d44542a6ceeeb6ce03aa7313cc47b96a4ad19160074bed83621": "0x00000000000000000000000000000000000c4b7573616d61427265747400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142bab42363fea46ad00f52ade889dac25285059b639359071c2aad88e3f1f60593f86cc460ce20213": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142bac4814c142df16f89d49e97071dfd7f8971ed816c0fc60a34aa6a8d0b1af8f7c6922659dfbd789": "0x00000000000000000000000000000000000d63796265726e6574776f726b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142bad7c5b850e0c22423a671a90c3fe2169dbaf169d5446c1470985ba05bee19614f2afef4eb2f15a": "0x00000000000000000000000000000000000945475245474f5245011a7777772e736172616867696c626572746b756e73742e636f6d011973617261682e67696c626572743840676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142badf2d7418dbc94fa2ee018998f963b05d05b960d10a8b47043ef1fa552415e0f128e239d9f4a17": "0x0000000000000000000000000000000000095a69676775726174001f68747470733a2f2f6769746875622e636f6d2f72756e7a696767757261740000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142bc21eb1a6e88498ea524b9e0dd9bd336d31e71bc1a172388b10d4b6571ace5e7e6e836483110216": "0x0400000000020000000000000000000000000000000009446f7420506c757300000016706c757373696b6f6e64654070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142bc675823ce5a7ffb49815cebdde0943433b0670fa66180bf2b957cd6ebe203be6e581149fc38113": "0x000000000000000000000000000000000007416e696d616c10416e6472656173205a7573756e6973127777772e426162654472616b652e636f6d1840616e696d616c6f756b6f733a6d61747269782e6f7267126961676f73383140676d61696c2e636f6d000009406961676f733831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142bce7bc79ded2adecaf177ad58c772e31f10a83e8b76e4905bb78d5547e8976e19ca4c3366609015": "0x0000000000000000000000000000000000094172636f694b756e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c044452e691b7312c2689f3c9b59f32f1730cd3bc8c54fe55ba31d2525cd7ec80a3dc6726809240": "0x00000000000000000000000000000000000453616d000f7777772e706f756c70732e636f6d000000000a405f73616d5f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c09493faa9e924efc5d04e7ff3965c8285a2c23aa573117deeed886bbe5e3be0974f1cf0a2ff216": "0x0400000000020000000000000000000000000000000012e29880efb88f536861776ee29880efb88f00000015736861776e40706f6c6b6177616c6c65742e696f00000c40536861776e5859616e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c0e09d90be40d90180da4776d78804652df766f9f002b4f448f183732eee12da7c3816f02031e64": "0x00000000000000000000000000000000000866756368736961086675636873696101011867616c6178796675636873696140676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c157c9e312512df503fbcd2efb481dccbbb4c6d7ce0c60700e0fd3c81bc126372d6e8efcbe2bb2a": "0x00000000000000000000000000000000001148656176656e734c617374416e67656c0000000000000e4048766e734c7374416e67656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c1a489d7e391b077c64f959f2bfd05207d426c9e28b0bdfda70d0fdac821107c426570205e67779": "0x0000000000000000000000000000000000084150452058323701010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c1efb90638974dc0c30a71e750654bc69b1e570c34c27c623f3e42f94632e3e1508f88bf97a1d5d": "0x0000000000000000000000000000000000074b5553414d4100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c2dd4393185b96676d76166add74cc4fad0151e7780acb5555dc57e14ce131251df83de6a5fe841": "0x00000000000000000000000000000000000c6c61692070696f6e65657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c3ee724586db259eaab0cb55c147ffaf184a4c00513e85f6d5bb6416994fbdd0dd168f3c59a291b": "0x040000000002000000000000000000000000000000000c437970686572204c6162730000001d6379706865726c6162732e636f6e7461637440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c74588f39d962f18813e7282320dc3025353a1dfd830f346e4d1440636185949584211859a75a75": "0x0000000000000000000000000000000000074261726b696500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c823c435a39d571c8a863618f72322a02f9d0028e6a6b907326041ee098e3259b39193a0cac5a41": "0x00000000000000000000000000000000000f4976616e2052204d6174682023320000000000000b406d6174685f6976616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c870467e584bae74292ae067e7aba72e9d415daa26425b96c13c059b76a9cacfd1edb2e1563be0b": "0x00000000000000000000000000000000000d50524f504845435920415254034a5400001970726f70686563796172746e667440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c8d642db83d4b3caeddba72d260d2a9d78d169f5a6762909502702e9b2e9bc7722c51cc5eb8dd31": "0x0000000000000000000000000000000000054b616e79000000196b616e7963727970746f383940686f746d61696c2e636f6d00000c404b616e7963727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c9114f608ac39a9a45d1c3020272172fdb2238d4b68c1f8d6178dfbf4a80404dcd01da024dac33d": "0x0400000000020000000000000000000000000000000009476162654b6f696e0000001c6761627269656c5f626f6e75676c6940686f746d61696c2e636f6d00000a40476162656b6f696e00114761627269656c5f564453233735383600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c99d1fc868ada3d123fc89c054713d7d6cea09d68bba5e3c45d3267549c5af73c5be3950afd3370": "0x0400000000020000000000000000000000000000000007536f6e64657200000014736f6e64657240737769736d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142c9bb7cb7587271684546cfff5fbfa479772bca48aad4222d5d56aea6027594293a87ae664c60b51": "0x00000000000000000000000000000000000442454311426f726564204561676c6520436c75621c68747470733a2f2f626f7265646561676c65636c75622e636f6d2f0019626f7265646561676c65636c756240676d61696c2e636f6d00001040426f7265644561676c65436c7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ca72e801f676e6fe034fb93b0d06e8a0db8dd5fac4edd8657c2cc78247ce5200e0b5c4ee6d55f3e": "0x00000000000000000000000000000000001e524d524b61626c652044657369676e732028756e6f6666696369616c29064d2e20532e00001a726d726b61626c6564657369676e7340676d61696c2e636f6d00001140524d524b61626c6544657369676e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ca762582cb6a0a95227e6087c3098806a03e82a5db0f33308340c7fdc3ab90cfd6f8be97ce28456": "0x00000000000000000000000000000000000a43726f776e6c6f616400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142cc588273271e0810837f57eb5dee33b7c8895a425116e9dcf32708397c630ca9a5cb1d71bd2d20c": "0x00000000000000000000000000000000000d43726f77646c6f616e2e6d650d43726f77646c6f616e2e6d65000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ccc8f3bf5790f3e7a5c852e5d78fb634282eccd5d38dc9b353a6c88841816710c12b4ee243ffe2d": "0x00000000000000000000000000000000000b4f6e6520506562626c650000001c6d61726e692e7261626173736f4074776f706562626c65732e696f00000c404f6e65506562626c6531000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142cd98d2b43b99a0b6a325e3630266fda0ef7f7725ef8199726e29d569d609f3cf068c4db7e82591a": "0x0400000000020000000000000000000000000000000009444a5f416e6472650000000000000e40616e6472656d6f6973656576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ce0ec76a2fab446d600c37c06c4c1c4fceca07e2a33e1db5f0958f4d36ce6b05fbc65d7d526c320": "0x000000000000000000000000000000000016486f757365206f66204b696e67732042616e6e65720000000000001040486f7573655f6f665f4b696e6773000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142cf2c3bc9ddc0e47eea5168acc75ce334e39799ff680543ce0217605b078f22967448aa781ba6925": "0x000000000000000000000000000000000010506c616e6574204e656f20504e454f001768747470733a2f2f706c616e65746e656f2e636f6d2f000000000f40706c616e65746e656f5f636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142cf3c07511b5dad1d9c958ec068aaa78b0d6256fea94a50cd19bdc1f82f905e88b4bd0bb5626ecf0": "0x00000000000000000000000000000000001253686f6b756e696e205472656173757279001968747470733a2f2f73686f6b756e696e2e6e6574776f726b0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142cfc30ea1aabc0e1d0cd1d5442f98ef9105aeadc08f225b4df5ebcdf62479ec5b0e540b57c313a3f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d287fe916fe23dc925000bd5b83d502f56c49f2a91e3532af9f919d6eb52d750b72539c6b62d45b": "0x040000000002000000000000000000000000000000000a4b534d2d736b756c6c00001540646f74736b756c6c3a6d61747269782e6f72671268656c7040646f74736b756c6c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d294ae179111e4afa0099be3ab25140ec53154e141885c824f52fc67184630153baa07e1fc1c10c": "0x0000000000000000000000000000000000056476736c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d51e75bf4f0eb6a367371f79b82ad8954a69d5bfdde1c06489909c9a12cb8501b949f58b6a03926": "0x00000000000000000000000000000000000b42794d6978616f6f7073084d496b6861696c2168747470733a2f2f7777772e61727473746174696f6e2e636f6d2f6d6968616900136d6978616f6f707340676d61696c2e636f6d00000c4062796d6978616f6f7073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d52491d0ed316bd6ccfe70c7201bb25d4c6d73cabc89a8dc1d76dc165b691db825c3f4b19889129": "0x0000000000000000000000000000000000064265657a7900000000000009404265657a794a4c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d52913dfdc412f8103b98301a063f5153c46f5c1afa1624ba72db328f8a76b3144eb7d6aa646330": "0x00000000000000000000000000000000001548756d616e2047656e6572617465204e46542773001c68747470733a2f2f646973636f72642e67672f685a464b68426354001b68756d616e67656e65726174656e667440676d61696c2e636f6d0000074048474e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d60b5c259d3d208620cceb8ca6241f9ad974b5719a46a33cf158e2e4ebc86b0771f909d4ff2ef62": "0x0000000000000000000000000000000000094e46646f63746f72084261747568616e00000000000c404e46646f63746f723033000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d697287022039ece6ba43544c8cb8f23a0d86e506d37cd74b63f07ae99714c3915068b4d0c7792d": "0x0000000000000000000000000000000000124b7573616d6120436f6c6c656374696f6e0101011c6b7573616d612e636f6c6c656374696f6e40676d61696c2e636f6d000011404b7573616d61436f6c6c656374696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d7cf31d9f27e677ccd583d619471f2ecbdca885d80a949e38c6c5b4c3ac8ea86837a45407530658": "0x000000000000000000000000000000000010616e647265735f6f6e5f65617274680000001b616e6472657369746f39384070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d859f3bd54b349892e02ce87428939cfbb7fbeeb1ee758b749a5854a1bd3ae9ce36b3bcb753010c": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d8a3df03fe6535f0815155bdc6775c63aceb731d5ebe8d55043b8598d4ed1308b4666bf0e66ba05": "0x04000000000200000000000000000000000000000000135468652052756720436f6c6c6563746f72730000001b746865727567636f6c6c6563746f727340676d61696c2e636f6d00000f40527567436f6c6c6563746f7273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d8b973a55fc6b24b4e398d5f14cefa2a00e1f9faeb8f2fdbe5ff83638ff3e1711301c39eca6e553": "0x000000000000000000000000000000000010446f6e7079726f2e4b534d2e444f5417526f6d616e6f20446f6d696e676f2041617264696e67000014726461617264696e6740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d930a562d1da7c24cb651038cd04fc360e95c5db473d3236c69fd68e57ce9ffa6bec307c450b038": "0x000000000000000000000000000000000012414a414c2047414d45532053545544494f12414a414c2047414d45532053545544494f1e68747470733a2f2f7777772e616a616c67616d65646576732e636f6d2f1640616a616c67616d65733a6d61747269782e6f726717616a616c67616d656465767340676d61696c2e636f6d00000b40616a616c67616d6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142dca72940cf66478a25c9b1c6ebb2832b2ccf7812a405dced6866efa8ff595fbfc408a4091b5631a": "0x040100000002000000000000000000000000000000001050696e656170706c65587072657373000014406f6b6f6a616d6f3a6d61747269782e6f72672070696e656170706c65787072657373314070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142df274fea56f1419fc659bba6d3985002708101d9c2aea9155bd520c105688751281cb40e4d37163": "0x040000000002000000000000000000000000000000000a524152455348495053000000147261726573686970734070726f746f6e2e6d6500000e407261726573686970734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e0a33dd13e78f0efbaebc5c7327144be51df35bb50ff8612c8c9ad73fc7b60b4382b979563de20f": "0x04010000000200000000000000000000000000000000094b6972757368696b0f4b6972696c6c2050696d656e6f761368747470733a2f2f70696d656e6f762e636319406b6972696c6c3a6d61747269782e7061726974792e696f126b6972696c6c4070696d656e6f762e636300000a406b6972757368696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e15b07440923f7648fad007551dd2cf911c9ab936c50be87a01cbee939cd9bc5ba6fde3064cd515": "0x00000000000000000000000000000000000e54484520434f4c4c4543544f520e54484520434f4c4c4543544f5200001f4c414e44534f4349455459524d524b4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e31c7d323f7b00deafa84f0fbcc838d944b1375c809bc99f800d225286b7f25edbdc33f6c469b16": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30390e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e338a8ddaef9fa642fa2391ee121af5f64b30bb2b63d9764735ac422fa2fefb0dfac90ee03a512f": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30380e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e61081843efc3b7105c06afbe01ff98801bf3e46b96d61d0d7aeadf7af7d6c39a20dbf946b0fe41": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e6833257186cc32886267a39c2dd0cd8175ac3e50d353375c694874ba6f48d6aaa4bb9e88ce3930": "0x04000000000200000000000000000000000000000000084d79706c616e410000001464656e6665726d383040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e7e56460089fc7a54c473bf199d05b878ab34e9a37d17d0a8bf70498edb5c759672e984fa38b432": "0x040000000002000000000000000000000000000000000f4170706c6965644243204c61627300001a406170706c69656462636c6162733a6d61747269782e6f7267186170706c69656462636c616273407961686f6f2e636f6d00000f406170706c69656462636c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142e872013d9376606ac9ffd09502123eba056c7619c9b96bec443840450e7759bd0a9817abbbc1a33": "0x0000000000000000000000000000000000066d726d743300000000000009404d724d74453231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ea6cb65218cf1ca90c6619c6ba60125e49e75e1ea5d9b46431ba834d005319cc036104c94fcfd34": "0x0000000000000000000000000000000000114576726c6f6f74204f6666696369616c00107777772e6576726c6f6f742e636f6d00116c757575406576726c6f6f742e636f6d000009404556524c303054000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142eb239de2237ff4464c92fbc08d8d3594de7a9eeae4ef24891cf7e8330faf07ed804cd0045e49e6d": "0x040000000002000000000000000000000000000000000a53686f7274795f33350000000000000a407273686f7274656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142eb552e15974a83bc96e8af1ad79932da28f515b436b020afdfd6a389631609ab07c2fcf2e140d12": "0x000000000000000000000000000000000019506f6c6b61646f7420416672696361204d756c746973696700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ed50d6c1327ddbc1cb5dafe7d8501739003634d34c9e44c526cff633093841194dcbe98ec229920": "0x0000000000000000000000000000000000106d61756e616b65612d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142eda38798820d6b442b5e9dc13290ed285216681dfdf7e2a948b541a618830bee3387d34bd23e262": "0x000000000000000000000000000000000006536163686100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ede9598e62bc86e52e4df0f3307bcc319ff009b0390f8225293b344ef27dc328a0c341d842bb23b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ee91b64f947da118e8bb8ffed82a876768d15ac8dc37d613d3d55abf82c23f9dc644b4c1d3a2513": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142eebecf8e65e7682b8920b8c8220efc9c49ffa5271b5e5356fbeca4f9bfaf73e2b887613d2cc4966": "0x00000000000000000000000000000000001151554152545a20425920554e495155450f556e69717565204e6574776f726b1768747470733a2f2f756e697175652e6e6574776f726b0012697440756e697175652e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ef08ea2ef087797ee50f5c29bb5a49cf456ef7717676a8d905eef37031a02eafb99b203edefb92f": "0x040000000002000000000000000000000000000000000b48697370616e6f446f74000000136869737061646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ef7355afce0085c3a68b37cdcb55285eb9e76ee8744cb3c47c62b6bb07b104116077df4b8460573": "0x00000000000000000000000000000000000a626974736176616765077361766167650e7777772e61646f72732e78797a0b4062697473617661676500000010407068656e6f6d656e616c6d61726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142ef7dd71f889f0050c841e6aea307d8704d5b7b7b71afad58548ce47dce090e25d01b84925e5c48d": "0x040000000002000000000000000000000000000000000a43616b655374616b650000174063616b652e7374616b653a6d61747269782e6f72671f63616b652e7374616b652e73756273747261746540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f01f5b6d9f688b11245242cb72fd4a3b8a7423d647e0463df0017eb7539ea511bf6f7e68b3dbd22": "0x0000000000000000000000000000000000054a70657800000017706978656c6f736f3035323740676d61696c2e636f6d00000e405069786f3632353735383835000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f134a0eed4de1af79454e81bd1c5d52ba72c96494e83f33e2aa22e93d3e500843857b6a7815a11d": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f20db1fb9bc54324c042cc1451781f79ff3bc34cacd5329b21591b2b2d82ad57426a5079ad1c455": "0x040000000002000000000000000000000000000000000a53686f746d616b65720000001c73686f746d616b65722e7374616b696e6740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f2145cd985eff31bcb916e7a7ef77dd1f610ed27ec519b4ec226028eb8edade41f95b217f89f620": "0x040000000002000000000000000000000000000000000df09f97bb4261736563616d7000001840776f6c667374726f6d32373a6d61747269782e6f72671b6261736563616d702e7374616b696e6740676d61696c2e636f6d000011404261736563616d705374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f317d0ceefcb30d381612c21d537305340416604931c9d1c99a50c3f99c794f75d84db494079318": "0x040000000002000000000000000000000000000000000c4a6164652057616c6c6574000017406a61646577616c6c65743a6d61747269782e6f726718646576656c6f706572406a61646577616c6c65742e696f00000d404a61646557616c6c657431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f344d81d36d4b7e7403af740812442eb174a83b37da8d7f8dc2d8b6cde6e7ff968b5cb4b07ffe68": "0x00000000000000000000000000000000000a4e6175777573616d6107446d6974727900000000001040446d697472793632383633333737000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f392ac03e9ede7930dedb2a379560d56675e977ced75752b912f35165ca8380499f8be7b74d426f": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31330f42494e414e43455f4b534d5f3133000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f42d98a8e441c40566fdfde57471dd26ff6213ab7190765d9d10b135cf911b45508a009a95fb03a": "0x000000000000000000000000000000000011647a6c7a76207c20537562737175696411446d6974726969205a68656c657a6f76001240647a6c7a763a6d61747269782e6f7267000000084064697a68656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f694a8c100618ce0209638912655716404e7787a88325ab80a7b0ca614aa5b8e3daea1cae0e1c31": "0x0000000000000000000000000000000000084b72697076616c000000166b72697076616c65786d6f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f77a540c5c2d555742717df0d5932f1d83ab0400a162e39e93a0823f8172cb880c46e1b6dd09c72": "0x000000000000000000000000000000000005416c616e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f816440610f862600ec9f324035cbb3d86ef51a32b5ca578c65271dcd882036d03e77601745d807": "0x000000000000000000000000000000000009416c65786269746100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f8e9f741508842470cff2a79754a54f7dfcc423111dd79554320512a153f45df50abac7e6f9d20a": "0x0000000000000000000000000000000000096368616f73626f6900117777772e6368616f73626f692e636f6d000000000a406368616f73626f69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f8f1ddeb924bbdf5cadb1617794ea8d20a5b0bf1e3275a815229a34c834c9eb6383602ad47ecc55": "0x040000000002000000000000000000000000000000000d504f5354434841494e2e494f000000116b736d40706f7374636861696e2e696f00001040706f7374636861696e646f74696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142f93d78dfd49d0a462d9d0181b12100f1740ab9260827746eac283a626d77755c56bea5ddf3f097a": "0x000000000000000000000000000000000005416c616100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142faeb9cc9f49512f1ea25dc95281641f4b7fd9b8c8d7b970fbe764ad49b2ca1b4402baeb8eb32d04": "0x000000000000000000000000000000000009736974752e41727400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142fbfebd49e947bc8decb110ce95c05a22ef28e342b54a2a7efcba5b6c64fa8ccec033c1f5ebf9504": "0x00000000000000000000000000000000000c426172657944657369676e12446d6974726979204166616e617379657600001664696d733930323338393540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142fccfd4d73aaadfef8c309d6472fab1a89e619867d57934db759e5d76d63b9e67968e36f02787335": "0x04010000000200000000000000000000000000000000084d72457863656c134672616e636973636f20416c626f726e6f7a0000176672612e616c626f726e6f7a40676d61696c2e636f6d00000a404672416c62726e7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142fdab663781fbd7a162f163b179ad5c7c13073565aeb1272868861738802c33bc921b69a9e0e8a6c": "0x00000000000000000000000000000000000748617273686107486172736861000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142fe1803695779c79b2636043fc3b8dfa608167a9fb6fb9d065b9f2f5821dc4bfc9785a244b24a92a": "0x04010000000200000000000000000000000000000000044a6f650e4a6f6520506574726f77736b6900000f6a6f6540706574726f772e736b69000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143020cac001d284991a0d2dde7dd9defc8db6f97b28e3c6a8b4a6887f27a62f60268f6061553fc719": "0x0000000000000000000000000000000000144b7573616d61205374616b696e67203230323100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143036130cfabe43d906a991c8e9af2d6e2422d0909ef0aaf0dbd5cc8c9985fe2967cb159a0f9d906d": "0x0000000000000000000000000000000000094b7573616d6f6f6e0000000000000a406b7573616d6f6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430364fbaff46f65ba081e51d00d0908deeac6cfb45d3e977f37085d2905be73e32c4b9e6707ab754": "0x00000000000000000000000000000000001250726f7665726273204149205661756c741250726f7665726273204149205661756c7400000000000c40416950726f7665726273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714303defe256c66ba0e0fb683f9ef19a5e932b6232272697fabd62213de02d7801aca1e94b03c0b23b": "0x00000000000000000000000000000000000c43495320466c697070657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143046396b7c34c0b3eec4bd650a277342ebba0954ac786df2623bd6a9d6d3e69b484482336c549f79": "0x00000000000000000000000000000000000664617678790f4461766964652047616c617373691468747470733a2f2f64617461776f6b2e6e6574124064617678793a6d61747269782e6f72671264617678794064617461776f6b2e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430669b7d5c8f7c3ab23801b12140968daf5304a7c38e81dbf8d75bedf02b85ae0ca8b4fe394e8337": "0x00000000000000000000000000000000000e6d697368616e79612330303231094d796b6861696c6f0000176d6977616b756c696e69636840676d61696c2e636f6d00000e406d6977616b756c696e696368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714306c8cf26d4e0d752673c96d918a62b9af204d09f3b8a9b984daf0abbd176974da17aa688f991a6c": "0x040000000002000000000000000000000000000000000857494e2d57494e0000001877696e2e7374616b652e77696e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430829bec9693a3c7581bddaf5249dcc6a055652c0654ba073e21bd622d8a5b2aec629a9bc8921562": "0x00000000000000000000000000000000000a53544153204c45474f145374616e69736c6176204c65676f73746165760000186c65676f73746165767374617340676d61696c2e636f6d00000b40737461735f6c65676f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714308ca83512dc5d0c00c6fad38515e62f83f804861803773ae17af068898dec6d558c903663078754": "0x0400000000020000000000000000000000000000000004624c6400001340626c643735393a6d61747269782e6f72670000000740624c643737000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714308d9c16e268f1b512713003b0c7826f024d4517aae0e5dcbfb2b9ead74c4c668f572698d012b754": "0x000000000000000000000000000000000010536174616e69636f20416e67656c6f0000000000001040416e67656c6f536174616e69636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430a74a4157ce4ce35c1be3d517926a6c194d42131d996140f3e8d7398764423cab176341b882ee7b": "0x00000000000000000000000000000000000d756e7374617465736c6f7468056a6f616e1b68747470733a2f2f786e2d2d64723868306474376b2e792e61741940756e7374617465736c6f74683a6d61747269782e6f72671c756e7374617465736c6f74684070726f746f6e6d61696c2e636f6d00000e40756e7374617465736c6f7468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430ac3f1c5457a413d602fcca19d55a03e44eb46202b906cca9d97b3e866b9b4ef584c957c135f109": "0x0000000000000000000000000000000000084761726261676500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430b98fcd88ab4d906463b8663469c48312ecb51fe6151c4fa1e91f93270cb23326ce9d8af3a80f01": "0x040000000002000000000000000000000000000000000a4b7269737469616e4b104b7269737469616e204b6f7374616c1a687474703a2f2f666969742e73747562612e736b2f3439303300196b7269737469616e2e6b6f7374616c4073747562612e736b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430d3bc09d2bfcfb50c7f10142a81fedec753f7c556f5b93a400c280805e7fcdff668719637b13434": "0x040000000002000000000000000000000000000000000f47656f7267695f444f5453414d41000000126a69673737303940676d61696c2e636f6d00000b406a696763727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471430e79056e8a84474ee06959ae4cf287f2e3dc249d46c25dc777851c755931b486d7fb552932da259": "0x00000000000000000000000000000000000b477579576974684c534400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143113d3db76841af844a91dfd908b2b82a43037d003c90f884d3e03e7ec64b460c7caa2c2f5dcf448": "0x0000000000000000000000000000000000104a6f654a6f736570684a6f686e736f00000000000011404a6f654a6f736570684a6f686e736f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143118f1715a74c330aef5e12ceb56767d94848a252a5d258186547a3e9fbc2cb1b4c916d8ac888554": "0x00000000000000000000000000000000000a4163636f756e74203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714314002c34f6b0e235818a8031736e2d320bb0c393bba318521b265f60a449e66567840734ec26c6f": "0x000000000000000000000000000000000013537562736f6369616c204d756c74695369670019687474703a2f2f737562736f6369616c2e6e6574776f726b000000001040537562736f6369616c436861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143149ce02bbbc85a0f809131fc9ebb8441aec7ae0c271a24d13d129266705fb0fef99aec4c1dbac31": "0x0000000000000000000000000000000000064167796c65000d74616c69736d616e2e78797a000000000c407374696c6c6167796c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714314edbaf8df5f693223e082b8fbcf1ff9271ee9630974f9807c33d3beaf0463d069be5e59f2e9e7c": "0x00000000000000000000000000000000000c30784669736865726d616e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714315041883e0df8a8da6a7b717c79a7c7737652894ae316e658fe616977042aa4b41bb9bb1b108371": "0x0000000000000000000000000000000000084d616d61446f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431511477c988aab2e875fa3fb75a0c715e26e7aceaae87e2c8a158b4e6cd5732985efb48b7023474": "0x00000000000000000000000000000000000645696b61730000001765696b617332304070726f746f6e6d61696c2e636f6d0000094045696b61733230000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714315b69d6d9952265924cf81bb5b38134cd8676c29a495f7277ff111b6a1bb6b22caf80d32a1b5c57": "0x00000000000000000000000000000000000c48656c6c6f204c75696769104c75696769204c75636172656c6c691f68747470733a2f2f6c756967696c2e61727473746174696f6e2e636f6d2f00174c75696769417274776f726b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143161b54cf940118e9aa6373b24df370b863773f45f2bed6ebd80c886c58b4232e655a9b130b6d615": "0x040000000002000000000000000000000000000000000a426567696d6f74696b000000157361617066697269756d40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143168f24ac9fff4d65e576cdec1179c77d81cca7e34d35784bf47d6667300642a7697403deb967d37": "0x00000000000000000000000000000000000a7374726f6d626f6c6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714316c889b24fdb42688040f8566edb50fd272f65b2f232a8008fc9d1127b8d543b529306c4ab3ee65": "0x0000000000000000000000000000000000094d6574612d67757903416e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431747b68fd9a8689a0e1a33870981aa76012429e64409e7445f64ba6b3bf75a2e0c97ed51179a64f": "0x0000000000000000000000000000000000086e796d65747661000014406e796d657476613a6d61747269782e6f726700000009406e796d65747661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143174bf5b787aca25e277549039e36cc29f87b3faea4cdc1957238e41a88fe7702eb6486c618f4366": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143182c3bc7056e978c6c42b648b7ba1fe5c4395c5d0465b522e3fcb7b82d8839526fb4384a8d57130": "0x00000000000000000000000000000000000e53746572656f6772616d417274034d4b00001873746572656f6772616d6e667440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714318ee29c136c23ba24d6d7cd9a0500be768efc7b5508e7861cbde7cfc06819e4dfd9120b97d46d3e": "0x000000000000000000000000000000000012537562736f6369616c204e6574776f726b001a68747470733a2f2f737562736f6369616c2e6e6574776f726b000000001040537562736f6369616c436861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431946c413eb637175681edd930e8ed28fb6d74c6d4ddf28067e73e562bd0fe5bae97eb943fa07759": "0x00000000000000000000000000000000000e626c6f636b736272616e646f6e086272616e646f6e00000000000f40626c6f636b736272616e646f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431a1b217ee0ca06caaad489ec818806f0fe0474670170482c6c30c637cc9346895f4829799d3b73d": "0x00000000000000000000000000000000000a4b6f542d4b6f4b6f4301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431ab29bb118a97e0641fc26bf772a415828c28c203d3058b65171ba36adfae02eee832c6ae723e09": "0x040000000002000000000000000000000000000000000a636176656d6161616e00001640636176656d6161616e3a6d61747269782e6f726713636176656d6161616e40646d61696c2e616900000c40636176656d6161616e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431b2fdb72ea0daaebe0b3284497d66688f69f915798eb39419480581d8af1d947081cccf478c3a7c": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431b53430fbb80701a6b7a488577dc9c35aaf6fd9cdb6959eed7d73764ef4909330aeb3179315c921": "0x0000000000000000000000000000000000086772656e6164650f726f62696e207468696a7373656e0f68747470733a2f2f726f622e746e0014727468696a7373656e40676d61696c2e636f6d000009406772656e616465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431c600177e63ce4012e3ea2518656228d1b018a56cf4f968a33342cef3a03eb86a0d7d93cd1a856e": "0x00000000000000000000000000000000000b736164616d626f6265720000000000000c40736164616d626f626572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431c6b74df11dd22926219557f2597e5d6194b4c8f9b23570220d6cac37f05fe10e8f780dcc0c0a22": "0x000000000000000000000000000000000008736d74616e30780000000e6277354070726f746f6e2e6d6500000940736d74616e3078000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431d0fa954fe513fec6f2b101590b7bd089df91f5c01093b83217ffcd1c6867c1512de33cff1f5e06": "0x00000000000000000000000000000000000d4d6178446f744465764b736d0c4d6178204b534d204465760000156d636b7261766164657640676d61696c2e636f6d00000f404d61785f5f4b7261766368756b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431d8dbf29af0af35f0b64148873fede866ca5f0c92fd48bf6eadbe447d71dbd331f83f0555ee044f": "0x000000000000000000000000000000000018616e64726540636f6465736369656e63652e636f2e7a6106416e647265000018616e64726540636f6465736369656e63652e636f2e7a61000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431e2782ae179fbea3a2c6f9e020bc5b17dff66bf280199df9d76dfd0936d912bb75ee8275a64a733": "0x00000000000000000000000000000000000861706f7069616b00001a4061706f7069616b3a6d61747269782e7061726974792e696f1261706f7069616b407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431eb5724c95ef0d7f883366aa0218141016c6bc826e0ec376bea1e39b119dc1f402ac6f5964e9f69": "0x00000000000000000000000000000000000c43756c7475726120332e300000001a736f6d6f7363756c74757261332e3040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431f2c7371b41417c08be3b4777517573d95a82ce78b6833c4db0092078a6dabffddc699905a2f013": "0x0000000000000000000000000000000000096e62307564696162010101136e626f756469616240676d61696c2e636f6d00000a406e62307564696162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431f8c44fbe7173049c1bf5e2ebc5301283cfbc96e83265efa80b326b5fbf5a6845c2c26fbef17c3a": "0x00000000000000000000000000000000000f616e792d636f6e74726f6c6c6572000000186d6f6e657963656e746572697140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714320eb468db7ea3c7aeb9fc068a3340edead118ac3cf3decc6743724cd5fb11edebaa98b540a08f07": "0x00000000000000000000000000000000000a59756e672042656566001b79756e6762656566626967626167732e6d656469756d2e636f6d184079756e6762656566332e303a6d61747269782e6f72671a79756e67626565666269676261677340676d61696c2e636f6d0000104043727970746f436f77626f794f47000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714321d91ef1d84c6471ef2167f2d144a220bdd1dba23aca800112c04f027d5751f9518f021394ae515": "0x04040000000200000000000000000000000000000000135a656e6c696e6b20466f756e646174696f6e135a656e6c696e6b20466f756e646174696f6e1568747470733a2f2f7a656e6c696e6b2e70726f2f1840766963746f72795f76616e3a6d61747269782e6f72670f7676407a656e6c696e6b2e70726f00000c405a656e6c696e6b50726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714322c4a1c125cf6126053336ac8500f1ab1d771ba627a5d555d22eea84ad860a37a137aefa31bba4d": "0x040100000002000000000000000000000000000000000b414e414d495831303030001468747470733a2f2f616e616d69782e746f702f1440646270617474793a6d61747269782e6f726714616e616d697840706f6c6b61646f742e70726f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714323ac9ca334c2bce400a075c48b7985fad91dda0b168b2185958c9fee280f145d2dfe24958a12737": "0x0400000000020000000000000000000000000000000017f09fa681204c454f5354414b452e434f4d20f09fa681001568747470733a2f2f6c656f7374616b652e636f6d15406c656f7374616b653a6d61747269782e6f72671974656368737570706f7274406c656f7374616b652e636f6d00000d406c656f7374616b65636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143245cbbc0d5339b2f4158285b53521c4304c0524941fc1fc64ac08a54b48a45448045248cec18925": "0x000000000000000000000000000000000021504f4c4b4157414c4c45544d41494e284b534d292028455854454e53494f4e2900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432534b4132eff74f56d29c67120f126ad44692c0fba5dc3ca6562485bdfdac135c7e5fb549694545": "0x040000000002000000000000000000000000000000000a50695f3331343135390000000000000c403331343135395f50695f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432540ee9d648f9c790c68164d33e35017d4303436b705e60fa485573f6531d1eb503a6b0b863e63d": "0x00000000000000000000000000000000000859616b616d6f7a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432667cae2c5726a94e544545258bffbd3739e69d0b3681ddfc7da593e4de4d3b709ba9625ad2a962": "0x00000000000000000000000000000000000f6b696c617565612d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714327fdfd66e528b9662d8c4e1c6fbab57ba4df15b8120db4cec5c150371d0755d8ee5312382f47f09": "0x00000000000000000000000000000000000b435249534e475559454e002168747470733a2f2f7777772e6c696e6b6564696e2e636f6d2f696e2f7472756f1740637269736e677579656e3a6d61747269782e6f72671e7472756f6e676e677579656e3139373139393940676d61696c2e636f6d00000a40637269735f76636d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143295418a4c4962cf587a4c5c081f8bf812c0b3824bc9fbd42d39809323488a81769f4699ef2f0e51": "0x0000000000000000000000000000000000056c69616d01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714329d31b54575b3148222952107095b593c6b7b300a4936b35d5064c55f7eded395c3022488510c58": "0x0000000000000000000000000000000000064265636b73064265636b73000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432a8d229e117b02904588a18498ca81fc97612420c9268aee42e4fcd4d33bdcaf34c0246f787e659": "0x000000000000000000000000000000000007736875746b6f107665726f6e696b6120736875746b6f0000187665726f6e6e6176736567646140676d61696c2e636f6d00001040536875746b6f5f7061696e746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432a941ceca936305eef0f6b882a5ab6c4798da18e4dace54e39a476e5299d7d6b5a84181b7495420": "0x04000000000200000000000000000000000000000000044b534d066c6972617900001461727573753239303640676d61696c2e636f6d00000d4070756b757075796f746169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432ae0c69a5fa3b31b4425e543594e2c64686f9be729eb42f8402f00485ba4d778c7965b0c70ffb30": "0x0000000000000000000000000000000000067175657463000000000000084071756574635f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432b4607867325af47e34eeb5e6312c8dabdf13264e7724f9eeda65214e8d45ef1aa63646bc90bd63": "0x00000000000000000000000000000000000d4b7573616d612041636964200000001273746563636f6740676d61696c2e636f6d00000c404b7573616d6141636964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432bdcffa7889f0078cb9e71e14f09dafab743396e139bead9dc662abafc0039c74cccfab1fc7346c": "0x0400000000020000000000000000000000000000000015f09f91bb4469676974616c47686f7374f09f91bb001a68747470733a2f2f6469676974616c67686f73742e78797a2f1d40706f732e6469676974616c67686f73743a6d61747269782e6f72671763727970746f406469676974616c67686f73742e696f000011406469676974616c67686f7374706f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432e3ab575cc440288693796a66327edfad41d99ce9606316637ed9f553d61c43f0b4a658d6b4c170": "0x000000000000000000000000000000000008416c69204e46540101010100000a40616c695f6e667431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432ed1c932b701c300e993f475e1085cfe2d313b1089c3fbc33c78c178ed19bfc94be3d7937709371": "0x040400000002000000000000000000000000000000000a54726164657769736500000019726f6d616e61726e6f757837373540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432f20048368ac529387f657be6913b17c0d5ad2eb24d10cbbd319e142f39c60a000b175744aaad42": "0x00000000000000000000000000000000000a42697474656e736f720a42697474656e736f721668747470733a2f2f62697474656e736f722e636f6d00196f7065726174696f6e73406f70656e74656e736f722e616900000c4062697474656e736f725f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471432fa3d1c089ff9ebfe88f2849c8b51127fefbb618de330c811b4092da0b9272edf2b8b7fddc05c1f": "0x040000000002000000000000000000000000000000000a375468756e6465727300001640377468756e646572733a6d61747269782e6f726716375468756e64657273323140676d61696c2e636f6d00000c40375468756e6465727332000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714330184541fb770392c11ec1e01ccd10cc21bab08d2ce15deaba048bb86b1ddba8fc51e1a988d9a51": "0x00000000000000000000000000000000000b5374726174757332313100001740737472617475733231313a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143303b463054555c594b84205e26b1239950cb66fad5f97873a7a3b60a5b8a0e5d648b07c936f451d": "0x00000000000000000000000000000000000a6c756e6172747970650000000000000b406c756e617274797065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143305daa457b057898c8448f9c214a50cf2419b6393994e0ebf1f6ecb2be98156fb611c9300f4075a": "0x0000000000000000000000000000000000064375726c7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143308804a76f50044ce6e3dc917919ccb44e66c8a5d4c693b96265d5e7072433971fb38d083d0587e": "0x040000000002000000000000000000000000000000000a546f6b656e6765617200000019726f6e6e656c73696d6d6f6e733640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714330e295310ab558958d00cc86df5a4d8320764ef4b5f0cf4ff21ebba4355b58a8845814102060d53": "0x00000000000000000000000000000000000b5a756b6920426c617a65000000154a746f6b616e363940686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714330f2a703c07a43ded1d56154af1862efb63fc12298d73411b024a7b5312346ca95effe7011efec3": "0x00000000000000000000000000000000000e4a6f73696168204b6f747a7572144a6f73696168204a616d6573204b6f747a75720019406a6f736961686b6f747a75723a6d61747269782e6f7267184a6f736961686b6f747a75723340676d61696c2e636f6d00000f404a6f736961686b6f747a757233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143319feb5b0bf9d1f5001f6559f948d59e184101e646c568bb7ef13efb4db683d7a7ec3addc20913d": "0x0000000000000000000000000000000000084c656d7a79706f00000000000009406c656d7a79706f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714331a1a8d88aca78396f39b336285f5069eae5651dd6f48e1552d55939e6175f0321becc3f1b2ef72": "0x00000000000000000000000000000000000954656154726970731154657265736120416e746f6c6968616f197777772e626568616e63652e6e65742f746561747269707300197465727279616e746f6c6968616f40676d61696c2e636f6d00000b407465615f7472697073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433370a1e53cb424dc47e87dfcd927cc014340f95d4a35f94eab0a418753ef596364955a0ffd85e00": "0x00000000000000000000000000000000001d4c6f6e67204e65636b204361706974616c204d616e6167656d656e7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714333ac2982066a85918363192e42fe9184f072cb098189ccef8150287fbaf0014859917c0aecd4e65": "0x00000000000000000000000000000000000867656d626162610b646f72756b206f67757a127777772e646f72756b6f67757a2e636f6d0019646f72756b6f67757a4070726f746f6e6d61696c2e636f6d00000b40646f72756b6f67757a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714333c08553d75ed2cdab8ba7a028d62fe9a5088e46acdbd2039f01abd8baa7c695d9377661c3d406d": "0x040000000002000000000000000000000000000000000664616b6b6b0000124064616b6b6b3a6d61747269782e6f72671464616b2e6c696e757840676d61696c2e636f6d00000840646167696465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714333e68c5f182853d28dd66875b9cd452d1d72193557b6b3dd0d90b32ea9c9e3f45657cf0add29919": "0x0000000000000000000000000000000000035430000000000000084054305f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714333e840aee386d7c1e0cc20dbeeb37538f83781aec7f2f707c665037681183092a9066d0a7c8dd20": "0x0000000000000000000000000000000000105461746f696e65506f6c6b61646f740f5461746f696e65204b7573616d6100001b6165646a656e6775656c652e69636d7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433446753bac3f7d8d49e16d1c4f6a051815c5865058cb218fe7d460fa893907bd0cf8596b493f45a": "0x040000000002000000000000000000000000000000000a676c617373666973680000134064616d6173713a6d61747269782e6f72671a676c61737366697368406879706e6f7469632e67617264656e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143356311bfa9f24835225293d2cd9e6ded0d8c2326e3e83db641db1660dcf04cabf1996e3bb586654": "0x00000000000000000000000000000000000a42554444494553c2ae001e68747470733a2f2f646973636f72642e67672f39485362515137677077000000000c40427564646965735f5374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714336272cd90b6e25af6ef7d80dce5697e079078de31bf5d55ec6b9b19b999062fbee55172c48eae22": "0x00000000000000000000000000000000000e4a42204b534d2057616c6c65740e4a757374696e204275746c65720000186a62406f726967696e616c6368696d6e6579732e636f6d00000a4069616d6a62757473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143370e35af77dde916cf513881f519aa8ffa7b6631e934e954afba13b14629e9683c20d697fbf5d5a": "0x0000000000000000000000000000000000064d6176656e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433816f27c89df87b3c10f599d47ddb88464f7785a359a32f844b08df8b934a997c6dd8c355beba03": "0x00000000000000000000000000000000000a4d6174742049736871104d6174746865772048696c6c696572000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714339633d10397f8728c4631b84124de831cc1d9c74c40b9ff4408faa6ee9bc04dbf133afeac872f41": "0x00000000000000000000000000000000000d4b414e4152494120323135300000000000000d406b616e6172696132313530000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433b7c4e68d541ee54c8510f693bac7c4f1b5eddabe8b18acb255bfbe7d9822f4fcdca22f94809b05": "0x00000000000000000000000000000000000a2e3638204661726d730d44616e69656c2053746f6c6c000017706f696e7436386661726d7340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433c1a1b7b16e21902cb7a7443e82f0510532b184fd139194ea5d179542bedea10a473c504ac0ab69": "0x00000000000000000000000000000000000550656b6f07596f68616e6e12687474703a2f2f6e6c742e726f636b732f0016796f68616e6e2e6d65706140676d61696c2e636f6d00000b40736f566572794e4c54000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433c7715ceb944ae1e6583ee03e4f19d6ff1fa84eb9beec7aec0d96a4114a484b5e7a63350144f42d": "0x000000000000000000000000000000000004456b6b0946756e6e7953756e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433dcd2db3d5bedf0c68a732184cd98dbf750752cd4ddfef8435da930c06bcd207c8a1059bea0ad49": "0x04000000000200000000000000000000000000000000046b6d77000000147a6c6174617574736140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433f0f3849914660f162eed692523a2755714b288f9b18c4775c3673da41a7935f7bbf669bc5cc27b": "0x0000000000000000000000000000000000114d61676769652074686520426c61636b0000001b6d61676769652e626c61636b406d61696c66656e63652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433f1232919bc79e13a81aea610fd2332295967d1c7846599774a112f2d6cf7e3ebe92392b7b17779": "0x00000000000000000000000000000000000661f09fa5a900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714340a8e74a21cd5fa14bab5b2a35355fbaa601d9ec4976e05b881f53b5df7e61c56b7a41d0b987733": "0x00000000000000000000000000000000000f48797065204d7974686f6c6f67790f48797065204d7974686f6c6f6779000019687970652e6d7974686f6c6f677940676d61696c2e636f6d00000f40487970654d7974686f6c6f6779000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714342142ada362a590fccd142fbfc7d9a3b55795804456d22d515ad559a57d7e6e2d95c10b42e30c1f": "0x00000000000000000000000000000000000b4f6e697a756b61313731054d616e7500000000000c404f6e697a756b61313731000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143422f12ebd49b52714cae80b8974ad74a47ee2f104c029601bde0cb7345bb040355a0f89d9745f4d": "0x040000000002000000000000000000000000000000000d4169722050726f746f636f6c094a6f7267652052451061697270726f746f636f6c2e6f726709633474616c797374166a6f7267654061697270726f746f636f6c2e6f726700000d4061697270726f746f636f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434268d32efe050e902c28aa0f96968db5317f8a199297ba47b1d11cee314125f12fa09cd1e5d1147": "0x000000000000000000000000000000000006596f68616e0101010100000940617269796f6170000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714342d10fd36c3ac43cec9484c231e2d686bc8932300191a43fa515f95c02ceebda09ad8d8f5fc5305": "0x00000000000000000000000000000000001754696e6b65726e6574205465616d204163636f756e74000000000000114054696e6b657250617261636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714343126692e3c2e4112d49078cd721faa2f041d0cf96e0d8194561fdcb4ced457270e52f209e76c0f": "0x04000000000200000000000000000000000000000000064c6f67616e000017406c6f67616e3a776562332e666f756e646174696f6e1378406c6f67616e736165746865722e636f6d00000e406c6f67616e73616574686572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143446a63253264d390c44b382fcf02cb9140cfe395af7409c9dcf90111a4178c91f9f4b72c0bf6527": "0x00000000000000000000000000000000000c537061636520526f737369001b687474703a2f2f7777772e7370616365726f7373692e636f6d2f000000000c407370616365726f737369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143480366b70f0bdd226bde67388e055556db32212b34a6b54863a68bde20ee8ac3237c2f8c7e0d748": "0x04000000000200000000000000000000000000000000096e696674657374790000134065656e6e6f6f3a6d61747269782e6f7267116e696b6c61734065656465652e6e657400000a406e69667465737479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714348d4ac14c12c66a52399f4bea6b67b35c699fa9e62d9e0dd0df8e6b77827f3a597ad59ca120436b": "0x000000000000000000000000000000000008666972656b31640000000000000940666972656b3164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434919c833ac161e16244de863562c83bef71d904006f17e4ac8c8d48aa254488993a007ea3293c67": "0x0000000000000000000000000000000000065265656365065265656365000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143493fe8d1494832ec62cf673ac24528062ca2dfebb72f5d32a0b562620536abe72a8fb7fcdce2c54": "0x00000000000000000000000000000000000854617261676f6e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143497da8d6cf4d6517ef2c40e61477ca83ac11a69a7d3700758cd7c80fd351b942f33a9860bef5c57": "0x00000000000000000000000000000000000a56696e796c73616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143499871fa32ffd0568060f25d5e2559890850d9e7f3090d2892da1bf44ff49e08d879139569af157": "0x0000000000000000000000000000000000066a6f616a69001570617261636861696e6d6173636f74732e636f6d0000000010406a6f616a695f6e616b616a696d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434a85255605692712c9ff1d449d4a433f155b6e0da1c283fab4c3269e4495779ad6f0a29cdf6b170": "0x0000000000000000000000000000000000095061646479626f7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434bafa4989ae96d2126d0c2d4f0884c2e829cd7f63235323c66f7c19cec693117810ac06918297f2": "0x0000000000000000000000000000000000055269636b144d79206361747320616e6420726f626f74732000001b317261662e636f6d2e38382e3838383840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434bd1b4448aed1acf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212": "0x040000000003000000000000000000000000000000000d506172614e6f6465732e696f001568747470733a2f2f706172616e6f6465732e696f164070617261646f7878783a6d61747269782e6f726715737570706f727440706172616e6f6465732e696f00000b40506172614e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434c19217b89473a6fcf0d5eccb7d0f8a0aa8a7b204db27cb8428c6576ad7bae55f194238c2aea53a": "0x00000000000000000000000000000000000a456c6f6e204d75736b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434cd31c4c02baaf40845506f4ace125170d1d1861cb0deac761cfe2b3538d3b80fb4feb465d9885f": "0x00000000000000000000000000000000000b497361616b204c69656e0b497361616b204c69656e1d68747470733a2f2f626561636f6e732e61692f697361616b6c69656e0015697361616b6c69656e3740676d61696c2e636f6d00000b40697361616b6c69656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434cdf837d56a264302302a200a9ead164617576a79dded74ccf9094d6222cdf93ed575422e9f5837": "0x04000000000200000000000000000000000000000000136f6b74616e6f646573206b7573616d6120310000001661646d696e40736861646f776e6f6465732e636f6d00000b406f6b74616e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471434e1695e7aec00cd2470066d3011ff4f5a582dc406244cd8ada9972cbc09197c4f746b3cd951fa47": "0x00000000000000000000000000000000000d524d524b2050686f656e69780000000000000d40307850686f656e69786578000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435050fd58a5fec6ccad8f26d3a6ce0ccd4aa88ef73904ed673267c502f9d1704c8842715ba7ef33d": "0x000000000000000000000000000000000012496e7370697265207820524d524b2023320101010100000a406363776461766964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143512543d0def14a69a569de2e5bdfb09afc678d03cf44e576409c90326bae832fa88d114efcc2f6e": "0x00000000000000000000000000000000000d4d69636861656c204b726f7a0d4d69636861656c204b726f7a2168747470733a2f2f7777772e696e7374616772616d2e636f6d2f6d6963686165001b6d69636861656c6975646368656e6b6f40676d61696c2e636f6d00000e406d69636861656c5f6b726f7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143513a7e35abd2c67c46a6bab44a8c15f7c71fc8abbde63bf128fcd626e328b351f8c2861b1183318": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435262d5febf811713c3defa1c97906bb8d689ff9791cfa1825a8ef5e3ff2640d5f76cefed049cdb2": "0x040100000002000000000000000000000000000000000d5562696b204361706974616c001668747470733a2f2f7562696b2e6361706974616c2f1840616e756e746a6f637572693a6d61747269782e6f726715636f6e74616374407562696b2e6361706974616c00000d407562696b6361706974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143533fb45c1708948625a907225b8ed830c16996d75cda73ef03750b535a6d83ca2ba1246be2dd424": "0x040100000002000000000000000000000000000000000ef09f8fa2204d49444c2e646576001168747470733a2f2f6d69646c2e64657610406f6b703a6d61747269782e6f72670f68656c6c6f406d69646c2e64657600000a406d69646c5f646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143536b008c8bdf5eaa8c65922638840726e9b9203f89734be64b61b2e50cbc85a2d8eb147032c793f": "0x04000000000200000000000000000000000000000000044e4c5a000014406e6174616e6c7a3a6d61747269782e6f7267186e6174616c6164617a6c6174614079616e6465782e727500000d406e6174616170706c653133000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143557b2fa873c85d70251da37e1b58a76ce238547801127124fa17d3010baff384a2da3bd52961257": "0x00000000000000000000000000000000000f4e46547320464f5220434c4956450000000000000f4043727970746f436c6976657273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714357f962bde6d00d270b553b4cbd93585c4dc2b13699e960a1f8fd5f31f50f304106a2bb8aa2cad64": "0x00000000000000000000000000000000000b727566696e6f66756d6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435868ac081666f4192f0611c424502b047a7052dbd07846e2d01f757a99db50b825984409b44cf6d": "0x040100000002000000000000000000000000000000000c44535256206b7573616d61001568747470733a2f2f647372766c6162732e636f6d001776616c696461746f7240647372766c6162732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435891656bf938dec687940be7bb769432186706f4e9167f078bc2f092bb445c6f2fd6c617f64e556": "0x000000000000000000000000000000000009325468654d6f6f6e145374616e69736c6176204b6f6e6f6e656e6b6f001a40737461736b6f6e6f6e656e6b6f3a6d61747269782e6f7267186b6f6e6f6e656e6b6f7374617340676d61696c2e636f6d000010406b6f6e6f6e656e6b6f5f73746173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714358c4c1a81950208d4b4f2d7581dea1c5b32d601fea80468da90b7c8a66ba5b8ee0612c0b368d363": "0x0000000000000000000000000000000000074a757374696e074a757374696e01010100000c407a65726f70726f6f6673000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714359d405fa784835ea8a89367cac10048b8e025cda5e0e391f4664b4c97b50377685e65ba09a5a460": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435a390c3506c1387482a9a411b630d2c3f850f435c4566a6a93143422e6cce181320f022a7451236": "0x0400000000020000000000000000000000000000000012537465616b20e299a8204e6f6f646c657300001e40737465616b5f616e645f6e6f6f646c65733a6d61747269782e6f72671a737465616b616e646e6f6f646c657340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435ae67dea62435324ccd96ab1b42e8a1a0cf69f0eec21200f9a8095c4da99f44d14c5181f3955a07": "0x00000000000000000000000000000000001154686f6d6173204a657272796b736f6e0101011d696c6c7573747261746f7274686f6d61736a40676d61696c2e636f6d00000c40544a657272796b736f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435ba3891cd5a1f1af4d1d7ee3de4691a94c7691da5d29681cf0c7e01b283c8741c32d6e712fdfc2f": "0x00000000000000000000000000000000000752796f7368690000000000000b4045734a617966697665000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435c408ac02c2a02dfae63fdb20e3ec7589586b14ea019731b5089e2d1b22a7911e48603a5939780c": "0x040000000002000000000000000000000000000000001df09f8cb2f09f8cb3506c616e7420412054726565f09f8cb3f09f8cb200001940706c616e742d612d747265653a6d61747269782e6f72670f6c6a7564766140747574612e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471435dd86d8f494ed5b3a33330086b97b130e60e53e5f19a7aefd249bfe935abed57adb19fed0525074": "0x000000000000000000000000000000000004417368074173686c65790101196173686973686d697474616c383640676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714360a99286860e95d9e3209ee615fbeeb2803b78f79e38d2750b261d2cdf03aee378953ca5187702b": "0x00000000000000000000000000000000000953696e6f7661373900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714360c398fd5e777baf6d6531d9623034efed118d00dc62831eb6f017dcb45d66ec6af44947ef41431": "0x04010000000200000000000000000000000000000000064461617665000000176176696461636f6e74726f6c40676d61696c2e636f6d00001040426c6f636b636861696e65723931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714361c04bb87dbdc8fded1ee76b3793ee4765d0e4ae3810234e2bdbfa5b7b9368d53e8097269106d53": "0x00000000000000000000000000000000000a4d696775656c446f740000000000000c404d696775656c446f7437000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714362e63bff395d5365ee1d8f4e275365ce386eca5dced8da68495954da5df694191446123b64d3950": "0x00000000000000000000000000000000000c42656172204772796c6c7306526f706572010114642e726f706572406f75746c6f6f6b2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143664fd682b63101efa1946d3fbddce1df50333701d2a14f895517f6c3144bfaf0b5ac25892f23672": "0x00000000000000000000000000000000000a43696369205279616e0a4369616e205279616e00000000000c406369616e7279616e3932000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143673545187abf2d44221843a04508635174403b3840ebffbc6c5f487373a75507291fe72019b8421": "0x00000000000000000000000000000000000a547269636b737465720b566961636865736c61760000124f72736f6e303640676d61696c2e636f6d00000f40547269636b7374657230363036000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714367c0b2407c22e99e22baee6a790a63088620f7483290c83fcb3337664866cd8d239568f7554bb14": "0x040100000002000000000000000000000000000000000d4a6f7365206e6f2d6e616d650d4a6f7365205261626173736f1868747470733a2f2f7777772e7261626173736f2e6e6574184073656e7469656e747275653a6d61747269782e6f7267116a6f7365407261626173736f2e6e6574000009407261626173736f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436805becc0cd7ecd46da7c288e4b28a5db64dbd221bbb75850708c556753300df83dd36b4c31c37a": "0x00000000000000000000000000000000000e50696e6b6b75726f736869726f054e656c6c00001c4e656c6d61727973676f6e7a616c657a406f75746c6f6f6b2e657300000f4070696e6b6b75726f736869726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714368ce1bdc40db94c34f589d251903b0ac5a22b1d13d54696fba34b77f5d21f5244de907171144763": "0x040100000002000000000000000000000000000000000850686f656e69780000001974616b65616e797768657265343540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143698794decef314ba1ada2749f3674b54120e643601edab41454b61285f7b1cbc38fa55f3f94ab5d": "0x04000000000200000000000000000000000000000000066a6f6e61730000001e676568726c65696e2e6a6f6e61734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436a17a0db79ef688c664fbde2dbcea2d4180fc9e285ac56ecb6f89a9b88cbee9b407bbceea7da912": "0x04000000000200000000000000000000000000000000084361626c652d58000012406361626c653a6d61747269782e6f72671e6379636c6f707373756d6d6572734070726f746f6e6d61696c2e636f6d00000f4073756d6d6572735f6361626c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436afe30a6f10936740d5602a0093ad63f7581091f78e184f8095d3796c36087d4b663b929dba6002": "0x00000000000000000000000000000000000d6b736d2077616c6c6574203100000014373337314070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436b6b4230572c15c9ef933abec7bfe3aeefa46b090f763be83a92b954ad2ffb6460dd0cf21279e22": "0x00000000000000000000000000000000000842616b686d616e0b566164696d2042616b6800001a62616b6874697961726f763139393240676d61696c2e636f6d00000b40566164696d42616b68000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436becd4b5e8bdbbe828618dad92559461b479508086bc781d88434e5372229cf66ffc887672e9b34": "0x000000000000000000000000000000000009636f6c646d6f6e6b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436d932ff657abe1ab25aad24c981efce7f02bb55dd5a4f1628f46162e297dca06eb78138ed10ba44": "0x00000000000000000000000000000000001942756666204368696d707a20436f756e74727920436c756200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436dfb954fb0e362388c0101e6310fd486b69ae18fae2985fea205d8a9c6de956070d71a69a8d3f66": "0x040000000002000000000000000000000000000000000a43525950544f4e594300001240626f6764693a6d61747269782e6f726717696e666f4063727970746f6e69632e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436fa711136f55b2b60021c1dff88ff90ebd476b7bfc172d30c808f1629ef5df7685da36526e79a54": "0x00000000000000000000000000000000000f496c61696a61204d616b656e7a690f496c61696a61204d616b656e7a69000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143719f7536919e4c0b2b3d5e18f8226115c2327ded2029a6308b4e8274f0b5f529b3a6e58dec46176": "0x04000000000200000000000000000000000000000000086d65643076796a000014406d65643076796a3a6d61747269782e6f7267146d656430303076796a40676d61696c2e636f6d000009406d65643076796a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143721f074825b67fc14e5b21d2eee0865adfb8783ac900540d67f0a89eb6881e77dda91d509398809": "0x040000000002000000000000000000000000000000000b476f6e74614a6f6e657300001740676f6e74616a6f6e65733a6d61747269782e6f72671c6172747572676f6e74696a6f4070726f746f6e6d61696c2e636f6d00000e406172747572676f6e74696a6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714374fc4337ebaecf75651449de27895f5da18dff76cf3fa3f1b1cf468b873d7a3e16adf7fd5187d55": "0x04000000000200000000000000000000000000000000094c454d4f4e4f4445094c454d4f4e4f44451a68747470733a2f2f6c656d6f6e6f64652e66696e616e63652f000000000f404c656d6f6e6f646547726f7570000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143753decbc1ae388b6849627c337067117e864eff154c6125539fa6e4eaa980712e7594cf78447874": "0x040100000002000000000000000000000000000000000e416d696761205374616b696e6700001940616d6967617374616b696e673a6d61747269782e6f72671a6f70657261746f7240616d6967617374616b696e672e636f6d00000e40416d6967615374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714375546d9339430d36aa9e19b08ef554ef0b123940b685c0d64eabd9a1ec487e43bb7e1f3d981c062": "0x040100000002000000000000000000000000000000000e434f534d49432d474c4f42414c17436f736d696320476c6f62616c204e6574776f726b731668747470733a2f2f636f736d69632e676c6f62616c1840636f736d69635f746f6e793a6d61747269782e6f726716636f6e7461637440636f736d69632e676c6f62616c00000e40636f736d6963676c6f62616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714375605537adb7dfd3d6d2d20735ec00c7753d3e6071ad1e2280288a98d7d89c2a2b7fe08bf6d05bd": "0x0400000000020000000000000000000000000000000015506f6c6b617363616e20466f756e646174696f6e14537469636874696e6720506f6c6b617363616e1668747470733a2f2f706f6c6b617363616e2e6f72670013696e666f40706f6c6b617363616e2e6f726700000b40706f6c6b617363616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143757d549ae01bcfef051c7e4fd453fe6e12e042c745c19c8eac609babbb08cbc1c469a06d3aa9f31": "0x0000000000000000000000000000000000097370696e7a3830380000000000000b407370696e7a3830385f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437635025e9b9216a08323e67f700f051d8178b6c4d82c7b2b8c9c3972f44e6dc368eea43dbe9c723": "0x000000000000000000000000000000000012736861776565656ee5b8b8e794a8444f5409736861776565656e000017736861776565656e6368616e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714376fe373bcf08e5136b08600b83f68dae5db739d3102ef8c8f0534ed6739d2c2c9406bc5e0cd5614": "0x0000000000000000000000000000000000084d465f313333370c5375627371756964204f47107777772e73756273717569642e696f000000000a40495f313333375f49000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714378b219e43b8dedff0fd6298e6d06eefc52fb2f12dc1a6ff9e8958ac2a3efebc7f5673dc33808170": "0x040000000002000000000000000000000000000000000545646765000000176a61636b736f6e73656467654070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714378e64dbe1bafe2d68d2af8a0969437cbf470fcbc5ec5be7fc7c2acc6cd55f31e218b313fd1bbf7c": "0x0000000000000000000000000000000000134b7573616d6120706f6b6c61646f742e6a7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143797aae91cb5418606bc6642d5cf9a96b25c4509ea48bcd739b9526d223d03db0fae3782647a914d": "0x000000000000000000000000000000000009586f6c6169646572074b6972696c6c0101146b6972696c6c5f73683838406d61696c2e727500000a40786f6c6169646572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437a030aa0334d1657a6d8b7ba3e9dc84d388f900d7a6d7eba875584a4230ba14e5923703d344ae59": "0x000000000000000000000000000000000007436f6c70746200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437c6690c1899a9f13208723ec642760b572b0ff8037d63d49f4d2e95875027fa85080cdff65df810": "0x00000000000000000000000000000000000d50726f6f666f664368616f7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437dd5e6545f30f91146ebb6c9c8a8953adc846bb66a7067792d2b79480f784b77da11f0556b05038": "0x0000000000000000000000000000000000055361626908536162696b61680000117361626f6f6368406c6976652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437ea3876caf984faa2a383db2910f8be8539704063de71c60aa9f4d2509eabc5ec04acd7d7601e4b": "0x000000000000000000000000000000000016496e666563746564205375627374726150756e6b73002168747470733a2f2f696e6665637465642e7375627374726170756e6b2e636f6d000000000f40496e66656374656450756e6b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437eabe2d897b2b72548da96d92f51656ca4932bec228b08d0a0d42a55ee6dfdf7d674bfab3509e4b": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32370f42696e616e63655f6b736d5f3237000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437f4c44a1802b5597a079b843efdcc1361e62bfe5767fd1f49ea2e255cc8b517675d8b33cf231d64": "0x00000000000000000000000000000000000c546865417274426f79797900000016746865617274626f79797940676d61696c2e636f6d00000d40746865617274626f797979000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471437fc013628a8c12f22fff76bb4a0a5d66cff0392dbc083abbac3b3046f6fcc328abf0ddd16ca0837": "0x040000000002000000000000000000000000000000000f53696d706c79205374616b696e67000000197374616b696e674073696d706c792d76632e636f6d2e6d7400000b4053696d706c795f5643000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714380d8f9827969150946e7b9165c3228654b593ea90a5130b0f137fef6f8af691990b4d4ac0b27076": "0x000000000000000000000000000000000007414c4144494e07444d5954524f010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143815dfeb687a9a1a2a951179aed88b7e507173ad199175237ae2c4861d242d441a77183975bbb453": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438172c8cfb5a713e5a718199b3c87bd8c24c35f027b2b4ba2789a85782a79cc6a924f9e4241c3005": "0x0c0000000002010000000100c8e6bc17040000000000000000000002000000010010a5d4e80000000000000000000000000000000000000000000000000000000b534b59534b49505045520b534b59534b49505045521768747470733a2f2f736b79736b69707065722e65752f1640762e7265697a7669683a6d61747269782e6f72671f736b79736b69707065722e76616c696461746f7240676d61696c2e636f6d00000d40536b79536b69707065725f001e68747470733a2f2f646973636f72642e67672f6d32794d41776276323300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714381b3821dcc0437820844fd0e3f22f42daca7eca80593433eb14ecb21dd12da7efd2ae70e2f7b977": "0x040500000002000000000000000000000000000000000954686520446f74731254686520446f7473204d6167617a696e650000157468652e646f7473406f75746c6f6f6b2e636f6d00001140546865446f74734d6167617a696e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143820161e5d657db05a63e35210da6bcf2d3ceb1720f65a7ea196cbb946768acaa184c732921c1f15": "0x00000000000000000000000000000000000f4d726973686f204c756b616d6261144d726973686f2048616a69204c756b616d626100000000000f404c756b616d62614d726973686f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143821f1ccdde80ab1e63e926f7d2f4b279925ff3eda433d1c619c315bcb690dd02392fc9cb5997e5c": "0x00000000000000000000000000000000000750726f7475730c44617669642050726f746f2168747470733a2f2f747769747465722e636f6d2f7374617267617a65725f7373000000000d40646176696470726f746f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714382e1e172c05a7dd7e7de858372bdac26ad50af6e76207a55fb089414348a70cd32926e8e9f4c76d": "0x00000000000000000000000000000000000d54594c45522044555244454e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714383198d18bf4db66169b1ca15010ef10b423afee4c0fca7e42f745b39e1fe4197436ec352b7f1708": "0x040000000002000000000000000000000000000000000b54525553545354414b4500001b406665726e616e646f2e726f73736f3a6d61747269782e6f72671f6665726e616e646f2e726f73736f2e6974616c7940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714383d396eac9d6d803aca2dd5f8e9ae8f6c34fdf662ccc8582f19712716ead453187133753461a717": "0x00000000000000000000000000000000000744454442554407446564627564000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143860568a1fbdad6c42b7d1cc48edb9374f8db31026a470a1ec19b7ccdaa262c341e6fce2375d022d": "0x000000000000000000000000000000000009546165546165383200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714386936040fec0a1e4499a095307a2c2c62cb6875915e9a9e2effbe99e2b3c5785dc46a4a57df7450": "0x00000000000000000000000000000000000542616b7500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438696a3c3a114b3a3661355b125f90d7764098692927e1b80a2a8609a90378ff6a7a6689e560a407": "0x00000000000000000000000000000000000474757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714386a2f35e87b835c78283798169eabf7cd6924745cb60df616354b36e53549fd8dd71e815386f525": "0x040100000002000000000000000000000000000000000d45524e2056454e5455524553001968747470733a2f2f65726e76656e74757265732e636f6d2f001c65726e63727970746f76656e747572657340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714388551d2e84f8ac29457c6d96254f5e60f77e53484319beda30e5b83868ee522ed88437a18cd4338": "0x0000000000000000000000000000000000034b4a000000000000114077726974656f6e746865626c6f636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438923e8a514e5d000ab0b61984dfcfe2fcb82147f0a2f00f992fa8a6b5ee81490387f8210a1ab678": "0x040100000002000000000000000000000000000000000b496275696c74726f6d6500001740696275696c74726f6d653a6d61747269782e6f7267176e65696c2e76657263686f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438986317de84f44a3aab02d159dca8d84bc9aea8c42341281111885ff6be86c075ac673b5bf4dc10": "0x0000000000000000000000000000000000134b6f6461446f745f657175697061626c6573084b6f6461446f741468747470733a2f2f6b6f6461646f742e78797a0000000009404b6f6461446f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438d4ac73c1121041b656e5ed45717d0c904cd18e4cfa9295f360e1cfb2a6d0a17859d5354118330b": "0x000000000000000000000000000000000004526164000000197261646d656e6163654070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438e0f5c9b6d45fdea0fb0c1cb29f31d2efb81ae72ca3ae59b95bd082afa8c6046ac6ad5245a2ab0f": "0x040000000002000000000000000000000000000000000a417065205768616c650c4761727920436f6c746f6e00001667636f6c746f6e3139383740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471438e3b3fa872deb74a0c4801b6d9b3d5b3a26dae883117f4f56f96585431c9ecac4e1daebbf04c674": "0x00000000000000000000000000000000000b3432304b7573616d6120001e68747470733a2f2f646973636f72642e67672f41587250464a32564278001a4b7573616d61343230436c756240686f746d61696c2e636f6d00000c403432304b7573616d6120000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143904609620d47eabc0256994e3cb4d398c31d072de5bb876fe05d1b958e1d76c70483224c1849364": "0x0000000000000000000000000000000000124d69737465722046757a7a79204475636b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471439091716621f04866c5bab403571753ecc61af53a82d7bcc6fbf910c32bb7984a3d9cf92a9ee7353": "0x000000000000000000000000000000000012706f6c6b61646f742e6a7320286b736d2900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714390c74f4052dd71642a8f4af92bc51e83093eeecb73f2aab526a11c41735ff54d9fc7de54ace5c6d": "0x040000000002000000000000000000000000000000000d50617261636861696e626f790000001e6a6f686e72686f64656c626172746f6c6f6d6540676d61696c2e636f6d00000e4070617261636861696e626f7900106a6f686e72686f64656c233831363200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714391938c738248b0b3c8bfe3979861faf9f62122a79c84cb49ef9ea9e34299af5886f69fb14987446": "0x0000000000000000000000000000000000144d6f6f6e496e76616465724a696d6d79536b7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714393bf648d0b05f8554b568a6e42a8892eca1a8e5c88dd952dde7288d79d35c3b57553767a3987a1c": "0x040100000002000000000000000000000000000000000c656477617264736d6974680000001a736d6974686564776172643139383640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143940c3c215b77b75a45607c284ca4ff60763ec121d5818b4571092c29bb4cd52b33689c17a87d24e": "0x000000000000000000000000000000000008524f5353414e410e526f7373616e612043616e7475000018726f7373616e6140776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714394c7c89d577e2150875ac52744a4a4b13c7ffc879ea121886d94ce994b592f87df88e0943b19e3d": "0x040000000002000000000000000000000000000000000e4361726c6f732053696572726100001c407369657272616361726c6f7331392e3a6d61747269782e6f7267196361726c6f73313973696572726140676d61696c2e636f6d000010406361726c6f733139736965727261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143961067d72d621ce64f1ff58ecb85b5c7e3ed681eb7d40bb52f67d2b918159c277a436ba23aaf975": "0x00000000000000000000000000000000000650696f74720000001a70696f74722e647a69756265636b6940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714396327fe5bb731ce1ac32f80dad23cb5f164f496f39291cddfc68ed41f9cb2d57953915c9ddd0622": "0x000000000000000000000000000000000007416973616d610000000000000c40616973616d615f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143977b398db792530b4d42c2aa38aeb839c157991447238edbf1a48f7fbaef96b30c733e769ee1f27": "0x0000000000000000000000000000000000074d61726c7561074d61726c75612168747470733a2f2f747769747465722e636f6d2f4d61726c75614b7573616d6100176d61726c75616b7573616d6140676d61696c2e636f6d00000e404d61726c75614b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714397f26eed6dc09cdae3abb16e30166db6c77a2f24b6e19cc63bd95fc08529bcb05bc71273a762b29": "0x040100000002000000000000000000000000000000000c746d64765f6b7573616d6119746563686d65646576207361726c202d20446176696420531968747470733a2f2f7777772e746563686d656465762e65750010647340746563686d656465762e65750000094062655f64617363000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714398ac470c132d05746cba586963ce742f0f17d705174df4317e773788ebdd7244df0a0ddedcc645c": "0x040000000002000000000000000000000000000000000c4162756a756c616962696210416264756c617a697a204b616d696c0018406162756a756c61696269623a6d61747269782e6f726714616b6461747469393440676d61696c2e636f6d00000b40616b64617474693934000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143992ed165a8d50830a7aadfd3b852856f9ed55fd5f9cac3b392e33d5aa9811376ede585177b14b1c": "0x00000000000000000000000000000000000e62696e616e63655f6b736d5f320e62696e616e63655f6b736d5f32000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714399bcc09e0ccb2081e808a04d4fc7cce9919d91092bae1466300cf9d5ffd53cee083b6fb9159b16b": "0x04010000000100fc8d0e800000000000000000000000000000000000000000000000000000000e45787472696e736963732e696f0e45787472696e736963732e696f1668747470733a2f2f65787472696e736963732e696f001468656c6c6f4065787472696e736963732e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714399dd3c4804b97eba095019831a2323d245f465af098b4341a7a1cf39bbc4314b2a78a9299f07146": "0x0000000000000000000000000000000000074f4e44494e34000000136f6e64696e37373740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471439a60ff17fca37777ec07e354ed4f92abdd5a1570470994410ad04181deb63229bd98ff39b73170a": "0x040000000002000000000000000000000000000000000e4b454241422d5354414b494e470000184066617469682e6f736b616e3a6d61747269782e6f72671966617469682e6f736b616e2e747240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471439cea59b0d3d75b0fcf9e23d0dbff2b47a4b7e9663399e393783b37c7f73aa42990494277bb43842": "0x000000000000000000000000000000000013506f2d4b7520436861726974792046756e640000000000000c40506f4b7550656f706c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471439d774c6a4bc08794a87d67106ab1314e759cf2a52c4a124011bfe5dd68d96d5d43cfbf3c2d9c06e": "0x00000000000000000000000000000000000852696164205a6700000014726961647a6770726f40676d61696c2e636f6d00000940526961645a675f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471439dbf6701a95ac8db4d7530c51ef3fd16db8e286712250830f98ad4ca9dc49eea4d8da21c810e509": "0x0000000000000000000000000000000000044b424c000000000000074031786b626c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a0d5ce7b9b42aa8680d49ff8449c4b9fec83868efb25e171d2982ff23af49f0815776cf3cddcb27": "0x00000000000000000000000000000000000a4d6f6f6e726976657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a10e49be7571c32fa2d14476ca490493ebdb00a5ad1c1217d02ed4e100bc74ccd99a9415043dc6c": "0x00000000000000000000000000000000000b656e646f6d617374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a29c46317f4f30b2a2ac2efa266a9b1dee45f418586a55232e8421ecf7f35ba47b3fc09743ba53d": "0x0400000000020000000000000000000000000000000008476f6c6f76696e00001740706170616e79797979793a6d61747269782e6f726711706170616e797979406d61696c2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a304428675bf6f7e6247d2909686256b09006b07e758ecc128364a926f1223ef04b38628a5a3a5e": "0x040000000002000000000000000000000000000000000f5354414b452048554c4bf09f91bd00001a407374616b6568756c6b69736d653a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a415aff9769824852a7ee3e88746ce662cfc7d016f8ea5c54c90579963c7d43fb7c1e0ee75a7504": "0x0000000000000000000000000000000000096770657374616e6110476f6e63616c6f2050657374616e611568747470733a2f2f6770657374616e612e636f6d00186770657374616e6140686173686d61747465722e636f6d00000a406770657374616e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a4998c1a7d8244c6819b9b3dab3439825f9b076ff1be1f248fe246f6be57b131d7d10e38b08fd00": "0x00000000000000000000000000000000000b4761746f724b6f727073000000186761746f726b6f727073406374656d706c61722e636f6d00000a40676b31385f646f67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a575ad1c2d80a9bde691421928e0c701ea5599bcc8d42231da832509479317eff32f2f60fe4525c": "0x0000000000000000000000000000000000104d4143405a6f6d6269742e696e666f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a5afa2fc0fdc1a0b43edb96243d684d0e67b83708e4d62a75c5da73d14aaf3f40d1d1aa4693f531": "0x040100000002000000000000000000000000000000000764616d736b79000000176b6f736d6572694070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143a631a94e785087a961d31be46eed7329adf7b0fb0c9aab987fa9a7734311077033176b56b36f66f": "0x000000000000000000000000000000000012416c6c65732050617374204c61766f726f15557273756c6120616e642046616272697a696f201c68747470733a2f2f616c6c6573706173746c61766f726f2e636f6d0019696e666f40616c6c6573706173746c61766f726f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143aa2de3f651751e4f433983f54fbdb39a76c4b223c0dd127b57d3f82321fbded49efdefb28429b1d": "0x000000000000000000000000000000000005466579640000000000000b4045757269736b6f3139000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ab053dc6b6a71e1b4f7f03bebc56ebe96bc52ea5ed3159d45a0ce3a8d7f082983c33ef133274747": "0x040100000002000000000000000000000000000000000f41757265766f69725861766965720b586176696572204c61752168747470733a2f2f6c696e6b74722e65652f61757265766f69727861766965721b4061757265766f69727861766965723a6d61747269782e6f72671078617669657240696e762e636166650000104041757265766f6972586176696572000f41757265766f697258617669657200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ab971e615fdc0ec048320335f4847b229ae3c6484ee07fa89fb804ec120545c3386a4a4d69aaf31": "0x00000000000000000000000000000000000c5374616c69616e6f5f323304504842000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ac96963acc241506a3cdc93de8298ac5521a3d59f0dee37394d4cebac305b27d07669c3a5713a0f": "0x00000000000000000000000000000000000d4b5553414d414e4fc38f444500000014726961647a6770726f40676d61696c2e636f6d00000940526961645a675f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ac99439d3775a97566784d696a177184eea3895409ad8a985b82b72d73881678018bb0a1152fb48": "0x00000000000000000000000000000000000c536572676579204c657267001c68747470733a2f2f626c6f636b636861696e61746f776e2e636f6d000000000f405365726765794c6572674e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ad0b73fd39c50f8202dc1d566cfa4d8a522c4a70f1a6d6361a103c582cbf4e6671b93f2ca081712": "0x040000000003000000000000000000000000000000001150617269747920426565722046756e6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ae93558a338096bd02437b89f58ab571676fed672f8b53b35626f3c993ed7741985e9f0d7cd8704": "0x000000000000000000000000000000000005506965740b5069657420576f6c66661a68747470733a2f2f6769746875622e636f6d2f506965576f6c0015706965742e776f6c666640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b1b7d5d35c61682a5ce96b7e0f53b8401817a3e592f695c3c268ec05665ca0a4782fc26e5300fd6": "0x040100000002000000000000000000000000000000000b4b4d4c20426172646574084b4d204c6162730013406b656e6f6b6d3a6d61747269782e6f7267166b6d6c6162734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b405b9499dd096722bc38752db2ff96485019da63c5c56727f8e94e3075a20e588a4ac99598b731": "0x0000000000000000000000000000000000054f736f6900117777772e6b72616d65722e746f6f6c7300146f736f696f746f6b6f40676d61696c2e636f6d00000b406f736f696f746f6b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b44d8f3097ee1d8741080ece2c165fb6ed98470e4dcff506788f14a5375a9fc5d21f0f78f16c86e": "0x000000000000000000000000000000000005497679610000000000000b40497679615f446f6e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b484b0dc727b45354825d8d050d0ac046e52f333e820999ac3dacb75f29306eb8233c0caf8ef012": "0x00000000000000000000000000000000000c446f742e616c6572742829002168747470733a2f2f646f742d616c6572742e676974626f6f6b2e696f2f646f74000000000b40646f745f616c657274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b50129d36d8eb2532cd05ac28368e20a8a51527499f368aa8a7d1afa5029b69db39dae229e64673": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b5508ea0182d21940bace52337625d59fb2154473ff9eabedb24ab44499213ceb4eafd361da3b16": "0x00000000000000000000000000000000000d44616e6b527574616261676100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b591f4633ac60568479c8ea5480acca5a847133cd97a87801b6e698a98f2eab0e8e9d5c51b14a33": "0x040000000002000000000000000000000000000000000744725733524b0000000000000744725733524b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b5bb9c0955b82d2c633e77b0ac47351f93a639be30f4496597e4e85bbc90a2980ceb7529ffb9953": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b721e900ffa3873ce292ac31cdc1aba6bc5b19b53e3f294c5da9c70aae9d8525a1f441d3626c57d": "0x0000000000000000000000000000000000086d757269637931086d757269637931000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b79538f38d1f4776a2b8e4592ea3a046666ebfefa1874cd632161ab49fde244017c8cef9924f322": "0x00000000000000000000000000000000000d5368616e652046616c6c6f6e0d5368616e652046616c6c6f6e0000197368616e6574657866616c6c6f6e40676d61696c2e636f6d0000114063656c7469636c6567656e646e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b7dae00d6ad1b52b28d7556ad0d7e6a31273e2c0e81de552104382d675a2445af326525fc81b972": "0x08000000000100902f500900000000000000000000000100000002000000000000000000000000000000000e47524f55502054484552415059000018406167745f7374616b696e673a6d61747269782e6f7267126167745f7374616b696e6740706d2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b8d9ac488d992b7a4b959e2a5cedaf1e09a5436cc714f79819e5b5b1c67390cffb468ee81ffe479": "0x04000000000200000000000000000000000000000000104e6f7a6f6d692053746174696f6e73000015406e6f7a6f6d6968713a6d61747269782e6f72671373746174696f6e73406e6f7a6f6d692e616900000a406e6f7a6f6d696871000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143b8fa2e75a1b9c5bcea3dabe52b2a665b1e19bf8c6913a5d54e06d6413ca3ddbec8f9a22415ec477": "0x040000000003000000000000000000000000000000000644617669640c44617669642048617769671f68747470733a2f2f747769747465722e636f6d2f64617669646861776967174064617669643a776562332e666f756e646174696f6e00000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143bb0e8992b8df2807e0292c2df794e7aa37c54e9be9ae80026647fbf4449917e4aca2037c3b91660": "0x00000000000000000000000000000000000c436f736d6f7347796f7a610000000000000a404b6163756b69726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143bc4805f1dc5a0b3cc5ce9e629b6758532291eaefea2671334d175bed7c29c805a435857b287b212": "0x00000000000000000000000000000000000a506f6c6b61536166650a506f6c6b61536166651768747470733a2f2f706f6c6b61736166652e78797a2f00156973686974613730373740676d61696c2e636f6d00000b40506f6c6b6153616665000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143bdc67a5cfa44da7f64ff5fb243e83dfb26e2723797c47b9e6b31cac8fc2ef91990d5be45e5cb33a": "0x0000000000000000000000000000000000074b61726c6f730000000000000f404b61726c6f737363727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143c0edca73b5ecdd9f091ff4a3f0a8699289c47578c42557932e775cf7f9c7da0c199c730410ee872": "0x00000000000000000000000000000000000e526f78792773204175726f72610000000000000940526f78794e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143c2cb2eb0335d82a6291b0b86664408338b2fddc2ccc5bc718bc2f197d60ba32e44fd9c942e92501": "0x00000000000000000000000000000000000d417274204f66204d616a6f6e0b4d616a616e20416e69731d68747470733a2f2f6c696e6b74722e65652f6172746f666d616a6f6e00156172746f666d616a6f6e40676d61696c2e636f6d00000d40496d61706f7461746f6f65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143c5c102537d492632e44d899f1c95f9c968cd59399a21a4856d1b0d5d9fae07c1aeb7b4c2c61aa68": "0x04000000000200000000000000000000000000000000074f7261636c6500001440616c6d6172696f3a6d61747269782e6f72671c76616c696461746f72706f6c6b61646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143cb00158aad5ee6baec1abe6e31fe52e443783e67de24e7ee311c1506cbb215881eadc721f142e0f": "0x040000000002000000000000000000000000000000000e4272616e646f6e46696c74682b0000001a637261646c656f6666696c7468637240676d61696c2e636f6d00000e4046696c74684272616e646f6e000d6272616e646f6e66696c746800", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143cdada2ee46b071630d8e67d1a8b9c95fe14553b3fa63f32c8690fc9ae8fd0196f16489252300b2a": "0x0000000000000000000000000000000000054c45443200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143cdcc87649a2d33c3e18ff79478f0555885d9da3b482bbea5930b8b33b47df607855a05848c6073c": "0x00000000000000000000000000000000000848656e676973740000000000000e404d656469756d4d61726b3232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ce6197206f2905cac5e7ba2c1529f9e16e3a920f65a36f2f170522b92e6c37fe26e8a58384a7463": "0x00000000000000000000000000000000001446616e7461737920436c75622053747564696f1446616e7461737920436c75622053747564696f00001c46616e74617379436c756253747564696f40676d61696c2e636f6d0000104046616e74617379436c75624e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143cf08b9f8a98ed5bf88a4006c41081ce901e0a845e8607bce1c81a69897211b9db6e68a3c148eb1e": "0x00000000000000000000000000000000001c446f72696e672d4261657a2d476f6e7a616c657a2046616d696c790d4e69636f6c6173204261657a00001877306d38356b32374070726f746f6e6d61696c2e636f6d00000a406e69636b5f717376000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d1b2413f2986065923a8f80723b86c1305ace998cc4a1b500095196102f5a3889b68a6ba00e690b": "0x00000000000000000000000000000000000d476f6f6e6579205361696e740b4d4461766964204c6f770101146d64617669646c6f7740676d61696c2e636f6d00000b406d64617669646c6f77000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d2247c3cff243e448ed2e907e472b4db96ce361f8e1a346c5af739d6705843e1a48ee9f5eadd22a": "0x0000000000000000000000000000000000082e4368616f732e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d4a43e0b9eb6a1b4a86fd86fbce1384861712946d1aeb1ee810242dcd228026328335634af76f3e": "0x04040000000100902f50090000000000000000000000000000000000000000000000000000000e4175746973746963204170657300000000000011404175746973746963417065734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d54772322b9426d803112054b6f2127db5bf84fae280724596d801671e4de7d1cff4c8d56edd351": "0x000000000000000000000000000000000013e8909de88e89e4bf9de68aa4e58d8fe4bc9a076c696e79696e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d71181b8a809887c0848079910d67af0a8756c87a50adb5c9e5ff410277980ba737025adf71f323": "0x000000000000000000000000000000000009506172616365696e000000176665646961736368696f707540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d7b57c9bab601df742f10a2b57e5ec3247c0ae6da2a2fdb4a731324dc7a2edfe0f4fc761e1a4d3f": "0x04000000000200000000000000000000000000000000094d696368656c6c65000016406d696368656c6c65783a6d61747269782e6f726700000000001336303833373436343939373331313330313400", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d8d6284f9cd655d3ea8ab4d4cb7d18b6a0d8f2555955abfb182af4808dfe1e4418e3e104c9cd07a": "0x00000000000000000000000000000000000d6c656f2d616e646572736f6e0d4c656f20416e646572736f6e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143da0de343db242fb1c384604d84ecd79034f0c19b26752abe03a0db3bf62b5069df96692ff077b18": "0x0000000000000000000000000000000000064c7973796900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143dcc236c1c55df5e202ff21bfa05c35d59be949ddac77d03e49ca8b43ad1d169408b247b13332847": "0x00000000000000000000000000000000000f537765657473206f6620524d524b0f537765657473206f6620524d524b00000000000e407377656574736f66524d524b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143de3c64163d245c278c7e23425c0433a78c7f295bee57069c78743b4630161530af5e6e5ad5a7024": "0x04010000000200000000000000000000000000000000174265737476616c696461746f72207c205a75726963680e4265737476616c696461746f721a68747470733a2f2f6265737476616c696461746f722e636f6d14406d6f736f6e79693a6d61747269782e6f72671868656c6c6f406265737476616c696461746f722e636f6d000010406d6f736f6e79695f7a6f6c74616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143df5621b372fe9b952370afd8038d4fe339fe8ab84ed26748940a72ea12df5cc63bb5b0e3a6bc830": "0x00000000000000000000000000000000000b446965676f5374616b650e446965676f2050657265797261000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e1505ea3181f4d938b56e4773b73ad84537f2a6ceb8623781bc4fde11d5eaf672e88fc19c0f2c28": "0x040000000002000000000000000000000000000000000744656e5055420000134064656e7075623a6d61747269782e6f726715766164696b726976303140676d61696c2e636f6d00001140546c76787947713543427275316b7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e1fada5350d221c002ebf751ae1def13e95b2260485550d8c3dc41390313ca457a0062560483778": "0x00000000000000000000000000000000000e426c696e6b696e2e6368616f730000001f626c696e6b5f6e446f6573446546694070726f746f6e6d61696c2e636f6d00001140626c696e6b5f6e446f657344654669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e2ea95392d7cb335c23c32caa710e0758a3f1f55ec38b4a90b46631bdc96a2b9838c9a77fc1235e": "0x000000000000000000000000000000000007726f6e63686f10526f6e616b2043686f7661746979611668747470733a2f2f6f726e616c6162732e636f6d2f0013726f6e63686f716140676d61696c2e636f6d00001d68747470733a2f2f747769747465722e636f6d2f726f6e63686f7161000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e3e798a3a6296aaf8d542920fa20b0dd5e126de37f7c0142db98b51a6caa4968922467b42b95a74": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e512628d0f746aeb4652c8810763fc9c9e36f67c348508c6880d831885799456555a0316184ec2e": "0x000000000000000000000000000000000006536f4b656906536f4b6569000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e76497ef9205fafb2f0665e547b1ace9b2b87fdc59a2eb376e4f52a6b5776ac7bc879b8416f3863": "0x0402000000020000000000000000000000000000000011494f53472056616c696461746f72203111494f53472056616c696461746f7220311068747470733a2f2f696f73672e766311406a6f63793a6d61747269782e6f72670e68656c6c6f40696f73672e766300000840494f53475643000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143e82b21f8446b3af1eded961809a3f356553dc14f1e93b1cb7e6b7c828e340e10415c09cdb41f86e": "0x00000000000000000000000000000000000c4c616479204b7573616d610752616368656c00000000000c406c6164796b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ea0a0e4b3cccecf1a7d6f18e9791ea8872d8882642f1ef1a567f67d8f4ebbf0e12a5f3a619fef3e": "0x00000000000000000000000000000000000e4b6f6461446f745f706f617073001468747470733a2f2f6b6f6461646f742e78797a0000000009404b6f6461446f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ec7ab919f5354868e675e5690eb2ade55d6690e6cbaaca81d24d34c805527c58d648183d74c7614": "0x00000000000000000000000000000000000c4d6f6d656e746f42756c6c0000000000000d404d6f6d656e746f42756c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143edca9b73dc0a5e4e06db2647e73f26d9b6b9d305ef921ae165215b4b7dc6f08b1ce295db0facd23": "0x00000000000000000000000000000000000953757266657273200630786864690101096d407375712e757300000d406d656864696a6169646933000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143edfdd48fc779cd5a80ea94af8a39eb7ba8d9afb913147e67eae84f48aad7b9ce6ee05094fe0394e": "0x0400000000020000000000000000000000000000000005416c6b6f00001340616c6b6f38393a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143f15914969e7b002928d0d0ee5f4d524a2a8bf992de4fafb497112bc3498eccdcfc88866bde42c19": "0x00000000000000000000000000000000000756616c7461720e526f76616c20546172726f7a611c7777772e61727473746174696f6e2e636f6d2f746172726f7a61720013746172726f7a617240676d61696c2e636f6d000009405f76616c746172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143f1c259322f2c75fc2d6907fd9c5c0a3bb5b8fa55153a9b8b798464f6ea3a540f0a7849f999ffc7a": "0x040000000002000000000000000000000000000000000b74616e7573686136303200000000000000001174616e757368615f363032233932353600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143f238aa31c71d3336ca6452fdccbb00af0b245231dff434535cdc7f9a2f2712dbc740e662e9c596e": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34300f62696e616e63655f6b736d5f3430000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143f4fdb82e13e4374aba289d29b3dd0dc2d56f7ab2c90a6776431a49723058a7050022fd81d237133": "0x0400000000020000000000000000000000000000000019706f6c6b61646f742d7361666172692d6d756c74697369670a53616661726944414f1768747470733a2f2f646f747361666172692e78797a2f0013696e666f40646f747361666172692e78797a00000e4054686553616661726944414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143f67110821e73a29729da928a9148b8da4cdef9bc0f03326dac61d8c5aa0604059bee63df6273e4a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143f766dca042f5e70f69409a7b5a311894e73baf41c5554009645f8c4180a1993ad690721149d7939": "0x00000000000000000000000000000000000e50726f6f6620206f662041727404496f6e00001466657261726938333940676d61696c2e636f6d00000d4050756e6b324d6f6e6b6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143fc75114c6299d4af21febf4202d805c54fc3a74b6d8f2ab070f330fcbd64bf02e1276111baf3967": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34320f62696e616e63655f6b736d5f3432000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143fd042080b18e9fb0f4c5aaeacd001fcf32b29ad902a5dfc489af0dd8b263ea97117218103921ee5": "0x00000000000000000000000000000000000852455354414b45001468747470733a2f2f72657374616b652e6e657400000000104072657374616b657374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ff9e63960b2eb614e74b71c8f5bec8948037d4191173025162d8193d1c6773f7f5bca917ff10c5c": "0x0000000000000000000000000000000000086465766d6f6465086465766d6f6465010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ffe32ddffac26d1225c1cf2356a5a5cd7e13c8e5dbee6c4c89e1c5f610c1050131cc58b4d96e75a": "0x040100000002000000000000000000000000000000000943535f417869616c001b687474703a2f2f63727970746f73617069656e732e636c75622f15406c696c69616c756c3a6d61747269782e6f726714663474617469616e614079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714401eb02c77bc87680c6be896b338d1c81b5e1c1629cc6658754b34a7382efa1daf20c8d979004b39": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440211a7f8ab7a9a03c757ba7f937e877ce2171c04b729b5fcdf7bb4d9f11c46dfc50212664e5cd08": "0x00000000000000000000000000000000000f5a6869786920496e7465726c61790c5a68697869205a68616e670000127a6869786940696e7465726c61792e696f00000e406e696b6b695f73756e736574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714402a556db017fb3cf802d69508ee4778ba8e6d8406e28484017a27f50be26df185e2406fcb0b322c": "0x000000000000000000000000000000000007757a6172646100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440506c474710c680becff51276f84146717aee4ee4e9626ae7023246f8dc03548ee313351957a33c": "0x00000000000000000000000000000000000a616c6f74616e67686501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144066c167257e03db04b82783d5d3e2c81f48908d03fd43630deefd23fdb2b7f5c21e322fcf7b5613": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440675f145f08184fd03abd3df52537964270150786182ab41f565027d36f488215c86d5c92e1f329": "0x04000000000200000000000000000000000000000000056974736f000000136974736f3939343340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144076a041f4206619a03297fd2374d7d2f0d1ba272e89e77079b48b402d1dcf36bbec6c7114378136": "0x04010000000200000000000000000000000000000000076a6179736f6e00000021616c77617973636f727265637476616c696461746f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714408289d96aa87d1172159b34e3f99ea3bb6d0c08bbff4d1d6ac30603b34811e222049cb39d8ff047": "0x000000000000000000000000000000000013e298952046696e616c4f6d697420f09f8dba0000001466696e616c6f6d697440676d61696c2e636f6d00000b4046696e616c4f6d6974000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440972e71eac65ab410c369c571d3b7fc6207371154eb81da418c21b4c96c4382131c09fa94165634": "0x00000000000000000000000000000000000b42696e676f20417274730000001762696e676f617274736e667440676d61696c2e636f6d00000e4042696e676f417274734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714409d3d5d3a1caccf4a2c3d9e33fd1f782dc354599c2f72b160e1d9293ca67e6e907b34061709bb6d": "0x00000000000000000000000000000000000b73616c746272696467650000000000000e405469646568756e7465723138000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440a080abf9c0d1738465abd5a02f5b42b23e323b73e52416514460b9a3e7c34c94ed8d9f986c3d6e": "0x000000000000000000000000000000000008536b616c6d616e001d68747470733a2f2f6769746875622e636f6d2f6472736b616c6d616e1440736b616c6d616e3a6d61747269782e6f726713736b616c6d616e407269736575702e6e657400001940736b616c6d616e406d6173746f646f6e2e736f6369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440a89f3abda82c85983347500922c79e9afb60da250d4dbdff3d8546f1b32f0239a5e8df8b02ea1a": "0x00000000000000000000000000000000000e42494e414e43455f4b534d5f380e42494e414e43455f4b534d5f38000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440d539e41516f26e565c9f20217f385dabb5e252dfcca7cbfcc0b4a260b331e82d39309b42c8e303": "0x0000000000000000000000000000000000074e697068616c0f416e647265772042656573746f6e2168747470733a2f2f676c697463682e616e6472657762656573746f6e2e636f6d0018616e6472657762656573746f6e40676d61696c2e636f6d00000f406e697068616c5f676c69746368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440d54556e8cd2d8b532092745cdf4f2b44e2e540322cd0c7a8a692b6fa5d177ddf17aeee823fb416": "0x04010000000200000000000000000000000000000000144b41424f43484120434f4c4c454354494f4e53144b41424f43484120434f4c4c454354494f4e531868747470733a2f2f6b61626f6368612e67616c6c65727901146e6674406b61626f6368612e67616c6c65727900000c406b7568626f7763687568000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471440ef7feca334f14c4a0eb541fc52db126c97ffd8cd041322b68e9c00b6d46b09d2c852c6f737e45a": "0x0000000000000000000000000000000000084772696e694d65084772696e694d65000015766772696e696d65657240676d61696c2e636f6d00000a406772696e695f6d65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714411a5418773a1a2568f8bfef657c69a5c34721cbaa618ae9eb2108566f9a2606cf5055578e0c2511": "0x040100000002000000000000000000000000000000000f436f6d707574652043727970746f001a68747470733a2f2f636f6d7075746563727970746f2e636f6d0018636f6d7075746563727970746f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714412792138d96bb58c2b264a56b5eaa7e1f4cf6db61445113e7df7cbfbaf77d7b23887088f629e657": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144140e165d0c0e9dab86111b2d7969eb7c651d4b1772388ca5e595860e6e82bccb903b46fba28c713": "0x00000000000000000000000000000000000c5768616c6520517565656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714415252cc5998dac14e516d9d6527c3bdcc45105195b8e23480bc0f257308b1f4fef03e06efbb1c5b": "0x04000000000200000000000000000000000000000000055245504500001140726570653a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471441681d40d088fef712df12dcbb5083fb5ae84c019e2b22922dd4e87647b0c5569955f40195cbb512": "0x0000000000000000000000000000000000095472656173757279104b7573616d612041706520436c75621b68747470733a2f2f7777772e6b7573616d612d6170652e636f6d001a6170652e636c75622e6b7573616d6140676d61696c2e636f6d00000b404b7573616d61417065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144177d8c48739d4b1602ae92f82bf4f711ac8534b73bc0959cf87cb691c42eb14bffd93d15da51f53": "0x0000000000000000000000000000000000145374616b655365656b65722062792042544353194254435320496e632e20284e61736461713a2042544353291b68747470733a2f2f7777772e7374616b657365656b65722e696f0018737570706f7274407374616b657365656b65722e636f6d00000c404e617364617142544353000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144184ba79c24cf9898ce7f9b6eb21ee076f759396cbac56c8417e38f5a5e93f354da84d6bf20bde62": "0x0000000000000000000000000000000000117374726f6d626f6c692d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471441b31d51b902bf81b44481905d25563efe49d16584345474c8b6127729b934e7b740a9f264d63457": "0x00000000000000000000000000000000000642696a616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471441ca7551fdd5198464bef580d4d5350d51b7aed6eedd24a2f14e9de9a4c438bb91f9d2b57ddc9026": "0x00000000000000000000000000000000000a73616b616d6963686900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471441e29c1629f394e1e4a77c09a5e7cca4340cd6ce8dd3cf6dfffacadaab7bd6581b7ca50959834271": "0x040100000001006c57c10b0100000000000000000000000000000000000000000000000000000d4b657920506963747572657300147777772e6b657970696374757265732e6f72670015696e666f406b657970696374757265732e6f726700000d404b65795069637475726573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144200a83649f12b6d9218a3abca6aaa7cda30f2493e57e5261b060f5f392f2d4cdd9aab3713e33d3c": "0x00000000000000000000000000000000000e4669676d656e7420416c706861001368747470733a2f2f6669676d656e742e696f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144207de929e0c2c7c20f322a0ce33a28f8e0d44accc268eaa77b9f80f421d8e0e1a96e10718dee164": "0x00000000000000000000000000000000000d46726f6e74696572736d616e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144229207fadf4b0c2366c1d734b33c714b0e0e9f164426e66e3bfa97b917b23e5d3674f4a2074f86f": "0x04000000000200000000000000000000000000000000094d6f6f6e6e6f64650000001174656368406d6f6f6e6e6f64652e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714424771d484adc6a72a6f412b15ba9a05e58871913e1db1c5e2ffaa7bc58e5211721e98a03045284a": "0x00000000000000000000000000000000000b4d616e6e696d4d6f6e640d4d616e4f6e5468654d6f6f6e00000000000d406d616e6e696d5f6d6f6e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714425d6aa15789f0c1507bf2acec7efcbdcf09e8ec2187bb87b07ee88825d4b840af4159a30012cf4b": "0x0000000000000000000000000000000000010101010100000a406361626c696e6531000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442661dc55caceeca42a60e286bf3ab5228cc24f47e4087436285f889a306a4542f3e97c50834ee51": "0x00000000000000000000000000000000000451766f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442846f3701313edf5e14105dd8e15633168123d30f93edbbcc5cccc3518791e53cdb9c541cbcd343": "0x00000000000000000000000000000000000e62696e616e63655f6b736d5f350e62696e616e63655f6b736d5f35000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714428cc1cacf21d843cc386a98ed8462dcd6df033f115fe1527867c49a2a898280691dc57ab5e63974": "0x00000000000000000000000000000000000d4672616e6b7920467265736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442946832d384cb2c5e1eb942e5f591bc1d902fc6a04dd7ecadf5f4916f2597df0505c6c521412c4b": "0x04000000000200000000000000000000000000000000084649474d454e5400000013636f6e74616374406669676d656e742e696f00000c404669676d656e745f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714429bcc7f376222a2d1bc4259aeb77874ee7ca72a9763d6385763068b56bf47fcabd0d854311ab7c1": "0x00000000000000000000000000000000000e524d524b204d756c7469736967001168747470733a2f2f726d726b2e617070000f68656c6c6f40726d726b2e61707000000940726d726b617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714429c4677f860fc0c88f9c19843d4503698a3cbdb00a6bcf115fd11c36d646f280da7822733a81f03": "0x0000000000000000000000000000000000084a52637265616d034a5200000000000a406a75616e69727566000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442a5466c1294dfdc0a7deeafeecde52fd2ef2749958d1b0e5094c629a355ab52c984116556e5f515": "0x00000000000000000000000000000000000f73696e67756c617274732e6f726706456e67696e1768747470733a2f2f73696e67756c617274732e6f72670111656573756c6140676d61696c2e636f6d00000840656573756c61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442ade399737c4384882a9309f1e5f87abb745dc51d5dcc338e3dbe7b818fd8a9768e27d97e57ec13": "0x04000000000200000000000000000000000000000000084469616d6f6e640000001776616c69646469616d6f6e644070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442b0e5e788b77418280221db3cd2515ba48cff6c400cf4624b9459eca62f30523972ee5b608e967b": "0x0800000000020100000002000000000000000000000000000000001c45535152204361706974616c204e65746865726c616e64732030311945535152204361706974616c204e65746865726c616e64731c68747470733a2f2f7777772e657371722d6361706974616c2e6e6c1940657371725f6361706974616c3a6d61747269782e6f726719706f6c6b61646f7440657371722d6361706974616c2e6e6c00000d40457371724361706974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442bd7fccd27172c3c0b457c25ea2f71dc18c12a6dfef5c32a1d663269787f2fe0b49b9ec041eba64": "0x040100000002000000000000000000000000000000000e566f75726865794b7573616d61001c68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b2f1b40766164696d2e6d616e61656e6b6f3a6d61747269782e6f726716766d40726f626f6e6f6d6963732e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442c610f7e050710e06b2570a6c00c6e0c418a2fef16ca9c55e7316c995265e99b1e5f15117ee3e3d": "0x00000000000000000000000000000000001553746174656d696e6520646576656c6f706572730f53746174656d696e65207465616d00001c626c6f636b636861696e627562626c653740676d61696c2e636f6d00000c406b6f7265616e5f67656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442d6dbf1184a5e27d45579ae86a4bb29d2440e48a9eed4790411a6a8e8d09413c827504c2088660c": "0x000000000000000000000000000000000007566f6f446f6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442eafc0ff257cf6b6a27e5f57753658d45a60fe2d7f5a2b9bc2e0202ed891a8fc80ad7c27882f448": "0x00000000000000000000000000000000000c4e465420496e766164657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442f7186af73e2c106edfd181c979c11a1d853c8fdef7b18e85ec39bb67ce723130b25fc24232c358": "0x04040000000200000000000000000000000000000000094769734c656d6f6e000000186769736c656d6f6e4070726f746f6e6d61696c2e636f6d00000a406769736c656d6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471442f901039d3431b5a0111975da4d8d0ae457ced7a3628c368ad8a7d089ebbed2a2f2561b0c144236": "0x00000000000000000000000000000000000d496d616464696e416d73696608496d616464696e01010100000e40696d616464696e416d736966000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443031ba174ef004f7e21ab0dcd65abbbf6f37cfde306ea29c7416a984ec5664cd553befbe3cf114b": "0x0000000000000000000000000000000000054d4a465301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144313f37cc5b7356c545b79d13047971ae5df6134fd0e034f99db6b174cf1046764861569f943514f": "0x0400000000020000000000000000000000000000000009726f636b6e6f646500001540726f636b6e6f64653a6d61747269782e6f726715726f636b6e6f6465687140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144315c981ebc9c224e49a94c01d7c0511480422e00ef7030ff64f314591b50d7057deadbd6411112e": "0x04000000000200000000000000000000000000000000074655545552450000124031667574753a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714431c4c64db68d8bc2211d6fce26d7140904357fce2aca5d1e63b362f1789bb6d7dbd848d3df79c65": "0x0000000000000000000000000000000000084d6172636f526f0d4d6172636f20526f6d616e6f137777772e73747564696f2d6967732e636f6d00196d6172636f726f6d616e6f77656240676d61696c2e636f6d000009404d61726330526f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714431fc37d4e65266372f0e8e7a0016e48feebb38705376825b84f27f82c8c108eb4301755293a5274": "0x040000000002000000000000000000000000000000001af09f90a420424952422e544543484e4f4c4f475920f09f90a400000013686940626972622e746563686e6f6c6f6779000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443219b832eb0cea63abe5f0e44b84bebe5b30889223938b97e535b6092c30915e40890f16edd51e1": "0x0400000000020000000000000000000000000000000016f09f9ba1204457454c4c4952204b534d20f09f9ba1001468747470733a2f2f6477656c6c69722e636f6d14406477656c6c69723a6d61747269782e6f726711696e666f406477656c6c69722e636f6d000011404477656c6c69724f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144322706aab5751605e9a8499b030780091dae032059aa6e38cc55ef49a68644a1cb272891b676760": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32310f42696e616e63655f6b736d5f3231000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144336ca0e09f590ffb45bcaffa67198b19865dce57baff03eff340df85c52e256631ec9c4b96ad275": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714433a39cb0e6f7bc112319b29cc9112a1be246421e75de0339021bfe1ed7b06541d969acc17a6de40": "0x000000000000000000000000000000000007736174656b7800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714433b1db524879af62af538e357eed0b3fe92c64dda50c356a3359a8c38940765e48c8a830279bc2e": "0x0000000000000000000000000000000000054b61727000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443496d81af6ed7735855f6f9634a68990a917f22cda160e53f14a0bab251926d946650b4df53412f": "0x0000000000000000000000000000000000217370617a636f696e5f4368616f7344414f5f496e74724b696e745661756c7473000000137370617a636f696e40676d61696c2e636f6d000008407370617a7674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144352c02456f8db9cda79564e50582d71b58582eee69b5eb4b01441d3e40edc2cd2eeaeef3f6d2963": "0x000000000000000000000000000000000007636872697a790000000000001040686579697473636872697a7a6c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714439dcb29ce5bd09bf622b449b4731ab216a7b8c8845323a004906934f028e2f16c5277b96e86c77f": "0x0000000000000000000000000000000000094d7255706f6e6c7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443a5a3e7bfd489c4deb05fb7623d20882b463209bd7e6a20a1ed0ec1929764ec119a616abe71e642": "0x00000000000000000000000000000000000b4b656c6c204e6f72616c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443bb1018fc2bff6592536c5469fd64b2adaee0a10c5936bb0d4c8e4c5e4d31185fbc0c9136e1f205": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443bb2518f5dd346208bfa1909b08831184ddb72b2bcd671adc761e4cfecc24b725be3f5a24cfe94d": "0x00000000000000000000000000000000000d4d722e2043616e64796d616e001b7777772e696e7374616772616d2e636f6d2f6368696c6c2e6d65000000000e406d725f5f63616e64796d616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443c19ff4a42bbd9874372fc06884fd5e1cee0831c88891f0e2941ee0017d3125724105d1b6b4f776": "0x0000000000000000000000000000000000074b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443c2329d3180137656c0b55c865aec0af22f6d39e01e0d943f3350933058f3b56807c89476e5125d": "0x00000000000000000000000000000000000864696c6c6f6e780101010100000a40584d696e676b6169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443d5af598339f8ef98796948d017243ad1b85af8cfc8bac2ef20e3b7e867bb096c5cb847e3562078": "0x0000000000000000000000000000000000074b75246b757301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443dd79f4e889aacc3c3ac3653a4bf9a728758393bbc9bdc5ca31e29aed46a1585fd3d4910257c821": "0x000000000000000000000000000000000007746f6d616b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443e9f94129b67458622984b619c81ee9a2a84c6ee36fa79b67b535ef31d7ee0b668d704b00c32f69": "0x0401000000020000000000000000000000000000000013526f626f6e6f6d6963732e6e6574776f726b001b68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b1723726f626f6e6f6d6963733a6d61747269782e6f72671961646d696e40726f626f6e6f6d6963732e6e6574776f726b00001140414952415f526f626f6e6f6d696373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471443f90c79a74ca36eecafd4305f2a5592eb1f819e05e7ed312282c5d86f284ed0dc5043e8715df14f": "0x0000000000000000000000000000000000084b7573616d613200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714441abecd8f673549225952e5bb10c80a33d25cdd180dfe6dddc0cd934560c8f6dbeb52edbccb054a": "0x04050000000200000000000000000000000000000000047377620d53657268616e20426168617200124073657268616e3a7061726974792e696f1173657268616e407061726974792e696f00000e4073657268616e776261686172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714441fb0b93c3c68999c036f0e22d9e0a68b1dc5018d743fb85f400f2e5e213561d03b4c966b131a64": "0x00000000000000000000000000000000000b4b7573616d61205a6f6f001e68747470733a2f2f747769747465722e636f6d2f4b7573616d615a6f6f001a6d616c696b62726f7468657273647240676d61696c2e636f6d00000b404b7573616d615a6f6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714442352000e64552148dd734e16f0815537f6bb9a491f1d76ecc83f46c6efe47243f6ac87ae88730c": "0x000000000000000000000000000000000008554d46204b7573000000116e6577756d6640676d61696c2e636f6d00000c40726f6f6d317a65726f31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714443156d8215300f5028613450f87010f24fa491fc01aee1a9a00649bc3656cc95623caabfd99df6c": "0x0401000000020000000000000000000000000000000007316b4e6f6465001368747470733a2f2f316b6e6f64652e696f2f1740766c6164316b6e6f64653a6d61747269782e6f72671277656c636f6d6540316b6e6f64652e696f00000840316b6e6f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714443ad277a8dbe9aba845ea35913a0fbdec49687ebc5b1579bb632c080ce61b02919ba40bcf889276": "0x040100000002000000000000000000000000000000001056616c696461747269756d204b534d0c56616c696461747269756d00001656616c696461747269756d40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444509eb7f7220ceaeebbde3ff2bb37ca11414154e92c0521ac8051ea48d0d84b39714b2347763648": "0x04000000000200000000000000000000000000000000094d4554415350414e00000013646572656b406d6574617370616e2e636f6d00000d406d6574617370616e5f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444555228869870c2e666c8204234e3e9dc671cc875c4f22316e6a7b67bb8b0538d8d77674468ed50": "0x04000000000200000000000000000000000000000000054178696100000019617869612e76616c696461746f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144456b32654fe47f91a8ab26aba64d6176b6aa462a2a7ef6252ca1063cf978dcb6f6c64fec81e7861": "0x04010000000200000000000000000000000000000000074534592e696f001368747470733a2f2f7777772e6534792e696f13406534792e696f3a6d61747269782e6f72670f737570706f7274406534792e696f00000740496f453479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144458ae5cd71591333641233f6aa39d0515608c15dc001611a7c5fdf5f5f76fe72d8f8348b0596f09": "0x00000000000000000000000000000000000c5669636b79447265616d7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714445f24d9b88c5e2770086e7c9eb19ebdb3e7c492dce59dd3f895c2253e7a838d6dd746503bbdbe44": "0x0000000000000000000000000000000000074a617a7a75730d416e6472c3a920446962c3a9127777772e6b616d65616c6162732e636f6d000000000c40616e6472655f64696265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444687e96c8cb00dea2fca1a6c0cf0568cd25a13786689400f1a7dbc63ce2b16a5568b1e88576a307": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714446c9be06dc89e3a8c57b6eb2ab6d89e5822919b8d492d510e847f4d60c8380d0265ef7804774a03": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714446ced0dc56cc8bf082dfbe87772fa0f7d714b22e0f43cf978a8b588035950aac6f9d14561ddd831": "0x000000000000000000000000000000000017426c7565517565656e20f09f9191f09f9299f09fa68b0020687474703a2f2f6c696e6b74722e65652f42617374617264467269656e6473000000000d403078626c7565717565656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714446ecde49f31e64a2a3fa40b4085d8adf7dddf3e3073d45d43cc9e55de72822990fa2d84b18faf20": "0x00000000000000000000000000000000000479616f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444781ab96a799989aea86d60aba408d8d30ec708eb6e322d9c9eac484e957053efab66f1ee4e0f58": "0x04000000000200000000000000000000000000000000094252415f31362d4400000016637074636f7272656f6f6640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714447de9973eed816a0c4e7bbcd18257cff6e835218d6e035cfe29dfdda404abd34f0107379cc9b239": "0x00000000000000000000000000000000000b4d6567616e20536b796500001b40746865746f6b656e626c6f6e64653a6d61747269782e6f7267176d6567616e736b796570686f656e697840706d2e6d6500001140746865746f6b656e626c6f6e64655f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714447e1613a9d973af08d48a00b01356b80f40e50f281c2cda9e858f45a1bc8e989b3eedfb27dfe044": "0x0000000000000000000000000000000000094252415f31362d4400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714448ea7872d496c7fe40898073d5ab4bfb056778a95be2d797fb929315d0a0e31ca415e9f37a1d726": "0x040000000002000000000000000000000000000000001447494c204655545552c38d56454c20f09fa496000000167a65726f406379626f72672e636f6d6d756e697479000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144499fd1a049d4b87923e75ccccb33e471161db9558583ef4668de361bdf471e674256e8fe0748706": "0x0403000000010010a5d4e80000000000000000000000000000000000000000000000000000000c4f50454e474f5642524f53000000166f70656e676f7662726f7340676d61696c2e636f6d00000d404f70656e476f7642726f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444a4a90b1106c3b5aed98e15e3ed392e38654215c3d1fa8143de53460386b60139fbb45c036c1b43": "0x040000000002000000000000000000000000000000000ff09f90a0207374616b6566697368000013406d34646269373a6d61747269782e6f72670e6869407374616b652e6669736800000b407374616b6566697368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444edfa80574ab9caa493de655d6a57c136e22828f46b8532e2d31cc6f2e7a5c7ba2a20e689f7540c": "0x00000000000000000000000000000000000b547269706c45696768740e44656e697320506973617265761e68747470733a2f2f6769746875622e636f6d2f747269706c65696768741a4064656e69735f703a6d61747269782e7061726974792e696f1864656e69732e70697361726576407061726974792e696f00000b4044656e69735f507374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444f07034c5b0cf0e041e9a27a03cc500b1953d21da30a299cd37b16dff34adc74960e58d747b6524": "0x0000000000000000000000000000000000085369737365726f0e4d696c6f204269636b666f72640000186d696c6f2e6269636b666f726440676d61696c2e636f6d00000a406379626572706171000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471444f53fc133ec6c80a0d32bc7ae5d421990bdb847fc38cade9b388ce8138ab4e4ae957fc7ca59bd2c": "0x0400000000020000000000000000000000000000000006506c7573560000000f706c75737640706c7573762e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144509291906f0088c76fea4c5f219d65cffa5fe38856023a2faca6f77682c6d6787ceeec403e6c461": "0x00000000000000000000000000000000000653746565621d42792e205374657068656e206f662046616d696c792050727963652000000000000d407374657665707279636533000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714450c8a71697e6a933a4100ce6c8cbffb10c34bbc2792d3c4e05e611f907038cb0b29af8a6ae0292c": "0x0000000000000000000000000000000000114b7573616d61487562204d696e74657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714453c05212d64d20f682eeef106c00e84e6c4ae91fbedae25dadb1a9acb8ffed3e0e90494c789d364": "0x00000000000000000000000000000000000e536b79627265616368204f5354001668747470733a2f2f736b796272656163682e617070000000000e40536b796272656163684e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714453efa586e0ab504d20f2ce6c2c876745bbb399c6290cf4e3ee75ce31bbc7ec11342fd5118b98e3c": "0x04000000000200000000000000000000000000000000105374616b65f09fa7b24d61676e6574001c68747470733a2f2f7777772e7374616b656d61676e65742e636f6d18407374616b656d61676e65743a6d61747269782e6f726715696e666f407374616b656d61676e65742e636f6d00000d407374616b656d61676e6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714454451249bb2a28c9e7db7bbc0e608c8947bcb697f3a57cfe4586184d757267011ce0ed08fa14976": "0x0000000000000000000000000000000000074e4674657874000000156e66742e6e667465787440676d61696c2e636f6d00000a404e5f465f74657874000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445599a5d9a55b787b6448af583e707f5da901694a4d98471a3be7d6ed6fd76711bd28278987bae25": "0x00000000000000000000000000000000000a426c6f636b20446f6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714457458e4dcb0efd044ecac8b217db711304ba182b23eea8795d7d3163a0d4552bc2c0bd46d38b213": "0x00000000000000000000000000000000000b5374726f7744654154680b5374726f77446541546801010100000d405374726f77446541546831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714458263f3dd29a31aca42f0b5c7957571706f29d2828291b148b4b162100ddcac72c507fd8ab69b2e": "0x04000000000200000000000000000000000000000000084a6f6579e29ca8000000116f647364727140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714458370997cd94a3038eb1437e296afe15e68d2f76e911a3eaee426d061821343101c542b4e375253": "0x00000000000000000000000000000000000e447265616d204e6574776f726b0e44696d69747269204f6c6f636b00001b746865776f6e646572796561727340686f746d61696c2e636f6d00000f4044696d697472695f4f6c6f636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144586d84f22c954a18d34b38fc5c98e7e3ca205b60de22964fb8a6b81f9573ecd9f36fe5d50923927": "0x00000000000000000000000000000000000d504f4c4b414c4942524152590d504f4c4b414c49425241525900001a706f6c6b61646f746c69627261727940676d61696c2e636f6d00000e40706f6c6b614c696272617279000d706f6c6b616c69627261727900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144586d8be9824d3b1ae54b764b5092a89e9a47240f68fc77b20831a47d17cb26216f51b09a6ebf238": "0x000000000000000000000000000000000003425a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714459cc19119e455ad94b3d04ef219a8970ac5f76658fdee1005b4b7ffee3fc02355f60db1a778f826": "0x040000000002000000000000000000000000000000000b46494e5354414b494e4700001a4068616e6e736b6f72686f6e656e3a6d61747269782e6f72671868616e6e736b6f72686f6e656e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445a19fd11dfab9141672dd5646976a1e7970e4294e7c76108ceaecae9d451cd9114aa05e60d7ed15": "0x040000000002000000000000000000000000000000000c6c65736e696b5f75747361000018406c65736e696b5f757473613a6d61747269782e6f7267176c65736e696b3133757473614079616e6465782e727500000e406c65736e696b313375747361000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445ad914bf08ca65600401fa089dca21daddd06b7a240939cab69a9b322b1b5d97106814d915a941a": "0x00000000000000000000000000000000000565746e6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445b717dfcdb4e9d874b415e0035e3edc9f18063fc7e060ed66b35f6fff4b657ed0110fa3c0972b1f": "0x00000000000000000000000000000000000e62696e616e63655f6b736d5f340e62696e616e63655f6b736d5f34000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445be453e8a7bff0f1c7376c9f2afef25e542556d2af805dfa691a414efb9e0fc9a8e33f625294f67": "0x040000000002000000000000000000000000000000000a43617270656469656d000012406a6469656d3a6d61747269782e6f7267146a7361766f406d61696c66656e63652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445d43cb8401e3564f40cd7a2181289e32776625b9f3a193f749e33ce1bdeb76cfaabece606c7324c": "0x040000000002000000000000000000000000000000001768656c697873747265657420666f756e646174696f6e00001b4068656c69787374726565742e696f3a6d61747269782e6f726711744068656c69787374726565742e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445d464460dcc7a6cee757e08a886f0c05726f01a5896cca539d55f5f479aefb99065f7fb522f9857": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000014506f6c6b61646f742042656c2033617261627918506f6c6b61646f7420d8a8d8a7d984d8b9d8b1d8a8d98a1d68747470733a2f2f796f7574752e62652f4f7962346e753144324663001c506f6c6b61646f7442656c33617261627940736b6966662e636f6d00000e40446f7442656c336172616279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445d6cf8cdd42d9567e551c089af6a7a53e7644e2e1f0cae900ee599c7b093d8d84e0b260baef1e2f": "0x000000000000000000000000000000000003726f07526f6265727400000f726f40737570657264616f2e636f00000a40726e646d6b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445ec95bcb8dd897248d5f568124b09fefe504a22bbce2ccee0fcae9262c639b6b2ebaf95b5c8fe77": "0x00000000000000000000000000000000000f5368616e6b617220576172616e6700001a407368616e6b6172776172616e673a6d61747269782e6f72670000000f40576172616e675368616e6b6172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144606c1e64c9b04ef089f89ddbc0f4ed98a10fb57963bbbb03c451dd3aa47ac578a0866ff36400274": "0x00000000000000000000000000000000001c5761674d6564696120426f756e7479203132204d756c7469736967001a687474703a2f2f646973636f72642e67672f595558716a5658001743687261776e6e61436f727040676d61696c2e636f6d00000e40746861744d65646961576167000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714460eeee95ee3957682947d9ddfb4825c6c07ea8c0259249142a42ae15548f32eed2f26dc995f8c44": "0x00000000000000000000000000000000000970696b612e61706501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144631dfe0f44bc9a172d92509f6cf730bcf490da19f09c2271c053d750155b314ec96a7b929ae0c1c": "0x00000000000000000000000000000000000943616c76696e20570000000000000c4043616c57616e675f4359000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446374d36cdcac1f68e28e91f200ae0e50fec4354a429a7e4e00f684f594a33437dff6e8c4ed18053": "0x080100000002040000000100902f50090000000000000000000000000000000000000000000000000000000b63696563686f6d2e6575001368747470733a2f2f63696563686f6d2e6575001c62617274656b2e63696563686f6d736b6940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144642619111762c48be1c7627fbc96a38d3a3cf746ae545f60e2510ed80961537d9b4924421fbb562": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144642e4cbf75408a4e0b67671edec61aa1d5fbcf798d4a25beda1a5dd1e3526317509d2c2fd200127": "0x0000000000000000000000000000000000084b55574f524c44000000116b7577726c6440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714465ad8a5d19f9267c884cfb4aaa082d634dd1490b083e2484eb1ae869dc283bdd232e79076050f23": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714466fd64f62aa7900e0c3d50d8748046da1a6d4b266aa6272596357d2fd8505297750874fef54bb62": "0x00000000000000000000000000000000001044656570204d75736963204e465473001b6170702e737562736f6369616c2e6e6574776f726b2f36333332000000000f40646565706d757369634e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714469fd489f05874310eb3bf62c9a8af621503ff143b18cb35afbfdf56b274e6c6de571e7a12732200": "0x00000000000000000000000000000000000b426974537461636b2d30001568747470733a2f2f626974737461636b2e636f6d0010626440626974737461636b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446b931982fa83f40c009ab06d6b49cd62f2801c4b0029a5343c51747f6716c788780bfeb2730af66": "0x040000000002000000000000000000000000000000000e436861696e20736572766963650000000000001140636861696e736572766963656c6c63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446b9cd597eba686fe4a48b16cd6a6c6c44e4c9542e923726dc861077b6a4ff3df1969b13a6868b2f": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000d5061756c6b61646f74746572000013407061756c6b613a6d61747269782e6f7267177061756c6b61646f747465724070726f746f6e2e6d6500000e407061756c6b61646f74746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446c4669abf816fba10d77f8b691c95b2e7307a11e1ef18b68c26e000c3989a780bacc7349437bb50": "0x00000000000000000000000000000000000a616e657474204b534d0f416e65747420526f6c696b6f766100001a616e657474652e726f6c696b6f766140676d61696c2e636f6d00000f40416e657474526f6c696b6f7661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446cfb02d325485373adee633eaf6ebc53ac8f7aec7bef21463801b4034e0e83a49aaa5f143554a1b": "0x00000000000000000000000000000000001054696d4b207c20414a554e412e494f0c54696d204b72616d61727a00000d74696d40616a756e612e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446ed2c28a4803e5468f660000960b688950a3e61f27955ce98545c0039dce11d99e53d03dc4ceb76": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446f06f7d193327806c7bcff1709777857526bb52cb6216759a67ea7e56d1d3571c828902b5bff774": "0x00000000000000000000000000000000000945676f72205368610000000000000d40436f726e666c616b656e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446f13c2d0cde69066a89d6035d62de486ffa7832f579971d6ad69ae8cf9e1e8b284b075c06be7d38": "0x00000000000000000000000000000000000e5572616e7573204f7973746572011f68747470733a2f2f7572616e75736f79737465722e63617272642e636f2f010100000e404f79737465725572616e7573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446fa647d7b60b7824ef63a0f97791221290fd19207cbb23ec5783221b5016afa55161b01dbb0125d": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471446fb667c004eee811ae687e64fca4530b4fd2d2c1f55592a05e4957804177fab940dbeb5cbd00855": "0x0000000000000000000000000000000000094272616e64736f6e0e4272616e64736f6e20556d61720000176272616e64736f6e756d617240676d61696c2e636f6d00000c406272616e646930303230000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447108ba2f686e08a84385f4dc4e864120c2648aafc704e395043dc4035e464a9b2a949b4bf0bd51f": "0x00000000000000000000000000000000000b726f6d616e6d65706c730e526f6d616e2042656c696165762068747470733a2f2f6472696262626c652e636f6d2f726f6d616e6d65706c730015726f6d616e6d65706c7340676d61696c2e636f6d00000f40526f6d616e42656c6961657645000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447298269749af4b4ae59eb4208247833e23d7fb08f26370152accd40170824923bcaab638039a104": "0x0400000000020000000000000000000000000000000012474f4245524e414e5a41204b5553414d410000001f676f6265726e616e7a61626c6f636b636861696e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144730d851b833f1c06eaf819ef043560115f737f51d3b07afa79fe8780373bd00070a2eae94015646": "0x0000000000000000000000000000000000046c6b6a0667686a6b6c0000186775616967756169306775616940676d61696c2e636f6d00000840477561693047000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714473db53267f4b4815c4a22915a8bf1866be4812ab49589348457618cebe48440fd7caa86b9b59e2e": "0x000000000000000000000000000000000012566f696365204d7920416d626974696f6e0000000000001140566f6963654d79416d626974696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144746bdebb15ec7155ee8c2936d7a2680fcce49b83f26983593b56a7d7ed33a261bcfdabdda639e2c": "0x00000000000000000000000000000000000e4d617465726961205072696d610e4d617465726961205072696d61187777772e6d6174657269617072696d616e66742e636f6d001c636f6e74616374406d6174657269617072696d616e66742e636f6d000011404d6174657269615072696d614e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447584c2d31e2e9c26ecda2dbfae5750cd7a01702757efade022460d7c30fce208e0e2f850c2aa93f": "0x00000000000000000000000000000000000d43727970746f5f4c6967687400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714475aa077ca585da3a65d8a5050f324ebffc0acbe4405923615e0d76c0c6665050b888337833de927": "0x000000000000000000000000000000000015416b726f6d6d756e6974792054726561737572790000000000000940416b726f5f4456000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714476c17eecfb55ebeba2a4bd4f5273adae499968adab8b397e60270db6dd18a85d69180b385a57a3a": "0x0400000000020000000000000000000000000000000006696c6f6e6100001440696c6f6e6131313a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714476f6754a2671256884bfab0d164daf8d9820db39bb87b170e21e75abadeae41fa148e853254d17b": "0x00000000000000000000000000000000000a4d616e6672656461730000000000000d406d616e6672656461736d69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447785781ee7fbf17b8bfec3d3aba4cacf54940cc35e865b8ab6d8a856894f6401c4a653031a92e42": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f33350f62696e616e63655f6b736d5f3335000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144788a63a68d46b3e90eeff9c04b03b3893aa1b545ce5e271bec4de02dee3ac259867733d65e4636e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447a11575d19da5016c32ae0601494f734050511609799c3e1e9c5be224bac231a5e083aefa3a5d61": "0x00000000000000000000000000000000000754495a49524901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447a1a560bf1b7d81546b0e2808b74dd556d18a6438df5b5b3afd038785afb34e8e1457a1dd1e9009": "0x0000000000000000000000000000000000074272616e6368126f6620746865204461726b205369646520000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447a838aa9114c0a2d29656902ad531e8326517cef640e70eb793c712b6329633dee3da0599c88e79": "0x00000000000000000000000000000000001446757475726520566973696f6e204669727374074a6172726f640000127261656a70756b40676d61696c2e636f6d00000f404a6172726f64436172656c7365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447b2d7bf40bf9bbc24beb92b2450897df40f8df93e348c583d972d1b6d4f661a49961acc2b88101c": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31390f42494e414e43455f4b534d5f3139000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447bedb9f0d77b46d6883b9f834076b9c1368e7692ec0a01ae97a52c5cdca957b5d31103423cfbe45": "0x04010000000200000000000000000000000000000000074c55534e45540d4272756e6f206c757373616e1268747470733a2f2f6c75736e65742e696f13406c75736e65743a6d61747269782e6f7267116272756e6f406c757373616e2e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447d0dac62a754c76dc74b64f14d50dfb713f914714ac6adc34d806466858fe9289687aa0decaf762": "0x00000000000000000000000000000000000b4b7573616d614d696b650000000000000c404b7573616d614d696b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471447ea99c6c537b3af1e65015f1fcf3b5f0dad80efb6213321b2fbace6b1662722d574d9641bbfa072": "0x00000000000000000000000000000000000b436174686557616c6c730e4361746865205061726564657300001763617468657061726564657340676d61696c2e636f6d00000c40436174686557616c6c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714481d0bcc9fe1394af6bf18ddf629a634fe0dc352b4f82084c67135cb235f1a7caf05e7b70bd1d128": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714481f4f2839a459d644a41e55054618d207431192696d5a5505935c9a8c7257e1067797c8484fcf47": "0x000000000000000000000000000000000007486f6773737308686f6773696869010117686f67736968694070726f746f6e6d61696c2e636f6d00000c40486f486f486f486f6734000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448240b28222befe0c820f33cbfd5179274cc09289203fd06d9bf02fee2c2ddb01202b6588fde2d23": "0x00000000000000000000000000000000000a42525542414b45525a0000001562727562616b6572697840676d61696c2e636f6d00000c4042525542414b45525a31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448289f8a612ecf7a008963f0b205fdfab299aefe8f86eac63a6c8418b081c3333c2ab9da1767d825": "0x00000000000000000000000000000000000b524d524b2042554c4c530000000000000b40524d524b42756c6c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714484f9e39f4f0e8475cce1eed57740222d643b9c92a594bec58f9b9968bfd4d63d495a7fe5237ab1e": "0x0400000000020000000000000000000000000000000007686972697368000013406869726973683a6d61747269782e6f7267166869726973684070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144851b9f7dac59c8088b775aecc56294102b3c3b55732f7355d69d629b7b3f75415134ae16fed8c49": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144871b57949825f03065cd01d8f8ad376ee4306bc8da85235688b7ef486eaa8efb7ef16228a32c317": "0x00000000000000000000000000000000000b626c75207072696e636501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714489667186afa0e91ca5bc1915da74aba3aadd7ce7b809045d5eb5b73559259755fdcd85a40a5dc6e": "0x00000000000000000000000000000000000f4a414d20e298a0efb88ff09f908d001968747470733a2f2f73686f6b756e696e2e6e6574776f726b00156a616d4073686f6b756e696e2e6e6574776f726b0000114053686f6b756e696e4e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714489b5689523a93fdf4f5911143092b1788c3a91f96d192b35e4fb201f05658f47b677e7dc9a1fd5d": "0x00000000000000000000000000000000001f52686565207c20444f5420456173742041736961204865616420416d622e055248454500001472686565756e696f6e40676d61696c2e636f6d00000c40524845455f554e494f4e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448a5df45177101a6780c9d8ff3121bf764b263a23d7913b4822df102bff190f70ea63effb2672d70": "0x00000000000000000000000000000000000c4b7573616d6163616e676100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448a936aa7fb7ee3630e0edcf2e2340535e12db18dc82636cc2398a3e51bc3c8652f738e3130f6c43": "0x00000000000000000000000000000000000773616e34657305416c657800001766756e70726573656e74373340676d61696c2e636f6d00000a4072796261345f6f6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448b0b934213b6e967cdf18faef23f25dc98b3c1b43e11f334ff5df943dc922e8f24ffdd726bb3733": "0x000000000000000000000000000000000009504f4c4b41444f5400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448b805c30833f34f66f193bc93e18f77ec6e9b26ab283adb6b5e58cc43c6cb81a22264525bfcda57": "0x00000000000000000000000000000000000c4d6f6f6e2d4265617265720000000000000f405468654d6f6f6e426561726572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448c23fd18bd08932827463efe7300e6a0f8839aaae0278895c8bdb087088da4583402898e4174478": "0x00000000000000000000000000000000000f506f6c6b61646f744c752e444f540000000000000c406c7578696e7a68656e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448cdedeb02681e28ac891d5a6e2f56c923dcff8c05d0a535c6695a118bf3de7ed3bab92ff7db641f": "0x0000000000000000000000000000000000144a6f6e617468616e207c2054616c69736d616e000016406a6f6e7064756e6e653a6d61747269782e6f72670000000b404a6f6e5044756e6e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448da0b535190e8951a734819deec3876010a3867c2ac97785e17624a30d8f51d3ab4e93f0d0d9816": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448ec723cf1e5db8eb6886973c891bf20892bfe376d58c89e42f42163a47816c2b064ac7e78528f25": "0x0401000000020000000000000000000000000000000016e29aa1efb88f457665726c69676874e29880efb88f0d736572676579706574726f76000017706574726f7640736f72616d697473752e636f2e6a7000000a405361676553503739000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471448f55d60a49f7e0a2119e372adc7757021cc9e11304519ed6f8f0ef24a3a61dcc5c5e983b2d7171a": "0x040100000002000000000000000000000000000000000d4b4d4c204a616c6162657274084b4d204c6162730013406b656e6f6b6d3a6d61747269782e6f7267166b6d6c6162734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144900c2cf5eb1d4d5dce117ad72d855b586a1c7ab1e2e1400b00418037000a81a26d131eff8486b77": "0x040100000002000000000000000000000000000000001af09f949273746174656c6573735f6d6f6e65792d32f09f9492001d68747470733a2f2f7777772e73746174656c6573732e6d6f6e65792f19406161726f6e7363687761727a3a6d61747269782e6f7267194161726f6e2e416e746f6e6f706f756c6f7340706d2e6d6500000f4042656e57686974654a616d696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714490d06ea3a7f6662a4bfd8243876621936043198841c6226dd58bb5183f2581182ccbbf1f0804607": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714494a0eac89f0ff78c63b6d81d7d307b9f4464304330a840f5159c78a804dd344c5fcbfb3da9aad11": "0x040000000002000000000000000000000000000000000c445241474f4e4c414e43450000154074616e69735f33373a6d61747269782e6f72671b74616e69732e737461636b4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449577d51da67dbbadc86d7e1dba377a90f087a942c0c2777851b447a16af68cfac09c2e58ecf7e1d": "0x040100000002000000000000000000000000000000000b4e6f727468776f6f6473001768747470733a2f2f6e6f727468776f6f64732e636f2f0016737570706f7274406e6f727468776f6f64732e636f00000d404e6f6178656e6565646564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449699ba492f6ca67be2153373520551c1a92b9a2f47ee66c0de25eb1e1c09a4b73af2fdf819c1464": "0x0000000000000000000000000000000000164172636869766572736520466f756e646174696f6e00137777772e617263686976657273652e61727400186172636869766572736538383840676d61696c2e636f6d00000f4061726368697665727365383838000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714496fd3c0ebe3acf5b2479a4c5a314be896da932acd7d770361daf76a8c0795afcbb09137ce83d545": "0x0400000000020000000000000000000000000000000012416d697220456b626174616e696661726400001740616d69726b68616e65663a6d61747269782e6f726719616d6972656b626174616e69373540676d61696c2e636f6d0000000005414d495200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714497b07aaeca4b31138f65ffa021ed80b8111b27929180c5ebb79e279810b521adaa2bbc22c343b7a": "0x04000000000200000000000000000000000000000000076b61766b617a000018406d7978616c6574697368653a6d61747269782e6f7267116974656b31393834406d61696c2e727500000d406d7978616c657469736865000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714497f7f7e0d825e942084ed6e5d7bbd49c8bcbf018d5aec40e9e62ef105729b7dcb83007e3ac5c911": "0x00000000000000000000000000000000000a4368616b726172696e0a4368616b726172696e0016406368616b726172696e3a6d61747269782e6f72671a6368616b726172696e2e7361726e7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714498d5c402783eb13d4da6bd9b592cffa69e19e3758d8984704c2335bf4c6474ad93e442f16b71556": "0x00000000000000000000000000000000000b736f6c6f6d6f6e3232360a50657465722053756e1868747470733a2f2f706574657273756e6465762e636f6d001375676c793032323640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144997fd81d8f83eff7294d22dea735215a7ac4a2aee260eb25d1beaad4b02bd8dacf87bd611a96c3f": "0x000000000000000000000000000000000006416c656e610e416c656e61204c656f6e6f766100001b616c656e616c656f6e6f76613139393740676d61696c2e636f6d00001040416c656e614c656f6e6f76613134000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449d8d1014a0c6d168029a7ce3dc02d90888bf05e8fe3ce278e7a8bf499cdb24c432315dace83176e": "0x0000000000000000000000000000000000054b796c650b4b796c652057696c65730000176b796c6577696c657361727440676d61696c2e636f6d000011404b796c6557696c657353747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449e133447b19f12b84d282e5fd1797757dfd0075cdc362493994ae63d980d941081baf72ea395e41": "0x00000000000000000000000000000000000956616c696572616d000000000000104050726564696363696f6e73436174000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449e3956212fb445c6e184bf933cc4cdd61b28f8609c1de672bcd1177bc284c479d184b1e9578d152": "0x00000000000000000000000000000000000c546865204e6f7468696e6700000000000009406865657a697573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449e898b75f9afd0d882faabfb49658b912fa7020be5bc8eaed5fba952a353359447d4406a1a24260": "0x00000000000000000000000000000000000c4e6f626c65204561676c650c4e6f626c65204561676c6500000000000e406e6f626c655f6561676c6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471449f010e5122c00e6fc71e57767a5284519f6f586a093a59bb6148d5b8a62ed7d65ebdd0e56c96a50": "0x00000000000000000000000000000000000d4775797346726f6d4d6172730d4775797346726f6d4d6172730000194775797366726f6d6d617273737340676d61696c2e636f6d000010406775797366726f6d6d6172737373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a0028d535eaa15c36bfed4710cf084c43f5c119f46111b46d7d3c7ad9fc54745e04283a64cef16a": "0x0000000000000000000000000000000000076461696167690f42617275636820466973686d616e00001164616961676940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a0f7a54a1ff58eebceeeed23997617c15d2ccbf5f14196f88c4765152956458ec73b13716ab6b4c": "0x04010000000200000000000000000000000000000000075a6f6f657973001968747470733a2f2f7777772e676d6f726469652e636f6d2f13407a6f6f6579733a6d61747269782e6f726717706978656c747269706e667440676d61696c2e636f6d00000c40706978656c7472697070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a15805a80c56a9eeee55cfb505663c2f6ca145bfd1942cf28f9c416db4d893b787a96feadee1066": "0x0400000000020000000000000000000000000000000011546967657250726f204361706974616c00001540746967657270726f3a6d61747269782e6f72671a746967657270726f6361706974616c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a1cf1abc24f3e10d215f8486a8ae2ec99783c371eb0a270a5e7a4b6e2eabe42270ad46a90d28523": "0x00000000000000000000000000000000000a536269726f76736b690101010100000b40736269726f76736b69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a2cd9d6d0b8021feaf06fd1666c41a9f0879bbe0928041cc4bc5dfd31f1d36ab4abdb643228584e": "0x040000000002000000000000000000000000000000000c63796265726f6d616e6f760000184063796265726f6d616e6f763a6d61747269782e6f72670000000d4063796265726f6d616e6f76001163796265726f6d616e6f76233739383500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a30177d9940d3d8dec1aa82291268cf854ddc3ed0a0869ed1da026b4e5df758ad4f6a380ecc052b": "0x04000000000200000000000000000000000000000000086753616e373143000000136773616e6a37316340676d61696c2e636f6d000009406753616e373143000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a46ea11348a56200a66532a23c418cca12183fee5f6afece770a0bb8725f459d7d1b1b598f91c49": "0x00000000000000000000000000000000000d44617277696e69612044657600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144a539d4f2d822bce28aff3e47f38d52ef86e186b3d0e5935e813fce1f3ed67c3cd2237171c9f2048": "0x000000000000000000000000000000000009386269746c6966650101011564656461756e756b696e40676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ab3116558524fc28ef755e985c62930b3c452073aef9336f78ba7bd0d48b2a19f3aaf430dd2d573": "0x000000000000000000000000000000000005646f2c6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ab82d82d397c8860874d8217aef5c084de244fbc3778345f11abe840071962ae16bc3709def6f57": "0x00000000000000000000000000000000000973616d65206f6c6401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144abab00f092058545487b54dc747fcbe6747dea2ce277caa6f70b21ec7031c20560b693c4b8f9066": "0x000000000000000000000000000000000009506f6c6b614d6178000000196d6178696d652e6d697261746f6e40676d61696c2e636f6d000011405468654672656e63684d6178696d65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ac339d82839fc62b8076afe0f3dd1a5b76b65ed4b34f0fca26a4bcae1e98ff052836ecdad1cd955": "0x000000000000000000000000000000000006596f7563650000000000000a40796f756365617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ad035c90c4d684092084338b54489d20ae38de6e2e3014504d49e8c69da585a7994f5cf1d3a0e06": "0x04010000000200000000000000000000000000000000175375706572636f6d707574696e672053797374656d731a5375706572636f6d707574696e672053797374656d732041471368747470733a2f2f7777772e7363732e6368000c696e666f407363732e6368000008405343535f4147000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144adf867ad6d86f6e22ecf13716f735f9b2fdfc69032bf3fbc35b9b0f11fdb7e1885ba24da2f96c32": "0x0000000000000000000000000000000000074b696d50726f00000000000009404b696d70723030000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ae112a6269c8ee59e10cc56a3e2852932123da5f88edcc0e81fc797ea65ea4225d0720efa7fb764": "0x00000000000000000000000000000000000d506f6c6b6157617272696f720000000000000e40506f6c6b6157617272696f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144afda37d0066d26344a9b7448162343250ddebb4d5eca9cf18c0fd710c01f65c20ef5a7a2b08c160": "0x00000000000000000000000000000000000a4c7567616e6f646573001668747470733a2f2f6c7567616e6f6465732e636f6d0013696e666f406c7567616e6f6465732e636f6d00000b406c7567616e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b11c09379596e080ac8aad77582e035ce510d01d6bdfa7d8eef2445bcb492123120d3ee940aa16e": "0x04010000000500000000000000000000000000000000094b7573616d61203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b290c17b4e25a4a36e132f4b16bd325ddb6a3c63562f23c18dfd20bb2c785d391f625f481097c1f": "0x040000000002000000000000000000000000000000000a6c6574735f6e6f6465000016406c6574735f6e6f64653a6d61747269782e6f72671a7465616d2e6c65747363727970746f40676d61696c2e636f6d00000b404c6574735f6e6f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b3956c26b2adb6f2c47a26841623e7a55aecd35d0d8972fe0a05b7a9f65ad36e2fe47f465d6ea4e": "0x0000000000000000000000000000000000054b59544500000000000008404b7974655f30000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b3d0a4ac99549aef4e2e84d81b6dc5b195f0e03e36c1810af34eb2c64d2570d0ed343473d846b7a": "0x00000000000000000000000000000000000850616e646173730850616e646173730c70616e646173732e6172740000000010406b7573616d615f70616e64617373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b3db0fa2b7c5e1502a095fe039e07658c9fa559d0919e4f4e288b383882a2262d322a71007f5704": "0x040000000002000000000000000000000000000000000d5669727475616c4261636f6e0000001864656e6e6973407669727475616c6261636f6e2e636f6d00000f407669727475616c6261636f6e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b425fef2474f0f6e08407ceab678c192cb8605649dd4eb488d8f3611ccb496c83ef856b3e1a430c": "0x0000000000000000000000000000000000115468652053696e67756c617220424f54010101010000104054686553696e67756c6172424f54000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b5632672e4e08b2e2fec50feac8a6c83a3e9f869ce04ab800420b2c80c4310f2de2e9f0adfa301d": "0x040400000002000000000000000000000000000000000c50726f666974206c696e6b0000001b67617263696170726f6475636572393140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b5a0926bf96567c4230c50bb60625c3db7e0446f4528301691ccb07fa5572cee0444f86c9d30511": "0x0400000000020000000000000000000000000000000009636c616e67656e6200001240636c616e673a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b610455a917d0af0422941b0c99c8add13283a6b1d5e62e55d9e634ffa427591031f7a4fd8fb16c": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000066b6f6d62690000001463656e776164696b6540676d61696c2e636f6d00000d4069616d5f636f6d62693136000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b7fd70c8f696bc35842bb6c3f854a1bb2243b20069f088f306eb9101ad40f8b120d268578d8f547": "0x00000000000000000000000000000000000944696d73756d31330000000000000b4064696d73756d313331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b9d785f0afee887423e5d0451428d77e1f81f6f20c87427e355468da3ac8eea9eee7f041871a733": "0x040000000002000000000000000000000000000000000c646f746265726b656c65790000000000000d40646f746265726b656c6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b9d8be32324ecea4466b2edfa709b581c84f0b55deabcb93de767955a37c6513d18dbca4d261069": "0x0000000000000000000000000000000000076d6164346f780a4e757273756c74616e00000000000b406d6164346f78617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bb93cb3dc92785e3e6f301b0a1e1a9c7bf69be3b0bd221a150319c3465bb42e2e7820cc0b1a0e4e": "0x000000000000000000000000000000000009534659204c61627309534659204c6162731e68747470733a2f2f7777772e737469636b79666163746f72792e69742f00167366792e7374617274757040676d61696c2e636f6d00000a405346595f4c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bbbcb9ded8c9980f69287204245020e54f703c5f12edc826ceac6c514a4e947ba402d9c32615e37": "0x00000000000000000000000000000000000e54776974636879547769746368105374657068656e204c696e6473657900001373706f646e65737340676d61696c2e636f6d00000c404875654368726f6e6963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bbd9731b8ad75407894adb5327cf29867bc6eb3d212dc96760f511ee3503d3f3ba1fbccb190434e": "0x040100000002000000000000000000000000000000000e4b7573616d612057616c6c65740d57696c6c69616d2054616d7300001774616e752e63727970746f3340676d61696c2e636f6d00000b4074616e755f74616d73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bbfbd1503dacab9f01c087c4a752cbf56ae4672f910acad4b234a830818356b8378afcd8e042360": "0x08010000000202000000010010a5d4e80000000000000000000000000000000000000000000000000000000a534158454d42455247001768747470733a2f2f736178656d626572672e636f6d2f1840735f736178656d626572673a6d61747269782e6f72671468656c6c6f40736178656d626572672e636f6d00000b40736178656d62657267000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bc05de7e42ebb50ceeccdb6802df2253998f9d4f928b120d51110d1d2afd969b95232bc16768702": "0x04000000000200000000000000000000000000000000096b6f6b656e616b69000015406b6f6b656e616b693a6d61747269782e6f72671c6b6f6b6564616d612e736167616e616b694070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bc1483b442cf7e9662fb31b7c1853748f43f46de1b1d0ef23ea62165357c098e72621ac6b54347f": "0x0000000000000000000000000000000000084a617276696578084a6172766965781a7777772e61727473746174696f6e2e636f6d2f617669726d7a0018696e666f2e6a61727669726d7a40676d61696c2e636f6d00000a406a6172766965785f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bc16c907ee6cbf1eef5d9e432937a9eb75c3ff77eed7fcd5f737899ed8f430fc0cf973ec61bf308": "0x0000000000000000000000000000000000044e494e000000166e696e2e6672656e63687940676d61696c2e636f6d00000d406e696e5f6672656e636879000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bc4e6ae3f5f5afdc470d4501fc73c4bdfb5c4a2faf683657785a8714fd9c4b8ebb6ff3835950f4e": "0x00000000000000000000000000000000000557617361055761736100000000000d4043727970746f5f57617361000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bc589ab602f6840aaf5b22b19bd3ea8d77cffcd9cf1d1fe284bab4d8af41577edb4d8266c8add58": "0x000000000000000000000000000000000006504f4e494f0000000000000c40506f6e696f6d6f6e696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144be3d4c5b2fe50ebeac4895a2fbabcb267962c7f717455d5c77cd3104c71b943c04ced35a6cdcb0d": "0x000000000000000000000000000000000010204b4f4441444f545f737572766579001468747470733a2f2f6b6f6461646f742e78797a0000000009404b6f6461446f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c058945adfbac44402589207ea3e9ba42e801aa4c708c414b804a5309216ccd01b5b6717646301a": "0x0401000000020000000000000000000000000000000013444154414d494e452e4641524d204e4f4445001668747470733a2f2f646174616d696e652e6661726d1940646174616d696e656e6f64653a6d61747269782e6f72671876616c696461746f7240646174616d696e652e6661726d00000b4056446174616d696e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c13d695515297086609300c61120adaba3301fe939f37a0c68915b8e998234283f800e7eb16e224": "0x000000000000000000000000000000000017e1b485ca8020e1b484ca80ca8fe1b498e1b49be1b48f001a6c696e6b74722e65652f63727970746f756e706c7567676564000000000c40447243727970746f3437000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c1956d8be560280b4ec21e13380c9be78fd373b4f73bfd4b21d8ae43274220f1de50c8d8eb9b329": "0x0000000000000000000000000000000000064a67756c68075275736c616e0000144a67756c682e656e6740676d61696c2e636f6d000007404a67756c68000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c28b62f4c20a085a223f906156407224304ef1353300b63d3fb6a4f3cffbb117239149c0884917b": "0x04000000000200000000000000000000000000000000114b5553414d4170706c69636174696f6e0000001e636972696269666572612e70696574726f393940676d61696c2e636f6d0000104050696574726f3337343230333730000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c3a92bfc0327de1b8fdf4d6648e1e72dd1ebd3d2acac4c85e1d6b17b3c657153a94db2e0c2aa356": "0x00000000000000000000000000000000001076696b695f7468655f77697a6172640956696b692056616c1c68747470733a2f2f6769746875622e636f6d2f76696b696976616c000000000a4076696b696976616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c4ff33745201ef57c04de8781bd329a979004519d2e6b02ddc140af6a548b3b59008053d5459537": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c530bbe085c5f6b608bbdc4a6f918146da541013750078357a37afc7c397d7a0fd3c4c7e528b23a": "0x0000000000000000000000000000000000125241482d44455349474e2d4e4c204e465408526963686172640000000000104052414844455349474e4e4c4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c5546659ce31189d0075cd9bb3988e0b5e05b124b20127e93531bc80c40ac0e4a1f22006815285d": "0x0000000000000000000000000000000000065375736861011f687474703a2f2f7777772e73757368617368656c656e612e636f2e756b2f010100000b4073757368615f736865000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c6fb887a199d035466f0fac5092dbe66d2402fde1bd7255483f087deabeddbaab26142d5a3db71a": "0x00000000000000000000000000000000001754686520436c616e61727920436f6c6c656374696f6e00000015746865636c616e61727940676d61696c2e636f6d00000c40546865436c616e617279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c89c93c5a9d60f348cb77bc66938feb608aaf2ddc62faa8cfa2b9c7c9576fb5f69ca8913b41f713": "0x040100000002000000000000000000000000000000000641726a616e1141726a616e205a696a64657276656c641a68747470733a2f2f6769746875622e636f6d2f61726a616e7a134061726a616e7a3a6d61747269782e6f72672161726a616e7a696a64657276656c642b6b7573616d6140676d61696c2e636f6d0000114061726a616e7a696a64657276656c64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c8f1e30e595b6bb7c4039fa473c4bbdfb7d175ddbef8407fda3e32ea0df0536c806bd4a64c6f35a": "0x000000000000000000000000000000000006666f6f677900000000000008406d667567616a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144c9165b3ec94f3b1c602f98da395c5bf3804e86851c5bf2a30db39848d62f6c14fea1a300946ca00": "0x0000000000000000000000000000000000096b736d726f636b73010d6b736d726f636b732e636f6d010100000d406b736d726f636b736f6663000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ca13e1b44c9d065a63e6b2499f54c2be949deb97b030010274cef1d88c2af220b1c6013096e4e44": "0x0000000000000000000000000000000000056675636b0000001365706f6361383440686f746d61696c2e6974000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ca2592175bb1cc4a09af83b3d2e115f1aca50377618b28b8891101b1f9d06a36889499676427b27": "0x0000000000000000000000000000000000086b616b61726f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ca775588b3d2ef060b8d7880b3110a1609b771f10f2ecff15a345059368867bdae4c6884c888210": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30310e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ca8b26602d73427e46675e622c45de390f070b175f99ea56d47537b076a3fc9ac0bc07c38e01005": "0x000000000000000000000000000000000006464f58585800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144cce5213f083cefe724cf673d804e34e23743be0969e9606c64b7ccf64a82b498c77a3195ad6214c": "0x000000000000000000000000000000000011416e61656c6c65207c2050617269747900001340616e61656c6c653a7061726974792e696f00000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144cd9322609738faf34a6cda09ad0388dd406269c050889d0fe64d996c3ff3571e26802ecdefedc51": "0x000000000000000000000000000000000006546961676f00000018636f6e7461746f646c746e657440676d61696c2e636f6d00000c40646c7461636164656d79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d0e40b01504aed30c0a7bb6b17a969c1c076cb422eb08c0185f932f494086f4d37abedd18af487e": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32360f42696e616e63655f6b736d5f3236000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d1691d80588b205382d4a2c2b6eee702dc19705f86d9113e79b860306c1b672db9adb4da9d5631a": "0x000000000000000000000000000000000017524d524b20527074696c69616e732043726561746f7217524d524b20527074696c69616e732043726561746f7200001d74686572657074696c69616e732e726d726b40676d61696c2e636f6d00001040524d524b72657074696c69616e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d35c327c115f99b08745476e8a2fb16504c77a75b2dd20b6f56cfb71c87125f1707a702753af24e": "0x00000000000000000000000000000000000642726561640e4272657474204b6f6c6f646e792168747470733a2f2f6769746875622e636f6d2f62726574746b6f6c6f646e792f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d3e0d4f24d59fa98ce6c79ffe1d5f06f89eb2ec7653c8c9c33cc32506aaa8ba0d4e0b63b43a5d67": "0x00000000000000000000000000000000000c6261696c65796e6f6c6665124a6f686e204261696c6579204e6f6c66650f6e6f6c66656d656469612e636f6d0101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d4b24b1bbf7bc3bd0b1cf79e7be19b7cf96bd4e625f4d5002278802fc0542a42535770798869b2f": "0x0400000000020000000000000000000000000000000014506f2d4b752050656f706c6520e29da4efb88f00001640706f6b755f6e6f64653a6d61747269782e6f72670000000c40506f4b7550656f706c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d585451a689512eae088990b08a6e0e8c06a9234cc06125677742fb1307bf70a2775ed19427dc09": "0x00000000000000000000000000000000000c65746e612d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d6200fed0714c63987ebea45bea8a2676cd896c6e01460290bdd56a6dcb27e9648fb33ac2b7fe66": "0x0000000000000000000000000000000000084e65656b43757801010101000009404375784e65656b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d699313bc760a036a81f13352076dce1dfe8f357fd805bbece6ec16efabad52a2c24e6824e16315": "0x0400000000020000000000000000000000000000000008494e4748415a4900001440696e6768617a693a6d61747269782e6f7267147374616b696e6740696e6768617a692e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d9a1147d1ed82c8b00eba4acb0f53ac420d73857bfba1ac2df6e3a4fd8001fd4bc1691e9a8da44e": "0x0000000000000000000000000000000000076e667465657a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d9dcf234fbee40ff6f2366ea3f3a900ae6b42a85e4860ca95bd5f42ae8e42b9ca30bfd975f7006d": "0x0000000000000000000000000000000000064d617474610f4365736172204d617274696e657a00000000000e4043657361724d747a4d617461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144d9e54521ff7e843ce3f66e4350864006ec5174657fea7729c83aa847e1949ca8256686e07c98123": "0x00000000000000000000000000000000000d4961726f7661796120415254094b61746572696e61207777772e696e7374616772616d2e636f6d2f6961726f766179615f6b617465001963727970746f6b6174653139383840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144da1eb2472c6e636a0802cb1cc2721239d717a1b2aaf59febe8995bb5c374272b7f7d346e8b7b923": "0x040000000002000000000000000000000000000000000e4c61626164616261646170746100001b406c6162615f6461626164617074613a6d61747269782e6f7267186c61626164616261646170746140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144db2a789d942dda53e3c2bc736c233d8d77544e74987ceb03bcac1ba7904b1a98f377883d4b1733f": "0x00000000000000000000000000000000000e4d616e7461204e6574776f726b0e4d616e7461204e6574776f726b127777772e6d616e74612e6e6574776f726b010100000e406d616e74616e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144db321631814cd32ace82546c558ba2ec9e42f805a65c2f16f011216b01b0bbcb32d6b68ffdf8c6b": "0x0000000000000000000000000000000000065269676f300101010100000c40416c65785269676f3930000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144db4fe1336b5ba5a06dc4e63396771cc7d4e36c3fc749db4b0f367c9c9edfd37badf8aa31efea960": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31300f42494e414e43455f4b534d5f3130000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144db8c074b305156e12fbc6f6f8379674458d237fa3a42ad300923a6721841c373dc2a168c83e0479": "0x00000000000000000000000000000000001bf09faaac2054616c69736d616e20476f762044656c6567617465001568747470733a2f2f74616c69736d616e2e78797a000000000f40776561726574616c69736d616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144dc9b342edef30bb0404127e6dee3322530e94ae97f3c9d21f0549b5140d9d004cadf94a66a2b730": "0x00000000000000000000000000000000000d524d524b53746f69634465760753746576656e1b68747470733a2f2f736e616b65736f6c64696572732e636f6d2f000000000b4073746f696364657630000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144dcd3691e5f659d55e0e72cb881993bf61241e60224f1e6bf2b9acf201c84cc5c6cd05fa6e0c591a": "0x000000000000000000000000000000000009616264756c6c616800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144de1efce0c5d7d9ff807dd354eec53082fa68580d6240ca57bb0f02afd6697c6f35b3fc11f0da402": "0x00000000000000000000000000000000000e50756e6b205661756c7420233700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144e066e19d4ddf8f19eba94f67453eeded0e6c8ce2932269f57b7227f6873b782a3a0aa0cad95b40f": "0x040000000002000000000000000000000000000000000e4e65756b696e6420546f6b796f0000001168656c6c6f406e65756b696e642e6a7000000c406e65756b696e64696e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144e0979985c355367e080d3f0de7be8f9edc6d90d8bc337aac66844025f3e9da7129356eda0f04256": "0x0000000000000000000000000000000000114e6163696f6e43727970746f2045787407416c657820470000174e6163696f6e63727970746f40676d61696c2e636f6d00000f406e6163696f6e5f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144e0e08d8f728b4dd32068fb3b800c5df40df16619761b3418e40d9455784b6a293d2425e35ef2c27": "0x04000000000200000000000000000000000000000000054c554341000000176d6172726f6c754070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144e3ffaf4570f18710a3289a760e8155e8894b96d8a319d43588281ef4f69c1bd0a0daaeb845d980c": "0x0000000000000000000000000000000000027600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144e6523a4af508944f2311ebbe228b955638ea3a3d58a8c73ffe0b98b2ea8214617c397bc98f3dd37": "0x00000000000000000000000000000000000753656557687900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ea5d0f641dc611c309d30ed1f41373d0abb1b8dfec4055e93312d73e9e7279f776e662fe306a00c": "0x000000000000000000000000000000000010546f6d61737a205761737a637a796b10546f6d61737a205761737a637a796b1568747470733a2f2f7761737a637a796b2e636f6d1b40746f6d61737a7761737a637a796b3a6d61747269782e6f726714746f6d61737a407761737a637a796b2e636f6d00001040746f6d61737a7761737a637a796b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ea6923b31b03243e0b9bdcc45111c7c23b354318607f4cbda8e7f017d500aa15402b1a16a36497a": "0x00000000000000000000000000000000000e524d524b206f6666696369616c0009726d726b2e6170700011636f6e7461637440726d726b2e61707000000940526d726b417070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144eb1abadf357251052c4cde966f7c4088d60cbf459a665660d36ae1f664cf65a86ced132b645c833": "0x00000000000000000000000000000000001353697874792d466f75722053717561726564001e68747470733a2f2f6d656469756d2e636f6d2f403634737175617265640015737175617265646e667440676d61696c2e636f6d00000c4036345f53717561726564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ebc48c63a5dc09fa4ac69b3ea42acebe4f70767ee894eeef5eef1f011f0dca45097a2e6c40c5366": "0x04000000000200000000000000000000000000000000036635000017406b7573616d61323233333a6d61747269782e6f72671e6b7573616d616b6f736d6f73696c613232333340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ec6dcb09516ac9cae463a6613cae63a77d1c391bb1e00a974ccd178ebd91e00268608f3a570f84f": "0x040100000002000000000000000000000000000000000d5061736861426f7563686572000000177061736861626f756368657240676d61696c2e636f6d00000e405061736861426f7563686572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ed0bc7ef1112e6f2ee6766c1a3679e5638966ec23c25dc094b99c082151f913704f439cb1e07636": "0x0000000000000000000000000000000000084b7573616d616e0442656e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ed12f7f95496d053674aa73951219dbd27b3e3fc5847b806c68c1de38fd4f22f9493a461c80e903": "0x040000000002000000000000000000000000000000000b472d646f742e74656368001368747470733a2f2f672d646f742e746563681740672d646f742e746563683a6d61747269782e6f72671467646f742d746563684070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ef34c27d4dfe709f615fbe2b5b19fd70abc2d71709e5a8efda335fc4ec06d25ac1105d7eaa92663": "0x00000000000000000000000000000000000b466f726572756e6e657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144ef6058a4c93b2fc18e2ab095c1838261df21f7474602c520288bbb6b328728417d5b6189591a054": "0x0000000000000000000000000000000000094a6f686e566173650d4a6f686e6e7920566173656c0015406a6f686e766173653a6d61747269782e6f726716656e61656e6169736f6e3240676d61696c2e636f6d00000b406a6f686e5f76617365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f0201a59b9849e4541e0539e47fdc4222ab09d8b19ae6ae612de8088ce5e73afd2e1b926ada255b": "0x00000000000000000000000000000000000b446f7473616d616b696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f08661e9ff1a0dca2faef0d22feb488024378daeefdc612f34713c17425c5fb5c1ee5ecca7f3908": "0x0401000000020000000000000000000000000000000009417272697665657200000013617269657665657240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f0effdbba5ecc713aecc4a1d9f8b782b08d7468da4753da690d55c26f9bd1fd1ca09dbc60bd4a1e": "0x00000000000000000000000000000000000b54686555464f437265770953414e544941474f00001654686555464f437265773140676d61696c2e636f6d00000c4054686555464f43726577000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f105dc4d6865f85da54f55778dd9d3ccc434d0000bc254788d7e0a9c766b8f6dde51e335a28305c": "0x0000000000000000000000000000000000084d69726167657a114a616b726170616e204d6565636861690000124a616b6170616e40676d61696c2e636f6d00000a406a616b726170616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f133aa79b057d66fef5977196fe3fe5c456a767e6b06013ca62762b282de97040add4ad2c53db61": "0x040000000002000000000000000000000000000000001350726f5374616b6572732e636f6df09f928e001768747470733a2f2f70726f7374616b6572732e636f6d1b4070726f7374616b6572732e636f6d3a6d61747269782e6f726718706f6c6b61646f744070726f7374616b6572732e636f6d00000f4050726f5374616b657273436f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f1e36622dd2acb4fcc2b373ac96c11d293ab0565d243750874cd8d060b66d1d908761ac1d616d79": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f2ae4ec939743a590bdd91c993e87db3f250c0d9276d9b122e8cd571cfc0d5d6c54066f2a225a32": "0x000000000000000000000000000000000008427269636b737a00001440627269636b737a3a6d61747269782e6f7267176461627269636b737a37303040676d61696c2e636f6d00000b406461627269636b737a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f2c0ec81395af615055fbad57aeb372174b99b9dc3723e1bd0f28febc74008251d7102e5ba631eb": "0x00000000000000000000000000000000000a4d6f6f6e7374616b6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f3ddf57e13a6e9f5cd992745ac97a51f7535709b288163895baa3b70f2620c3141f9a16b8ec8714": "0x0000000000000000000000000000000000134c69666542616e206f6e20547769747465720d426f6220446f62616c696e6101011c43727970746f57616c6c65744e616d657340676d61696c2e636f6d00000e4062756b7368756b616c616b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f3e6ee6ff9d1b948244b130639897c7f76d7838eb1c530786b0c1e15e65f0c09c0a6a3ec35f9d68": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000a79656c6c6f776265650000194079656c6c6f776265653236373a6d61747269782e6f72671779656c6c6f7762656532363740676d61696c2e636f6d000010407962656539313238303835353036000f79656c6c6f77626565233733303700", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f487a423739a66d8e27005a0b559b40d16613abc2804aef92cd137692b2eb228820e20aabdda27d": "0x000000000000000000000000000000000007704d725f4e4c0000000000000840704d725f4e4c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f4f5169450cef7530b0e3fc5407fa802e7988b2d86f8eb9d13784e230668e74cd90eab4d48d145b": "0x00000000000000000000000000000000000f4275726e6572204163636f756e7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f5fac645183a09c2ab937c4061cfa1059fbab2252518119f1f4f18a1f0155ee42732ae263c4510a": "0x0401000000020000000000000000000000000000000012454c454d454e54204352454154555245531042656e6a616d696e204e6971756574000021456c656d656e745f4372656174757265734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f96a77cdf9bb4b12ee187e3230395e417650558d1362b6dc594a481134ff29b3d63db53b8597d09": "0x00000000000000000000000000000000000b414c4c434841494e4d4a154d61726369616c2053204465204c656f6e204a7200001a6d61726369616c64656c656f6e333040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f99ab6629a5af0254007a3d6d00fa2d2c2e8f8b24c88def5120d3b168e003b7d15a405a5c105d67": "0x040100000002000000000000000000000000000000000c4d696368616c4a657373650d4d696368616c2056616c636f0000176d696368616c2e76616c636f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f9f5cdc4b4279e04ad1d3ce2898b3b78ac9df34af660eefd167222e9efdb07467a0c82160903f7a": "0x000000000000000000000000000000000009526f6d616c6f727414526f6d616e204c6f72746b6970616e69647a65000017726f6d676c6164696f6c797340676d61696c2e636f6d00000a40726f6d616c6f7274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144fb1c11ebf76bf856c70f422fbca28c1e03e79bc42594c5bd8588a7c23454842f169b1b8c57db47e": "0x0000000000000000000000000000000000096f6e616e61736f7500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144fbb681dafad845da0f491d92cddc77c2487a3fba73ac3008e418a146631a742407b1af5e107c568": "0x00000000000000000000000000000000000b4d616e7361204d7573610000000000000c4069736861726c65653932000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144fc324df3bb6d99258bb56063a47ee6e4a4d0bfe444682394a1e4657fa39f4622f2a0285689c1b3c": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144fd5ef0c5bb8d4b6aef764dd5f7e23556b143bc80e0ae0b4835b469dbad3b0dbea4b8275e91e5256": "0x000000000000000000000000000000000006566172757301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144fd7f55b4df090d0ca1b43ab297c7745ad2f6b3b5b201df66cf98723c3029230ffe61057084a8425": "0x0000000000000000000000000000000000094b6f6d61696e7558000000166b6f6d61696e75786e667440676d61696c2e636f6d00000b40785f6b6f6d61696e75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450004b04910a1297929aa2bfe7b52500b288c943b7c24a90928cd8a6f7ec8eec44763d9f74198401": "0x040000000002000000000000000000000000000000000f43727970746f2d6275696c64657200001b40616e746f6e696f2e63727970746f3a6d61747269782e6f72671b616e746f6e696f6b61726170757a7a6940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450045aaecb66d5cace6fb186ae3769b7bbee62c3ea178cf730754413b26bfe540eda5ccce590d444": "0x0000000000000000000000000000000000096b75727572614c5000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450079469344a3846844f55022b2b8667129c167068a9c2a6bc292f2d312336bd98339d686b575a1b": "0x040000000002000000000000000000000000000000000b416c6c34486f646c657200001740616c6c34686f646c65723a6d61747269782e6f726717636f6e7461637440616c6c34686f646c65722e636f6d00001040616c6c34686f646c65725f636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714501e18a682931984145bf48774f53c991d99038301e44c30a2de38d805016bc6ea1a95d74b2a7f4e": "0x00000000000000000000000000000000000d73696c6c79736865726d616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714501f97beba27688eba2c0d2631820207e6461b85177854a6cb019fd8b7f689c9a255457b346ead78": "0x000000000000000000000000000000000006437261696700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450233fe85fbce46c6ee137ac7e0f2103c00e787b5ba39ea7ce81c245e4ac64718041272d8218c748": "0x000000000000000000000000000000000009437269737469616e17437269737469616e2d417572656c2047616e657363750c69616e637532312e636f6d01196372697374692e67616e6573637540676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450417bc6d24f055d92200a0fa4244b13cf0277ce222a51979033d35e0cef4c692b27b4871d748b06": "0x0000000000000000000000000000000000114a6f686e314d6163206f66506865656200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145045ef62591a03255a26d9a7c3642c9bac25a08bf77ddf394916fa48fd714e61e8b5088fe8f58872": "0x0000000000000000000000000000000000074b3273616d61084b3273616d616e0000146b3273616d616e696140676d61696c2e636f6d000009404b3273616d616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450494b773f99187c086b3cff28537011ee3cdb33556a85d93cb1d836c7bb2c8e9a000a339d887136": "0x0000000000000000000000000000000000154d722e20426c61636b2057686974652047726579064d72425747000016726176656e32303139303940676d61696c2e636f6d00000d40726176656e323031393039000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450541acb5b3adfcb783677be3528d7c562df11a31317f6138279cd39ef96abba3dd1f38e9896a37f": "0x0000000000000000000000000000000000127733662d7374616b696e672d6d696e657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714505689aea117f4b4d03671180d2ac566d1ed507709b08be083bdb86d29d36a654f899c8c9e624874": "0x0000000000000000000000000000000000044f746407416e647265791a7777772e696e7374616772616d2e636f6d2f6f74642e696c6c00126f74646e6e6f7640676d61696c2e636f6d000008404f7464496c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714505fb34a37127f8a58e8959d0add94c9171e095082f1a476fe16fff8fd01a0e51401135f4801d844": "0x0000000000000000000000000000000000046d726200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714505ff16b5338dbbc26b65a62591e46572822dd9b2e5866b150fc2a10196ccc8ff71303d3e2713e69": "0x00000000000000000000000000000000000a4d61726b20524d524b00000000000011406d61726b5f656d6265725f7279616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145082507ad8dcff7f3cfd8876d11ad724df41e20f43f3bdedabc6d83620a029b9d7c28f54ebc47501": "0x00000000000000000000000000000000000358430f5869756361695f66696e616e63650000127975727569717540676d61696c2e636f6d00000d407368756169676579757973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450841acc86ed6f0be071272e72b49c948d9b4013d7563b649cb1730b0a52de303155dcb44c9e497d": "0x00000000000000000000000000000000000a4d6f6f6e62756d3364024a00000000000b404d6f6f6e62756d3364000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714508509c16c555d079458bb073e69511e772b1608cff07add7f5240cb1c89cabde012d5b29504e72b": "0x00000000000000000000000000000000000a7874755f63757272790c43727970746f52616269741568747470733a2f2f383735372e6574682e78797a001a636f6e666964656e63652e6d6f766540676d61696c2e636f6d00000b406a6961736875323131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450c343c18df87d20fe565d8fcf8fdb44c9a61cc16a70649519a2acda598ee64d5b664e09a76d1c1d": "0x00000000000000000000000000000000000a646f6f6d73617965720000000000000d40646f6f6d73617965725f31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450c3b90207ca02d3d2dc9a9f85e3c523f1da8ee7e3e116f520ed49a53a48aea229147880736b906f": "0x0000000000000000000000000000000000000000000000000e4063727970745f6d6164646f67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450e0223a7f06f4edee2804a63951212e1342a2c01ea12f20153f27b6a5a649ef2e6c7b20d7859f68": "0x00000000000000000000000000000000000a696b68616c656432380000000000000b40696b68616c65643238000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471450fc5019aa653ecf50c91b0b82bff9b1b93145633214a08d5fd25d12e6c78a3b369cd7e539b92e26": "0x040000000002000000000000000000000000000000000853616368696b6f0000144073616368696b303a6d61747269782e6f72671c73616368696b6f2e76616c696461746f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714510331c48413f98ff85f04ed2bce67d0b51550754bdd4da9f8800f83ad39390c5925429f3cc47d47": "0x00000000000000000000000000000000000a5472756f6e674b6169064865726f330101010000114050686d566e54723038323236353134000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714511c6af03bd0bb3e6abb62dcdf9839bcee6a1686d8bba50e66959c2b5f23bcbb353eaa2522e62520": "0x000000000000000000000000000000000016496e697469616c576f726c6443726561746f72303116496e697469616c576f726c6443726561746f723031000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145126d11d32941450dc41188d0dcd6722402508e1eb7601ac5d225c923114ff63aa085f20756fc371": "0x0800000000020100000002000000000000000000000000000000000f564c41445950524f4d4f5445414d00001740766c6164796c696d65733a6d61747269782e6f726715766c6164796c696d657340676d61696c2e636f6d00000c40766c6164796c696d6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714514824a3c36d4d80d22cf3de263e508136506b6e9b7b06bb8c7abb53a5a55f7772229273fe43a41f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145151486ca217f604d23f678af47c89d76031edc91e43784bcf9991b131f957d312fced2c5187fb47": "0x0800000000020100000002000000000000000000000000000000000b5354414b4543524146540b5354414b4543524146541768747470733a2f2f7374616b6563726166742e636f6d15406e3174726f67336e3a6d61747269782e6f726717737570706f7274407374616b6563726166742e636f6d00000c407374616b656372616674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714515c9ae1e485544e02b666dc3f8a627302f02c719cd1179cf2b762bfd23d97c79fcfa515283bc23e": "0x00000000000000000000000000000000000844205765657a7906446572656b000018646572656b6e65616c7765737440676d61696c2e636f6d00000a40645f7765657a7935000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714519b117a3f97578bf416788bc4684010deb2f452fad6136990e23fab94d7a6ea03a212d22dad1461": "0x00000000000000000000000000000000000e444f5453414d4120444547454e0253000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451af1b7470f237d6dcb36abb644c739ee8ccf5b2ed810bf1bdc860a8082b43885c3c04db9befc011": "0x000000000000000000000000000000000010416e656b646f74652053747564696f00167777772e616e656b646f746573747564696f2e646b001a6e69636f6c616940616e656b646f746573747564696f2e646b00001040616e656b646f746573747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451affb7adda940b6380329063444b0d709fe60a6bd0ee966c85ee1da8d62faf0bf33c58d8a15f93a": "0x000000000000000000000000000000000005546f6e690000001d746f6e692e696e66616e746563617361646f40676d61696c2e636f6d00000e40546f6e695f426974636f696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451b32c5fc205cb3dc8d71df73e465b4a8872ab23bd7a7a6556ac05f3146f5b08f77e0b6ea437d051": "0x00000000000000000000000000000000000962656e6a617348750101010100000a4062656e6a61734875000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451bca9b0989e2a50c096244f429cc3c9a56de9dfd07cb0dca6c15a42e701acac26d1ea108d8cb91e": "0x000000000000000000000000000000000009737578696e78697500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451c349b821056bc4dcf8dc909c5afd9755dd3c322b6f06b32dcfcc36755bb73e7ee5ae0722f4477e": "0x00000000000000000000000000000000001c54686520706c6179206f66206c6967687420616e6420636f6c6f721c54686520706c6179206f66206c6967687420616e6420636f6c6f7200000000000e403139353931566974616c6969000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451db8a617be61c665e0a4ca74bbb4da39c79954e7875519fa67049795c02a360412f3ee41a020506": "0x0400000000020000000000000000000000000000000006416c6e74630000001d63687269737469616e6f7272656c6c38373840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451eafd8385d1936b5812d714528fe379fe7ddc1381d3608149064486d4b95266072df8dba9539a22": "0x00000000000000000000000000000000001073735f70726f64756363696f6e657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451ed17e92838fdaefe73b0dae6be10617b258eb5f9a3a6a8eb62ac48d8815c159149a267d616cf27": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471451fe2259dc584cad041148d9102c91506d9e3e75297536084c9e3c3259ff78e4651ef4c464a04377": "0x04000000000200000000000000000000000000000000064e6f646c650000000000000e404e6f646c654e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452003ea86a3405e150a9915a75f39429595debcf987a1ce8aa34937de24d2356f31fab6192acd032": "0x0000000000000000000000000000000000053147616200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714520f291562f43512506732d16ab06c1d33cae04a14f0aa43c2de8a3971d419c6db3fa03a6a047131": "0x00000000000000000000000000000000000962616c73616d69630000000000000c40307842616c73616d6963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452212743bf9486034a6b7fe6b1506b1a58b5e6e4b5635fdb17797ce19fc34786e3c1520c21bc024e": "0x040000000002000000000000000000000000000000000e446f6e6174656c6c6f204b534d00000017646f6e6174656c6c6f6c707a40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714524d4c9a4edf7068ae7469e454ccb99c9086f96135f5aa2b32b44652c9d739a2e4f80aadef463600": "0x00000000000000000000000000000000000b487970657263756265200dc3967a676520546f70c3a775177777772e68797065726375626573706163652e6f7267002068797065726375626570726f6a656374737061636540676d61696c2e636f6d00000d407a67653432323232393433000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714526acd0240c524a4b01af838437b50496eed9bc64de023cfbb1afdd633b0999537bdf0e5030f6e6c": "0x00000000000000000000000000000000000f504f432044454c45474154494f4e001e68747470733a2f2f7777772e70726f6f666f666368616f732e6170702f0021676f7665726e616e6365696e63656e746976697a657240676d61696c2e636f6d00000f40476f76506172745265774b534d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714527b633bf5bcbf6fc8d5ea648c1881e3cc19179ce0aca0b0b13f9f8bbda137472a91864b93514667": "0x00000000000000000000000000000000000f4d757368726f6f6d20546f706961001a747769747465722e636f6d2f6d757368726f6f6d746f706961000000000f406d757368726f6f6d746f706961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452864ab8b7555a13f24cb6d3f22ce3f4f7a7d553f2d53defdc6cfb346115bc7c81fb34b2579a0c58": "0x000000000000000000000000000000000005686b6465000000136b756e693633323240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145296f5f3e605a0e3e8b2603f6baee5bc32a9b9e4eee9168499fa553d35edb56aef0035ff7e1f165e": "0x040000000003000000000000000000000000000000000850617261646f78001568747470733a2f2f506172614e6f6465732e696f164070617261646f7878783a6d61747269782e6f72671470617261646f78787840676d61696c2e636f6d00000b40506172614e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714529f9f0efcc4d1fef4a187600e4026679cd65074ea9a9bdf2e807d7df8160b1ffbbc8032c97b1c03": "0x040100000002000000000000000000000000000000000970756e6b726f636b0018687474703a2f2f696e666f2e70756e6b726f636b2e6d65154070756e6b726f636b3a6d61747269782e6f726715706f6c6b61646f744070756e6b726f636b2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452a0abbda8b43f37b8e21e9844672e363cb73cb15c0b5e8bab835962d2f60baeaa6035ed31245f48": "0x0000000000000000000000000000000000144b534d204d41494e20434f4e54524f4c4c455200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452ac2d872feb1e6aae19bf487c9effca2fe23d3601d330da0a0b82462f340b84ef49676810e58c44": "0x00000000000000000000000000000000001256616c656e74696e73204976616e6f767300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452c8ca65b329df6b02f87ce6d066323c92f56d284faaa856ce083f9ba81635464f04fabec453c822": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000001fe298af4368616f7344414fe298af204e6f6d696e6174696f6e20506f6f6c094368616f7344414f00000000000a404368616f7344414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452ef0ce1f0943599a092ee7d51b6ba1268db2c00f3037cd198fd31f14343bcdc966cb23d7ad90816": "0x040100000002000000000000000000000000000000000c3238446179734f66446f74001c68747470733a2f2f7777772e3238646179736f66646f742e636f6d001a6368616c6c656e6765403238646179736f66646f742e636f6d00000d403238646179736f66646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452f06c1cd27b99a6fe276fe53bf4d1a7589d977a91c8cc990d58ec79654f9560bdcf4e06ea7c2b39": "0x000000000000000000000000000000000006642e67656e0c64617665646f7473616d6100144064676e726174643a6d61747269782e6f7267000000094064676e72617464000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471452f7789aca5beb4f4eaba2222455fc5cddf28b131f3f6317f2c22de7976eecf12ad8d3865d453418": "0x04000000000200000000000000000000000000000000074e585858494f00000000000008404e585858494f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145311d7c5ed4d76a10e82ed0d7d2e0f86a12c9f4276c1da60ac75cbba94789514736664d15514fd5b": "0x00000000000000000000000000000000000f42616462756e6e696573204e4654000000186e667462616462756e6e69657340676d61696c2e636f6d00000a404169746f725f6c7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145322d4c9d96b74a14a07b12f3c8a1cbf139a46d05f52acae666ffe15f97e2e19d6def5831d101166": "0x0000000000000000000000000000000000093342616b5f6172740e4572696320547265736261636b1a7777772e6c796e6b666972652e636f6d2f3362616b5f61727400133362616b2e61727440676d61696c2e636f6d00000a403362616b5f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145326dd1bd53284ff3c2dd5a18ca096521bdf0adfd35e358ba6b89ce8931c87144f80998c5f6a0a48": "0x040000000002000000000000000000000000000000000a43414e445953484f5000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453274014bd0b9f664274f5c7b6be61ea3dcce96b80af40f4ff7b53e46c598986411fdfae942a7955": "0x00000000000000000000000000000000000d4372656174697665204c616208526f626572742000000000000e40437265617469763936393634000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714533d19de9dfcc61206d1b911e582c3c8c372135076ef9570fa2a48ef4ce5a71d53d9e1dbc9e70e2d": "0x000000000000000000000000000000000009736d6f6c6265616e000d6d6f6f6e6265616e732e696f0013736d6f6c73406d6f6f6e6265616e732e696f00000c40736d6f6d656c65747465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714533d284f329fd8fc9e13e5a0517ed028b4f44c593efb7caa0f82ddb90e95b8cc1c68122d0b03c319": "0x00000000000000000000000000000000000a417274206f6620424d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714535df4fc4871fff79c0495d70ded39e5fe05f1d41b05db162a52cbfd4441ebf81a50132070ad1d09": "0x000000000000000000000000000000000000002168747470733a2f2f706f6c6b6176657273652e636f6d2f6163636f756e74732f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145361b1ae059eb11e0650a2e41ea97b60bbd3f87aa30d605562069075deaaf79559959230928a2487": "0x04000000000200000000000000000000000000000000124d722048617276657920537461636b657200001a40686172766579737461636b65723a6d61747269782e6f726718737461636b657268617276657940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453798c7023fb40ea3629a3ff4589c42f2239861dc182184b176845a6bc350b9d72aa592a8d113e25": "0x00000000000000000000000000000000000b524d524b2050756e6b73001768747470733a2f2f63616e6172796e6573742e696f2f001652656d61726b50756e6b7340676d61696c2e636f6d00000d4052656d61726b50756e6b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453860ac0c7c038f0f84edf06c02ea2f2216867fbd39f86329f2558741c17f78643d052bb8eb83008": "0x00000000000000000000000000000000000a4b757361746f706961000000146b757361746f70696140676d61696c2e636f6d00000b404b757361746f706961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714538812c43fb3e37faa55a7d8768b4fac73f8c942e3639d378464730219023c5df0d4b2634b7db07c": "0x00000000000000000000000000000000000b56672042756c6c69736801010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453b266b24dcdb964c81deb9f19b615125e4e4f316d5ffdcf2e24eb250126a1a4e60b3ac1eb0a2f6f": "0x040100000002000000000000000000000000000000000e57454233445241474f4e434f4d001768747470733a2f2f77656233647261676f6e2e636f6d001561646d696e4077656233647261676f6e2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453c8b0719674d5ad2ac4ff01309437984822f0b78beb305aa015cb11b01b993468b64a744216cc1c": "0x00000000000000000000000000000000000553756d6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453db9f22b39bbf09f8d7db5169156459bbdee84a522da4bc2110027b602154ca5b363abfff5e527e": "0x00000000000000000000000000000000000f4b7573616d612047686f6f73747a0000000000000f404b7573616d6147686f6f73747a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453e4f85431a5b93d464a24ea583d3b746841db2aa9af933ff6c1239ed2fc83d1aa424bcfbbd66b1e": "0x0000000000000000000000000000000000095342486f646c65720553616964000019736169645f626f737331303040686f746d61696c2e636f6d00000a405362686f646c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453efe4a2559eb48e920b814b0381e982418dcc9a71ff4248b63308d015b77acb31977ee72543de0e": "0x000000000000000000000000000000000009426f6b726f6e697300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453f12a00f2f2c920388038a2455e863b7a51a8c6c2015c3c1001583db6c1068f0362eb73c6f9f804": "0x040000000002000000000000000000000000000000000f4b5553414d412047656e657269630000184073656e7469656e747275653a6d61747269782e6f7267116a6f7365407261626173736f2e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453fdbf79c2885f07749f37b4b1d74040e735d5d6d683415de3c084e069409d863a7ff876c307a031": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145400dfd4fa6501fb4ee051c50b5c51b147d939e25ce61aa7e05af10ced2ed62ce7051509009ddf54": "0x00000000000000000000000000000000000d506f70707970697820417274001668747470733a2f2f706f7070797069782e6172742f0015636f6e7461637440706f7070797069782e61727400000b40706f70707970697831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471454265aa0109191e386863b1e54bacf60ffc0a50e063b1bea72f2b1b1e9334173777e045f4c2ad618": "0x00000000000000000000000000000000000d4d61726174646a616c696c69064d617261740000176d61726174646a616c696c694079616e6465782e727500000e406d61726174646a616c696c69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714542d07047e260805305a014d7c8a0804316d2b4eb9e2e3cd6c1a021d60f1c6402c3c3103f2abf20a": "0x00000000000000000000000000000000000c5452554d5059204e46545300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145439cf6aa71671f74608fc7527698d3f4d4cfcc6074f01c2ed59112ad670dd5206b3658bbb62a073": "0x040000000002000000000000000000000000000000000b6f70656e6269746c6162000018406f70656e6269746c61625f3a6d61747269782e6f72671c6461766964652e6f70656e6269746c616240676d61696c2e636f6d00000c404f70656e4269744c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145460e0b925bf21dedef46db9b4a4808a39f261919782eb5530a835a5454e31ad95e1ead1bb67076d": "0x00000000000000000000000000000000000542544e5101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145486e9127d5c6ea83e6cdd1a5f9be051d4f9bde07d864b9a2d963d3ea06efd1ea6ce3ec73280f34d": "0x0401000000020000000000000000000000000000000008556e69636f726e0000000000000d407472696e69747931363132000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714549a808861f1a51754a244c98779e1b91c46999aa8713fc01b8fc589002d302fe54e264247228705": "0x0000000000000000000000000000000000075368657272790e536865727279204e677579656e010101000011405368657272794e3039353033353131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471454a75c3f1924b5a8f4eba0e62e3993df8992425026148f7f818a9140343439eda6de9b85cf80d74c": "0x00000000000000000000000000000000000946656c6972616d69000d66656c6972616d692e636f6d000000000a4046656c6972616d69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471454bcedbc59ca5b64fa3c3e2de0340ce354980a87c50a75447114c521bbf11d3366528e0e5507bc36": "0x0000000000000000000000000000000000074bc3b2c3b36200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471454d7e633409fc98ca61cffec64bd3d89d7195fd423998178d8a4e6a0593ea5ced602f43d2e5ca346": "0x000000000000000000000000000000000009437361696e74303200000014637361696e746e303240676d61696c2e636f6d00000a40637361696e743032000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471454e846fe38b60f59dccf45d8f5333a3cda7b160d6f930e1e3a97a84b752365745bb0f133af36027b": "0x000000000000000000000000000000000008574368656573650000000000000f40576973636f6e736f6e62726564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471454ec0e7f694e04f5fcf0c2ab943cebb940962bfb3cf3c29b9f3031ffe3257dfb57c87865e1c3817d": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714550a7f6530adfd1672f1cd51a567fdf672b0f622cac26b6b4b2b777f062d72b1278cd30f1f909a0b": "0x0401000000060000000000000000000000000000000014636f6c6c65637469766576616c7565732e696f001b687474703a2f2f636f6c6c65637469766576616c7565732e696f0019696e666f40636f6c6c65637469766576616c7565732e696f00001140436f6c6c65637469766556414c696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714550eb3eebb9a802e905a70f40069da23d88524866c0386eac29894ed423cf9f5c2715a375694c82c": "0x00000000000000000000000000000000000442424600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714554194451846f3f4140ba7452170aa67c1de4d8315d861cedbbd398ed74664d3c78397b0e10dea23": "0x000000000000000000000000000000000018546865204b696c7465642041706520416c6c69616e63650000000000000b404b696c746564417065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145548f72303df99a6dc926438eb65dfa069c73774ffafcba13d1519c0132d14a8537323feb356467e": "0x040000000002000000000000000000000000000000000d4e6963636f6c6f2047616c740000000000000d404e6963636f6c6f47616c74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714554d8e14cb2e6c614c909beaee469132767ebae5cc49961b19237150c0e983b4ae7ac64f23d83519": "0x040000000002000000000000000000000000000000000b626c6f636b7a696c6c6100001c40626c6f636b7a696c6c612e7465616d3a6d61747269782e6f72671a626c6f636b7a696c6c612e7465616d40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471455538dd590c80f13507c2d0784ffc68240a395784f16cd29f99f974a58876fa9e948fe4ffcb70334": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000001d4c75636b792046726964617920476f7665726e616e636520f09f8d80000000147279616e406c75636b796672696461792e696f000011404c75636b794672696461794c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471455596bc6a00ad8cb92d11958f5d22465a5c44d5c4411437e57ca8bc73b0d61e332a6c4f698381d7a": "0x00000000000000000000000000000000000b53776973735374616b6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714556c80301dcc6c9cb22a4babf3715c5f87721f51b3c81da94e30982ff1208676559eb41cfee4a96f": "0x00000000000000000000000000000000002143726561746976656d616b65722020284461766964204172616b656c79616e29104461766964204172616b656c79616e00001d64617669642e6172616b656c79616e37373740676d61696c2e636f6d00000a40645f6172616b656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145579d397caf9629d608aa0febae80d8c228709183cf997bc87b0aa219cda0928408df22ac7ffef39": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471455968c29c82cacff564ee20cf557d9908995750ee210fb123037816ada2d4a702bb54068100a8767": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471455b22415a61f9221bcf7fa68ff79818686ee0a26bcff740a8b3c2930251fd15a49c6ccc64faa7508": "0x040400000002000000000000000000000000000000000948616e205a68616f0000124068616e7a683a6d61747269782e6f7267157a68616f68616e406c6974656e7472792e636f6d00000b4048616e5f5a68616f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471455c8a048a9a0dce1d6ae958d7ee48f421e3e5c4adf7448c8ca260e9deb824e62ef108e7e25758d78": "0x00000000000000000000000000000000000c4c75636b7920426972647301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471455f668eb0e022b6af4f8d7504c181954de142fa5dc2dd3d7e79ce9b4f19b89cce879eb7f60bb5721": "0x0000000000000000000000000000000000055a69676100167777772e6d69636861656c7a6967612e636f6d2f7a0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714560e4606f61ab63ebe1f786c654c20757527b840d1d4a4ea6fc3b355d5791110ab8f8f0724b9404f": "0x0000000000000000000000000000000000114c69736120576c6164696d69726f7761114c69736120576c6164696d69726f776100001a6c697a612e766c6164696d69726f766131406d61696c2e7275000011404c697361576c6164696d69726f7761000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714562122059d1dbce57ca460cc927a04fbc91f4ddda54149556d1a85196bc753d054aca1fb7621e349": "0x04040000000200000000000000000000000000000000055649585900000017736175726162686772696e6440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145629138aa7fc2439fc079f0aaf5e36f2d2ad13f54b81924eb303eb0b47e3af372ded43049bc64910": "0x000000000000000000000000000000000008437572696f757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456437782aa58550c3801e22f05e304a3fff7124b7e1830b112e3466db9d8fb6cf1e8e9e79051662c": "0x04010000000200000000000000000000000000000000144c616d626f6d6f6f6e204d6574617665727365144c616d626f6d6f6f6e204d65746176657273651668747470733a2f2f6c616d626f6d6f6f6e2e78797a011779756475732e76616c6c657940676d61696c2e636f6d000011406c616d626f6d6f6f6e5f7665727365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145667d4d8a497c0945a2b916f6525c0639e089c5b221b61ff495cccbb4fb82fd4dbd6034a8ec4c008": "0x0405000000020000000000000000000000000000000009506172616d6269720f506172616d6269722053696e6768000019706172616d62697240706f6c6b617373656d626c792e696f00000c506172616d6269725f3137000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714567dc72806fd2ef9d453b6e497b6a89979fb34eea715720d37c2381c8c51458be04296fd059dcc3a": "0x04000000000200000000000000000000000000000000044a4a4200000000000008404a4263727970000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456842ac04118f270ecbab750f5f7563a45e30f4b4ce064248400b90c5f8d06158944dc94bc6d5236": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145687eed0089938017caa8fe3fab162b7508198c9ad5b37c7af8b02cb70ac48da4a5f98c505c7155d": "0x00000000000000000000000000000000001052616b73686173612053747564696f0000001972616b736861736173747564696f40676d61696c2e636f6d0000104052616b736861736153747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456a1c5009025aa2bb6c090fcf1675617fdd8ced70d7567c5dc707782d10d9570430ef02194c75067": "0x0000000000000000000000000000000000154c6f6b6f20506f6c6b61646f742077616c6c65740e4d696775656c20426f7267657300001b6d696775656c626f726765733739313340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456b436eb439d2e4862586fe7c5d0173262986d66edceb58dfa24f4ba4f35aed0f37228ee9ffa4f00": "0x000000000000000000000000000000000005416c657800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456cebd3283e0ea933a3884dbc6806e8b4cccbf2c407d800c12141c3d7cacde442a649a6a2822ac17": "0x040000000002000000000000000000000000000000000c53454b4f5941204c41425300000013746f6d4073656b6f79616c6162732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456d57c08aef106735ecb86012e4c9df3676d3ba24512ff0c5b3509a4282b4290f095da42de17eb56": "0x0000000000000000000000000000000000064261626172064261626172000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456ec9fbeed402237beb4f57329d674153ba91c3d1a21f744e48d79e8879f1213bc2099a3eb241429": "0x000000000000000000000000000000000009524742416e6b7379001d68747470733a2f2f6269742e6c792f524742416e6b73795370616365000000000a40416e6b7379524742000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456fcf1e5447565198ac9fad47064fa58342aea6727b9e45076283c71a6447534c444f163eb426813": "0x00000000000000000000000000000000000c50616e6f707469637573200000000000000d4070616e6f70746963757376000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471456ff64b33828b8d02a3a79d6cb82c0f1fff14cbb78d3b7fa64b5a9a3fd9c54fd4e78a5cbfbade710": "0x00000000000000000000000000000000000648616e697300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714570905ee38b668978c7da506845d451b9510e7ac2e7d30c36e72a5f39e05d427f9e79719724a5a3e": "0x0000000000000000000000000000000000115468652042756c6c697368204f776c7301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457130fa04591b33060283de9f5beb93ac69b24ca8c62f60f39b8c80758d807aa244532c66b67bc3c": "0x040000000002000000000000000000000000000000002153616e746961676f5f47757a6d616e28656c63726970746f7061726365726f290000001d6469726563746f724063726970746f6c6174696e666573742e636f6d00001140656c63726970746f7061726365726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145721ebba28d18ffd9c84f75e0b1b92f6b003bde6212a8b2c9b776f3720f942b33fed8709f103a268": "0x0400000000020000000000000000000000000000000006616e6472650d416e6472c3a92053696c7661001140616e6472653a7061726974792e696f000000000b616e64726573696c76610000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457303e92e8fb25ab9a83298c34e9c1f3f325afee086ab423e88645861ad8c9e380e4bc3ef7046e07": "0x0400000000020000000000000000000000000000000006526567686f00001340726567686f5f3a6d61747269782e6f726710726567686f4079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714574f6106315eb5517418571179b97e88a57328ecffa64c08abd0dfb5ff50be36e00582e56c5b8955": "0x00000000000000000000000000000000000c706f6c6b61646f74626f6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145771ae952ce319e894390dfcf349f8a5e73597a2e96ce1344cf8272e990489a08c24ac30d9027953": "0x0000000000000000000000000000000000074b757261726106446172696100000000000b406b75726172614e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457845cd05536c32e9c6ba1325d8dc7cec809ce61640c9ed92d18f0d818a4c102c2c0ea4f29820136": "0x000000000000000000000000000000000004546f6d09546f6d20686f6c64000017636f64656861636b3737373740676d61696c2e636f6d000009404b534d50554e4b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145786fc402111e82d5202845d849d9eb6a7e5a414492a86d205be4a374ede34e98fc2440de4809a3e": "0x040000000002000000000000000000000000000000000c556e6f205374616b696e6700001740756e6f7374616b696e673a6d61747269782e6f7267186f70657261746f7240756e6f7374616b696e672e636f6d00000c40556e6f5374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457903c6184bae82f5a090c88f0438b46b451026597cee760a7bac9d396c9c7b529b68fb78aec5f43": "0x00000000000000000000000000000000000d5365756e204c616e6c6567650000000000000d407365756e6c616e6c656765000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457a1aae68bb3807a7ae8740550b3d4de49d50fb4e83354786a6ffc5c166d7b876c31baae7388ea51": "0x04000000000200000000000000000000000000000000054d414473000015406e6f626c656d616e3a6d61747269782e6f726715676f6d6164736e6f646540676d61696c2e636f6d00000f4053657267654e4d617263656c31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457a5cae663c515ca00ecaacb451648a3660fe122ccc2c32cfd9459ca6dac9f10cbf7a0ab60c61318": "0x040000000002000000000000000000000000000000000d4a414d4553204147454e4441000019406a616d65735f6167656e64613a6d61747269782e6f7267176a616d657340686f6c64706f6c6b61646f742e636f6d00000e406a616d65735f6167656e6461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457a97c250c6d982f788f24f65de10ed710c10f5daf367e9ca57d8a998cf6bd13d7cdaf6937e16d68": "0x04010000000200000000000000000000000000000000184c696768746d616765204b534d2076616c696461746f720c53616d20456e672053756e00001473616d65733230323040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457b1a86eeaa2582dda1a090ac84e6183dc9e7e3369cbab0ca51afcc7133b1324634093753a483e11": "0x00000000000000000000000000000000000f52757368696e672053747564696f0f52757368696e672053747564696f1a6d656469756d2e636f6d2f4072757368696e6773747564696f001872757368696e6773747564696f40676d61696c2e636f6d00000f4052757368696e6753747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457b1fed518565181aaa635f88e75ad58af28925d0c21a804d87a449469e45970c3a52f57aba7b366": "0x0404000000020000000000000000000000000000000008486f646c6f6e690000001874656d70696568616573736c7940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457c41eaef46fdefb2ca8e96b721f074e95a3f7d994c370dab688fc85134de7e2e7d4589d0a306c51": "0x040000000002000000000000000000000000000000000842696754756e610000144074756e616269673a6d61747269782e6f72671574756e6162696776616c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457ce53ed6bf695bad6266aeeea11e5bcbf8d5a1b7255a363aa2635083e0e0aee6ab434fdc3f1b511": "0x00000000000000000000000000000000000848414d5a4941530e48414d5a4920412053414b455200001a68616d7a69616264616c6c6168393640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457e0f36f0fe2bdee54efb33a98824d6330a8f074481df98b5123305473559bef960180791f849252": "0x0400000000020000000000000000000000000000000008426572657a6b610000154074696b74616b33343a6d61747269782e6f726715696b617a616b6f766e6e40676d61696c2e636f6d00000f4063726970746f637468756c6875000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457ef873d5dca9de5ac09149a298fb86b4ecb5c648a2d37e8dbd6da2ad3f265179eb5daa903c3f73f": "0x0000000000000000000000000000000000046b736d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471457f4780677cf709b4ec0381e4427ed6567f7a5c328288ced36c33becea6ececd8145001f4230ac1b": "0x04020000000300000000000000000000000000000000185869616f207c20e586b0e993bee7a791e68a802d4742430f44722e205869616f205a68616e670f7777772e676263746563682e636e1340787a68616e673a6d61747269782e6f7267127a68616e677840676263746563682e636e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145805cd76b5154e33e6b0690ac14357ff8a2228b2dca5e221badf5d252d94ab08dbcefb2004d5214e": "0x00000000000000000000000000000000000000000013736f6b6f6e66747340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714580dd48e484c5f2972a45f5688398a40b4bebab307d097de95cda8220d74e053fa0b7b77f0c36e14": "0x00000000000000000000000000000000000d5761746172754b6f73616b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458138ec91336832cb4dd8fc49aa15538543007347b1df3f4bf948ed60474105c19819a311fdced43": "0x00000000000000000000000000000000000c416e61726368792041706500000016616e61726368796170657340676d61696c2e636f6d00000d40416e617263687941706573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145839ea98689b2889bc6e12d7ab70abea4c08db7055e84f16bab817b5fb359088ad5190422df9dd1d": "0x040000000002000000000000000000000000000000000e416c657850726f6d6f5465616d00001340616c65782d6d3a6d61747269782e6f72670000001040416c65785f50726f6d6f5465616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714584010d60675c6289a8cba76944a9dd66c20b150c5821f2b6c3fb5c7896b9a3e889d574f48d3d50c": "0x0402000000020000000000000000000000000000000011494f53472056616c696461746f72203211494f53472056616c696461746f7220321068747470733a2f2f696f73672e766311406a6f63793a6d61747269782e6f72670e68656c6c6f40696f73672e766300000840494f53475643000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145853e7deee1e01320c3e1db6b821c4e5dd8d3199aee048377eeb692392743d43e7196d4f8d52e212": "0x040100000002000000000000000000000000000000001344455720436f6d6d616e642043656e746572001a68747470733a2f2f7777772e6465772d7374616b652e636f6d1440646577706f6f6c3a6d61747269782e6f726716646577706f6f6c406d61696c66656e63652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458554ac760f837f7d8f7fd9ee2b808717305d4bbc06e1ed5aa519e75c398f6dad27e1c1c026c593c": "0x00000000000000000000000000000000000b45736b696d6f204a6f6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714585c0f93d15e98cb42f3c525c66f2a4eacfa88479f7537670d2e1f45f4ec25703a111f5f003ba15d": "0x04000000000200000000000000000000000000000000145374616b696e67204c616e64207c20457269630000001265636f7637373340676d61696c2e636f6d000009406572636f373733000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714585dc428f7abc0d304b28d3651a60f46affd3f6b3b5631bf8e1181a53911bc83872183ed80f92641": "0x0000000000000000000000000000000000033838000000113932343131373533384071712e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145879c1214022b88dc8566f6d3669729e877cd5e453d59f6be01ae6f31b7a9c9925160e70072f7242": "0x04000000000200000000000000000000000000000000084d555348494b410000134062726f776b613a6d61747269782e6f72671069726f6e406875626361702e70726f000000000a49726f6e233933323600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714587c6bbae1bb420cf2d0eed0f21b82d4b15802153cde2a229f257f01d003694b2973ef785a734766": "0x040100000002000000000000000000000000000000000a416e6f6e7374616b65001668747470733a2f2f616e6f6e7374616b652e636f6d0016737570706f727440616e6f6e7374616b652e636f6d00000b40616e6f6e7374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714587c6d66c4c89f37ce8bb3daa399b23c4c37885a945461ca1e15579969152bd06ad91aa42a901c45": "0x0000000000000000000000000000000000095261626269747373000000186461696c79726162626974737340676d61696c2e636f6d00000f404461696c797261626269747373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458929df6c9d6b10576a95bd9907b8b23244d8d127f6218e662a8098b03338c02b70926cff7215812": "0x00000000000000000000000000000000000849736c616e6473054c696e6100001749736c616e64732e726d726b4079616e6465782e727500000b404c6567696f6e383837000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145894bbb4b58b7f2a267bb3686448c8f8e75390a649826f7b524f9a9768817678333e405f03b2330e": "0x0000000000000000000000000000000000036b790273010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458b1d929f632e2bf305941b16193089ecff9efaea02756aa01cca8a54406d6cdc44f7d4b3ec7fd37": "0x00000000000000000000000000000000001d4c696e646f204a6f736f6e202850656163685f6e5f506561726c732900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458b50dea3d326a26e61e809e1d333966b27b8a6ad71850881f0a7f534caeff85ddf6c9cec0b3763b": "0x00000000000000000000000000000000000e50756e6b205661756c7420233500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458d6ba7bdbadef08f05f73ff22478af897ca6ff58c5152c641fe41bfbb168ec437b1e699c18ced5d": "0x040400000002000000000000000000000000000000000b5169756861692047756f000013407169756861693a6d61747269782e6f7267157169756861692e67756f40676d61696c2e636f6d00000b4047756f516975686169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458d8557741d41ae44e4ac8070fea95496b63cdcb6987de88f63dc75a295eace6ce5079149169300c": "0x04000000000200000000000000000000000000000000044b594200001a406b6f73747961796573696b6f763a6d61747269782e6f7267196b6f737479616573696b6f76393040676d61696c2e636f6d00000a404b596573696b6f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458dec35f4d8ac0dd708b394ff79e4dcdd95357d1f6f5eb4db7314ea5bddad55e9b1507e58059cc3f": "0x00000000000000000000000000000000000c53565941544f534c4156310c53767961746f736c61764e0000177a6164616a616e697930317940676d61696c2e636f6d00000d404d5370656b756c79616e74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458f0e1d56d9c06ae72cf375dbf960070e09942d1eb553973beac2e3d410a30a87e1271c53d1c4b13": "0x0000000000000000000000000000000000084b6f646569737400000000000009406b6f6465697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471458f78aab94d3b05202ecd7386aa07e755cb458b790699dbcf09458279ec393f5384ff7729da38d10": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714590171a64e0cbc98e6482c69539ce311c0cd1b067d98be8f177fcd9620f938a48f3e61353bbd0367": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714591121c7e29722e2043fef4609e750d25d21d9fac3f3144e2cacf1f758e70dc4a23dc848e140850f": "0x00000000000000000000000000000000000943656b697264656b000000000000104063656b697264656b5f6d65647961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714591a0dfab85943a49e28e10189b8bdd0e4980086b6c36728d840932128ea4bce3db2f26032c15114": "0x0000000000000000000000000000000000074a787264786e074a6f7264616e00000000000a406269746d656d6578000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471459212f1c3da6903f24172a563943291c97d252def71e17abf467a1626bca358728a90a82b3de3118": "0x040100000002000000000000000000000000000000000e5a4b43484e2e52594142494e41001368747470733a2f2f72796162696e612e696f12407a6b63686e3a6d61747269782e6f72670d7a4072796162696e612e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471459368261611b8625ee3f7f4c2dbe3c27e5e524c226ef9e65b827498e0f53b5c3592d4b6b884e6d55": "0x0400000000020000000000000000000000000000000004707467000000137465616d7079617440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714593a90e3bf5c060f765a97770360b61055ecfbe9f3790d29fe8dcac870716c5464cd4ce27c3f4744": "0x0000000000000000000000000000000000084472616e6b73790f4472616e6b73792041727469737400000000000f404472616e6b7379417274697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714593b2319048c7897fc6b29e92d65b645a56a0d44e3f4879eb82f3c5b50341cfa61aad9edeb7cbe0e": "0x000000000000000000000000000000000003656600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145943caacae6ad2f25aae17b541f38373368901648429badf112a0dcefd9a8976dc5b8d6acebf7425": "0x04050000000200000000000000000000000000000000096a616b6b796f6e650661726d656e0000136a616b6b796f6e6540676d61696c2e636f6d0000104043727970746f61726b657469706f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145964965cb7d831cc9e819e2426df687c803ee2abc546c68bb0267ea7652029e7e242ac75a83ded24": "0x00000000000000000000000000000000000944616d69656e4d6b00137777772e617263686976657273652e6172740016736175636564616d69656e40676d61696c2e636f6d00000e4044616d69656e5f5361756365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714597947638d09aa7a7a5b71ff1acdfd938cac1b6b115ca5479c392d1fa5d9d78c1770f0042a9db811": "0x000000000000000000000000000000000013506170696a656d20706170696b697263686508426f7961726b6100000000000d40506c6179657248656c6c61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714597991a0ac94c2410af5599c203182b0859805283944d9a8df0d788a52a37423ef002cc5889f5764": "0x00000000000000000000000000000000000c6d757461626f726174756d104665646f72204e696b69666f726f760000126665643232323240676d61696c2e636f6d000011406e696b69666f726f765f6665646f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714597a2e1f5ab12e08025741e5e3fa614b7a17855d223f48d4ac98bdaf45c11e67963cd0b4fbe0081f": "0x04000000000200000000000000000000000000000000104261657a61204b534d2053746173680000001373676261657a613140676d61696c2e636f6d0000114053656261737469616e474261657a61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714599ea05228cbabc6429a9eb3c6a1f14b291fbd2c10ae3b6dc3fd95fab0ab0072122a90c2f6529057": "0x00000000000000000000000000000000000f5461626f6f2047616c6c6572792011436f6e74616374203420636f6c6c616201010100000d4079616d696e617274697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471459a857c5ae03b5a7ece6a4bff0a206e9739e9f05b36e23cafe0e59d2c5fc1adf3d00069160ec6319": "0x00000000000000000000000000000000000b4a6176696572204e46540000000000000b404a61766965724e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471459c0a69a8bc9cd0c3e89f6d3fe88c432363723082d6d6cc6e5b3c09a1b4087dd409bf8804b1f7d57": "0x000000000000000000000000000000000010506172616c6c656c2063757a64616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471459d3ac6be2fd0312ce6ac62a23361838caf62d10c11a08b4ef6048cd2d8819abbe0399f2da40da68": "0x00000000000000000000000000000000000e43727970746f4f7665725553440000000000000f4043727970746f4f766572555344000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471459fb49563ab8f0448629b0221568837ac8c93a4534c77b40e4f07dc7dca8e7ab9062914c6d5cd64e": "0x0000000000000000000000000000000000204b494c542043524f57444c4f414e2046554e44494e47204b52414b454e204900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a20e5cb7fcd59317e4d3937a8778981c0365ad2faff4ca846c9d910ec1196e66f9fa0ae5a469c2f": "0x000000000000000000000000000000000006354e344b3300000000000008406a6f63323430000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a322d41358015c5820e859e96c107c3dc5e0b110d8e5a7fd2bf312b511b00a5a45e59eeec47d741": "0x000000000000000000000000000000000009436872697342434b0000000000000a4042636b4368726973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a53642bcce8d5192055808c210d863dfc372ec85beafa8fd3a8ff497f8eaee401ef05bf27d3065b": "0x00000000000000000000000000000000001f4a696d6d7954756465736b69202d204b7573616d61205265736964656e740000001b6a696d6d7974756465736b69407374616b656e6f64652e64657600000f407374616b656e6f64655f646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a5afe08a0a9de9ed6aadb9a7f66a45224f6f83011f854c0b5758c626b213f97cbffded94830507d": "0x000000000000000000000000000000000005f09f909c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a5f25d1ebffdf66facdca5effe8072173c4c12f7bce4d0e693e5feb83f7926bf1a8c7ffd1caf14a": "0x000000000000000000000000000000000008536576616b3438000000144374696c657236303640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a69592e77fa7ad2d8dd47918c70f35b60c098e90f3ddb7aaab24082cb7043be071bf323f10b3928": "0x000000000000000000000000000000000007454e31474d30000000196672656e6b656e737465696e373740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a6c990eb5706de2f6d5d7a1f11d32d33bff1d878db5eff7462b104818a869e89f47034210c88812": "0x040000000002000000000000000000000000000000000763727968656c0000134063727968656c3a6d61747269782e6f72671163727968656c40736b6966662e636f6d00000f4063727970746f68656c656e6b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a84a36862a690700210f894089a5fd3e91bcc8f6848717c556f002438cd902c40af4d031e9d5e21": "0x040100000002000000000000000000000000000000000c46656e6e656c204c6162731046656e6e656c204c616273204c4c431768747470733a2f2f66656e6e656c6c6162732e636f6d1b40726f6d756c757331303a66656e6e656c2e656d732e686f737414696e666f4066656e6e656c6c6162732e636f6d00000c4046656e6e656c4c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a8a8fc110b069894a0ac27d662bb3987c4f0568f1d048d57dc25a1479fdee48cae7b7cf6eaa8d42": "0x0000000000000000000000000000000000084472617468696e0000000000000e40616c696d617277616e693130000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a8e89c3cf824328d0962c02edc80c0e947917fbb8b18e5811c1f3be76938130208f71aa07f0f909": "0x000000000000000000000000000000000011436f6c6f7265642050617261646973650854617469616e6100001374616e7961626f796172406d61696c2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a8ebd7db5efcab1de575b9b9da6c9296693e2c37ac5f38c1d84f64a7749a5c59edd1951fb5dff12": "0x00000000000000000000000000000000000654455452410000000000000c4074657472615f636c7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a951ea190277ac2de78f9ebf672082a2ed1e9d5b00430dbf6d0284fe3bbc4176f140e934d3b3b2d": "0x00000000000000000000000000000000000942657253746576651053746570616e204265726c697a6f76166c796e6b666972652e636f6d2f6265727374657665154062657273746576653a6d61747269782e6f7267156265617273746576656b40676d61696c2e636f6d000010404265726c697a6f7653746570616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145a95852911b4bab1a41f73a80d77cb1ca2a8ced7f20a74c1677edb562b37e8a16310b89187cef94e": "0x00000000000000000000000000000000000853747573616d610b53747520426973686f700000177374752e702e626973686f7040676d61696c2e636f6d00000c40737475626973686f7033000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145aa8315fde207d41183982ce80e4b52f2e80aaf36d18b1eba1a32005ffbefd952962227f2f4db309": "0x00000000000000000000000000000000000f477561726469616e7320f09faaac00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ab174fa9e055d169cfe0b920dc749dada372dd02f2b5d60cbf9081a05ed65c7df35e4e47c593c01": "0x040000000002000000000000000000000000000000000a4b7573207374616b65000016406e696b735f67656e6e3a6d61747269782e6f7267157472656964636f6e323140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ac78869847a814046d41e304d6e7344c6509ee4cd56eb032090b86436ae5fca4ea3a357018a0659": "0x00000000000000000000000000000000000000000016736572676f35363534353640676d61696c2e636f6d00000a405365726730373136000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145acf1d24617d25ba6a88b4d1ab30ab4708521d6c6d480a858d92692c0b0cff67e1a6904e23b84112": "0x040000000002000000000000000000000000000000000a68617070796d65616c0000164068617070796d65616c3a6d61747269782e6f7267146d617276657238333340676d61696c2e636f6d00000d4068617070796d65616c6368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ae21247553af3c4f683b2e8b27985776e127615b3dd6362db1d252d4136112efb7451838cc62e4a": "0x000000000000000000000000000000000012426f68656d69612047616c6c65726965730d426f68656d69612046616972147777772e626f68656d69612e67616c6c6572790015426f68656d696144414f40676d61696c2e636f6d00000c40426f68656d696146616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ae3d02694d32b74b4154f12cdef88338edfa85cbdd64b61c410187e4f7971057aef32cdafdfb702": "0x0400000000020000000000000000000000000000000016f09f9bb8205a6f6f70657220436f727020f09f9bb8001868747470733a2f2f636f72702e7a6f6f7065722e6f726717406a6f686e756f70696e693a6d61747269782e6f726710636f7270407a6f6f7065722e6f726700000c407a6f6f706572636f7270000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145af116176166f3dcdc891490870515c71014938641e9b09cfbfadeb502b16d67d2cff9145aaa9a75": "0x0405000000020000000000000000000000000000000009426c6f636b41544c09426c6f636b41544c1a68747470733a2f2f7777772e626c6f636b61746c2e636f6d2f0015636f6e7461637440626c6f636b61746c2e636f6d00000b40426c6f636b5f41544c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145af3c641a81d6a63eaacc14e67deba7935dc28c86bb8b6bdb64239065b718fed6b8691ce14163350": "0x040000000002000000000000000000000000000000000853494c49434f4e000018406b6f6e74692e6b6f6e74693a6d61747269782e6f72671b6b6f6e74692e6c696b652e6b6f6e746940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b03e1028650b87eb4ef79231816c3f685dbf10c86eacea23af48909a856957b41dfbd75ac36524b": "0x00000000000000000000000000000000000a506c617965724f6e65000000146c6175726f2e6b656e40676d61696c2e636f6d00000a406c6175726f6b6966000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b0f569c80b1ef944889a8a8910ca711d463b40c9216c7007638c77f4f62fa37ad1f05b5fc386e0c": "0x00000000000000000000000000000000000f4a757374526f636b657443617368011a68747470733a2f2f6f70656e7365612e696f2f446f6e4a5243010100000a406a72636173686868000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b174056fc3b6e14dc9163ea2d0bf58ceaf597668ac362d5723f061642ef6dbd498e5088f11b2225": "0x00000000000000000000000000000000000a446973727570746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b2364935bdfff38fa27cbf66115a030147d7e427273ca01ced9332ac5ca8883927d41f121f60651": "0x00000000000000000000000000000000000e736b6574636879206a61776e73012168747470733a2f2f7777772e6162616e646f6e656463656e7472616c2e636f6d0113637874726f6e636f40676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b2d54fd29af31b28691026aa386df1bde178237fd99072af73d9fba71b0a350dff42db8bd2a4279": "0x00000000000000000000000000000000000447616201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b3a26a81f77f16fd623d05214a4c208f0dc52cf4eef865afccd55bfedd175856129aa3048d38174": "0x00000000000000000000000000000000000e4e465420436f6c6c6563746f7201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b3e4fda94e65239bdde527f50b491568aa2085ee12c5535d7ce765e180399a038eac99654a31ad5": "0x00000000000000000000000000000000001b53595354454d20434f4c4c41544f5220505552452050524f585900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b48f080beb98586a8ca45025561ad23d3000cef010fb14901ba322283898e08c3d0a7fcdd03ce5a": "0x000000000000000000000000000000000007446542616e6b001368747470733a2f2f646562616e6b2e636f6d0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b4c4e58d29949859a2cb674ea2f4866664769a1663fd6aa321d9cfb89b67c402c881891700c0f57": "0x04000000000200000000000000000000000000000000084c6962657274790000001c6d657461706172616469676d4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b55dc011bdbdd6c4c50e314596f61c5d9d8d93121d1fb03734be5b91e7f4d89eb5fddf130148274": "0x00000000000000000000000000000000000b4e696b75737961363636054e696b611e7777772e696e7374616772616d2e636f6d2f6e696b757379612e36363600156e696b756c696e39313140676d61696c2e636f6d00000d404e696b757379615f363636000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b63e90199fb6234a42f4d0ef9a0113223ed286071390af15142d1ca267cb1683a5bf6e8f492de75": "0x00000000000000000000000000000000000a47726f6f645f696e6b094e7572696464696e2168747470733a2f2f696e7374616772616d2e636f6d2f67726f6f645f696e6b2f001367726f6f6472617740676d61696c2e636f6d00000b4047726f6f645f696e6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b71d956514a077d9ee54da7df7f0e7ca7a874fa03f8094681e9db42994f0b21cd215fed704c3b37": "0x000000000000000000000000000000000009796f726e6161746809596f726e616174681f68747470733a2f2f6769746875622e636f6d2f676f72696c6c6174726f6e00126a6f726e407a65697467656973742e706d00000a40796f726e61617468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b8f8631883ea6dd1e568033ec5a6695a6f27b6e2cb4a2b6dbdcf497c0837fa0272e31019a69ea29": "0x04010000000100c8e6bc170400000000000000000000000000000000000000000000000000000d61726e6f6c64736d616e676f0000194061726e6f6c64736d616e676f3a6d61747269782e6f72671376616963756c697340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b908e9c38f784a922592d747d00fa956a6388eccfd7c7684191178e62a1e6e2b12758ff447fc402": "0x000000000000000000000000000000000007506f62626c650000000000000b40506f62626c65417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b959c6eb8b10f975ae160771e1bffc404bfedafe29a049e2804721a4932258c8a89e7a9cd5a2632": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145bab0f6894110edcd06077d6ae735ec4a8fc88f424db70b0dec1e9bae95e39d2737a105296af462f": "0x0000000000000000000000000000000000094b534d204d61696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145bc7aeaa278c7e8dda0ab7aa04417272602b517a5e25b783a5aac2a251495eb12d5a4d64ea0d7f7d": "0x0000000000000000000000000000000000074a454550455200000000000009406a656570736f37000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145be3d49d6a02aa76663628177efedc10b4ffa4c6765b525575ed6a6128b945d93c02b45d56358255": "0x00000000000000000000000000000000000b426561722054686965660b426561722054686965661c68747470733a2f2f6c696e6b74722e65652f62656172746869656600186265617274686965662e6e667440676d61696c2e636f6d00000e406265617274686965664e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145be620e3757932d22e0299102b6e06b617097dcc0380612e6d3ee0692721d984a3e92b5520d5095e": "0x00000000000000000000000000000000000f52657475726e65642056616c756500167777772e72657475726e656476616c75652e636f6d000000000f4072657475726e656476616c7565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145be79f90404ad9e0e4a66ee66171e3238670377bc9ffbd7cb4bda47baf25e6ed80c2070942ee3f72": "0x040100000002000000000000000000000000000000001070617468726f636b6e6574776f726b135061747269636b20486f666d6569737465721d68747470733a2f2f70617468726f636b6e6574776f726b2e6f72672f154070617468726f636b3a6d61747269782e6f72671f70617468726f636b6e6574776f726b4070726f746f6e6d61696c2e636f6d00000b4070617468726f636b32000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c0211d083cd891e2594a69ff79c03f8cf57c80cff2d29d4a62d07787e70838463232e42b694a260": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c35b09fcd09a3c258fd2bfc348cd72f4b516fa5d07dbae2f170724947cac5a578a0cd43d30bce38": "0x00000000000000000000000000000000000e526f636b585f4b7573616d613406526f636b581268747470733a2f2f726f636b782e636f6d0012737570706f727440726f636b782e636f6d00001040726f636b785f6f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c435ff0076da260aa4370d01e3beef9dd9b535ed1c7957cc66685f15cc203189f1245013f92f14a": "0x040000000002000000000000000000000000000000000c56657261636974792e6669001868747470733a2f2f7777772e76657261636974792e66691c40646f75626c655f6f5f74686576656e3a6d61747269782e6f726711696e666f4076657261636974792e66690000114056657261636974795374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c5ab5d3c9934ab83e8b471e99fa0edd1730046ef2d4e82f66364dc513f52dbd0fb1ab561cc33e17": "0x00000000000000000000000000000000000b4672616374616e617279000000156672616374616e61727940676d61696c2e636f6d00000c404672616374616e617279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c6592b134c699ba187444691216a55e3455ee1ed462d54ce0b635a1b2b37d0eb7625faa31218877": "0x0000000000000000000000000000000000074f56c2b9c2b9154f6c656720567973686e6576736b7979c2b9c2b91e68747470733a2f2f767973686e6576736b79792e636f6d2f6c696e6b7300156f6c656740767973686e6576736b79792e636f6d00000d40767973686e6576736b7979000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c6b1c34b6431f3840b9259dde4ecf577907b60e73ac636e896ac881e1f44c1bab1062fce8edef10": "0x08000000000100902f5009000000000000000000000002000000010010a5d4e80000000000000000000000000000000000000000000000000000001942414a554e204e4554574f524b207c20616a756e612e696f0e416a756e61204e6574776f726b1268747470733a2f2f616a756e612e696f2f1540726f786f6e746f783a6d61747269782e6f72670f68656c6c6f40616a756e612e696f00000e40416a756e614e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c7a1f1f152d77a7e61ccc992fa2dcd65b95d4f77ce0f63db60e2bdb19cbfec36d300f44069c751f": "0x00000000000000000000000000000000000d42696c626f42616767696e7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145cb77214d79cb5a2fac0b420b2c0787c18368b8685cf54606b59fd34f941ce2f31fdb91534c6bd53": "0x00000000000000000000000000000000000f496e7370697265207820524d524b0101010100000a406363776461766964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145cc468a5aba1dfd7cc0460228b1d0c8cb99d0b025dcffabfad0f11c8b61297a9dec7d7a2f72c744d": "0x00000000000000000000000000000000000e43616e2d417269732044656e740000000000000b404154726f7531393835000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145cc5698ecc3af260fe2c90d31ad2500e8b1358efa80aa7170e5887de4687081c24def3fcdcc43d07": "0x0000000000000000000000000000000000037879037879000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145cdaddbf5de66df5623470253bd540d69edadc8a758e8dbeb532a66c9eb39311e7daf3ed2466d25d": "0x00000000000000000000000000000000000a686f70657361696e740a686f70657361696e740101176e696365726973653133333740676d61696c2e636f6d00000b4074776974706f746170000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d07888ff9ed46fc58994e72c04b7c36de2b08b119e7abc2870c51f2315a4980e544197e706e7874": "0x04000000000200000000000000000000000000000000074a656b736f6e00000016657667656e6d617373383440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d12ddd9ba6fb6ca0cb2d216a8ad7864f222d92dd6636ae1ff0fd9151ca3b60e0bcd2d55ec25ab4e": "0x00000000000000000000000000000000000a5b41525453414d415d0000001661727473616d612e6e667440676d61696c2e636f6d00000d4061727473616d615f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d3dec38e02e37251c6d8b40be9990c19e993d238e6e3613cfc6cbc51979d5fa61dd6ea259385609": "0x0400000000020000000000000000000000000000000007416d666f72630a416d666f72632041471368747470733a2f2f616d666f72632e636f6d00137374616b696e6740616d666f72632e636f6d00000a40616d666f72636167000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d42f9745219ed50b6b86c53a0db7f8b293e164a22bc0c47d4cd554e3ab2f1f8c4dde73f2227c574": "0x000000000000000000000000000000000010636173746c652f524d454b61626c6510636173746c652f524d524b61626c6500000000000c40636173746c6532353331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d6c6374575f1684f47abec3c5269249303575bb90c763d420fb6148e567841105815cd63152c121": "0x00000000000000000000000000000000000d4368616f73204b696420763200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d9004d360afe69f265dc7b1a304621252fdbb2e64751d958a3ca006f359f4987fd9a77f9b22124d": "0x00000000000000000000000000000000000b636170656c696e686f7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d9e8b6d1aaa8f64e8e5969ab8c6f6f4d63b090863923fc834b24583c0f2363e00edbd7b7b296011": "0x0401000000020000000000000000000000000000000008766f6c3474696d001c68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b2f1440766f6c3474696d3a6d61747269782e6f72671773617340726f626f6e6f6d6963732e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145d9e956221876f960a49a73df6ad2c6b41b8a01c54e34488b27cf010c22af4ad2b46baf013c75303": "0x00000000000000000000000000000000000d5469676572e2938874796c6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145da16a0301baa67d9e1e5d3c3e1a8f1018f081a7d998ea6684e823165a3bf8f18d0838c0ab9fc531": "0x00000000000000000000000000000000000e47396536207c2043797068657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145dac9d84545257d0e49291d5619f4363858a3528f102f0270fb36e1eb3283e3c1f6478a4e48c8f35": "0x000000000000000000000000000000000013446f745363616e6e65722046756e64696e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145db29c27869ebe6dc20d53e9595db5afba8fd5320b11f3fa6970ab4335c7517f86fbbc7560bbbb5b": "0x04000000000200000000000000000000000000000000134d696d69204c65742069742068617070656e0000001a6d2e6661727265732e72696d62617540676d61696c2e636f6d00000c406d696d69666172726573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145dbe0f77941d0faafa383fb921b3c46f10d51250fbf855bf1de45709fb43db76534a8bdfd072e479": "0x000000000000000000000000000000000005676c736b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145dc126cfaa025d1aac2139e2876b295c93ed453f5de79048754ed32e3ecdd7991584200e822c4532": "0x000000000000000000000000000000000006417274656d06417274656d000015617274656d6b7574726140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145dcfddbf8eff24b40c1b579fe2da2803945658be583be68ae72980152018d8dff7d8a83f27f37d73": "0x00000000000000000000000000000000000a43656c657374696e6f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145dd8f42acc19bd83d2c5ddbad0ff443692047d533ca5d92693fb03f15c740757264643133eb5d542": "0x00000000000000000000000000000000000a4b7573616d614875620a4b7573616d614875620016406b7573616d616875623a6d61747269782e6f7267146b7573616d6168756240676d61696c2e636f6d00000b404b7573616d61487562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145de66fa01fb4c2d708b3b1930f36bf7fa336c7abc044e75fea45cf1c903081e7e0bfbd664a80093a": "0x0401000000020000000000000000000000000000000008434f534d4f4f4e001568747470733a2f2f636f736d6f6f6e2e6f72672f1540677265676f7273743a6d61747269782e6f726715636f736d6f6f6e40677265676f7273742e6f7267000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145dea83f53bc9588fa6e49f5e4ba8e10080d8f963dc77cc2a1bd11c0426542a26ac8a0200bbd03c3d": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e09b43fe9323929ec586c840ae4772a0c0068d8202ce6baa96408294fb32e03bf3e44984307ff1f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e0b461bbe90623fec95ed93ac7c2ef8f9eeec8e072f236841214fa59bad12f4d6d2072490922753": "0x00000000000000000000000000000000000a44697a536572676569001c7777772e696e7374616772616d2e636f6d2f64697a7365726765690000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e12dc698b4a5bd2d01ec8518f4e2a34834d5d62d8091e8aee663e4446bf8c1ad1d9b02e58a22568": "0x040000000002000000000000000000000000000000000d6b7573616d6178692e636f6d001568747470733a2f2f6b7573616d6178692e636f6d15406b7573616d6178693a6d61747269782e6f726715737570706f7274406b7573616d6178692e636f6d00000a406b7573616d617869000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e238672304420f9c80539b93608621c583bed3c25caa9b9862d27ad2d5c36e40a00986b92a5747e": "0x00000000000000000000000000000000000e41746f6d6963546967726573730000001861746f6d696374696772657373407961686f6f2e636f6d00000f4041746f6d696354696772657373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e25f5c22e4254863073c378b0833da59cda1d49d711f37c9ae20ed30dc3dbb842ead63dde578331": "0x040400000002000000000000000000000000000000000a4359424552574156450000001a637962657277617665304070726f746f6e6d61696c2e636f6d00000d404379626572776176653134000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e2b059303130f519ad0a56ae39a6237f9eb5c1929d8cb87ecdcc6a31b053e1a37b06d3bfb885943": "0x00000000000000000000000000000000000c4b7573616d61205061706900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e38d1015309414f0ce9186972074fee3e851ea1c8b6d97a0a4fd631a98be1996b14448936bd8e36": "0x000000000000000000000000000000000005594e6f74000000177768796e6f747265636f726440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e3a90dd26f050973a8c8c37aeeed30fcb32ee7e4ddeb5e633eaa8f2c0c46a64ba5864f63a0c3970": "0x00000000000000000000000000000000000d4d61676963204672616e6b79001d68747470733a2f2f33347a672e73686f72742e67792f43686f726473001a6672616e6b792e757262616e696b6140676d61696c2e636f6d00000d404d616769634672616e6b79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e5d6dae2517ec4656a5e2491de262ad111c767a3ef398f0b19b6fb4ec7794af4939231abeca073f": "0x000000000000000000000000000000000005576562330557656233000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e647d848a1c0e61baae5cc25103ed6b8f136972b3582f23e0e524783c6da4357becaf258a6c837c": "0x0000000000000000000000000000000000094173636f6c646678000000136173636f6c64667840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e76a25c3b19eea73e9ff161410bcc8358a7016fcb249cf8e841a5b8d4417db5e1e578efc8e45522": "0x00000000000000000000000000000000000a53494c56412e4d415200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145e83c43ea150b4deaee71703931ed8f0437b28ca920a0054c723c9c3e099e6822f58ca0f5620325f": "0x0000000000000000000000000000000000154d6173686f7665727365203420556b7261696e650b4d6173686f76657273651d7777772e6d6173686f76657273652e636f6d2f342d756b7261696e65000000000c406d6173686f7665727365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ead7e317a7b15bc802c869bef7c9ee9696b34b72df675e6d2c0767f1ee15cf38f396a8a06099f70": "0x0000000000000000000000000000000000064d4152494f000000196d6172696f70696e6f4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145eb64e243ca273fba80c7347e64d19e137abd5258ae78a835ed01d65787a2f4aea106e8122254577": "0x00000000000000000000000000000000000c5452455f4e46545f4152540454726500000000000d407472655f6e66745f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ec8ab4f526b5c792c227f6cb71a18ace22f7e126b230d765c53bb168753b3d33f12582baea65658": "0x040000000002000000000000000000000000000000000c4465657054686f756768740000000000000a407761726d616e6a6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ed5968b3088d1332e1f318e20b782989f8d4f0db439d9d5a29bf0d52552f5c7941292213d16b315": "0x0000000000000000000000000000000000054840736100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ed84a25925e6b15cef26871166ae1372e4e1b7c59cc227a75ba9e857548a063f3d9ae602710674c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ee8405cff42241194339db8b404ea216d60433f00ed67b0cdcd9e29d21355615d967161db0cb04c": "0x040000000002000000000000000000000000000000001f5354414b454e4f4445207c2056414c494441544f5220414c4c49414e4345000016407374616b656e6f64653a6d61747269782e6f72671b6a696d6d7974756465736b69407374616b656e6f64652e64657600000c407374616b656e6f64655f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f0d8890ee3f281f94237cdf8ab6530170cf7256c211e15b3a53100bd495cd668bbe4de875741450": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32380f42696e616e63655f6b736d5f3238000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f151dc76721212cf68991c22752cfedfc52627d3fea5b6e138260c09a7bd3941a9bc27b0379dc72": "0x00000000000000000000000000000000000a7761666120736162650573616265000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f188f90ed9c0ccc0e2cf389e3f53bc3ab0777b1678b1fa13b9c6a8e428695928275ba1cc029bf7a": "0x00000000000000000000000000000000000c4976616e2052204d6174680000000000000b406d6174685f6976616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f1b8b6e45fb190ccca9cb5657907dcb0bb01d335b17564e77994536edd05ddd50524a9355c2221e": "0x040400000002000000000000000000000000000000000b5072696d61204c616273000000167269656765726a6179333840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f3e0959896bb537d25b05b9887ec97dc7b078d84d04a619575bbc450478c6d97d0772aba1865b77": "0x000000000000000000000000000000000009584361737469656c01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f3f48a63730ca8508a514f13e955ec5401a19e0b64d325cb87a4ff62e50416ef73a834c99493b2a": "0x000000000000000000000000000000000009446f7473616d61780000000000000a40446f7473616d6178000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f4d5cce600e2badf85068f05bb04fc1d830745102b649680d7dd589524792942e24232ddbcff40d": "0x040000000002000000000000000000000000000000000b4541524e535441534832001668747470733a2f2f6561726e73746173682e636f6d001367726f77406561726e73746173682e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f5c79ebd9a8464fb49d5777c5b6aebd9aa9a597ec5cc2e160c9657dfb261ef76752ff7b51781a16": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f656b807ac9334d44d80863e2464a745a3eaa65cb6a7a336d86bd0390f75981c8e4735038a2d974": "0x0000000000000000000000000000000000074372696d656100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f690a20b95f47ba3e892614b6c645f4f0d3d757b5300777b6d6730f024a8181925e9cd56376c86a": "0x000000000000000000000000000000000008476176486f6f6408476176486f6f6401010100000b406761766f66686f6f64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f79e21c0cc427bbac2b14d62dc0c216e459037f76d0dc6f788f48976db1357ed97bf2dbf48a991e": "0x0000000000000000000000000000000000104d6f6465726e2e4d616e64616c61731343616d65726f6e20452e20476572686f6c641f68747470733a2f2f7777772e63616d65726f6e676572686f6c642e636f6d011343616d65726f6e406365676172742e636f6d000011404d6f6465726e5f4d616e64616c6173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f86b540db6a05d1d635393a4855e718ea723244ecd115bfbf129fd71e44384f107bcc6905069f7b": "0x00000000000000000000000000000000000574616c6a07496b61726173000f494b4152415320564142414c41531450686f746f74616c6a40676d61696c2e636f6d0000074074616c6a33000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145fb6a4114e90fbedc87dd7c321ad3dca39e53d05541bf9d17306d681ab556029b0f172156e12b603": "0x0400000000020000000000000000000000000000000009636172676f6b736d00001740636172676f6c6576696e3a6d61747269782e6f726715636172676f6c6576696e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145fb8bcd13578776d68fc7e1c641c663f8507e074bc989b520ec2c33b0733bd377ff67ccea372a035": "0x0000000000000000000000000000000000084a43727970746f0000000000000c404a43727970746f474d49000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145fbfaa2a1a2510a7525c7a721c51b453cd55ceba8c86d183b45cdeb531c582159f21a05bb1122270": "0x00000000000000000000000000000000000f7370656e63657220766f74696e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145fe706d242d60b74f2fe5db865ff1f5e647cdacecea78d89979dc8b00c22d10cf52692937e948c28": "0x0000000000000000000000000000000000134d697363686965766f75732052616e6765720000001c6d697363686965766f75736d61726b657440676d61696c2e636f6d000011406d697363686965766f75736d726b74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145fe9709101b5cdf4e4d04514ed98bdef66d61cb7d50504a675095499e3a08b6f70e55e136af1654d": "0x000000000000000000000000000000000008424f524f42494c0b4a4f4e20414e444f4e49010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145ff08099f8e90061ba99d08e1e0ba1738bd68e07bcfdea7f486400921abd04b9e1dd1ee6b8cea322": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714601c869e08b51af7b04b58ffedd058a81a625819d437d7a35485c63cfac9fc9f0907c16b3e3e9d6c": "0x00000000000000000000000000000000000930784b68656f70730000000000000e404b68656f707343727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146023f967e8019e7b344cb1cfad3f1924dfc180169cb9bded8af74e5f457f6528272093398f46fe62": "0x00000000000000000000000000000000000d4361745f4361746f77736b6912456b61746572696e612053686972696e6100001463616465747377617940676d61696c2e636f6d00000e406361745f6361746f77736b69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714603d476d63191d24744b0a7d18985d2a3527d9d2498822644667f042af46231f51eee5bdbbf2b75d": "0x0000000000000000000000000000000000096d617276654c6574001d68747470733a2f2f706f7274616c2e61737461722e6e6574776f726b000000000c4072756461797275646179000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146041d27bd4e9040932abc1ad7749a511ed7b24f535f0908561cd2f8d550e7f9689ddcf285bfcc845": "0x00000000000000000000000000000000000c54686520466f756e64657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146046b114806eb5a2b4dc5c71e24bd3c05768294b875060b54e8b7663ae9658eec8b9f99568bb6e60": "0x00000000000000000000000000000000001341727420696e206d7920756e6976657273651341727420696e206d7920756e69766572736500001361696d756e66747340676d61696c2e636f6d0000094041696d754e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714604a48dc92e39be9fa9d24f035ebf90c61da552b2317dd1703f5a216e4b02786af26f8b41f211e35": "0x00000000000000000000000000000000001043727970746f53706163654d616e58010101010000114043727970746f53706163654d616e58000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714604c2e1bdbd6e3e66aac0cfe2a889556f28599f18da991a0a352b26f3d59c81961385eaf6f037c3b": "0x00000000000000000000000000000000000b417274486175734e465401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471460672f43cee923df4a4c04c002c7c58fd79b886d649cc5ed9367d5c1ec17e8946fafeadd9f17067c": "0x0000000000000000000000000000000000054b617465054b6174651b68747470733a2f2f6c696e6b74722e65652f626f6c696b617465000000000a40626f6c696b617465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146067f41bd57795d6945e90a1afc83f0c74a3ffe96b40c4ebb5397af04126bc2db23036c043be4a63": "0x04010000000200000000000000000000000000000000134361706974616c5374616b696e672e636f6d001b68747470733a2f2f6361706974616c7374616b696e672e636f6d1c406361706974616c5f7374616b696e673a6d61747269782e6f72671b737570706f7274406361706974616c7374616b696e672e636f6d000010404361706974616c5374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471460707c14d6e8780e128e3b8a2d3b98071ba399c17206f84350e65653537dbbd646cb5908efff9d49": "0x040000000002000000000000000000000000000000000f5a6564617a69204361706974616c001368747470733a2f2f7a6564617a692e636f6d13407a6564617a693a6d61747269782e6f726713636f6e74616374407a6564617a692e636f6d00000f407a6564617a696361706974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714607fa85c571cb935f0dbc94eb3d3fde9a2fa187c0ed37d158bdcbd48374ecc306373f222e19a860b": "0x000000000000000000000000000000000008465249454e445311636f736d696320706f72747261697473000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471460b67be86271e2f36e99996cc6c41e39696f7c3bc4248e548473b68fe2ba26567771be07b7eb5b19": "0x00000000000000000000000000000000000a43415354414b494e470101011963617374616b696e674070726f746f6e6d61696c2e636f6d00000e40436173745f466f726b4e6174000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471460b684ec999e7b776c064ffd60471f3c2adf674a02e6ea11ce28f1981dca3394b86062f94aec3112": "0x00000000000000000000000000000000001242494c4c494f4e414952452020f093858201010121626974636f696e2e62696c6c696f6e6169726537383640676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471460c583d95c1213880a72a8935ecfe766b95282b1902fb185171bb302d78bbc27dc5c89c25ef6c37d": "0x0000000000000000000000000000000000094e61726973657469000000196368616e752e6e6172697365746940676d61696c2e636f6d00000f404368616e753436313836313331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471460cdf0b66deac356a06c780ffc2b9de1aae95dbcc7571e99639a5bd0a4646a9ccee387964be8837f": "0x00000000000000000000000000000000000a6f7a63616e20646f740c62696e616e6365206b736d000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146114e2b6ec2830667a196ebccf96edb47307cda78135c6b89259a9f4a747320a379c6fd81127b367": "0x0000000000000000000000000000000000034d4a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714612039a711b36f21e810732f068b79d01edcc9aed808c3bf25efa395f8dd89ecf8f282cbebe3092d": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f343600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146138eb274d27f0c5a4ce39d360532d50a6c69d07829c49cd7e6578a426f2e99f2b09cdd287cb9805": "0x0000000000000000000000000000000000137a62632d776f726b65724f70657261746f7213e4b8ade69cace881aae5b7a5e4bd9ce5aea40000113439303539333632374071712e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714613da82c3ef33267be14004eaae54231bada9111a86e3fa2fec1e94229b2d716bc90311cd75f1a65": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34350f62696e616e63655f6b736d5f3435000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146159604e6072a968e4f7e1546f461407d77e0147cfd55b204c151c6f6f5c3d121d93619bb208e576": "0x04040000000200000000000000000000000000000000096364626169626169000000136a69616e69406c6974656e7472792e636f6d00000a404364626169626169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146162ae27b1f4959cd2658699891fdc5afeea90415ba58333034b6e831e5c9f14c5a72a1abf10bc7d": "0x040000000002000000000000000000000000000000000c44656e697320476f6d657a00001a4064656e6973676f6d657a2e686e3a6d61747269782e6f72671c64656e69732e676f6d657a31373139393740676d61696c2e636f6d00000e4044656e6973676f6d657a3937000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146163414a2df709441a5eac9a90f7102af1e06c3c94890e49e1fddad6086afe119f3477a34a098255": "0x00000000000000000000000000000000000c6b7573616d61206c616273000000166b7573616d612e6c61627340676d61696c2e636f6d00000c406b7573616d615f6c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714617838b6d37dd7945ef462a72d35939b5584e9a29b33af86b356ce709bf022029f075991de1cdc4c": "0x00000000000000000000000000000000000944414f20495043490944414f20495043491168747470733a2f2f697063692e696f2f000d696e666f40697063692e696f00000a4064616f5f69706369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714617d0fda1940698d00834960bbbc5d62f484f8dac939fed0d34781de56ca24596cd29728962d1f17": "0x04010000000200000000000000000000000000000000044253441342617264757220536f6e6e692044696d6f6e0000126d7264696d6f6e407072697661742e646b0000114044696d6f6e536f6e6e693431303730000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471461811f3dd86470107a377b96be092a5ef4e78cba0b9d33be2206d0ab6d31ebf6b9026f9bdbb84f51": "0x00000000000000000000000000000000000745626c616e630101011d6361737065727363686e61757a65722e313740676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714618fd93a58f35389e2680e2c991a18cf7ba4710a51ba147b6856879a3047a03f8c647c69b953d630": "0x040300000002000000000000000000000000000000000751696e77656e0751696e77656e00184071696e77656e3a776562332e666f756e646174696f6e1771696e77656e40776562332e666f756e646174696f6e00000d4051696e77656e5f57616e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714619bd5898686aa365c4c4cb973301ccba822fd2d525c9ada03e8ded3a3c396e4bbf0e2107101e558": "0x04000000000200000000000000000000000000000000074c75646d696c000000146c7564646f6236373140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471461be688e5e7a221af444917451425779e3e5d876f510ff63599e80cefd31b596fd03d2a0fdf8a658": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471461ec8191fc5989284252e6ae566173032638ceba452106c90dd62a83b9f56f32d87a8a5cf7156a7c": "0x0401000000020000000000000000000000000000000014f09f8c9f20616c6578616e64726120f09f8c9f001c68747470733a2f2f616c6578616e64726168656c6c65722e636f6d0019616c657840616c6578616e64726168656c6c65722e636f6d00000b40616c7868656c6c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471461f27b90121cc03394243fe719e35099e11473b7e357af29ba960e0c0dc92ec37a04278e2760df1f": "0x00000000000000000000000000000000000b57616e67646f6f646c650450617400000000000f4077616e67646f6f646c65746677000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146202f221c7d24475766f18a6eba78487bc0e570108e8c80d864be67c5bb6f8242420c0f43c955c1c": "0x040000000002000000000000000000000000000000000f43726561646f72657320576562330000001863726561646f7265737765623340676d61696c2e636f6d00000f4063726561646f72657377656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714620f714edca8297ae21e94b7c05630c70ab2867d6f30ec737042ed4525baf9b920b8df5b3161aa2c": "0x00000000000000000000000000000000000b4a75616e204541476c650000000000000e4077336e6a75616e6561676c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146244e474aa91e041ae9749dfdee466ed67835efa51f04d74db27d75e919d7050e4f5b7f481f77a14": "0x0400000000020000000000000000000000000000000006535052494e00000019646f7473616d61646f626c616a6540676d61696c2e636f6d00000b40736172615f74726d73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146269f1c102c0bcd962088931a549261141670f3076ea53eb7fb0af2d5717fefbca6d16ca48eeca32": "0x040000000002000000000000000000000000000000000751756f72756d0000164071756f72756d6c6c633a6d61747269782e6f72671971756f72756d6c6c634070726f746f6e6d61696c2e636f6d00000b404c6c6351756f72756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714628acd4748784be3a2da2913d7db19baf0a41dc40a73d75bc6001ce1691c3ded78e4e86387881b4c": "0x040100000002000000000000000000000000000000000b43686f727573204f6e65000000126b7573616d614063686f7275732e6f6e65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714628be056de9c8868da02ca3758e9d65bfa5ad00f3a258996a96f49323635e11866ec4d8924b8e316": "0x00000000000000000000000000000000000b53706972616c7761766513436573617220416c6265726469204469617a00001673706972616c776176653740676d61696c2e636f6d00000d4073706972616c7761766537000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714629a4d1544110b26a8f85ce44267618f170518db7da6321a685e61838d3efde0d62d46a10ea16b20": "0x00000000000000000000000000000000000a4a756e7175656972610000000000000e406d7970726563696f75736678000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471462c58c7418228d6852310e6542cccdcab43d1104aa442792b3198b67913966b339ae8303b7b8f010": "0x040000000002000000000000000000000000000000000c444f545f4b534d5f53544b00001640646f746b736d73746b3a6d61747269782e6f726714646f746b736d73746b40676d61696c2e636f6d00000b40446f744b736d53746b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471462c6144c430228802e62b548856a9ff975d160a0df8219bd36a7807620ac1ae2eeeb34498ba3e470": "0x040000000002000000000000000000000000000000001064656967656e76656b746f722e696f0000194064656967656e76656b746f723a6d61747269782e6f726715696e666f4064656967656e76656b746f722e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471462dbdca0ca2af18f4c440cddf43c86794b066df57248545bbfd487ca4bb653f97efca73d1c4c1949": "0x0000000000000000000000000000000000065365646c6f00000000000011405374657070696e5f52617a6f723737000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471462e240b15fe5fc9d40750e87a8eeb07ffb982670415979c0b6b8c33c27aa81c621b5c96df3148520": "0x000000000000000000000000000000000004524b4f08524b4f204152541f68747470733a2f2f6c696e6b74722e65652f486f757373656d3133524b4f000000000f40486f757373656d416c6c616731000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463168c77524eff6872b83296f11b567d5dcfae7f23e88b1d4c33216002a6bb6a3892a801d4ca4c0f": "0x0400000000020000000000000000000000000000000013436861696e53616665204964656e7469747900000012696e666f40636861696e736166652e696f00000d40636861696e736166657468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463182e6ca878bb873e459ba69f3cfc7148ceb115a6be76c18bd69773eeeb6b5bd5240d3233ec0014": "0x0000000000000000000000000000000000104d69636861656c20446f75676c61730000001a6d69636861656c2e646f75676c617340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714633914b3a4ceda021eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef4843": "0x040000000002000000000000000000000000000000000e416c69636520756e6420426f6200001a40616c6963655f756e645f626f623a6d61747269782e6f72670000000f40616c6963655f756e645f626f62000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714633b64caf2f93c5bd8856a8b804829eee642bf2b6b516e28958926179cf089338f2ea81a64470152": "0x00000000000000000000000000000000000b6d6f66666f5f6a6f6a6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463415cea64dd2404ac41d6bb0835464e8428f9393e3edd73b74aad6d978a9870ecf4e7eed1ed8c0d": "0x040000000002000000000000000000000000000000000f68656c69787374726565742e696f00001b4068656c69787374726565742e696f3a6d61747269782e6f726713746f6d4068656c69787374726565742e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463469200c98418da9e91c0029b5a22ff3799a39634f2cf1e89060f4acd5ab2855a4b91fae1150a3e": "0x040000000002000000000000000000000000000000000a506f7765724c61627300001640706f7765726c6162733a6d61747269782e6f7267146d696e7a756b76696b40676d61696c2e636f6d00000940564d696e7a756b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146354c3c5f32f80e56ce8f0f322c021ca4991c83240d0feb94ad1678835b51d228999252bf9223e49": "0x0401000000020000000000000000000000000000000020f09f90b05f2e2de3809020435259505449445320e38091202d2e5ff09f90b0001668747470733a2f2f63727970746964732e6c696665154063727970746964733a6d61747269782e6f72671468656c6c6f4063727970746964732e6c69666500000b40637279707469647338000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714638103b9b7fd6d8154902ac86eb3bc2e1ecf30533e2d9f1f1b034ac0dd35ff41f44da47384646169": "0x040000000002000000000000000000000000000000000669616d7a73037a73000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146386fd585f1ea07542a041a8ffd0a0de1d7a09e1de1635a8fec8d94f3410ad806111ecc9e456a14d": "0x0000000000000000000000000000000000094d6f736772656174094d6f7367726561740000166f6c756d6f73733230313940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714639f42b914578e805412791fff5f735f273124674635bdae68a09229b99bc0bbd1ae0edbe83a9b05": "0x0000000000000000000000000000000000074e5f4c6f6b6913456c697a617665746120536f6b6f6c6f76611868747470733a2f2f696e6c6e6b2e72752f414b644576770018617274656c697a61766574617340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463ac3c1368e584e17277877d44db05f92e11933c218cb6a0521f24896c2406e5aa60fefb204cd72a": "0x0000000000000000000000000000000000114c616c6f204d61696e204b7573616d611c4564756172646f204a617669657220476172636961204c6f70657a00001b6564756172646f2e6c616c6f3139393940676d61696c2e636f6d000010404c616c6f313939394a6176696572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463c5b9775db401c68e303bd9a1d343eb4a0b4bde59e42981bfcf6e0013b87835529233cbacb63e2d": "0x0000000000000000000000000000000000094a61636b6e46696e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463d7ad13e4a5e5d66c7794b3f35a9636f38ce0e7fbc035b445f7d8cb19d2eb1c4deee97ca8e3dd6f": "0x00000000000000000000000000000000000d6b7573616d612070756e6b73046b73701968747470733a2f2f6b7573616d6170756e6b732e636f6d2f011a6b7573616d6170756e6b7368656c7040676d61696c2e636f6d00000d406b7573616d6170756e6b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463d8eec7a22e3fe26f3913b4f1a51729f61ec915230c7de2a7d577e4da9034d02e3d047a9498cddb": "0x00000000000000000000000000000000000f4b41424f4348412050415241494400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463e692f33df6177fccbd7176021b4da713cb1d0acfcd28fdd2ed0657f34d7341e055160e67a5ce64": "0x00000000000000000000000000000000000a796573626f72796573056f67757a00000000000b40796573626f72796573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463e7faa7d3930e42c443fd5caf9808af1b7a5586e7717f4f85ef6d4762d0ed1aa98edb83577e957b": "0x00000000000000000000000000000000001041727420556e73746f707061626c650000001f6172742e756e73746f707061626c654070726f746f6e6d61696c2e636f6d00001040417274556e73746f707061626c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463e8632182788bd60a439f839504ef07c5cf8daf62beb17546e808ed1026c8a683be8207245f300f": "0x0400000000020000000000000000000000000000000018556e69746564205374616b6573206f66204b7573616d610000001c756e697465647374616b65734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463ebead6dee4cc021cb5747641960389b41372ddf6c5eb13b7aca0e06193dc732c9975c2feacae3b": "0x000000000000000000000000000000000008546865204f6e6501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463f0045ef18b9c5c9468b8cad284058b157ef324f85ab25a84e890efc6d08b1068df790d06387953": "0x00000000000000000000000000000000000101010101000009406d657663686562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463f0f91780f2ce733674264b4be5fccb6e5b960a8259e2920a7d5a85774560360b76c2e219983d78": "0x00000000000000000000000000000000000944656c6f7344414f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463f4f567548c9f8c2843d91b23b106e3020b7a903da075113d1aaca1db7ac30e119d6250fb6f5961": "0x040100000002000000000000000000000000000000000b48595045525350454544000012406c6f6b616c3a6d61747269782e6f7267146c6f6b616c40687970657273706565642e6175000009406c6f6b616c7070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463fce0f80bcc10c07006f88b83702ddc8509429bb2d29e8b0e538aa42f01b495f269f358beae5635": "0x00000000000000000000000000000000000853616d7361726100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714640c0a62703f8c354ae4661aa6417a9200e77acc80beaf8222c4d6c43318e9ce44bb4827ba401a24": "0x0000000000000000000000000000000000074e61696b656500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464127eaeb41ddf9d8e73597eb622ce0a2ea8c15674502d2099bbc62cc9251269d31bd1fc0a56bf7f": "0x000000000000000000000000000000000007436f6361736f0000000000000c40436f6361736f73616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146419f57ea3f84915121b12be1a2b918b9d01ff05c3d2fe5a28769cb747ff9fd7ecafc320dd5f810b": "0x000000000000000000000000000000000010446f74204c65617020456469746f720e4272756e6f20c5a06b766f72631f68747470733a2f2f6e6577736c65747465722e646f746c6561702e636f6d0113656469746f7240646f746c6561702e636f6d00000a4062697466616c6c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714641ab77a8f62130ee4b0ce3fdd2e23b0be2314a084becb2f782302768fd25900e51b241c6a8b8b2d": "0x00000000000000000000000000000000000b506c617a6d617469636b104d61726b6f204d6968616c696e6563127777772e706c617a6d617469636b2e696f00176d61726b6f406d6968616c696e65632e73747564696f000010404d61726b6f4d6968616c696e6563000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714641f551ea31b85752a6cfd49c515150a2daf15df3dd7e94d3bbdbad7a2f2c47651b1cf12fc0b0a44": "0x0000000000000000000000000000000000076a6f686e647912416e647265204d75736573616d62696c6901010100000e40414d75736573616d62696c69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464212dfe8be1489d70ab4d54ff22e17eacd7d1a393811b4c555f60803c068e64470d74d55ed2223d": "0x00000000000000000000000000000000000a414e4f4e594d4f555301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146436bbd870b62a0a0475fa54014587f4211cf4bb360489a63b4e0d7c4dd03e2cca08bbc5adfb9f57": "0x0000000000000000000000000000000000064a6f72696b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146451faf4c30c21127c329830176364028bd694be68b8e62b1cc3508a6779889926b6cc2a22d8d574": "0x00000000000000000000000000000000000a486173685370696b650000001a686173682e7370696b654070726f746f6e6d61696c2e636f6d00000b40486173685370696b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714645a2111e24537a2c088a8a35f9a31008c7ac0d4103078bb14b3d50213e4b92bf03ea98c081f173c": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464680adbdec0e1af3e2256acd251ae7db0c356b5b5aa4d67adbf25281d9d074d364d57398a60b31b": "0x0401000000020000000000000000000000000000000009457667656e526164001b68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b1540657667656e7261643a6d61747269782e6f726716657240726f626f6e6f6d6963732e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714646ace64bb54bf1ca6b6d86d75692bc3d6f3c2c9b83173ce3b9e5e738adc16009c5d4a0d80e36c31": "0x000000000000000000000000000000000006517561647300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146478c35322287a2a38bc40bd7bb3dc77516be2d9fd9c02168506073728317baafe272267873ce80b": "0x00000000000000000000000000000000000d4d6574616d6f72666f7a7a7a00000000000010404d69737465725f4368657272797a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146480d6c21997bbbbd278adfb237acd334f2939c917a94a5acdd972ed468a743e7c562a6f1bf6ba27": "0x00000000000000000000000000000000000476764b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464850ed977f64df0a49a4bc7683f6ffd027b75a783f6c5b182a633a22cc0605ba0abd470de9def5b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464acb2a5e7697e7428778f95bd35e3fec4ee72a0d252c47097380c3ffdf93a9600b364ea119c0502": "0x0400000000020000000000000000000000000000000012524d524b2e617070206f6666696369616c001168747470733a2f2f726d726b2e61707017406272756e6f3a776562332e666f756e646174696f6e0f68656c6c6f40726d726b2e61707000000940726d726b617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464b2511e92b6677ab1e8b074b1c82002a33e63338a04b974107769099111637275514fb0cd740978": "0x0400000000020000000000000000000000000000000017536e6f776272696467652042656e656669636961727900001d40776861747265676473666f64726a6b673a6d61747269782e6f726713616964616e40736e6f77666f726b2e636f6d00000e40736e6f77666f726b5f696e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464b6eda43f595223dcbb7ca8b988aa2a9771a34d8ddde1bdddc4177d021a87a2e6559b58a4252d57": "0x0000000000000000000000000000000000064d6174745800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464bcffa5a054b3fbf06b28b48291aaf2818a2bf2276ef4bfb2702c9b1a651b58c8bd45c91d926d3d": "0x0000000000000000000000000000000000114d61726c75612047616c6c6572696573000000000000104054686547616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464c69542e90ec9f70223f0fec2f4aa58a1666aad88ff105170d3cbc67343f17070fa95047d0aac0a": "0x0000000000000000000000000000000000044e6174084e6174616c69610000126e67726f6d6f76616140756b722e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464f0f0b4da5c0746d0354e9fe5a5be336577b8759695e5c13dd9e07bd2bea414f2a47b88c2cca867": "0x0000000000000000000000000000000000044e656f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464fffce989e2fabc6a0051ef580a2b9dd19a368b82ec20f9a605b0207f2e8d364e6c985b5b2ba871": "0x04000000000200000000000000000000000000000000064d49444153000014406d6964617338393a6d61747269782e6f7267156d69646173676f64383940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714651097b4998394e146d1b7fd733a68d1c3e53d6bfd7134a5803fe5a4033c2dc9eba2e31dc21c4a65": "0x0000000000000000000000000000000000076272656e7a69000013406272656e7a693a6d61747269782e6f726700000009406272656e7a6935076272656e7a690000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714651f9baac64c847fb004ba829fae5aec26aaa3aef02d67856a32c161d3d50807a17338bc06592a74": "0x0000000000000000000000000000000000056b736d6300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146522b168b23b5549d8e1ead6bf0091994d15f0df75afd35759da29eba0512ce3913b668fc656a229": "0x000000000000000000000000000000000007457572656b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714652d11d1e91fe674e0588915142c9ed7cad4b2abeb48263fca36403643561fb0929da1949c983160": "0x00000000000000000000000000000000000c4d6f6a6f2053747564696f0c4d6f6a6f2053747564696f00000000000f404d6f6a6f53747564696f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714653cf62e15004fa7a68f012e4e382e5eb35895b62f3184be8aa381109bd6a270d661c05ee8565930": "0x0000000000000000000000000000000000086d61657374726f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714654cf21a2fd00f055e520486d48edd5e6f31158b9960a0673503235c10135a57c147389815412162": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146553c10b93169dc66e8a3622a7355ab70892bc48236c461076d5163f55309b7e5d0a459d17c6272a": "0x040000000002000000000000000000000000000000000d57696e746572737072696e670000194077696e746572737072696e673a6d61747269782e6f72671477696e7465726b736d4070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714655dfea04bf9ae01f8b3e568239aaf85034f6f4a28e4d6b90a57ecf04de0005531f141d849aea160": "0x00000000000000000000000000000000000b417374726f4d6164647900000017617374726f6d61646479313040676d61696c2e636f6d00000c40417374726f4d61646479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714657b24569b4318acd6e71489d5d3479fb29f2f7cf4b3a9534f72de76d0d76880066362330f818c09": "0x000000000000000000000000000000000008444172746973740a5065696e2057616e6700000f777065696e406c6976652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714657f579f3442148eea0ab1b08b58a3708b50ba9928c4e25ad71d68efcbb868a2f75b987d0e8e4108": "0x00000000000000000000000000000000000a575252696368746572000016407772726963687465723a6d61747269782e6f7267000000114063617473776974686f757468617473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714659226a0e9136adf1010b8a9bac58b959a3b92e0ff6a1a2946d36a543b8f8d34a70f231c91f73313": "0x0400000000020000000000000000000000000000000010426c6f636b20416e64205768697465000018406372697374695f616e5f6d3a6d61747269782e6f726715736f6d6574696d65737340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146595beebc30abfa94e56d4889d3aed021503759b7a8428959648af042d123e2a8f495179ee7abc53": "0x00000000000000000000000000000000000e456e72697175652040524d524b00000011456e726971756540726d726b2e61707000000d40416c706861697264726f70000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146598a12412759f6926f23bd836ee246363cf6151d26b5d323c077e5d73697de6ea099d1e8368b937": "0x000000000000000000000000000000000007e5b9b3e5928c0000000000000e405a6544617343727970746f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714659cef47a15bd68424401b30707f2ef5ffbcf62a082f989655d8d542f4b49f2d0cef0e4bf622bc6b": "0x00000000000000000000000000000000000c43727970746f57696e6773001768747470733a2f2f63727970746f77696e67732e696f00000000104043727970746f57696e67734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471465b47ab9f3aec5ec06e3ed1e088da56a1e7ea6b57a856a0ead9e03bfbbd1ec74b33153e35015f10a": "0x000000000000000000000000000000000008546f6d69747a7500001440746f6d69747a753a6d61747269782e6f726712746f6d69747a754070726f746f6e2e6d6500000940546f6d69747a750008746f6d69747a7500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471465bc13bbec192777643ccd0e9c3470bced3320d37d632da5fa7a7f13eda60bb6ca83ccb2ba0f495e": "0x000000000000000000000000000000000006504c55544f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471465c283803e3c51bba2c30b2305139eb8d015e3eef8b71accde489c01030153ee2599a5de59dfe869": "0x0000000000000000000000000000000000155449515549205449515549204d494155f09f98bc00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471465f501be466f9b4b4c476e3612a313e1ce03f27e26affdf86137396fd1d38fee5b8902c9f0892870": "0x00000000000000000000000000000000000e4d75726174204174696d746179064d757261741c68747470733a2f2f6c696e6b74722e65652f6174696d74616b757300126174696d74617940676d61696c2e636f6d000009406174696d746179000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471465f65e549ed519ab389ab756df0ac71f85739a5ad44971dcd1f0afaf783daa1007cf3589c94fc1f3": "0x00000000000000000000000000000000000a436861742d436861740000000000000d404368616261737469656e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146644353ed65ec6a1589ad5b4e32f5317c485258bad05fab5a0d716971f7832fb565d6037ef4be95f": "0x000000000000000000000000000000000010556e636861696e6564204e696e6a61011c756e636861696e65646e696e6a612e737562737461636b2e636f6d010100001140756e636861696e65645f6e696e6a61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714664fe17c743b2df5d09338c5be5ef14c6d2e27a0ac9e65ce1167d13a79584cb684cd11a9b7f1b977": "0x08000000000201000000050000000000000000000000000000000006416c65785600000014616c6578676d696e6540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714665285c8d09dbb63b44cc7489f7ee065a888cb76ad104715a6a9ad5b0d2be070949985734fe32f39": "0x04010000000200000000000000000000000000000000196f726c6f77736b692e696f2076616c696461746f72202331104c756b61737a204f726c6f77736b6913687474703a2f2f6f726c6f77736b692e696f00136c756b61737a406f726c6f77736b692e696f00000c406f726c6f77736b696c70000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146652dea770af814592374b554ae5a1ce10e87eaf0b25b26d3d2680fb9bd59b32e203ded3a2936471": "0x00000000000000000000000000000000000d4e465420426162616c61776f0000001d6d69636861656c2e616b696e6d656a692e6f40676d61696c2e636f6d00000e404e46545f426162616c61776f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146663c4bca0fcc63836af143c60658947d49e753293cc454dee77beead3b919ce47c3467a12f6266b": "0x00000000000000000000000000000000000a596f75646c6544414f0000000000000b40596f75646c6544414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714666400683ecf9c61ac94924e4f863b0d6b74957b1641de4cd23dd809276a9f8ae5dc32c5eefb2717": "0x00000000000000000000000000000000000b576176696e20476f6f640000000000000c40576176696e476f6f645f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714666ad47322da5d72a62b6efc3312fabe517bf8e1f407a00a676bf2112161ed1daeb0f5e784208b43": "0x00000000000000000000000000000000000973656f73657263680009776172702e777466000000000a4073656f7365726368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714666f15289c2f579fba6b7bb322f0a9aecd1faa52f835110cfb228107676c28771a2a024a2bbdbf53": "0x000000000000000000000000000000000003454400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146670b1e816a2cedaaa2b3e0a8702aebcb83d552838a17902b2403b0f16c4e52a4514fe02df532e3c": "0x040000000002000000000000000000000000000000001af09f8c9020646563656e747261444f542e636f6d20f09f8c90001868747470733a2f2f646563656e747261646f742e636f6d001661646d696e40646563656e747261646f742e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714668bbbac68a19cb7a02f7333e25590e4f568ae8a2ddc93a879e92e48fa3cf1666ac56e020c106d55": "0x040000000002000000000000000000000000000000000b436f696e53747564696f0000001a636f696e73747564696f4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714668ce779b7a9f3801e76b9da6373b204c3db21d2a7097a79afcf32f642a516980ae26c910e70a35c": "0x040000000002000000000000000000000000000000000a4b5553414d41424f5800001740616e746f6e696f626f783a6d61747269782e6f72671b616e746f6e69676c6962657274626f7840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146699d463bc3acb0176df0017195b220a733f294a1835837a8a8ec22d66deb8cacfcbeccaad77e748": "0x000000000000000000000000000000000005517565730000000000000a40717565736c6f7264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466a0ec80cc3122c082bf733f44a840f0a5c1935a002d4e541d81298fad6d1da8124073485983860e": "0x040000000002000000000000000000000000000000000b73616d20656c616d696e0000164073616d656c616d696e3a6d61747269782e6f72671273616d40696d6275652e6e6574776f726b00000b4073616d656c616d696e0a73616d656c616d696e0000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466a17448b8730ba3089e132a7e8fe6484138542c6e44a303d0e66750a9381730bb421a28cad7f033": "0x00000000000000000000000000000000000777616c6c657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466ab20bec2c8842b5c7a60ff74811eee72747ef1f1ae376eda2d3c8aab129f6c2cc76abaf59fb87c": "0x040000000002000000000000000000000000000000000a486563746f723c423e00001840686563746f7265737430363a6d61747269782e6f7267156862756c676172696e6940676d61696c2e636f6d00000d40686563746f726573743036000d486563746f7242233936313500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466b6b504ec5881431a57245f1409f422242aefe885d3b0c7227cfb00aa278c6b84e34a803c14eb7c": "0x040100000002000000000000000000000000000000000c415245434f4e542e70726f14417265636f6e742053657276696365204c4c431568747470733a2f2f617265636f6e742e70726f2f1840617265636f6e742e70726f3a6d61747269782e6f7267117765623340617265636f6e742e70726f00000d40617265636f6e745f70726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466c21eb278416a36b6217be75d0c62d8fe8d921563198f317fc92f65025cf3d1d1bf2cab9b7cf732": "0x000000000000000000000000000000000014504f4c4b41444f542e4a53202d20524f48414e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466d2ce8502374c4f9c4f65bbb181e89e5539eecf3cec64c02ff858973646fff1a72563e8fe81044c": "0x0000000000000000000000000000000000064469706c6f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466d850d0167dfb3ff429460ae52548e754c712a7cfc75f1bf7c9295da165293ca52ccc686db5c02d": "0x040000000002000000000000000000000000000000000a5354414b4550494c45001a68747470733a2f2f7777772e7374616b6570696c652e636f6d16407374616b6570696c653a6d61747269782e6f7267147374616b65407374616b6570696c652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471466f1abaccca5dc5ea22523537072ddf4b80dfeedc797c613e8c2452a7f82f810b6e30ebb7281843e": "0x00000000000000000000000000000000000942617274204b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714671d243feb29878cc23a09ccefbe0b2e0bd6ca9e44ea9f9f566180c324f0ee94d750493b2a90d364": "0x0000000000000000000000000000000000104469676974616c20466c6f7269737401010101000010406e6f6d616463727970746f677579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146736de782d724588d2777ebda943e55cb791aa8437709ef3bb53c3231bd91a75b835439dd6ef4663": "0x000000000000000000000000000000000009536572676579373500000019736572676579736f6c74616e303240676d61696c2e636f6d00001040736572676579736f6c74616e3032000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714673b3b4a1ad50d479c644791dc08755b8abe4530f04692c895f2a4a93ab128acc17fc4fc0808372c": "0x000000000000000000000000000000000007477575676c6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714675581c1eea085a9d8dba69752ffb04fa563b126a31b037c8bebeb73e3c66cacd7c8efab46bd3423": "0x040000000002000000000000000000000000000000000a70616e6472657339351d5061626c6f20416e6472c3a97320446f7261646f205375c3a172657a1868747470733a2f2f7061626c6f646f7261646f2e636f6d174070616e6472657339353a626c6f7175652e7465616d15686f6c61407061626c6f646f7261646f2e636f6d00000b4070616e647265733935000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467568de3317e474e9a64ad79179d3f9e018447fa67d8d05d92f0d82e4dc731d14e516ae10a25d924": "0x040100000002000000000000000000000000000000000e496d627565204e6574776f726b001b68747470733a2f2f7777772e696d6275652e6e6574776f726b2f0016636f6e7461637440696d6275652e6e6574776f726b00000e40496d6275654e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146775a976f24cb02358805bce812d39a03405e454ea71401dbc7be353f65686c4c6bb30e656c8b76e": "0x000000000000000000000000000000000009486f6e6579706f741054657373616c69652046656e64657200001974657373616c696566656e64657240676d61696c2e636f6d00001140626f6e676d61737465723132333435000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467baf0838d6b1b2ae02e07f40a4d21e0d5fa5ff929adf8b9bfeacaf06bd5987b2741522b01ba4a32": "0x000000000000000000000000000000000011446567656e206f6620446f7473616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467bcc2ca4091537b5c7125e83d4230d1818f811230994a118ac01ccb73ceb2146a8a3f443ed75241": "0x0000000000000000000000000000000000056b61746f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467d3e4a96a4337066e31ecbbe0f191c3a02509dec5145e1bf73c7ee1ef086904b36a8a3fc249e138": "0x00000000000000000000000000000000000c4a6f73686573756d6172650000001d69717569717565697175697175653230313940676d61696c2e636f6d00000d404a6f73686573756d617265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467f3ca507a532ccb2e1884c53071526483b14004e894415f02b55fc2e2aef8e1df8ccf7ce5bd5570": "0x00000000000000000000000000000000000970657079616b696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467f85c2c7218fd6c409c3164dee58108840f004e49ad5abcc680714ede7ea4a064986f268e396e43": "0x0401000000020000000000000000000000000000000007434855525255000000195468654368757272754070726f746f6e6d61696c2e636f6d00000b40546865436875727275000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467fc0f66fe815ab410383630258381dd93b530a4c73fedb24d04aebe8cc7cc6ba4f7e008eef32f47": "0x0000000000000000000000000000000000066961676e6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471467ff75c4bc963c22fa77d65110d751716c8236da48f45bec37350fb0b36b6dbb8cef029fcba86b00": "0x00000000000000000000000000000000000c716267406576726c6f6f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146811e36909dc3ca59e42ace67151e0f94d4fd29937698d7ed05d8b5e663dde63c9227b0a3ae9334b": "0x00000000000000000000000000000000000a456c6c7920456c6c7900000012656c776972757a40676d61696c2e636f6d00000940656c776972757a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471468180e8198681ff7e0d744a6f291a2dc1e6d744d5ae0747e314b046739be170638ecc185ff4a9b5f": "0x040000000002000000000000000000000000000000001e624c64204e6f646573207c20f09f988e436861645374616b654b696e67001568747470733a2f2f626c646e6f6465732e6f72671340626c643735393a6d61747269782e6f726710676d40626c646e6f6465732e6f726700000a40624c644e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146819d27a5574bf9d52f1cc1b6904a99f88fe1a80a09959ec14bf0c4505cab1c13af31d107b817b22": "0x040100000002000000000000000000000000000000000a4269746368617267650f42697463686172676520496e632e1568747470733a2f2f6269746368617267652e636f001368656c6c6f406269746368617267652e636f00000e406269746368617267655f636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714682226526c5637c6f4e893116c799faec7c11176104e134077d0d1902ae545b9db21fd842a773362": "0x00000000000000000000000000000000000b4c75636163727970746f0000000000000e404e4654736172656d796a616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146823ed8df7d5f458c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51": "0x040000000002000000000000000000000000000000000f747572626f666c616b65732e696f001768747470733a2f2f747572626f666c616b65732e696f1840747572626f666c616b65733a6d61747269782e6f726717737570706f727440747572626f666c616b65732e696f00000d40747572626f666c616b6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714683a845d2e2728b9246469efac79c9f41621d250f07f19805a6596176d39826ce44253693ebd5b56": "0x0000000000000000000000000000000000084372656c6c657307546f6d61737a01010100001040546f6d61737a4a61726f737a3137000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146844ca75100b198bc4b1960de3e58b7b296b26befd8d2588871a3fdb9c58bc3240fb5fb279bc0712": "0x00000000000000000000000000000000000c6d617474616c6163686961054d6174740000186d61747473636f74746372756d40676d61696c2e636f6d00000f406d61747473636f74746372756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714684be26b14283aeb2821c06b6812ffe1a79be4b1374799e641b89dafdd961d79720c299827a05802": "0x00000000000000000000000000000000000c49636562657267536c696d00000000000011407472656675636b696e676d656e646f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714685887d42c2579e03839e4be40e252a56e2d7c8e89a0c8eb990df5910714fea61c6e1d3b1c4c5502": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714687a668789176ce3a262b69b9bfcc58a6707cd9d6d68e30f6815920b3df7016a0d0315b21a45901d": "0x0400000000020000000000000000000000000000000004474f4400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146887fb7291f50ec61ac3c67396f49987dfeb090be1ff560b8e00eaa42218093f3043e59a352e5005": "0x0000000000000000000000000000000000036d65066d65746f6f000012616c65786c6a6d40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714689719bd3780b5a8d031f202a2d2aee29aa291ddea64d37b43c9120519e5508a6eeb8b61b232c553": "0x0000000000000000000000000000000000084465657044414f001368747470733a2f2f6465657064616f2e696f00106579616c406465657064616f2e696f00000c404465657044414f5f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714689a20d8714b51d538cadf9abf7492ce1df73d8b7ee82e10c2a0571970e2aa5ded4b9a6f91a49833": "0x040000000002000000000000000000000000000000000f55766f20746563686e6f6c6f67790000001255564f746563684070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714689d5109a8aed88944657c9cc1d0202b2a9508ae547b03bf833352be16facad780b19b179cbd554d": "0x00000000000000000000000000000000000d536e616b6520436861726d7a0000000000001140736e616b65636861726d7a4e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471468b195054093d962441ad818e57097e7d044b15fe0dcdf61742cf279444c5e8ffa9ae554ceb61c6f": "0x04000000000200000000000000000000000000000000037071000000127071686f73743540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471468c9be061f3c16c170e0cdf5c21bdd68eaa9eafec9fd9fc0b6123251406f01de516a06cecdefe64c": "0x000000000000000000000000000000000012576562332e3020666f756e646174696f6e12576562332e3020666f756e646174696f6e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471468da324624114433da47e564f57cad4eb817c1e7d2287012d5fe459992ae2997995bc03dc55f3256": "0x00000000000000000000000000000000001354686530726967696e616c47616e64616c660000001f7468332e30726967696e616c2e67616e64616c6640676d61696c2e636f6d0000114030726967696e616c47616e64616c66000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471468ea576627e05a04fa0dcc186bc3f6b9fb943feca1bec230acda1bb80b3cb2f9d3ecc3e7d089241e": "0x00000000000000000000000000000000000b4d41442052414242495400207777772e696e7374616772616d2e636f6d2f6d722e6d61645f72616262697400186d6164726162626974323031384079616e6465782e727500000d406d726d6164726162626974000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471468ee2c2eedcec18516fc047d8cace5a7f17cc8605f1fa2de274ad27664a5ed7d6a33dd54e3dfe84d": "0x04000000000200000000000000000000000000000000104d494348495341524e49545a2049490000001a6d69636861656c2e7361726e69747a40676d61696c2e636f6d00000e406d696368697361726e69747a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714691af4f75a591a304e4593da91318df8bdb35d247accf2db96e12f1d1a7bcae43c047c13991ae924": "0x04020000000200000000000000000000000000000000105068616c614e6574776f726b2d30310016687474703a2f2f7068616c612e6e6574776f726b2f12237068616c613a6d61747269782e6f7267156d617276696e407068616c612e6e6574776f726b00000e405068616c614e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469259d1259754a2ee8f80e4dd56979a1eb996faf0d02b804d4b8d3986687d1bb096ef61494881b73": "0x04010000000200000000000000000000000000000000084a6f686e6e7942000016406a6f686e6e796234323a6d61747269782e6f72671766696e6765726c696e6734324070726f746f6e2e6d6500000d406265726d616e5f6976616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469283fb3584b29920cf1d73c4b30f8f97080ad60115e05a5105025201dbad0e95e245c6d78f43805": "0x00000000000000000000000000000000001a5374616b65204361706974616c207c205374616b652044414f0e5374616b65204361706974616c1b68747470733a2f2f7777772e7374616b652e6361706974616c2f1440626e65696c756a3a6d61747269782e6f726716636f6e74616374407374616b652e6361706974616c00000e405374616b654361706974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146952ec1f162d715fd2f6e5569a0398b8af4ecb4283a1dbeb06a94a1c093b8d2b8532b5944079291e": "0x040000000002000000000000000000000000000000000a736d696c656368656b00000016616c657878786b6c696d3640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469546ab63701f3cde46a9306739edfedb7505df5e98e1212ba27f17dd964e4607da678379984206c": "0x0000000000000000000000000000000000056230726701010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714695b23e099c12086505eb7820f60d0949697617b2f3366bd616d8c7e96724aa681e0113f6bf45c46": "0x040000000002000000000000000000000000000000000676616c6b610000174076616c6b613a6661697279647573742e7370616365000000094064617461666f67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714695dc1e151a40b7a60ed744aac415baf7621e0335ec5046c8edbaa6c164cb4134a1d7879ef5c0a40": "0x04000000000200000000000000000000000000000000094d6972736c61766100000016736176656c6f767633393940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714695fd23b8e9c5e7a24d1da766a4abeec540f5fcb3d9f07f4f1395c7eacdb2e277949f2f5c3a50f2e": "0x00000000000000000000000000000000000e526f636b585f4b7573616d613506526f636b581268747470733a2f2f726f636b782e636f6d0012737570706f727440726f636b782e636f6d00001040726f636b785f6f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469610a6934b675c69eafb1ad57ed8ee595ac311709e19ca5dae7df48680cf3c822074b2d69891d58": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714696f75486035f5d11e94bf36131632d37719d822bd603d9675488e206d77a509c5bd31ac4ff5ab2e": "0x0000000000000000000000000000000000074d6f72656e6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714697c98e61ff7a035f436ddc71e0400b93ece90a48e94cf0e193c9157c4a21199bc32b6dca543313e": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714697ead568e820ccfd2eb07f02043788e254d9e2df57be11566d241c56302b91199b4647947af3020": "0x040000000002000000000000000000000000000000000846415241444159001968747470733a2f2f666172616461796e6f6465732e636f6d1940666172616461796e6f6465733a6d61747269782e6f72671768656c6c6f40666172616461796e6f6465732e636f6d00000e40466172616461794e6f646573000d666172616461796e6f64657300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469937a5fa154cc0722a58635dd1a211d33750333282985df00d84e87b160293d6b39e89ea4bc7d67": "0x04010000000200000000000000000000000000000000084e45574445414c144f7665726d6172636b202620506172696465461868747470733a2f2f616e6f7665726e6f64652e746f702f15407061726964655f663a6d61747269782e6f726714696e666f40616e6f7665726e6f64652e746f70000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714699a4e2e91f07769c8f44643be482988aa2bcd437f7de9722e6a8990e44e2a64c2f426ce3337f006": "0x000000000000000000000000000000000017466c6f7878204173736574204d616e6167656d656e74000000000000104074686567616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714699c5d3507c778d4cecb620d2e44c2e64a400ff3fe531d5e4716897072fbda0fd33fd58dfaa5fa17": "0x00000000000000000000000000000000000b414e444557204e494f4e10416e647265692053746570616e6f761768747470733a2f2f6e696f6e2d73747564696f2e72750017737465702e616e406e696f6e2d73747564696f2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714699f178882ae3a35ec306760410fb8a67209ee8286fb9ecf86bf6dd864d277b7f3830b288f319267": "0x00000000000000000000000000000000000b677265656e6d61736b3900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469a2abccefec01421488aef5fe1d334d513adde87cf781758c6d9c6841cd1925b3b1fcd27f2e6e51": "0x04000000000200000000000000000000000000000000076b6f706f6e65000013406b6f706f6e653a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469b743ba383eda3afe7d71599a2b67c5085142c626641ccfc1f44919270fcac28d2ecfd41e0c7e3c": "0x0401000000020000000000000000000000000000000004496365000011407a6172313a6d61747269782e6f7267177a61723133696e617a69617440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471469ea407a9f4730a1de5813cb17d418545d0c39927cf50adf35e0a5676f4f9ff8ee9125dfb1cf1a0e": "0x0000000000000000000000000000000000124368616f7320436f6c6c6563746976652000000018696e666f406368616f73636f6c6c6563746976652e6363000011404368616f73436f6c6c656374697665000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a15d0669087eed9208735c92b8b6d8391241b17fffd2cd8a74ea8c713cd5ad058360fe8615d1c2a": "0x04000000000200000000000000000000000000000000064a756c6961000018406c6567616c5f6a756c69613a6d61747269782e6f72671e6a756c69612e7374656d7066656c4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a20805653256a9b76dbbe01275e2d5edc1aa637fa5e9e3f83b2eaf5338f3de24332be755548b018": "0x040000000002000000000000000000000000000000000641676176650000002161676176652e6e6f6465736572766963654070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a22a847a729096bb6c51bd8c8b45c224054c4ade99572611c2c41d499e26493c32e93e6868edc70": "0x00000000000000000000000000000000000c547572746c65204d6f6f6e0000000000001040576f6e6465726c616e64734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a2edd04aff025a00a71c6a0fbf9b63ac089c5395bdea4917a84aabb3475d4454147c4d24ce1013a": "0x040100000002000000000000000000000000000000000c45726e7374204b696e74730c45726e7374204b696e747300000e656b696e7473406d652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a398ba50f12d00734e23dcaeb2f272db78575091eb39369fcee10abf1bfc53551a9b9ec94b94c41": "0x040000000002000000000000000000000000000000000841757374696e5a000012407a6f75745f3a6d61747269782e6f7267146c65726f6e677a6f7540676d61696c2e636f6d000008405a6f75745954000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a4f96f9cd70bd9472e7ccd983b92c5ae60481a636eab0fe42269c9f43c302a74f9dc65e0fbe202b": "0x0000000000000000000000000000000000175375627371756964204c616273204f6666696369616c135375627371756964204c61627320476d62481568747470733a2f2f73756273717569642e696f2f0013736f6369616c4073756273717569642e696f00000a407375627371756964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a6c65861cbfd4f690ebd94a58a07211dcf05c4164ebab8c3abaca45f16f793fbe34072ae7b9ba08": "0x0000000000000000000000000000000000054d61726b00000000000011406d61726b5f656d6265725f7279616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146a6e72184ec057bf2838ec53e79c47d990272aa7c797218bcbdb229dbb4a083890ebb47a143387e1": "0x000000000000000000000000000000000018444f542056414c494441544f525320414c4c49414e434519444f542056414c494441544f525320414c4c4c49414e43451b68747470733a2f2f646f7476616c696461746f72732e6f72672f000000001040444f5456616c416c6c69616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146aafc9e20cbf801c6e2d7ed8cf2cde362abfdf7d9fa95859c20f906d98ca7aeb305a723cdba08927": "0x0000000000000000000000000000000000104b7573616d6120496e766164657273001e68747470733a2f2f6b7573616d61696e7661646572732e73706163652f00196b7573616d61696e76616465727340676d61696c2e636f6d000010404b7573616d61496e766164657273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146ab589167a0b898fcc9f261e20561ee1a137a7c03770706d09a6f85e36e7a313f04d92faefbd3d43": "0x040000000002000000000000000000000000000000000942494742414c4c5a0000154062696762616c6c7a3a6d61747269782e6f726716696e666f4062696762616c6c7a2e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146acaf91ac46baae4f280f5a4ff014f822ccb22c7482c0b0c688b0fd288f57ea28fcef55ef7fa1451": "0x00000000000000000000000000000000000a4f6f6f63746f7075730d5061736b61204d6172696e690101167061736b616d6172696e6940676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146afd27c18040cef1a2af46cca496f67510c65b4ed9f745ff058392bdf7526b99764fb54eb6a1fd03": "0x00000000000000000000000000000000000b4672616374616c456c6600147777772e6d617968656d6e6f6465732e636f6d0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b1e4c1928a48d22a604120d3444af15fde1d4b1906795e462d4978bbd0ad2995312293221af136c": "0x00000000000000000000000000000000000a626f6e64616e76656c0e416e64726569204f6368696576001240616e76656c3a6d61747269782e6f726717616e647265792e76656c646540676d61696c2e636f6d00000d40416e6472657956656c6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b22402cd56d342a42e3f1833e3a53fbc58fc821cbc960242707bf6570504a0ce6d62de52df1fb3a": "0x0000000000000000000000000000000000076f6e64696e33000000136f6e64696e37373740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b2c66241f33f7627cbce8173250e3191a2ff3c05d37a116d3956565fd029fdf531795e3f429b431": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b3ea68cf38610c0e697c9f32c96c1d09daec35b2d6881c22c01a315dc9e44e17a1a1454c7a33f36": "0x040000000002000000000000000000000000000000000d5354414b452e5a4f4e45203200000010696e666f407374616b652e7a6f6e65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b602156dcd19a36e0b1d428d91be9ef7f6933b17ecfe93b41dc32014329c8f47697c43d11142121": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b6157a13ed645fa040298f71f02d7b6a67c0ecee7d7a62ea51dc6daecebf4dd9ad72e0510537a58": "0x040400000002000000000000000000000000000000000a43757272656e63797800000014656574696365706f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b72dbbac6798f2746fe2480205384715045cce22348bb6e69153e172c8780cdfdd9f48177edda29": "0x04000000000200000000000000000000000000000000067961726f6e0000104079726e3a6d61747269782e6f72671179726e40636f64656c7578652e636f6d00000a407961726f6e736b69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b793eedafb74ea99424aaa1e5fbf3eb4200f5686578f97d514f46f90093271607e7309ffcd5ae2e": "0x000000000000000000000000000000000005556c796100000017616c7661646f6c796d70696140676d61696c2e636f6d000010406e61756d6f76615f756c79616e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b8a8b66e5aaceb88ee2a383ae9ce2d6589f1b285935d8f4930f78e65edc311971df2526d2f55132": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146b9579021acd44d76a4e6c8afc7a8bd02ff300b3dd1edca19adae52cb65c1908935abba4e193a705": "0x00000000000000000000000000000000000b796f6e6763727970746f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146baf8445decbe4302880ceaa5b3bfd387562510764a2324bca0444751ccf843dba6d9950cb6eaa6d": "0x000000000000000000000000000000000008524d546572726100107777772e726d74657272612e6f7267001665617274686361726540726d74657272612e6f726700000a40726d74657272614f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bbba429de58b1c6ee8e0a7379fb0908719062234d2982188a3b31eb3aa895e6046981b865479b29": "0x0000000000000000000000000000000000155261696e696e20416c7068612041697264726f7000000016416c706861697264726f7040676d61696c2e636f6d00001140416c706861697264726f705261696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bd6f5cbed6591426e0b706961e1b5f3b545003ff3544f22feae738534cefa08be15d523f52ff114": "0x00000000000000000000000000000000000f4f647973736579404b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146be5d0bab82378087042479798003022a5753c8547cb0de8ef25e2471e40889ff3909fe714e24c5d": "0x0401000000020000000000000000000000000000000007414e414d495807414e414d49581468747470733a2f2f616e616d69782e746f702f1440646270617474793a6d61747269782e6f726714616e616d697840706f6c6b61646f742e70726f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bee5533ec8299d8ce116bea2fcddd47f5540ab01eb225b9cb60b053d5f0dd863d33ce89a6da4055": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bf5f668cb5d93dad21839a4704482a87db32156b9990a0eaa841fb2ae49e362cba1f0d5ded52376": "0x00000000000000000000000000000000000f67616c657261732d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bf9c9353fd020348c33b686a457b74f9b1a61b4446404e522d122064d6713ffacee88bfa9a15861": "0x040400000002000000000000000000000000000000000b53796e61707469636f6e0000174073796e61707469636f6e3a6d61747269782e6f72671a73796e61707469636f6e4070726f746f6e6d61696c2e636f6d00000c4073796e6170746963306e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bfc5690a062a1afacf62b7427d226aeaaa925a52f3b0dee7c343124b0adb8785b3fa48694a0b94e": "0x0000000000000000000000000000000000094a484f4e20524f59000000166a686f6e726f796172747340676d61696c2e636f6d00000d406a686f6e726f7961727473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146bfdbf25ef8b99373c016a81d6b5a5d805e1b21e8e0bb9014ba2dfcd7d128251b5dfc30502b3037a": "0x00000000000000000000000000000000000b4769676d696e64204949001468747470733a2f2f6769676d696e642e61707014406d6d61686572653a6d61747269782e6f72670000000a406769675f6d696e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c01c6b0489d52fa600031e4527046dcc067d2cb23fc6cb1970d94e9251fcc131cd5f23b6ca6d476": "0x00000000000000000000000000000000000c446164647920416c65782001010101000011404461646479416c3238393835303436000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c12977fdc424f56cea296c4097c6926c86d188eb65b0f77877584512ba5054f7c52873be1a0580b": "0x040000000002000000000000000000000000000000000c4d65726b6c6546726f7374001768747470733a2f2f6d65726b6c6574726962652e696f18406d65726b6c6566726f73743a6d61747269782e6f7267156d3475353461643440616e6f6e616464792e6d6500000d406d65726b6c657472696265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c1c74353498a63bf41c4ce9c03cf28414bc4e05a5bd6d5d79e72f700a38d5c722aebd796608c44e": "0x0000000000000000000000000000000000044b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c22738133d6c7a48e9da09f277ab09ea322900d4c6e0e3d3221c1a2b702f72590545e851fa9aa72": "0x00000000000000000000000000000000000e6c6c616d617a70726f6a656374000000186c6c616d617a70726f6a65637440676d61696c2e636f6d00000f406c6c616d617a70726f6a656374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c23be321ba1d5692aeb5a90eb2107b7490991ac059fc314c28974cb318c16f75f04241085fe936f": "0x000000000000000000000000000000000011416c656a616e64726f2050657465727311416c656a616e64726f20506574657273000017616a6f73657065746572736840676d61696c2e636f6d00001140616c656a616e64726f706574657273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c3f94c82b8b136c880aa8e4ef5d44c88e477371270a5d5187b12475a39b620f0b813bd002966024": "0x0000000000000000000000000000000000124d697373696f6e20436f6e74726f6c203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c4d2026575763437cdc1a6a5a7f23437b6528edcdf553d0685f940a4e6e85579727ef3dc574563a": "0x04000000000200000000000000000000000000000000114365727448756d204d61785374616b65000018406365727468756d2d6a696d3a6d61747269782e6f7267136b7573616d61406365727468756d2e636f6d000009404365727448756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c53b7f96dcb583d9c2b14c09923911fe0ff6918b7c7702a91762aede2c2cdd0f1f0bdcf7b9f2a5a": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c6da4b2c10d05fda63297294a9d13df4e9fadfa013e8e6855d330075c55f9347bc4a63a883a8412": "0x00000000000000000000000000000000000748726f6d6f760d496c6c69612048726f6d6f761b68747470733a2f2f6769746875622e636f6d2f4d656e74616c47001967726f6d6f76746865666972737440676d61696c2e636f6d00000d4048726f6d6f76496c6c6961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c6fc4e27d0976af0043984dd2239bb88a209976e33ca5cd20ca0479096d86aab7e9b6137d5c2d62": "0x000000000000000000000000000000000008426972646d616e00000017616c65786a7573747761697440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c7206770c39d9295a5f7eb7050fb96d8d7895d9afce428a064ce66e3b094805bcad9a8e68cb9934": "0x0403000000020000000000000000000000000000000013424946524f535420464f554e444154494f4e14424946524f535420474c4f42414c204c54442e1868747470733a2f2f626966726f73742e66696e616e6365001668656c6c6f40626966726f73742e66696e616e636500001140626966726f73745f66696e616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146c748650b11aedf08eeb78c1dd6b2244b18b549a0c3cab933c680dbc18b411764be1ce4667f41649": "0x040000000002000000000000000000000000000000000948616d7a696b35330000001368616d7a696b353340676d61696c2e636f6d00000a4068616d7a696b3533000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146cae0ce72d947795c8ad53e6aa24a6208566faab7d3e203476531e2ee2b4c7d0d77c80245791a00e": "0x040100000002000000000000000000000000000000000c506c616e636b204c6162730c506c616e636b204c6162730000156c616273706c616e636b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146cc4e49307ea87327232db7b484171854543c6b3d42b95f6a16f4742d2f683d97fafb45e9bcdca34": "0x0000000000000000000000000000000000076d6f6a64697000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146cd2b2fd45e2e3d0702a6dc9592ec94ce9e1f07e2a0559d7f43f932101bace2400d0e92419218732": "0x040000000002000000000000000000000000000000000a73746b656e393939390000144073746b656e39393a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146cebd0b9de064aab0e038990f47761a17f45c2bb01c4c7746f4ad67c7d0c1dfbd6915372faae911f": "0x040400000002000000000000000000000000000000000a2a2a2a2a2a202a2a2a000000196c756e61722e706f6c6b61646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d01b9ac106696b20ec8ef626347c834d4d964b525fb46f8db2910e11d88c0100e62590d10ac990f": "0x00000000000000000000000000000000000f4b7573616d615f573353746f7265002168747470733a2f2f646573746f72652e6e6574776f726b2f726d726b2f752f4b001f4b7573616d615f773373746f726540646573746f72652e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d12ad5162806a9cca76c36de0085c8c561dbb64575cb016d4d6e7cef42b666d3ea978543f1c935a": "0x000000000000000000000000000000000008736b756e65727400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d1339be09f0555c5c229899568bac5fdc0ab838a23ee5391f704eac09ec1bdde78841beed461b6c": "0x0000000000000000000000000000000000074b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d301a445678938ac43aabf384c6baf54ef9712a96be7c46533b538c05d4e6c687fe09b109664b28": "0x040000000002000000000000000000000000000000000a4d616e7472614b534d000016406d616e7472616b736d3a6d61747269782e6f7267146d616e7472616b736d40676d61696c2e636f6d00000b404d616e7472614b534d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d34ca1ecaaeb6174471abb5438fa95f8c85b8d5a417df0a6a38b4372874f27f30f20645f3263830": "0x040000000002000000000000000000000000000000000b5975647573204c6162730000154064757979756475733a6d61747269782e6f72671579756475732e6c61627340676d61696c2e636f6d00000c4079756475735f6c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d54b71cad5f64b392e2419c0839bb61ec6ab6aae9fbb0c4fc9e519138faba9ae9e5eb4bd17f836b": "0x00000000000000000000000000000000000d616e746f6e696f5f323030320f416e746f6e2050616e6665726f76000016616e746f6e696f5f3230303240696e626f782e727500001140416e746f6e696f3639373637343938000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d5ba05b78a2e080daa4917008c6339bc42960ff491ffb03c3a6ddfc2b2b045d1c24112383398252": "0x000000000000000000000000000000000007686f646c337200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d74d28ec12105fa9e2ef38fe8e04e6f04dd146920ea60a5eb88dba8aeb59cba116768220dff632d": "0x00000000000000000000000000000000000a564953494f4e415259034d4a0000196e6674766973696f6e6172796d6a40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d77aae7d9cc2c6b6a08d5461e12b86fb79830fc2c45b9df0883ea74d91a02ae0c8ba8519d90f91e": "0x040000000002000000000000000000000000000000000b6372617a796c616e6464000017406372617a796c616e64643a6d61747269782e6f72670000000d406372617a796c616e646464000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d7865ba4ce38d13803c48fccb86dbda70ccfa6ac01c6246a558cd1ed3082276e3ec55ca850e1520": "0x00000000000000000000000000000000001373746576796861636b6572207c20524d524b0000001673746576796861636b657240676d61696c2e636f6d00000d4073746576796861636b6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d81d41850c8478a76016fc20a6457ff8953bf29686c5698c28bbfa860669ddd07b386c910f1107d": "0x08000000000204000000020000000000000000000000000000000016f09f9a82205a756769616e204475636b20f09fa68600001840726f626572743a776562332e666f756e646174696f6e17726f6265727440776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146d8e6ab01df42c15d25af2fedd4eb672f218932fde44f97f10c1d7788efd0079957ffad4f186ae78": "0x040000000002000000000000000000000000000000000b6b69616e656e69676d610d4b69616e205061696d616e691e68747470733a2f2f6b69616e656e69676d612e6769746875622e696f2f16406b69616e656e69676d613a7061726974792e696f0f6b69616e407061726974792e696f00000b6b69616e656e69676d610b6b69616e656e69676d610000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146da178aac6ca938996ef2b0677180342454254d3b508e6ce27545440454a0e810cbc779af50f476b": "0x00000000000000000000000000000000000763616f67656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146dae9d8fdc97e46a740e01932711bd4fd74b1c85696ef68396a6f11437ef8b8f44815103ffdbd942": "0x00000000000000000000000000000000000d4348414f5320414c49454e530d4348414f5320414c49454e531968747470733a2f2f6368616f73616c69656e732e636f6d2f0000000011406368616f73616c69656e73636c7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146dcb518544a17d04f4fb2a6f05eb4f0ef01e695d677ffd9f940af819590642305c12924e203f9143": "0x04010000000200000000000000000000000000000000074d626c6f636b001368747470733a2f2f6d2d626c6f636b2e696f14406d2d626c6f636b3a6d61747269782e6f72671576616c696461746f72406d2d626c6f636b2e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146dd970d8cf026efb58ef09d3489cf843247e53debd2d08faabf4953de4eda8a0221474a1ec42e51d": "0x0000000000000000000000000000000000023500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146ddff06071871e051c3f1f94a947e045496deb2fb43db180a284a1f0f141875865aae404d0b38f17": "0x00000000000000000000000000000000000d536c65657079204c656d75720000000000000e40536c656570794c656d757273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146de5c15d472fd831e4e00e63c3647fc8c0a3d1b163ac988b6f0a7c3d05a01e209d4adef8e285037b": "0x040000000002000000000000000000000000000000000842696b657234620000001272656b6962346240676d61696c2e636f6d0000094072656b69623462000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146df179326c6132ac783485f72737efdd4e0c86f1097b1deea2a1ef0ea22514a081151293f8e78d77": "0x00000000000000000000000000000000001b54616e656c65657220616b612074686520436f6c6c6563746f720101010100000c4056696e694c6f6e646f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146df74e3c08670c34887a557f77bf1881bcf40ba6c2c8d41f819e5630997472cf310c76b8679f7d00": "0x00000000000000000000000000000000000873616e696f6b7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146df9089f721a647b5e18f2acdd0df1e1379c4e45df53fd18ae057e351a2f7df26cf6538bf1f3951e": "0x00000000000000000000000000000000000a4c6569662057796e20001d68747470733a2f2f6c65696677796e2e62616e6463616d702e636f6d00126c65696677796e40676d61696c2e636f6d000009406c65696677796e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146dfe113c3c0ddaf4a65e518d273553f951a8b5de9928449255508036636aafab13e479e51fa83153": "0x0000000000000000000000000000000000106172616e656c6c612e6b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e0bda57536f0f7afe8ed746b2f0fafda336e27346a75f2f03db0f73a3e73e1ca6deb3676e14d139": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000a4d61747453616e746f0000001b6d617469617373616e74616f6c61796140676d61696c2e636f6d00000c406d61747473616e746f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e137c0fa3493007c85e3aa75711f5028f297d018c3e20ae87e5c605a4a42c32d075ffc5a2b1aa2a": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f353300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e1af8908544b70bbaadb6c3e6fb2482077a53cdba093a8ad605991be5a8f692c348c96cedb3b310": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31340f42494e414e43455f4b534d5f3134000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e2b59d3240a71b136bad3dc145e2a9330d4339cd3ae78ad38899297f90179c89e1c164e7db9792b": "0x00000000000000000000000000000000000b417263686976657273650b41726368697665727365137777772e617263686976657273652e61727400186172636869766572736538383840676d61696c2e636f6d00000f4061726368697665727365383838000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e492261936ee303a8a1e3cbfa50d90dd8c3387e41849ee31bade6c9dd7631949b278e063ba0604c": "0x0000000000000000000000000000000000094b7573616d69746100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e49b5b6b41150cb5648a5099cc672def900b179b0b166c0cda43c5741fa016a0a4e59159eb4cc4b": "0x00000000000000000000000000000000000d50726179657273345261696e0000000000000f405f50726179657273345261696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e4c492ee4a04b7be0e388350540bfbcc4ec71eed079ac582106107fb7e4c3e0644a78ef77090f0d": "0x0000000000000000000000000000000000084752554d4c494e000014406772756d6c696e3a6d61747269782e6f72671b706f6c6b61646f742e6772756d6c696e40676d61696c2e636f6d000009406772756d31696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146e5600c7cb67a52de262091990c95c2667f621831f3215e8fc2a0958daa5658f4ce7c548fd687070": "0x040000000002000000000000000000000000000000001433394b7573616d6120436f6e74726f6c6c657200001a406175746f636174616c797469633a6d61747269782e6f7267116b656e6c303940676d61696c2e636f6d00000b406b656e736572736f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146ebf663bc0ff3d824445227fdc045db50d470f830869813c458eaa12071681d76ff022a7b9b5e750": "0x00000000000000000000000000000000001a4265636b795f66726f6d5f7468655f626c6f636b636861696e13526562656b61682052696368617264736f6e0000000000114042656b695f66726d64615f626c6f63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146ec642500076ba25a6c5f0595d6ed85d6260bc682d4a68a4b4e605d43c67d56f2765d19698549772": "0x040000000002000000000000000000000000000000000b5374616b656c792e696f0000124069696363313a6d61747269782e6f72671161646d696e407374616b656c792e696f00000c405374616b656c795f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146ef36fb6f6a6627954d552eafb3c32b82bee18d1093507b22d300293d0691948950fb2a6cfbf1d12": "0x00000000000000000000000000000000000b4d616b6569747265616c05416c65781f68747470733a2f2f6c696e6b74722e65652f6d616b655f69745f7265616c0000000010406d616b6569747265616c5f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f007ed8cae8e00c428480e94271bfdffe5fba698c5049093175433f81dde2e8f2f656a228995312": "0x000000000000000000000000000000000006626c6f6f6200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f162ae750478cd420d36d6d4b71407dccd0a9fe417f847296503b1db88b49034e72b107177d5e67": "0x0000000000000000000000000000000000106675636b746865636f70732e6574680000000000000d40665f636b746865636f7073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f1853e1ebaebf497a688ccd0cad14cf3e26ad4b10c0775968bac5ff48f77a8c4b09cc3c3d77ad23": "0x00000000000000000000000000000000000b4b75726f43727970746f0000000000000f404b75726f63727970746f525047000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f2598efe3f47fa4e622f17425a56e7acc6bcd2b36f6912005287c470d94a3deb0f0ba39f8f41f75": "0x00000000000000000000000000000000000753616d6f6c6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f2b5e9f208392888cf6773ed595b6b8f123786931160f5162f826be90f00ba77493312a768e9e2d": "0x00000000000000000000000000000000000f424154544c454b414e415249415300000019626174746c656b616e617269617340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f337845d3ff300d84ef1a151887ad6d4baedf802cfe9ade9c4c9ca57747723f0b3d7ca956997f7e": "0x00000000000000000000000000000000000d546865204e61727261746f7200147777772e6d617968656d6e6f6465732e636f6d000000000d404461626167686f646c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f360d963f230c31180b25c72c11ca6b74d6601e3684642afbe828f3e7b45479a42d0b84fc8cdf12": "0x00000000000000000000000000000000000b446f62726f646979554108416c656b73657901010100001040416c656b7365795f313936393131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f3d6f5d8945a2a9d896f718b4ad053ba53468ba0347060b4a80f03fa72e9c14da5e2e7ea80e3f2c": "0x0404000000020000000000000000000000000000000008426974446173680000001a6d65726365646573736f72656c313040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f3df2817b3b9c94e44dba99bb5810bdc7a2a1d32a4b021ac735ef01322f57be7b51210f46d3b323": "0x0000000000000000000000000000000000074c656f6e5f4701010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f56186447cd7ef15aa188fa54383921d848228f0e40540f07297c6241a05e63f675ce5ec53da525": "0x00000000000000000000000000000000000f666f6f7462616c6c68616e67303100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f630b718e317f68aab8c369bfc11e722e4328afbcf0bde98b014ac292eb9a33e745acd3c4e820cc": "0x00000000000000000000000000000000000d484f4c44504f4c4b41444f540000001c636f6e74726f6c6c657240686f6c64706f6c6b61646f742e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f7f4b41e08c803b185c5ef33d3d91ed9167e35bff60265cec83c040ed7766f256ce0f599da6c749": "0x00000000000000000000000000000000001056656c696e6f7661207c20524d524b10436872697374696e61204d6979617209726d726b2e6170700013636872697374696e6140726d726b2e61707000001040436872697374696e614d69796172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f808393005db1390cdd6d75a061aa70b5d57bd30e693cecb8e7a392788262319da19105c0f4604c": "0x0000000000000000000000000000000000084e61706b696e350f526567696e616c642053747568720000127274737475687240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f99dd7465b93e507c6e2eb7daa3efe47026b0aaccc5c24d5a8c36387f471d5ad10b63a269bbc11c": "0x00000000000000000000000000000000001541746f6d757365202d204b7573616d61204d4b311541746f6d757365202d204b7573616d61204d4b311368747470733a2f2f61746f6d7573652e63630010696e666f4061746f6d7573652e6363000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146f9bf1c5c47f9bff1c378d545f64248bedae80ec34f8f29551fc9f814f8491f8fea50f10fff6e229": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146fbe924612f6781f544bbcd309eadfd42df83e1483616da5dbccf5a8cc0bfcdc023c4d310580cb2d": "0x00000000000000000000000000000000000f596f6e6b6f204d7567697761726101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470014f24dcab4fe440a6b2797a5499aaba937f5931186ce4ec4831af09c1571f185e68a0a926451a": "0x040000000002000000000000000000000000000000000846696c6970706f1246696c6970706f204672616e6368696e6900194066696c6970706f3a776562332e666f756e646174696f6e1866696c6970706f40776562332e666f756e646174696f6e00000d4066696c6970706f77656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470023b9d2a2c164748ca001326b583070e370be3bc6680d09cad47649584a5c992bd388c693b9a54": "0x040200000002000000000000000000000000000000000f4b6576696e204c69207c20455043000014406b6576696e6c693a6d61747269782e6f72670f6c696a756e7169406d652e636f6d00000e40647573687573616e6a75616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147006767d397f2ca9ea767408daed5fa84321c8d73e1353b847391877cb07ede4de41a98c010fe702": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714700eadba413b7d7e9a017a02ac5e0464e0fe81c2db6d53396f85e7cc4818fa63972ddba87c1db039": "0x040000000002000000000000000000000000000000000d4d617968656d204e6f6465730000000000000e404d617968656d5f4e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470175c9772705b5ba28f7a2b2fd4fd83e0dc9c67d22fea19d5e755aedc336a973afa342ef2642147": "0x0000000000000000000000000000000000094d69636b794e465400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714702bcefac99fd4dd8679aa82b4485f9035d099869dc380bc36b390ae89b77a21b1dfb8db3de56d54": "0x0401000000020000000000000000000000000000000007746477736e690000000d3040746477736e692e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470381211b81bd578b208742339c55723f8834a3379a95ba73073d7583a7d381ed6ec1b860f46692b": "0x0000000000000000000000000000000000043737370000000000000d40766c6164626f6e64373737000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714704211a750c9b855eed08a5b10b1835610d66ce4fa273c8e2436b978c9f65442efb6074871b48a6a": "0x040000000002000000000000000000000000000000000c50726f766520436861696e0000001570726f7665636861696e4070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147049f2f99a873c94c00f86f5f5421e98f7ba345ccd996c53412f39308ea854053fe650ca7bf44f75": "0x00000000000000000000000000000000001242726967687420496e76656e74696f6e73001d68747470733a2f2f627269676874696e76656e74696f6e732e706c2f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714704fd4d990de5befa2062502692e27d3608be0d008ea4b92ec004291e439f90b050bef5ec7f0f23f": "0x00000000000000000000000000000000000d506f6c6b61646f74746572730d506f6c6b61646f7474657273001440706d656e73696b3a6d61747269782e6f72671c706f6c6b61646f74746572734070726f746f6e6d61696c2e636f6d00000f40506f6c6b61646f747465727331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714705bdbc11ece35d4b43cfa22c3d218af6782a4d65b8f3634fce7cffea162940ca819714f49747337": "0x00000000000000000000000000000000000d3320457965642042696c6c790000000000000b404243727970746f6e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714705e6ea755bbf165fee29a5ceb96897553f0573c57f2824416ab0160259c6dedd23dc9553e7f7979": "0x00000000000000000000000000000000000c506f6c6b617370696465720e506f6c6b617370696465724c7500000000000e4061696c696e67797532303138000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147061508d0facf9d35a1a549172a49f7591155007c51680ad8ad77571cea04acd1b0b84459e779234": "0x04000000000200000000000000000000000000000000073078546f6e6500000000000008403078546f6e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147067b025e697cd29c8ceb1c664df2d960b92a98620baf455b678d17a8c066832ad463537dec7b916": "0x00000000000000000000000000000000000e416273747261637420536563740b54796c657220526f776500000f746a726f776531406d652e636f6d00000e40416273747261637453656374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147073fca8d293ce1f104f30a7ce921de97e2b0953c03b1b52290417f02ddbf93f00d32560ce6cdc73": "0x00000000000000000000000000000000000014486f706520446f726f746879204d7572706879000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147074ebffa575049570886222c37e2ae242e928891fa622a6117888450059ea48efb53048e2b7d46b": "0x000000000000000000000000000000000005527572750257010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714707a1c5ae852ffd0d6e82061804fecd8a01e8c288670158557d1e0d29fd43965d6d9a18f456d9e5c": "0x00000000000000000000000000000000000e63727970746f20706965727265076c6f7572646501011a6b6576696e6c6f757264652e70726f40676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470862ef001da720f4c91bbedabe6c9691a94cf18545d962d105c46e421a187a1762475116b6e3931": "0x0000000000000000000000000000000000104162737472616374204d6972726f720101011e617274627961627374726163746d6972726f7240676d61696c2e636f6d0000104041627374726163744d6972726f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147097277b2a5e0e0c74c08ab30239142fa489802606f4ba630d10ae640d418068e557125f7ab21437": "0x0000000000000000000000000000000000044a444c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470b0ccf61769cfd8360745c8f812f88313ecea48072c02d3af2e0879f0788fb42ca57d2a08308913": "0x040100000002000000000000000000000000000000000a414747524547415445001b68747470733a2f2f6167677265676174656e6f6465732e636f6d16406167677265676174653a6d61747269782e6f7267206765742d696e2d746f756368406167677265676174656e6f6465732e636f6d000010404167677265676174654e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470b521035124345e708abc87f99cb7125a4485ab287fe649da93d7f63d94f1723eff0702ce271b38": "0x0000000000000000000000000000000000104f6666696369616c204b75646f7473104f6666696369616c204b75646f74730000196b75646f74736f6666696369616c40676d61696c2e636f6d000010406b75646f74736f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470c16b639ae50cfd227dd8d2161a0ec5c16d32bb404f4397db4eec7a0384dec4434653c46d6b4e68": "0x0400000000020000000000000000000000000000000007616e73616368144141524f4e2054494e4720534541204b494e4700001574696e672e6161726f6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470d819a2c84da4c51854e80d2ab67fb4b12a0372a7345e933258591fa524445f98f9e228c6c2d157": "0x04000000000200000000000000000000000000000000054f7461720000000f6f746172407061726974792e696f000011407368616b617269736876696c693237000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470e8af948020788b9023c272646be7fdd636e3f40a760528e8d3ed13a56a7f60b70dfb0865e01057": "0x000000000000000000000000000000000006566c75796e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470edeff14bdc035a2290b0d093c2c0a08acdb392bed5b03a80bdd6654e950ff597feeb3c9b9fa831": "0x0000000000000000000000000000000000114d79436f696e7461696e65722e636f6d001968747470733a2f2f6d79636f696e7461696e65722e636f6d001761646d696e406d79636f696e7461696e65722e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471470f0a3ba8fdc51ba04c760ba8b16be7af64b5fb7e1b3243abc8a02ffc7e87fde86fa29f6ed3c5776": "0x0000000000000000000000000000000000076f6c657a62610000000000000a406279627972616279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471116de1a587c32588a4ed0e6c34d0464f85f9b7017fac279d96a1a581c00df0a2d68e655836b75d": "0x00000000000000000000000000000000000b537072696d6f4d61696e0000001573616261697072696d6f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147112ba5d6dbefa86fa8cae363fae322ca18adf9cb334426c0d8a4eda052ae2919136fb2aaf810d2b": "0x00000000000000000000000000000000000a43726f636f64696e6f12456b61746572696e6120426c696e6f76611163726f636f64696e6f2e64657369676e001a64696e6f63726f634063726f636f64696e6f2e64657369676e0000114043726f636f64696e6f44657369676e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471136285006adf116270f8a05e7e0281bc17de3331550f81e8089dad4b80614c028c0c816a872566": "0x00000000000000000000000000000000000d534652204465706c6f7965720000000000000d405346525f5f53747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147133801574a23097407c5d153353f5dd34183ce2c8b55e6b7858de0baa2a568b7c577ae65f04623b": "0x00000000000000000000000000000000000b6b68616e6f6e6472756d076b68616e6f6e010c406b68616e6f6e6472756d0100000c406b68616e6f6e6472756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471338c87abd75247bec65f0d42a638f8ecec8206173fe2953dfd914fe6285ad35812621e09e8373e": "0x00000000000000000000000000000000000757697374617200000016656d696e34696b3139393340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714714f1bba6aeb57ed503830ae159d84972115565fb0d195f5c84d0b3aedf7661f14923f434c482e58": "0x040000000002000000000000000000000000000000000455534100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471807145847ce7520a9e6fb48b9423ae5939f07fe1d7f41a6c1ebe3d2135e94af94b7fd717a47418": "0x0000000000000000000000000000000000096d6161726d6170611e6d6172696f2061727475726f206d616c646f6e61646f207061727261201b7777772e696e7374616772616d2e636f6d2f6d6161726d61706115406d6161726d6170613a6d61747269782e6f7267106d6172696f40626f796b6f742e636c00000a406d6161726d617061000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714718a792663e13c111e015452870e49b4e4c3e054556b19683e8895586bfa58638a74a5782ab4f712": "0x040000000002000000000000000000000000000000000e414c45585f3031205354415348000019406261626c6f7275626974656c3a6d61747269782e6f7267176261626c6f7275626974656c40676d61696c2e636f6d000011405374616365794d3033393337393233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714718c7c930a9f7254d86997541d3de5e602951b87a658d2b1f239a44b1aa7db63926677175a296130": "0x0000000000000000000000000000000000044b534d064252554e410019406272756e616b616c6c696e653a6d61747269782e6f7267186272756e616b616c6c696e653140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714719741a00f0f258052b508058d399f2d273c624adac51fc2e2e9083a0d13cb59e515c83178b91f08": "0x0000000000000000000000000000000000054e4f4952054e4f4952117777772e6e6f69722e6469676974616c00146472696e6b6e6f697240676d61696c2e636f6d00000b406472696e6b6e6f6972000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471a62c336559149c727cdf9587aa815816cbf027b2040a04860e0ca6863df676ab65e79aed5dfe12": "0x00000000000000000000000000000000000c596162615f44656c7578650000000000000c407961626164656c757865000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471b1a690490b9b855030a81483b3f65ad2904fd32cbcd5d3a534e9617e0c1daf610acd4e1d851821": "0x00000000000000000000000000000000000a646965676f6e616b7500000017646965676f5f6e616b7540686f746d61696c2e636f6d00000b40646965676f6e616b75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471bab60978c7657ac0af8f315fd5c43e3a9d5f24986cff822296343aef9c3c9e9c98d7b8c16dc770": "0x00000000000000000000000000000000000f536c696768746c79204a756963790101010100001040536c696768746c795f6a75696379000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471bdd65031f8d5b4264b8f4a0be4ca7a9b8c7a8a08a119d549bebb1be6049b2947d363cf06f1e749": "0x0000000000000000000000000000000000076261796576730101010100000840626179657673000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471ce39b31932f385f616ea43a83d30c7e9cd14c07f2534d4e1d983feb50af44e2e101786f1174d5a": "0x000000000000000000000000000000000008537461726579650000000000000c406879706574617269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471d47d954dd610d384e78712d71e4663b0673f11b9b9119d41b6a74c3ab3e1cc49b2c26e45f2c717": "0x0000000000000000000000000000000000104c6962726172792047656e65736973104c6962726172792047656e657369731368747470733a2f2f6c696267656e2e66756e0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471d6f804bbc175ce2c2fcfda3ef3753aaef240f2d5048bf365a746ac9ad94836ad72d9e4030d217d": "0x0000000000000000000000000000000000074e61744172740101010100000e404e6174616c6961735f417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471471ea140dfcf364da7e3b8fd929dbbbd1986cc76d08bd7d45710b54ebd933c2545bbcaf1981b4f02d": "0x0000000000000000000000000000000000064c4558584f0000000000000c4069616d736f6c6578786f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147214db08aea29f4c2a5bd5797da40fe8be1b94dd3260ef86d6b01cfc891c5c1cd160ad7fa198de57": "0x040000000002000000000000000000000000000000000a726f746b6f2e6e6574001268747470733a2f2f726f746b6f2e6e657418406869746368686f6f6b65723a6d61747269782e6f72670d687140726f746b6f2e6e657400000f40726f746b6f6e6574776f726b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714722083cf8467cb9174725e8d7159b39aa5dd43117d6354ba8f5ebd00f73b484e0b397477ce8fa949": "0x00000000000000000000000000000000000868756e6973616e00000017706170616d6f6e2e676f2e3040676d61696c2e636f6d00000d4068756e695f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147231a73eec660398046ff960b0d51db710b8ca414171afd47c9612311b69fa9416622dfb42a33124": "0x04010000000200000000000000000000000000000000073330383072611f33303830205265736561726368202620416e616c7974696373204c74642e1468747470733a2f2f3330383072612e6c74642f13403330383072613a6d61747269782e6f7267107465616d403330383072612e6c7464000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714724c7c15464878b07802118deb1bdd268c44247e6804781b4548c46e8442a63af94682f2586fd54f": "0x040100000001006c57c10b0100000000000000000000000000000000000000000000000000000f4d792043727970746f204769726c001968747470733a2f2f6d7963727970746f6769726c2e696f2f00157465616d406d7963727970746f6769726c2e696f000011406d7963727970746f6769726c4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714725a86431f305963b0537038713a322f80aecc5a647740589a2ab3a9f558d66e1edff7dbcf321034": "0x00000000000000000000000000000000000f537572662042756d7320436c75620000000000000e405375726642756d73436c7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147266c84e2a6ccd54865a0192a7b1bf11f1915b156b8a80e5bc2983a38d075ecafb9fcecd13980210": "0x0000000000000000000000000000000000144d69737465725f436f6c65204344204d532031000018406d69737465725f636f6c653a6d61747269782e6f72670000000c4031393238333734367a7100075f6a706d665f00", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714726d01a4c80d6ba32af509d174981a76e0ea8736ebd955e869e7aa3df90d9782dfd27f8d5275877b": "0x00000000000000000000000000000000000e6d61696e2e73616b692e6b6f7500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714729ca592de7e6cc0349febe9138f7c4f2123246970770df11b411268566c25bcf71377d23717285e": "0x00000000000000000000000000000000000f56696c6c69616e20417274697374001968747470733a2f2f61727469636b7573616d612e636f6d2f00136e6674766966657240676d61696c2e636f6d00000f4076696c6c69616e617274697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473006ea8baa58afe58f26dd10efac24a7fd1813d6aa72a8e60bee976f7da28e492ad033fc1822315": "0x08000000000100902f500900000000000000000000000100000002000000000000000000000000000000000e4172674e6f646552756e6e65720000001c726f647269676f2e62617272696f73393040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147304b924b222e0c7dae5efb233d7bdc68fc16135030559ee44b6372ef24650ca982158e8ae9b1c34": "0x0000000000000000000000000000000000077761766530360101011c6672616e636f69732e6c6567656e64726540676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714730966358482a89df88d7cb742e81b397cdef5f7cb474cf2df150c46a450316042e096240b132b7c": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31310f42494e414e43455f4b534d5f3131000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147315356594fd4a95bcb17afaf0c76d9419961b476bda55ae861b5ddc7517212e5ffe51739ce7110e": "0x0000000000000000000000000000000000074152544b555307416172746f6e17687474703a2f2f7777772e616172746f6e2e6172742f144061616172746f6e3a6d61747269782e6f72670e61616172746f6e40706d2e6d6500000d40416172746f6e447572616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714731673ba1d1b7d986e311246667f84dd2c1d2c2d2125f71c1364b217deab8ef23eacfc4c693fa64a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714731adab152229ba0b659069707b696d313e7ca3bae3a5f2c4951bc142487185e254d35f7af56c40b": "0x00000000000000000000000000000000000670616f6c610d50616f6c61205475617a6f6e1c68747470733a2f2f7777772e70616f6c617475617a6f6e2e636f6d001668656c6c6f4070616f6c617475617a6f6e2e636f6d00000d4070616f6c617475617a6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714731facdea878555ec6f4c6d200f27c4b02afdd345dd02ea77dc45c05b79dcdd2c5709418a0658503": "0x00000000000000000000000000000000000d63727970746f566f7274657800000000000009406673675f646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147321f7eac82ba0a6d68f13f9cf8966128c622327bd4819ab2a9ee1532587bb04ebc99e5e993b4ca1": "0x040100000002000000000000000000000000000000001a526567697374726172202331204775696e656120506967203200107777772e6578616d706c652e636f6d0012692d61696e742d6e6f2d656d61696c2121000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473445c1fa17d2f30828005347ff7053e6a83a61075859529c9ae6f85ea952e2d44d8b5667209933d": "0x00000000000000000000000000000000001a4d6f72677261746868207c486f757365206f66204368616f730b4a61636f62204b656e740000156a61636f626b3130333040676d61696c2e636f6d00000b404d6f72677261746868000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147349ec625640077690a8aa6a4593bba62b920c5dd3f580b4bafa5b6c3b567dbaf5598d3f0963466a": "0x000000000000000000000000000000000012546865204e696768742047616c6c657279000000176e3167687467616c6c33727940676d61696c2e636f6d00000e406e3167687467616c6c337279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714734b6c90edb07bd010f22d753c18dcb34da3b1573e4ecdff30f6d3b2642b1864d3bd7832e5cf9721": "0x00000000000000000000000000000000000759616b696e6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147351a6242479e8c754adb573ab2fe5551264b00100828e552e8ff391fcf975b85ce81f900a2f5b32": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714735585e3f384f206eeae02b784e8ec57b81c2bbe0cbed5bd3cb5dcc98f76d81c99edeae3a2aaa85f": "0x0000000000000000000000000000000000074f70706f757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714737675dbae64b33e3284bc8ce3083b62e671d1c5bd61db5b3fea95a77967341ca8834a69cffcfd5f": "0x040000000002000000000000000000000000000000000b53554241455445524e410000174073756261657465726e613a6d61747269782e6f72671a73756261657465726e614070726f746f6e6d61696c2e636f6d00000c4053756241657465726e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147378c2b706979cac06ecf3372b3e7ece785bb3ac73d9f9b458fe48856ca1a524e929f794e8c17320": "0x00000000000000000000000000000000000b4b55534157414c4c4554094d4f4f4c494e45580015406d6f6e5f70736575646f3a4d4f4f4c494e4558146d656864692e62686140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714737e39e875eb0a9662e891cdb404830ad46eb5fc896e60670f658032c6914f08fab6f79d7b2ccf57": "0x00000000000000000000000000000000000e4a6f6162204e697761676162610000001b6e697761676162616a6f61623130303040676d61696c2e636f6d00000f404e697761676162614a6f616232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147396af96b1f453f59e826b5434525d00c118f3f6b0a29b7f432be7bbd18659d472c5f07298e76949": "0x04000000000200000000000000000000000000000000096d696368616c6973001b68747470733a2f2f6269742e6c792f6d696368616c69732d696e00176d696368616c69732e66724069636c6f75642e636f6d00000d406d696368616c69735f6672000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473ba145c306b74dbccb16cd79f56a5405f9cdd0dcf58fcad90a18beb2398e77175d36ff52eb2cf3c": "0x00000000000000000000000000000000000f4b7573616d612048616d73746572000000186b7573616d6168616d7374657240676d61696c2e636f6d00000f404b7573616d6148616d73746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473d68690216574fd6c6d70ef9d0c65d3371ed462bf273c97368bc1cf484d361ffc7e453f2eeef457": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473e46c80f9d62c235e8f1c9a2103345a007c30d9238d3ddde738792ca155c520ca3d5e6f71c11153": "0x0000000000000000000000000000000000073275326e32690b637269737379616e6e201868747470733a2f2f7777772e3275326e32692e636f6d2f0017637269737379616e6e33313340676d61696c2e636f6d00000e40637269737379616e6e333133000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473e5d8ceda089f22283a608f6cd382190e64f646c648318ba0cef6e3177d31e0d7bd753ffc28e70b": "0x000000000000000000000000000000000005416c657800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473f4bcd1862aa772d67d4382c3093feb355d01710902f2e705a2ad23b41bd67a006f5e82137f1d58": "0x040500000002000000000000000000000000000000000744616e69656c000000146f6e6564616e69636840676d61696c2e636f6d0000114044566f726f74796e63653133333335000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471473fdff1bc4baf9bb02700d16339ef586cc2850916f3a1556ab9cc6ec0fc649b0dbda00eeaa3acb72": "0x000000000000000000000000000000000008486174746f72690000000000000c40486174746f72694e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474083880a0b640654a003aeae28534daddcc861d7d3e91b576683544217044cefcf4803ced1fbc69": "0x04000000000200000000000000000000000000000000086d617873616d340000000000000e404d756469745f5f4775707461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714741fac12b13370280685555e8c1a13943f5c7702c73b2f447830c65030eaccc6b924eabd400cbd4f": "0x000000000000000000000000000000000007616d616c696b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714742651abfff8b63f6efa3511e9ccc0610b2002fefe0d71f5faefaf5b0cc88b07fef66b2b1cf2ac35": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474271bdfa6ae1a69da47518aa64a1ff00dd57c2ff1727281161e074938a18a6096b1babdbd7d1e06": "0x00000000000000000000000000000000000b52696368617232363834125269636172646f204865726e616e64657a1c68747470733a2f2f626c6f636b636861696e673939392e636f6d2f010100000c4072696368617232363834000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714742888be1295ba6bbaead6c7fb94fc60bece91d9847eec0b31d78bce6152066713100b34a839505b": "0x0000000000000000000000000000000000056552654c000000146572656c2e676f716240676d61696c2e636f6d0000094053746162316c30000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474406008848ff57f0c82db2f36c07bfec5b0740ed71bbf04598091b6d37990d6bf84c959e3a4abff": "0x00000000000000000000000000000000000743726978757306436573617200184063657361726361737669643a6d61747269782e6f726716636573617263617376696440676d61696c2e636f6d00000d406365736172636173766964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714744b3cf73bf091eabcd7eb9a65ba6073a4b69584560dac24856d42dd86c2626369f9e8cae4ff4746": "0x00000000000000000000000000000000000a4465657020426c756500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474559469cf43f4e2c4fcd7297103660b29d0123458798ecb8bdb13eecbc41a9c04530e9d13159f74": "0x00000000000000000000000000000000000830785041494e5a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714745d268c749fdfe7f456c1a72c215f5a9ca81bb0df28c94111eca509b92500b47c2b31f8bfc59d7a": "0x0000000000000000000000000000000000096b72616b61746f6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714746c4fe5893bfd45e09fc6d479ac74e565c808896aea76e5fdf7246342e37e353c5c94efb64b3f67": "0x00000000000000000000000000000000000653415459410000000000000e407673617479616e617665656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474716d14814cef8d82f736294488b59a485d55f39a68754429437d762a2973da86c68a69dc70ab59": "0x00000000000000000000000000000000000b626f7265646b6e6565730000000000000c40626f7265646b6e656573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147475f3aac064f73442831969ffd0acbbf3f772b0456bf8efe1217f291efa8feb4e989f85afa43c33": "0x00000000000000000000000000000000000661727475630000000000000a4061727475635f6374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147486007852d722beb28d79f911d3438c510261d54ebf88c62527eb890a806c921fb67177d5cc2248": "0x04010000000200000000000000000000000000000000066c75313931000012406c753139313a6d61747269782e6f7267196c7531393173756273747261746540676d61696c2e636f6d00000000066c7531393100", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714749169ed52de2b9f4854e348f7dba33f64383ac0cb3cc067b4fca99fc2b72710cb78cc9c4e1bd343": "0x00000000000000000000000000000000001c4e49434b2753204b5553414d4120312028455854454e53494f4e2900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147499a373d4b2f70f8419a4ac409fa4e7bec032c696c526fac10ff9114d928df56ca0bf9e9ae29149": "0x04000000000200000000000000000000000000000000104d41415254454e207c204153544152000013406669657865723a6d61747269782e6f7267166d61617274656e4061737461722e6e6574776f726b00000b4068656e736b656e736d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474ae4b04f564e823e42dd6f52f63bcbaf33ac5fb58a55537539f1ed9f811c1341329e975c71a4930": "0x0000000000000000000000000000000000055376656e010101157a32363039353232373440676d61696c2e636f6d00000b40416c7269635376656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474b0f64b9469490136260874c384616f8b5a95c2411b348c39fff27cce76cd42755d8d6fece3431b": "0x00000000000000000000000000000000000764636363757300000014646f6368656f6c4068616e6d61696c2e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474c050d87caa47647e4e0465c71777ec6af833a58cd011d79e25a7ff7c0a0dbdd7f8128f95bf2347": "0x00000000000000000000000000000000000a627261776e646f6a6f0e4272616e646f6e204d61636572000016626f626279736f7833323240676d61696c2e636f6d00000f40626c6f636b736272616e646f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474c0ebf8c6444329b22c3558e9004c7c046c943774f9f95a6459ade5b4aad4180d7159ebe4119a24": "0x00000000000000000000000000000000000c50696e6b204f72616e6765134b69746368656e7a6b7920262047726f6f6400001870696e6b65646f72616e67657340676d61696c2e636f6d00000f4070696e6b65646f72616e676573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474c3ae49c1416014a0afbe96d21f06c21f01a6e501750fe36c0e4697b8431fab6f94a558541b6446": "0x0000000000000000000000000000000000053230373500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474cc699b7926e3dd6a935bf6362c818dd3106b1b36b6ae8024e257a1a626ae763aa1b4858ad2a239": "0x0000000000000000000000000000000000054d4945530000000000000d406d696573746572696f7573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474d82617272f8f5c901a175702ec27245aa892dd1bcf5cbd174d3db6eac6768ca832fab149273429": "0x0000000000000000000000000000000000056d61747400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474d9203d38249c605c58ceb3d9af8f7088d7f2ae7496000c0d358cbecd774629a4f03e413497637c": "0x040000000002000000000000000000000000000000000662697432300000001461373931363032373640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474e73ec4f7c76752d65d5c1484e5faf8ad32907ab729add8ffc2ffe0f29bc18015bec2c3f8ac7c66": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474e91f24b625d4c85eb083f19535ddfc1936497ce8db7b4dfb4af273000c4e2b9148077da9260547": "0x0400000000020000000000000000000000000000000008414d49522e454600001740616d69726b68616e65663a6d61747269782e6f726719616d6972656b626174616e69373540676d61696c2e636f6d00000c40655f616d69726b68616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475229331a2dbb39412313fce4a12f0d70df33b7e34d5d4465c36287f220e43ea28005ac76322132f": "0x04000000000200000000000000000000000000000000084b726177696563000015406b7261776965632e3a6d61747269782e6f72671c6b7261776965632e76616c696461746f7240676d61696c2e636f6d00000f404b7261776965635f7374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475257b58fe3742e82ca47b427122fbbfe8de659ddc23844cac97f091453869825c922079c350ac2b": "0x00000000000000000000000000000000000a506172617368696e730e766164796d206f6c69696e796b00001a766164696d73636f7270696f33313140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714752ce2fc0e55cd08ac33b989d0b4dd35d2fb8af4cd04cc5a3831e59023cb884044f5cda0541f1064": "0x040000000002000000000000000000000000000000000b4d61746843727970746f001c68747470733a2f2f7777772e6d6174682d63727970746f2e636f6d17406d61746863727970746f3a6d61747269782e6f7267116d61746863727970746f40696b2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714753ac717444b23dd1cf3e5e0a3f8f198a63f5f7284fe493c23e88161d92d2cd418e52d050e3bd22b": "0x040000000002000000000000000000000000000000000ff09f8cb46a756e676c65f09f8cb4000014406d616e5f6375623a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714753bb535f9a5c087d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460": "0x040000000002000000000000000000000000000000000f4c75636b794672696461792e696f000018406c75636b796672696461793a6d61747269782e6f726714696e666f406c75636b796672696461792e696f000011404c75636b794672696461794c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714753d125c2bf217855867f9ad84580fdde5310bb3bc75271259aa2e8b2c2c98fc249fce382e1b3871": "0x040000000002000000000000000000000000000000000d506572666563742d6e6f646500001940706572666563742d6e6f64653a6d61747269782e6f7267146b6174656b7261737640676d61696c2e636f6d00000b406166696b736c697465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147550c5deabfe47ad2c1bc0240190ae1f8f11a721be76cd4b628e0ba46eb943bd040cdb4c93883513": "0x00000000000000000000000000000000000c4e65642052796572736f6e0c4e65642052796572736f6e010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147551fa3a9029b0b45c8c6d9b15990f00bae2cb1ada580b4542762816af1644539183aa12906923d9": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714755c80f8e6c4a211e0a847a82939b522cfc1e77ec7067dba177ea048e7241bb47415e867e1149d5b": "0x040000000002000000000000000000000000000000000a56616c69627269756d0000164076616c69627269756d3a6d61747269782e6f726718616c65787469636b6f7269736840676d61696c2e636f6d0000114046616c6c73456c6973653531383139000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475682a0307a79151dc5097277a9b8a83b3886f07f7ea245f1f487de234aec097ea6ad84d2d71343e": "0x00000000000000000000000000000000000843484d522e494f0943484d522e494f201068747470733a2f2f63686d722e696f010d7468656d4063686d722e696f0000094063686d725f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147571a6ecb5a2dbf4548dcb6c3aabe041e7f7ee65af37818dc7ff1ff1a4300008100322c39e9c610b": "0x040000000002000000000000000000000000000000000c4d65726b6c657472696265001768747470733a2f2f4d65726b6c6574726962652e696f18406d65726b6c6574726962653a6d61747269782e6f726714696e666f406d65726b6c6574726962652e696f00000d404d65726b6c657472696265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714758982f5e32232cc0a223d7867531f2390fd0eb3a2ba98d93ea437e2cd466997e2912a83ac278a01": "0x040000000002000000000000000000000000000000001062756c6c735f616e645f626561727300000012706570657065703832406d61696c2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475a0d6509fc0241396a4d072a866d0159f05d71a556328aac66e6615a6317e3ef3e1ea8809bd211f": "0x040000000002000000000000000000000000000000000a6d63626561737465720000000000000e40647269736d65676973747573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475a38f0aede221241069369c13e300464594a119fec27d43ff2a939abed871a8fbc0e0610bf6736d": "0x00000000000000000000000000000000000a506f7368506572727900000019706f736870657272794070726f746f6e6d61696c2e636f6d00000c40506572727932506f7368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475ccfb98243b897452cadfbd70405e7a8fe22235a0d0eeaf7cffc9644b3a3ccd8b5177cbb56c3c57": "0x0400000000020000000000000000000000000000000009616e64657273656e00001940616e64657273656e303730373a6d61747269782e6f726718616e647265693037303730313140676d61696c2e636f6d00001040416e6472656930333334333837380010416e6472656930373037233131353900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475cdc28c14a9cc2afa39f29d6a982110baf95aa0df5ea004d5bd47384487c755bed36e36685caa39": "0x000000000000000000000000000000000007596f6f6c757500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475d0e8e1b508954d865adbf7513359dbe7c0a088bec21c757875053271f78b003f2442b42720dc31": "0x00000000000000000000000000000000000c44757374696e20204c65650b44757374696e204c65651768747470733a2f2f6269742e6c792f334f6d67517069001564757374696e4061737461722e6e6574776f726b00001140696d63727970746f687573746c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475df5a7f3c11bfadc2519ea66bb836e7ae7d3491feaa78a9f3ea413e94c386ab086580f208d31432": "0x00000000000000000000000000000000000a4c696564324865726f0e416e6472657720546f6d6c696e0000126177746d61696e40676d61696c2e636f6d00000b404c696564324865726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475e1678efd9c765a8255ea05ae1ce1c34195681672bdb31e2b8bf9b5d39a3f22a84191d40953dd20": "0x0000000000000000000000000000000000064b75674d6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475e225b4667968a73461d66688269f501b405d7c0ffff6b767f705c5057a833d7ff7749cbfee384b": "0x00000000000000000000000000000000000f4d65746150617263656c2e636f6d0b4d65746150617263656c0f4d65746150617263656c2e636f6d000000000c404d65746150617263656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475e3c5fb2fc81969a22ae2f665befd20682d417e794ee4836e534dab09632319e7e0fa66537cab16": "0x04000000000200000000000000000000000000000000124e65774f6d65676156616c696461746f720000154063656c726973656e3a6d61747269782e6f72671363656c726973656e40676d61696c2e636f6d00000b404e65774f6d65676135000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471475fc0cc738d3f7c5e8ceea4a5b67c6502a4d1da2b7f2c09498bb0584b6410d0dda3e242748635f4d": "0x0000000000000000000000000000000000054d6f4844054d6f686400001672617a6974616a3130313140676d61696c2e636f6d000009405370756e6b4d6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714761bdb16cf74a422cc1653dc9247ac12fc2c0dd939ef12fdadd7d244e74b0975be811e4843f35352": "0x00000000000000000000000000000000000476697109566963746f72696100001376697175652e767a40676d61696c2e636f6d000008407669715f767a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714762278ddd7f9d2fe420ae612725091be044c1275af4ac86541f24a1848edb4c357b36b816839da09": "0x00000000000000000000000000000000001556616c656e74696e65204b69746368656e7a6b79002168747470733a2f2f696e7374616772616d2e636f6d2f6b69746368656e7a6b79001761656f6e7765626563616d6540676d61696c2e636f6d00000c406b69746368656e7a6b79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476436269fe98c06f8453d0ccb4af13c4b487ae02866867342e2fe6fe124c430824f583ddcb7e9e59": "0x00000000000000000000000000000000000d53616e676f2058616e676f201054616e6e6572204a61636f6273656e00001c74616e6e65726a61636f6273656e34303940676d61696c2e636f6d00000f4053616e676f3234393331363937000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476552190c60e7f90a0495a650d73c54c563ad571868583a27e8b209f2f2f4cc31c67f332cc331769": "0x000000000000000000000000000000000003626400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714765a1861cae96efbeaedc22b9e782d9d4d40aa5f1f3e4de97fb3268e30d0de993a03bc65359d8c1c": "0x00000000000000000000000000000000000a616e6e61206168686100147777772e616e6e617361676164696e2e636f6d0018616e6e612e7361676164696e6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714765f38af2758527ade93f42cc38c7609e349ca89bb1480dbd59541afc27c843526c5a3fde0fc8c37": "0x00000000000000000000000000000000000e3648414f53206f66506865656200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147661b26815a3370c9ef2c74b5a6820a16eb04205a9d177c4244a94cdcfe1275039ef8704480a3905": "0x040000000002000000000000000000000000000000000763796265724700001440786379626572673a6d61747269782e6f726712383876676b383840676d61696c2e636f6d00000f4076616479686f646c6572373737000c637962657247233438383900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714767231bfd9d9921676d33240f4b328bb3536f2f5f43ecafbeb3694a7e25598d81bba69ce69506168": "0x00000000000000000000000000000000000a436865756b204e616d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147680539dbbaf0658cecae006fbf10a81337d87455340ce6112b125a971482490e02d75a27bb2c33c": "0x04000000000200000000000000000000000000000000064561726e58000017406561726e787374616b653a6d61747269782e6f7267166561726e782e7374616b6540676d61696c2e636f6d00000c404561726e785374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147698861f374eefe70ce1cdf8f0c7f65b38b034bbd62a2c51eb4f02bcf4ce6691c01ad2f50bb01841": "0x0000000000000000000000000000000000094d6f6b756a65616e0000000000000a406d6f6b756a65616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476a3455700cb811448f31778f2cd7b542127a81c6399a5dc333c691cda16418ce9dcf2023d3b230a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476ad7533e77fcf9ee4d08b1a297dde589fa652c4e340037e5108c7e7fd7fb94631e02cc5602e5a4f": "0x00000000000000000000000000000000000867616c6572617300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476c091a5cfc0b569cc10aff3a4e5cf2f467d1ebcff68b3a06d432ef8bad605064fc88866429b7000": "0x000000000000000000000000000000000005416c657812416c6578616e647265204c6f6d62617264010114616c6f6d626172643340676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476d10d82508ddae096e24e9b5ab82dc275b82318a52cebed1cae3e25be096d5f288229b256359e43": "0x040000000002000000000000000000000000000000000b537769737320506f6f6c0000000000000c4053776973735f506f6f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476d4bdfcc3fd9b0f169844782440a77d789ef60cf8b4dca2caaffbdaef8842105e401a6628aebe11": "0x0000000000000000000000000000000000134a65666665727920426c6f636b4d616b657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476d8de28c15a8e696a51e7f4c64e59e468d49709561ab3d04062aebd5c0f297a491a8002f2a72250": "0x040100000002000000000000000000000000000000000a4a696d6d79204368750e436875204368756e204d696e671d68747470733a2f2f6d656469756d2e636f6d2f406a696d6d796368751f406a696d6d79636875303830373a6d61747269782e7061726974792e696f176a696d6d796368753038303740676d61696c2e636f6d00000f406a696d6d795f63687530383037000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476eef4ee4756ace55c00bdb5472e548ff2126b45ee064c8dc4a28ec22bacedde0b94ec691ca5d648": "0x040000000002000000000000000000000000000000000c416c78203220737461736800000016616c6578657940766f796e6974736b69792e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471476f257bc22f38143849b3cc4c3aa80841d99f834aeb0b204a65bf71c9ccd6577945e75188397554a": "0x0000000000000000000000000000000000096173656e7475726b0000001861686d65642e73656e7475726b40676d61696c2e636f6d00000a406173336e7475726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714772841a40326b32e5e7a3f7b33d6abe2f9510091af389384bb1ab14ab421c4b3bd6bcf795fd54873": "0x0000000000000000000000000000000000084e466d617263690000000000000c406d617263697061616e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714772b6dd134dbece18e428bc5c22f213b32118358403cf626ddeed283fa946889b5512e92eadd8a61": "0x00000000000000000000000000000000001359757269476969207c20524d524b2e6170700959757269204769691668747470733a2f2f7777772e726d726b2e6170702f0018797572692e6769726a616e736b6940726d726b2e61707000000a40797572695f676969000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147736d72637ca5ab07af655360c0cf90fcb636adb5caa425cf3911b2707fa85a86ed8cf16e590d216": "0x00000000000000000000000000000000000a536572686920322e3000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714773dee8f55ce5355f6354361a43b2ac461373d645f232de95222e5a067e4dfae25752e1f5a92c855": "0x00000000000000000000000000000000000a566c6164696d6972530101010100000f40566c6164696d6972535f627463000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714773f55df525fa6d534ea169f0bbf6ab861377b3e9cc34e52ffa3f1674f887b71b14b32404221b135": "0x040000000002000000000000000000000000000000000a73656279747a6130350000164073656279747a6130353a6d61747269782e6f72670000000b4073656279747a613035000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714774da64b663dd7d90eedf5b5991e93ca6682d493f8684926b6b63234410e1486ab77d2f32c0d997c": "0x000000000000000000000000000000000004676b320c4761746f724b6f72707332000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714774e798df2f721b6945e3aeeed6199fd8d6847051b2a2d934dc9829eedaa45cec70271e37403d050": "0x000000000000000000000000000000000010444543454e5420504152544e45525314446563656e7420506172746e657273204c74641868747470733a2f2f646563656e742e706172746e657273000000001040646563656e74706172746e657273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147775da760598d092885ba76f4524bc17e5b1bfa2a4adf9b232fb8fa878637d8a9a9fe9ab8de2db4d": "0x00000000000000000000000000000000000847616d6544414f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147784c0640018c813102e184cab1726546391446bfb60b78b2fa78a927f7bf2bd4a734cfeb62c8909": "0x040100000002000000000000000000000000000000000d444953432d534f46542d31300e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714778e5b823e917c204e1b7df1c25a717adfd14ac5b1c65729320a22679677aaa76a874481fb47e140": "0x0000000000000000000000000000000000054f7365720aed95b4eb8f8bec9db4000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477a8f518e90d0d2cbe1c8831d018fed582688b5e75be3c9983ac1761fb24a916451c6999c0c66f5e": "0x00000000000000000000000000000000000a73796e636c75622d320a53796e636c75622d32000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477aa5087f8d73da5f298ab8705f9d69a9955907f011b1d7eb853967859fcc6065deb0b2152f99b2f": "0x040000000002000000000000000000000000000000000a677265676f7269757300001b40677265676f7269757370657472693a6d61747269782e6f72671b677265676f72697573706574726940686f746d61696c2e636f6d000011406269616e6361696e74686563697479000967726567676c612e00", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477ad80c392d951980a16d6fd4dc2954c449699e5f6e3c7d2f0dc64df5b8008135fd60eb3eac61e6f": "0x040000000002000000000000000000000000000000000c7733636f696e73202f20320c7733636f696e73202f2032000010696e666f407733636f696e732e696f00000c407733636f696e735f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477b2306d55618a8bdaf9e258248303362ed9d0b45920e6dc07a1bfafd053c4b7a345340fd4bd9357": "0x00000000000000000000000000000000000b77656e6d696e747369720b77656e6d696e747369720e6d6f7573652d64616f2e636f6d001577656e6d696e7473697240676d69616c2e636f6d00000c4077656e6d696e74736972000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477b87309f6cae82ef455298acb3f8ea6f9d027b7c64a09fa48e70e793797ab0671a65fde287ef917": "0x0000000000000000000000000000000000115a657573205468652042756c6c646f6704524e44000014726e646c763230323140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477ba939f01b84a579c498e54dc6d09282842bd6c3d6add63c626b0838149004d3fe55df18467424a": "0x00000000000000000000000000000000000f4b7573616d6120596f204d616d610000000000000b40686564766f7963657a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477e7c81b688e86ab38a7ddb36feebd8be00186f38273c7b9c0f3415d0dbcf9425af23baa7e86454e": "0x0000000000000000000000000000000000000000000000000f403038324b7573616d616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477ef359c63039c607a7a5f759444657faa370e0c7648ea82b7de38d94095646afa9889dff83a2b3b": "0x00000000000000000000000000000000000672313076340464616e00001364616e2e3130763440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477fd1e387545e3290a84cc0f8014ad2583df5d2a0298128a8096160a1303b5700785e59acebe4f06": "0x000000000000000000000000000000000007503474746f6e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478002396ad151eccf413237f470027cfdcbad3f3ec8a4bd0eeae013767ba226d4b8ed4e422e61f01": "0x00000000000000000000000000000000000f706f6c6b617263686e6f6d69637300000019617263686e6f6d6963734070726f746f6e6d61696c2e636800000c40617263686e6f6d696373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147803fd5293bb10b7f40a5105916d3b2e8d8dbc33dd65990b50002d116e41833ce2fa96c8619f7229": "0x0000000000000000000000000000000000065061756c420b5061756c204272617475010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714781495c979b2e4523a4ac0daf927a452ba14109b8e0c334aad8f0d2d2fe2605346eb14c4745f4f5b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478255621fd0ac553544ff9f7dd373ef4057deaae18a4cac212e8ab6c3ddd696af9b6f945c1336e08": "0x0000000000000000000000000000000000094f6a6f6669726d650a4f6a6f204669726d650000136f6a6f6669726d6540676d61696c2e636f6d00000a406f6a6f6669726d65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714782e7be4e56dc7e9ae963c00a7c164fce3f4a8ed94ba0a87e83cc1a7b192726836819cf1f63c522b": "0x0801000000020400000002000000000000000000000000000000001356616c6964436861696e73204b7573616d61001868747470733a2f2f76616c6964636861696e732e6e6574154063673135383335363a6d61747269782e6f72671668656c6c6f4076616c6964636861696e732e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478331d8cc49f0ef276f45a1045fe47a639befe802be7eeea599080222e2f45fba46492039609cc07": "0x040000000002000000000000000000000000000000000ff09f95b454555845444ff09f95b400001a407475785f696e5f74757865646f3a6d61747269782e6f72671774757865646f2d77686974654070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147839058a91da35f1a263c8ff41827b72b0e7c7f2dddf460cf61bd57cabe37e1936ac5451452c8119": "0x00000000000000000000000000000000000e506f6c732061206c276572612000000017706f6c73616c65726140747574616e6f74612e636f6d00000b40706f6c73616c657261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478401030f0261c10a49deb88afa394b7eb478483a65a8c8f060b7de319dc6f65776a84d9e8f40e7e": "0x040000000002000000000000000000000000000000000e56414c4944414e44554d2e494f00001e4076616c6964616e64756d2e696f2e6c65653a6d61747269782e6f72671c76616c6964616e64756d2e696f2e6c656540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147842c8fa2321f1331c8631eed8177ca1e36107697b82afdcdc5ca1a3221796e8e614f3a6fee09c3c": "0x040000000002000000000000000000000000000000000964616c6d61444f5400000018726f686974726168656c34383540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147844550bde08fe13c40c37aeda337a3d84628534a349c778f4718fb9f6e6c5f0c9bdca2b5e44fd49": "0x00000000000000000000000000000000000d466c697061636164616272610e466c6970204163616461627261000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714785d8583e9b989bc9ca9b80f86dcc4755225a09c681b3f26f8726727be13e22edce6d9606f90c605": "0x00000000000000000000000000000000000e73686974697362696774696d650a44616e204261756572000015626175657264616e353340676d61696c2e636f6d00000f4073686974697362696774696d65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147866877cb9f3ebb8002112fe63749d3925cc0f36c9440450f21fe76c46a36e5b3343bf47d8c27400": "0x04000000000200000000000000000000000000000000054e696b300000144073616368696b303a6d61747269782e6f72671c73616368696b6f2e76616c696461746f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478793b4db20d123c8e111a2e445cc0f64b5809496887b3130718d969db6637c0ebf1118c39b15c55": "0x040000000002000000000000000000000000000000000c7733636f696e73202f20310c7733636f696e73202f2031000010696e666f407733636f696e732e696f00000c407733636f696e735f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147883a128c175fcda5c7c138d8c7e2fa8a340509d00abee2e593ee159d44aaed005e6cd715fc3a962": "0x000000000000000000000000000000000005f09f908901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714788ce32e00a517a71a6704e77a51c290fd77bc04c40e080df04cbe0d05c6153809e315bb6aba2f7c": "0x00000000000000000000000000000000000f53706163657273206d696e74657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478a36b37e7c8a45b4c676770b34941cb7911f0ae00880839f51ad31da8c0eb3703b10f37e6ec461e": "0x000000000000000000000000000000000009417175615461696c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478bdc0755cc0041a684d341d7bd4328296ef486454ae52c31e38b1420d509d66e34a473ce15c4914": "0x00000000000000000000000000000000000d56657865644f7374726963680000001756657865644f737472696368407961686f6f2e636f6d00000e4056657865644f737472696368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478db62c47c6f528d0a4713b1197cab2fc64ebc8f1f65b3c6d76a8e64d13d61a4e7e6d26018fbb8ab": "0x00000000000000000000000000000000000c474d6f724469652044414f00000011696e666f40676d6f726469652e636f6d00000a40476d4f724469655f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478dc64ae118a61a2b80adab283f96e115f1bcc05211dd11e75ffa4257dcc33cf704d019606094739": "0x0000000000000000000000000000000000066c75636961066c756369610e7068616c612e6e6574776f726b08406469656f683b00000007406965686575000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478edf2d109908df4067f9883bbb39d48af456babb990409e10567c251c7237cb8709b56a7ec5786b": "0x00000000000000000000000000000000000963617272797765620d6b6920686f756e672068616e00001465636f2e6b6868616e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471478fa03421f9ba61e726ef17b500f436cf596935acac782c71a423d35a959f3e6831f13c34db9d71d": "0x0800000000020100000006000000000000000000000000000000000a58796c6f44726f6e650000001978796c6f64726f6e654070726f746f6e6d61696c2e636f6d00000b4058796c6f44726f6e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714790543fc3e74b681e0f527663883fadc99963738cc81dd244d866241b296cb6d54596c296170534b": "0x00000000000000000000000000000000000f4573706163696f2043726970746f0f4573706163696f2043726970746f0000196162726168616d406573706163696f63726970746f2e696f00000f406573706163696f63726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714790d9013966da8e5aa586da0f7eb3da5b7ec7dfc89be91b6ec1ed7fd82aab54aebb6d71423080868": "0x0000000000000000000000000000000000087061736375696e00000011702e6272756e407061706572732e6368000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714792c8b74a404b20220e6f95ce6c0d08f1578ea375de14bbf04d449cf817c1b0b576edd00add11d5e": "0x000000000000000000000000000000000006426c696e6b0000000000000a404b534d426c696e6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714792db7b2b1e449a2d0c696806e3f6020040241eefddbbbb6ef5bf870f4c77feaac4775d26e7a662c": "0x04040000000100902f500900000000000000000000000000000000000000000000000000000009706f6c6b61646f74085472616c646f740000116a677472616c40676d61696c2e636f6d000008406a677472616c000a7472616c5f6c656c6500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714792e04f3dda19263a61514d5cabf81b3f62650806870ad83b2e5059538b846b6dd9963e010566a17": "0x040000000002000000000000000000000000000000000a504f535448554d414e0a504f535448554d414e1b68747470733a2f2f706f737468756d616e2e6469676974616c2f204076616c696461746f725f706f737468756d616e3a6d61747269782e6f726719762e706f6e696d616a757368696a40676d61696c2e636f6d00000f40706f737468756d616e5f647673000f616e74726f706f636f736d69737400", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479400eb594b6cde92ac4cde57f9b59d92a58b75a696fc7c8f23f63f0e507145f1d0ef3413a0a4255": "0x0000000000000000000000000000000000104e6962626c652062697473204b534d0c4e6962626c6520626974730000196e6962626c65626974732e61727440676d61696c2e636f6d00000d406e6962626c655f62697473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714794c7db721956af68a56b1da8dc3f4bd58630c15f5754ee634528a007ab510c86a7e1fe6e62f4166": "0x040100000002000000000000000000000000000000000a414c46415354414b45001668747470733a2f2f616c66617374616b652e636f6d0010616c66617374616b6540706d2e6d6500000b40416c66615374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714795234d3f309d6d928806960ed2b5fe0085bf2a7119dfa7d5aafa82cd6a4c13ba365e6f60b351e2b": "0x00000000000000000000000000000000000d4a616e6973205069706172730d4a616e6973205069706172731f7777772e696e7374616772616d2e636f6d2f6a616e69737069706172732f0018706970617273666f726576657240676d61696c2e636f6d00000e407069706172735f6a616e6973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479585c82582ba5886c8f9ce90ef15bbb188d6b310bf351d0ab7db5b56ad0c612a2f59faef49ad307": "0x000000000000000000000000000000000009766f6c7465726f6e0d456463656c20426572696e6718766f6c7465726f6e2e61727473746174696f6e2e636f6d0017656463656c2e626572696e6740676d61696c2e636f6d00000c40766f6c7465726f6e3364000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714796a244fdb685192402f9f91c708b2f2bce4117ced908fcc3d2627b9f49cab6eda2aa0466800d90b": "0x040000000002000000000000000000000000000000000b4541524e535441534833001668747470733a2f2f6561726e73746173682e636f6d001367726f77406561726e73746173682e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714798bc3485a0137f5de4a268c87586c0396cd8a46f0bcffd0229bd1075894df86d3c95193b27efc2e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714798f3d8958aea0ecce17aeb93e8c317b03168d3459ad0214f0ab47d844d7b22033b79d8e45508c04": "0x04000000000200000000000000000000000000000000154c6f6e67204e65636b2056616c69646174696f6e0000000000000a40626f6c696b617465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479ab4299c1df4149c2ed7fff877c4b79589f9716c09946592ff894a011fd5f462b3e0517f1bd562c": "0x0000000000000000000000000000000000174368616f73204269726473204172742053747564696f0000000000000c4042697264734368616f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479bca3c1ed2e66e5daca1f54b717110efd2c4ddba6a4a2af7794a66a38bac564e2eb93a627bfec1a": "0x00000000000000000000000000000000000441737504417375010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479e65a55eba330a3ba169058d0c44fb1c127201307004ea2f54930043ac06a7ee0fc6a2e2293b329": "0x00000000000000000000000000000000000749534142454c0000001a63727970746f737562694070726f746f6e6d61696c2e636f6d00000d40737573755f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479f44e04fbf309e0e8ba1059e1e856708fda311f1e008afeff98f61978b96740f4b566bf29f32352": "0x00000000000000000000000000000000000a6d6f757365363439320968656c6c206e6168000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471479fd3f4b616af04ea62f28c78bc6e6f0fa30808f5c8f203a4881c77fb732a00089fde9ad87ded73d": "0x0000000000000000000000000000000000085348494b4f4241094164656d205a6f72000019706c616e6574616c6d616e61634069636c6f75642e636f6d000010405348494b4f42415348494b4f4241000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a0fd3be900ddd6b0a7ac5be69a8243f8880d5fd015b2e8f8f30ce6c7162f8bcb5ad1a1fa4246d32": "0x040100000002000000000000000000000000000000000b426c6f636b736861726410426c6f636b736861726420476d62481668747470733a2f2f626c6f636b73686172642e696f001468656c6c6f40626c6f636b73686172642e696f00000d40626c6f636b736861726431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a246b025078730ed4fa8184e7ea69dbb3cbee71cfd7490803d457140d5d57d0e53a49a887bc4a06": "0x00000000000000000000000000000000000c6578706563746368616f73054769616e2168747470733a2f2f6c656e737465722e78797a2f752f65787063746368616f73011a65787063746368616f734070726f746f6e6d61696c2e636f6d00000c4065787063746368616f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a2939f6c5b0bc2542a463a7a8813a1272eb8605af0c83660ce65b57d3d5f85ffa5eeff31793ad21": "0x040100000002000000000000000000000000000000000a416374697661746f7200001a40616374697661746f726e6f64653a6d61747269782e6f726718416374697661746f726e6f646540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a3a19d147ea88111e0df3bee6fe15fd9bda70092476cf116506064e04aa9388bfb5cc95fe9a7836": "0x000000000000000000000000000000000007636861726c7903435200000000000b40435261796761737365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a44a3d1b39b54493692082b41c6f2cad15ba58a7c962c2f435ec4e6638aedb2c851a90bd4f03f11": "0x040100000002000000000000000000000000000000001a6e2d667573652056616c696461746f722023312053746173680c6e2d6675736520476d62481668747470733a2f2f7777772e6e2d667573652e636f154076616e74686f6d653a6d61747269782e6f72671563727970746f2d6f7073406e2d667573652e636f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a5bd17ec506c9c5d2365c4c6c0e812a77aabfb804bf75ece6c010669c21fcff48edf5208a3e3a63": "0x0000000000000000000000000000000000076b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a87c1a545342f8db6f53125f95e71a35535efc16d86142bb9547ee9e24abc8e74fdcef0b078ce50": "0x00000000000000000000000000000000000864656e697378660644656e697301010100000a404446656c74616e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a8cdcdb01c0984188e5872b9f167067f4643d21128ebcebd8a017e601055451432503af1703cd7a": "0x00000000000000000000000000000000000b487970657220436c75620000001a68797065726c6f636b6564636c756240676d61696c2e636f6d0000104048797065725f436c75625f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147a98a4b9eacb17aeaa77918b3029d54685efa54738d2dfb3a172cdddf800b7bb1189e1717220e472": "0x00000000000000000000000000000000000a496e65666661626c6501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147aab7b06334f0de4562ff43de6459fe64e03e965644c3ae5aa94d383c6eeeddfe96a85777d196603": "0x000000000000000000000000000000000005534841510553484151000011736861712e696e74406c6973742e727500000c40534841515f5457495454000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147abcdd59281433e90a5cc2047a1215e4758a0cbfc07d10b287327c0929e780d7be8642874c4b7606": "0x00000000000000000000000000000000000a79615f616d61726f6b1159616e61204e65766f646e696368656b00001a79616e616e65766f646e696368656b40676d61696c2e636f6d00000c4079616e615f6e65766f64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ac654eefb24124154af43ebc6cea9969e01ad1cdb66b1d82c291f1aab334cb3f854f67ad68a9a26": "0x00000000000000000000000000000000000c47686f7374204167656e740000000000000f4047686f73744167656e745f4f47000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147afcd22bd458c5e66aa7f16d0ce7a6288dd1d2f1779fafb18d4c60ee78e89ab3dd3bc0979aad386e": "0x040000000002000000000000000000000000000000001b4d61726b65744163726f73732d426c6f636b4275696c6465727300001c406d61726b65746163726f73735f62623a6d61747269782e6f7267196d61726b65746163726f7373626240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147b2722eb6380c719b4b2436a2db80368af17fb8a41e3895f3e1ae305d705eda24a60e20ee5055e02": "0x00000000000000000000000000000000000b457265626f73303530360000000000000c40657265626f7330353036000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147b2a45dd87ad9b19a6ad826eb856ef28698449bf4103a10f62f5f20ed4604ea2c1c62068cb26200e": "0x00000000000000000000000000000000000006416c696e61000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147b35d7021f4bbfded244ce5d458028ab10f9ba6eef01fda2953990aec9f433c2badd94d982918e0a": "0x000000000000000000000000000000000009444f546e4441534809444f546e4441534800001b646f746e64617368617274776f726b7340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147b3c1c60afa16946d463b40af00de0a725978a340e77acec44981702cb83d3f6b7eba082effe333d": "0x040000000002000000000000000000000000000000000b4b534d2057616c6c65740000000000000c404554585f43727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147b695b311c79a7fc5ab511f883a11f02c9af8054b409f4878f98b04f7cb9eba289b8a0297d79173c": "0x0000000000000000000000000000000000074c65737465720000000000000e406c5f776f6f64666f72657374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147b85696876ff480a6e72261b4e3c4405420177b2d56a579337eca2fb61e849a66ae35be7b0f0cf02": "0x04050000000200000000000000000000000000000000104b616e6973686b612052616a707574106b616e6973686b612072616a70757400001d6b616e6973686b613633393372616a70757440676d61696c2e636f6d00000c4b616e6973686b6152646a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ba630360149afeb56e9233d9889e00e3c03f1cc20dd23c0dab8ea23e5b60fc423b0e631f2a19b47": "0x00000000000000000000000000000000000d434f4c4c41544f52532e494f001568747470733a2f2f636f6c6c61746f72732e696f0015636f6e7461637440636f6c6c61746f72732e696f00000d40436f6c6c61746f7273696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bb29bc9d1b02b887063da8fb9f496867aaed0e760ed9866ce51c4e91dd7e4a341f9af7086f08c34": "0x00000000000000000000000000000000000e5061772d6665637420506177730e5061772d66656374205061777300001770617774726169742e6e667440676d61696c2e636f6d0000104050617766656374506177734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bbbb302ea3c73fd6a1e7cf7558378809fa376f7eec7b065d30759f8a4e7b721ec2ae74b313f0855": "0x0400000000020000000000000000000000000000000015616e6472656974612d76616c696461746f722d3000001540616e6472656974613a6d61747269782e6f72671b616e64726561662e7370657a69616c6540676d61696c2e636f6d00001140616e64726561667370657a69616c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bc80f4306d5529f7a54e6a55c0453407909789a06c3ee6719f8735ac370d6f17dc342717fd76819": "0x040000000002000000000000000000000000000000000b5374616b6520506c7573000016407374616b65706c75733a6d61747269782e6f726713636f6e74616374407374616b652e706c7573000011405374616b65506c757343727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bd011e2b24427fd3ac61927f22210f94e610302612161d8b654db31a59babe728e48c3365313440": "0x000000000000000000000000000000000005426c6f6200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bf2c0491ddcbed34e908afcf0fb6b394bd1a043bc8b226fac33b4742731b9cde5d324f450eb3006": "0x0400000000020000000000000000000000000000000018454c444f5241444f2d544543484e4f4c4f47592e6e6574002068747470733a2f2f656c646f7261646f2d746563686e6f6c6f67792e6e657415407061756c2d6769653a6d61747269782e6f72671d7061756c40656c646f7261646f2d746563686e6f6c6f67792e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bf3bd886ed78f2a3e01274f4de899bd98847d7bb544371503102f4d5a201aae95187cb850f4ad2d": "0x00000000000000000000000000000000001072617269736b617465626f6172647301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c042a4fb9dbabf496bb0203d41e1ba3170850ee862f64c451b09159d9344d10b641feed65d30162": "0x0000000000000000000000000000000000086d617263616d790000000000000a406d617263616d7931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c1466766d8e06522ce1929ab903f695bdeeeb79a588774d71468362129136f1b7f7b31a32958f98": "0x040000000002000000000000000000000000000000000d696e636861696e776f726b7300127777772e696e636861696e2e776f726b7316406461667269636173683a6d61747269782e6f726716636f6e7461637440696e636861696e2e776f726b73000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c1a4ee18bd3983f5262b0fe348437cc140f47a9fd3818787fc5b72fdbf2a79693b599d464416f7d": "0x00000000000000000000000000000000000a426c61636b7374617200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c1bddbb2e7b2b75a85040fb4858bb0af5be5d20833d58a0b093c35927090deed8a2a6ec8ca95d4b": "0x00000000000000000000000000000000000a506f6c6b614b696e6701010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c1f3ea8d8d889e4aa6716504b6e349996c6b7d6832a2103f48fcf53ead6a647a36af9eee8ad6733": "0x00000000000000000000000000000000000e46726964612047616c6c6572790853414e4354554d000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c24fdc8783352eda417107f4162f22d0f8d00f4d4498216cb35682c90240b59ef80a93d6018d520": "0x00000000000000000000000000000000000f506f6c6b61646f7420576f726c640f506f6c6b61646f7420576f726c640000167465616d40706f6c6b61646f74776f726c642e657300001040706f6c6b61646f745f776f726c64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c2fabb1c3a36f8f280a78e265cd8a5274321bf5d0036e20ec9aa7e145667fce26f6e774c2516773": "0x00000000000000000000000000000000000c43727970746f4a6f65323300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c35760e1493bdc39244b39ea5a40c289a1bae88df2aafb1c7024e53a8ba9924065aace7b5f17d1a": "0x0000000000000000000000000000000000096d61756e616b656100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c36ab3c7817f712728ea7cd638962b92ec6405e7b5572b67cfbc96c7c2fc7becf4cddb22b50b02c": "0x00000000000000000000000000000000000e4e6163696f6e2043727970746f07416c657820470000176e6163696f6e63727970746f40676d61696c2e636f6d00000f406e6163696f6e5f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c379f62304c02a738bf717e43124f5679168a3ab1ef2490662f9b08508c5328786ea7c8fda2d72e": "0x00000000000000000000000000000000001242756c6c69736820e382ade38383e383890e444d20666f72206f666665727300000000000f4062756c6c6973687468656b6964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c55d4e4996a81667670dd46299698281a6d0034fdd5484979f6f96ecb0f181e96442387fd1bf831": "0x00000000000000000000000000000000000b5346522053747564696f0000000000000d405346525f5f53747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c7bec710790ac95948ce1d407b5915c413f1b4813162a9782bacedbff9bf43844df10e5612a4d33": "0x0000000000000000000000000000000000046b6f7401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c898863ee64a53fd0fcf4956cda58392e1602fa60d6bcb408356ad853287beaa4c33962b6440f20": "0x00000000000000000000000000000000000d72616e646f6d626973686f70001d68747470733a2f2f7777772e64617461736369656e63652e6172742f000000000e4072616e646f6d626973686f70000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c9b151305dcded7e26969331bf77ce04768009026a5362d51e5bccc12f788b8cda2a43ef218bd04": "0x040000000002000000000000000000000000000000001856462056616c6964696572756e6720f09f87a9f09f87aa001b68747470733a2f2f7777772e76616c6964696572756e672e63630017636f6e746163744076616c6964696572756e672e6363000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147c9e204de64a64fe366850fd0d31d0261237699990f450e0b2cb41cfc4ec7b2ca6ebb7b0435d3654": "0x000000000000000000000000000000000005526f6d610f526f6d616e204368657265706f761f68747470733a2f2f726f617274692e61727473746174696f6e2e636f6d2f0013636865726f6d383140676d61696c2e636f6d00000e40526f6d613633323032343630000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147cb3d8e166e9bea1044e495ecbfe9e4a4c436b753e3bd41b0249e45e7210ae7caa5e7bce20671e6d": "0x000000000000000000000000000000000009646170686f6d696e00000013646170686f6d696e40676d61696c2e636f6d00000a40646170686f6d696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147cc6f5d138fccd7c32c57d0d50eea3e0561d15d28ffded023d7ea2489499d39ffd20c07bbbd11732": "0x000000000000000000000000000000000008486c616464696e0000000000000d40686c616464696e73616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ccb553670cc1be59a9407f791aa5535102209c0d7c89f97f52f0f40b3091f672c5141aa11801f59": "0x00000000000000000000000000000000000a506176656c204b534d17506176656c204e696b6f6c616576204b72617374657600000000000e404b727573746576506176656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ce1a23eb5655e8050c8d2fdc12aabf21a31c0f6812cc0e7525597972ca0a37ab9bcef9f51650811": "0x040000000002000000000000000000000000000000000846524545444f4d00001b40636f6e6e65637465636f6e6f6d793a6d61747269782e6f72670000001040636f6e6e65637465636f6e6f6d79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ce6fa220b1f0d1ba06446b3474c3d9dcfb759f3df134cf4b6620b2559c4e1b99d3be4d010378f40": "0x040000000002000000000000000000000000000000000a5354414b452d4f5053000011406876616c3a6d61747269782e6f7267147374616b65726f707340676d61696c2e636f6d00000a407374616b656f7073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ce77bdfc2d91a1e54e20840d041d6626327c3ee6c0555e991b4e893e6b998f269bc85f1a7503f1a": "0x000000000000000000000000000000000006556e646572001968747470733a2f2f686f6c796368656573652e7370616365000000000f40556e6465726772617068696373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d13ee9b5b531cc24ea378f0cd9285451e51e00c2e68851a57a36662990baa9226ab5c7734e05737": "0x0000000000000000000000000000000000065350414345054e4153411168747470733a2f2f6e6173612e676f76000e696e666f406e6173612e676f76000006404e415341000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d26f412c600f65a48745d28d9e9596ca41b7f7bcb03f874757f4f0716a7237e566662a6393bc125": "0x040000000002000000000000000000000000000000000852686f6d627573000000146b656c6d616e6d6d6540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d2dd084386fd77b18cf1686419c41dc5d3e76d373e3176c32c6d23c755fe1fc357f9c755ffc0019": "0x04000000000200000000000000000000000000000000075374616b696e000014406564776172646c3a6d61747269782e6f72671168656c6c6f407374616b696e2e636f6d000010405374616b696e4f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d363e805ca7dc102e6dde560aa0f00b08d0db5e3c2f199181be3ca53d2e7a0a742aa5692433060d": "0x000000000000000000000000000000000010446553746f72655f4e6574776f726b214b6f747a7572204d6172696e6520496e647573747269657320507479204c74641968747470733a2f2f646573746f72652e6e6574776f726b2f19406a6f736961686b6f747a75723a6d61747269782e6f7267186a6f736961686b6f747a75723340676d61696c2e636f6d00001140646573746f72655f6e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d3aabffb2e14c3d20dffa395a3019c0f32205ada0abe3d79389a209a7ec31e53ff55ebdeddff46d": "0x00000000000000000000000000000000000d466f756e646174696f6e2e5801010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d3c67d22eef172a8c20d46f86242eea89c400d5c478207e05c76bbab29a748af8aac90d627e1a01": "0x040100000002000000000000000000000000000000001256616c696461746f72732e4f6e6c696e65001b68747470733a2f2f76616c696461746f72732e6f6e6c696e652f000000000d4056616c696461746f72734f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d411dcb862ed4531294b53cb96f295c8920789005ffe63ce3a3b02d8bd7591fdcac8cfd50ccae11": "0x00000000000000000000000000000000000c436f6c6c656374696f6e5a0000000000000c407261696e626f776e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d44fe16767b62f23c52ad5876acd95595414a3e1c47afc410f9cc28db853b2f024dfec10d8bbd4f": "0x0400000000020000000000000000000000000000000016416e7469205374616b65205374616b6520436c7562001c68747470733a2f2f616e74697374616b652e6769746875622e696f001d616e74697374616b657374616b65636c756240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d4bc48ac25c63f1a68d2023d2a06f5042d7b2a268a330c38732d209b07bca2802ee241952235210": "0x000000000000000000000000000000000007436f74746f6e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d616786735a0c05f27568417dfb3873918d1e4316450de4e3af810622b72e9931863c31ed854f5a": "0x000000000000000000000000000000000015e284a2c39fc3b8c3b8c2b6c2abc3b8c3b8e284a200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d647315c276b2ad56baa9b15ae335e108f3a6a84c2f6c8ddcea0a96477fefe9f5670a819802116b": "0x0000000000000000000000000000000000094269484f444c203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d6816787a83cc6cccb149c0e1f585be4511d6f942de360c39827f904cbdb9a8c572d580a8b95f0e": "0x040000000002000000000000000000000000000000000a736572676579303037000016407365726765793639363a6d61747269782e6f72671a706f7461706f76736572676569383640676d61696c2e636f6d00000a40736f6c73615f736100087373613131313200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d73ff709d9ae6a4d53c9c6e61431448ceef1eb49542ddee942dd3d6c81c19d53efbab8acb02f00f": "0x0800000000020100000002000000000000000000000000000000000f426c6f636b7365656b65722e696f001768747470733a2f2f626c6f636b7365656b65722e696f1b40626c6f636b7365656b65722e696f3a6d61747269782e6f7267166b7573616d6140626c6f636b7365656b65722e696f00001040626c6f636b7365656b65725f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d76b3fc859618eb1a41e8f79310cf5b804b038d19f28b535261fc5c1c3d1dcfdc49e6bf5a946d32": "0x04000000000200000000000000000000000000000000067a7a4265710000001466726f7a656e67756b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d8fa5989cce248be07628deaa9c6fbbf2288f879396ff3566871c0dbce85c9e23764d15b810657f": "0x00000000000000000000000000000000001e44616564616c7573202d205374616b696e6720466163696c6974696573011f68747470733a2f2f7374616b696e67666163696c69746965732e636f6d2f001b696e666f407374616b696e67666163696c69746965732e636f6d00000c407374616b696e67666163000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147da4d6e045faa8163a731ac0ae7375a2cce5b504484d91f1c49923b3425072e36e12b0afd5f2a857": "0x040100000002000000000000000000000000000000001542696e61727920486f6c64696e677320f09f92b01042696e61727920486f6c64696e67731d68747470733a2f2f7777772e62696e6172792e686f6c64696e67732f17407461636f747572746c653a6d61747269782e6f726715696e666f4062696e6172792e686f6c64696e67730000104062696e617279686f6c64696e6773000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147db14798f78c92e409ed7dc92692f6d1b8bf5e71b68f9019a16f825e4eb71bb22c5bcbb9fec300d1": "0x040000000002000000000000000000000000000000000830786e3030627a0000144030786e3030627a3a6d61747269782e6f72670e30786e3030627a40706d2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147dc9a3488002e55b9ef65e3341a0a9e7e3b70c9af1ff1d6ee9e59567071bbf6f67940d5367532225": "0x00000000000000000000000000000000000c6c65616b65642d7a7330320c6c65616b65642d7a733032000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147dd1665541d4746a38753d84c52f2cf326a92899fc7113242a46879511684ef558436b2ce95d8a7f": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000b73697854686544617665001768747470733a2f2f736978746865646176652e6d652f124068657866663a6d61747269782e6f7267127369784063727970746f6374662e6f726700000c4073697854686544617665000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147dfe17f3928dd74c88480d4bfa9c9e6e217df08b61134f96a9f1b78713d3c56540d865296e530e0d": "0x00000000000000000000000000000000000d4d72204d616363686961746f0000000000000f404b696e674d616363686961746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e1d98e7b551be5a30fd1beaa72357f61ba1fe7e90aa8c5080fcd49b2c82e1b8315bcd9a223cbe41": "0x0400000000020000000000000000000000000000000014f09f909d2043525950544f424545532e58595a0000164063727970746f6265653a6d61747269782e6f72671e63727970746f2e6265657a7761784070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e2263555f112d23e0b27830a257252988efa5bf9d223ece5ce9eb120abe621bf5423deb2c3a8c67": "0x00000000000000000000000000000000000c496d6167696e6163696f6e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e5233edbec5e2e006e6492fc1524f365b7045cc047a7ecf6c1c2e147081f41b851219e4b1c5c245": "0x000000000000000000000000000000000009417374757254696301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e550986ce912ea7305fe17c669dd937d1ed23df884dafef2d92b970bcb8f043ab297a3ed8a2ab01": "0x00000000000000000000000000000000000a496e66696e6974456400000019656464795f6a61636f62733440686f746d61696c2e636f6d000011404564776172644a3838313236303637000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e5d5a07a968882aa81126ca612e86be5e697a772a636776495ebc044916218a1286f9031ab7c038": "0x000000000000000000000000000000000006525c44656306526f6d616e000017726f6d616e706f646f6c736b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e5dd4c385ce0fd8a810d21a048615e37979f5c5e4f8ec80853dcd1d961bf8c1a5d4048d034d151e": "0x000000000000000000000000000000000003585801010101000009404e465462795858000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147e869f600c42271970b2d516a4815cecf618133b7987a8362995b78ae48035a1643e4bce5ccc5d3f": "0x0000000000000000000000000000000000096a617a7a6c6f737400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ebcb68d19e2cb6d2ea8c3fc9696643972bb4d9af28b01fe9a7105b4530b337cbc31a2d3896b7025": "0x00000000000000000000000000000000000773616b614d75001e68747470733a2f2f646973636f72642e67672f7a71746d735932637758001573616b616d753230323240676d61696c2e636f6d00000c4062616467657262723073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ecc461d41cccd863b7bd97ef2fbe878b2a978258f73697519dbf246e00514930f04daa24602b1aa": "0x000000000000000000000000000000000010e6b19fe58d97e4b880e69e9de88ab1047858780000067840782e78000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ece2f2beb48f825300255e8ee286bf5f0e90134d2d24b212b644b4da71d243ff1885f8d972bc23a": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ed96b7d3f8a3e92083857fb5e068b7253110088fdc0431964252a7d2f46622d6b3cfc66be587c30": "0x0000000000000000000000000000000000085341544f53484900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ee646bfe72c5b3abcac4380e7aa66426d530f0cb21bb82d67ae68ab51c86a20c87cd0cdc185da36": "0x0000000000000000000000000000000000095075796f5075796f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147f34cefba02f9ae1b45943b4ed9825ec0f00a5d760c6fa50ac9cbe4f8d3aedcf807f8bf0bf6f5c0f": "0x000000000000000000000000000000000013536b794c616220436f72706f726174696f6e001868747470733a2f2f736b796c6162636f72702e6e65742f0017627573696e657373406b727970746f7666782e636f6d00000d40536b794c616273436f7270000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147f3a10eaa5404047e2fc99f3a3ab840d9097da913d9516ca82943e0c61efcf1eef379ec46ed01f1c": "0x00000000000000000000000000000000000a486f6f6b65724e46540000000000000b40486f6f6b65724e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147f8c60eec0cc4d652827816806c65a098eef53ff0b47b7ae84b811119ffb96d519bbef1402e07b32": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147f9e55d7623ce6876ae93e7162785a77d3a2c0413a9ee04af1b948ba5df9ac191552b72e1dd49b71": "0x0000000000000000000000000000000000064372616e65000000000000094030786372616e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147fa561eaceb076e25ad683920f3457b2599f4669eb42fdbea3b475b38f85fe6afd74203c6117ea1b": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147fbcd6b06fe4b789aaf84aa2cb81d84aa9c578081a5f107723eac3fa3af95df8d72e025840ffeb71": "0x00000000000000000000000000000000000c4173686c6f73654b736d310f417368204c6f7365204b736d20310000166173686c6f7365406d61696c66656e63652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147fe79549034d8b46a2e1685f62b2a1a996a2a1ba10ac6836c2b72174cab1bd1c6907454e6365fb70": "0x0000000000000000000000000000000000144b696e7473756769202f20496e7465726c61790e4b696e7473756769204c616273000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147fe8792204e9c295d0f95f0b6b0f3784199f064eb87e6230aba869addbe2898705673d06385f1179": "0x00000000000000000000000000000000000e4375656e7461434f4e594b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147fe9ee2c58e8b05db88f14766b6b332c755a2a08ffa22c4783a73ececa4062d64e24ff80c9165c5d": "0x040000000002000000000000000000000000000000000e49204c6f76652043726970746f0000001d63726970746f616c62657274627572676f7340676d61696c2e636f6d00000f40495f4c6f76655f43726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ffbd1415556c174eed8aa4c0f53370d2d6cea6c89603ba8155d80856e81ff4f45fc4eb4df8bd019": "0x00000000000000000000000000000000000b446172696162616e616e064461726961000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480060d7753f9b8d6680f824acef4a0bcd554d24e911c75f8453f4979a433016d521023d625ad5706": "0x00000000000000000000000000000000000977336e3a206a696d064a616d65730000136a706f686172613740676d61696c2e636f6d00000d4053747261774861744a696d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714803d5aecf59783b17628a5be63c4d3c8dbb96c2904b1a9682e02831a1af836c7efc808020b92fa63": "0x0400000000020000000000000000000000000000000006626b636872104261737469616e204bc3b663686572001140626b6368723a7061726974792e696f0f6b7573616d61406b6368722e646500000740626b636872000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480463187525d27801c22d9c0275c636dbd1efaedf149337a591a85423be5ee06e0b459bd7db75c32": "0x0000000000000000000000000000000000000000000000000a405369725f506c7835000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480728ec7d78ba2aa1cf7204d94b6e54fd231fddd65147458abc6350f084bb65d8417702c4d0c934f": "0x00000000000000000000000000000000000b70697462756c6c69736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148079574f18bbad18449df0c2eb08117322b4037a5dfac6b84385228492b377a1b6871791f344f357": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714808ebc416a42b5dad4dd0db36826124c944cd84245cec4db714bf5e22cd7354f06d855fb39e358ad": "0x040000000002000000000000000000000000000000000752616661656c0000124072616661656c3a70726976617a2e696f00000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480997bddfac735ca6e92c07e2a51a497bd1b6d9769dc3dd9342184b22cd903ad5bcfb1f5df973918": "0x000000000000000000000000000000000008536f6c4d696e650000000000000b40535f6f6c5f4d696e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480b33d9bdfb990d7ece16124407c7b88b0ef392c160d9ce49dc9f57d14ebf88ec1f5c0a8171d5a0a": "0x04000000000200000000000000000000000000000000055855414e000013407875616e39333a6d61747269782e6f72671b79616e676a696e677875616e6d61696c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480bb42a185021da0ee4ada127e6b71655f2b821dcef49b1b7a9c2c2533dd7bb686f6cf25d6a43c56": "0x00000000000000000000000000000000000f536f6e616c2042616e65726a656500000019736f6e616c2e62616e65726a696940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480c30a7cda5adab606ee04dbe5970b2babe888f787f22e17da71ae752427427611a869f8a71f2a70": "0x00000000000000000000000000000000000f4d656d65636f696e20436861696e0d4d656d65636f696e2e78797a1b68747470733a2f2f6d656d65636f696e636861696e2e636f6d2f0000000010404d656d65636f696e436861696e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480c3b8a059192b8fe0b174435a2214def3b876b9c695b812cb5b4f58de2948b76abee22c98a45445": "0x0000000000000000000000000000000000095461616b7769747a0000000f7461616b7769747a40706d2e6d6500000a405461616b7769747a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480c4e0efde12fff3981467bc43c55319c70cde08e341fe0629c34bd92bf3fcc25d33e7f990c22466": "0x000000000000000000000000000000000013445220537472616e67652053747564696f730a4452206a756e696f721f6c696e6b74722e65652f4b7573616d615f42697264735f41636164656d79001c6472737472616e676573747564696f733040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480e633d9b260415a7c504d6e49be15d262c72336d6cb5cb00c96471a168cf8bc5c9e5388d91be86b": "0x0000000000000000000000000000000000044d3244114d6174766979204d617473697075726100001d6d61747669792e6d6174736970757261313140676d61696c2e636f6d000010406d6174745f6d6174736970757261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471480f72a77b66dd393b36020ebe1f4954611d109e2badcd2e8aa7e104f43dd3b09d728f187894a32f1": "0x0000000000000000000000000000000000205350414e49534820434f4e54454e542026204556454e545320424f554e54590000001a626f756e7479656e657370616e6f6c40676d61696c2e636f6d00001140426f756e7479656e657370616e6f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714810a268051077a1deabf400732513443aec4f98d477ce3bea66725f271c496c8e52e7a6f5d6e2c4a": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30350e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714811067f8be6075ad60b5c072d3e0f45cfcb0fb99318f17c49fcc6bbbde23e392577a30d7bedd9f5b": "0x00000000000000000000000000000000000b506f6c6b612048617573001b68747470733a2f2f7777772e706f6c6b61686175732e636c75620000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481325f28f848ffe9a411987e278e1a1883853fcfb029d8a17c08f44880bfe2492473744de632e830": "0x0000000000000000000000000000000000076b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148132e691730eba14b6b5cd171f242e060b0d16566e21961dec966e34cb5cc667b08923b248c07749": "0x00000000000000000000000000000000000d416c696e61204c6f73657661001f68747470733a2f2f6c696e6b74722e65652f416c696e615f4c6f73657661001668656c6c6f40616c696e616c6f736576612e636f6d00000e40616c696e615f6c6f73657661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714813ba8ca144d6d26562427d438fcaac2c2be2b22bdec3d8c65b11048d013e77c0d4f21f7215a490a": "0x000000000000000000000000000000000006486f614c5800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148150bb2411acc76d1aee272e3633e036e6f22d4da4a65c844b515353161e8f7186b2c2e71e7b0a5f": "0x00000000000000000000000000000000001245636f4672616e6368697365732e636f6d0661646d696e1245636f4672616e6368697365732e636f6d001861646d696e4045636f4672616e6368697365732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714815938890f454d06be78a8a56ca63c88f3035d0dadea57cf12d42c7d8ef61795deec2dd98ca0393e": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f33340f62696e616e63655f6b736d5f3334000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714815a863bd5bac191942f56470b01e3fb44288e85a90be6bacff225537a556eac4c61f25930284b66": "0x0000000000000000000000000000000000114361205465747261206f66506865656200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481644b5c9a9a13e69a9ebf1328e64aac1cf749436ec602945693a088d0ffb823da08dff6bc4fd739": "0x040200000002000000000000000000000000000000000c52554259e2808bf09f928e00001240746174616e3a6d61747269782e6f7267166b7573616d612e6e6f646540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714816714a6c487ab8b56495460066a5fab4be4b0634c41f0e550f4f3e4d3436924364ce98d8678372d": "0x040000000002000000000000000000000000000000000a4578747261436f696e0000104079726e3a6d61747269782e6f7267187961726f6e736b694070726f746f6e6d61696c2e636f6d00000c406578747261636f696e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148173fc75c8868e7434c4c671dc3f4b52d14b36134e3ab9cb71580ad6130331b0e16aacecec396e75": "0x00000000000000000000000000000000000f6172696e61736d69726e6f7676610f4172696e6120536d69726e6f76610000196172696e61736d69726e6f76766140676d61696c2e636f6d000010406172696e61736d69726e6f767661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714818371d947b2dfe99e6f2c2051af39eb875189cb0584c88f9979e8a11e196fd709788bdc360bb303": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481a8aa27b7c69abc7c7d2fe83c4af79c49136f0f8c5f1a00cd8d0aa91c94fe74d0145cb96d688f66": "0x0401000000020000000000000000000000000000000009454d4d414e55454c0000001864656d62756f6e67616374726f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481ca6b2d789063a60c57c0853ddd25eba3342516d472dc386718377fd76df4485eeb60a105ac7055": "0x000000000000000000000000000000000017526f79616c20536f6369657479206f66204368616f7317526f79616c20536f6369657479206f66204368616f732068747470733a2f2f726f79616c736f63696574796f666368616f732e636f6d001e6368616f7340726f79616c736f63696574796f666368616f732e636f6d00000f40726f79616c736f666368616f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481d06e4180e1ea3d46783c52055cd65e6c7b0cc7ffe525be5bd41a30837c25cd5f061802c1ff9707": "0x00000000000000000000000000000000000943727970746f42691041726979612042616e6f6d796f6e6700001a61726979612e62616e6f6d796f6e6740676d61696c2e636f6d00000a4062695f6172697961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481d88cd163efe288face4e155edc11a8a64d04d35885b5b9189172fb4c225a9c4c3ad2997a699121": "0x0000000000000000000000000000000000175468652059656c6c6f77204775792050726f6a6563740d5068696c697070204b75727a00001c7068696c6970702e6b75727a4070726f746f6e6d61696c2e636f6d00000d406b75727a65747765657473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481d8e79920233c8de01eae270edb18124aa8bd49e3eca870f25497795d1843e2bbe21ed2808cef20": "0x0000000000000000000000000000000000084b756a696e6e200c4b756a696e6e20526d726b0000166b7573616d61646a696e6e40676d61696c2e636f6d000009404b756a696e6e52000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471481e1f270e2e851570e7aaf6634a1bec0cd73d40e2a69c31d160cd76f4dc3d06ceb3ed1bc58636e3a": "0x0000000000000000000000000000000000074e6f76757358000000166e6f76757378617669657240676d61696c2e636f6d00000b405370616365426f6279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482175dad66ffb1f228f8214ba1b29fbf1d1a0a45f760803cf6539ef1b1739b05019e017b85987a24": "0x00000000000000000000000000000000000a4a6f686e204c756b6500000018696e666f2e6a6f686e6c756b6540676d61696c2e636f6d00000e406c6f76656a6f686e6c756b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482177f02309c6644de455bc9951b3280b717735762428896bcc146adba12c9e4dd2c4a1316f95432": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148218a521e794df69d80d984a8b722fa16d8b8b5d39b18a3074a8d57450f44a072f3bf27f3602ee10": "0x000000000000000000000000000000000009637665746f6d6d790000000000000a40637665746f6d6d79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714823f88e31299deaa7c7546e35503a5716aadd49f18be0bf4e04e65db300e0d9822fd7f2a935c1d12": "0x0000000000000000000000000000000000076b404e61727900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714824e4641808c73d2acb9eb46f872884c2b988d65fe151ce9ca720b9fed0bb3831861429e25bb7853": "0x0000000000000000000000000000000000054d4f4f4e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482560819c55b16b2badd9daa2bcd66e001195e14fe7c6d176a7295734db2f46f05d7d4d38a097922": "0x0000000000000000000000000000000000084b686e656d7564001d68747470733a2f2f74696e7975726c2e636f6d2f327038656d6e753700196b656e6e79406b686e656d7564706f74746572792e636f6d00000e404b656e7a69654279726e6536000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482a2945d18dc6de7685dc052a755ac3cecc0b0bd0d1405ade433d8463a3cabc1e5b7eedb13c08871": "0x08000000000100902f50090000000000000000000000040000000200000000000000000000000000000000064c65696d691752c3a96d79204269656e2042616f20506572657474691968747470733a2f2f7777772e6c6974656e7472792e636f6d001272656d79406c6974656e7472792e636f6d00000a407365787964656669000a52656d79233632373700", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482a6377e5035d73b20e9d154939a016638b30c2015296620adc11207fbe0901296b53556efa4c81d": "0x00000000000000000000000000000000000c53686164794261646765720000184073686164796261646765723a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482b8bce0892920f9ca3d904d81a1b1ba11bd6e391daa897b907ff89c5c5aebfe6f2da23292b8500f": "0x00000000000000000000000000000000000d5765796c616e645f46756e6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482cc12483eced9790ede38c79ca874b40d63470229ef2d0de1453af484ec71f8af099bb3a37d7760": "0x00000000000000000000000000000000000f706f6c6b615f6b725f737461736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482de5a96dc46220438036dd1fdee37c36c5a5718bda359f3c5eafb47cccbc1b47663b15c42e93879": "0x00000000000000000000000000000000000f526f626572745f476c6561736f6e0000000000001040726f626572745f676c6561736f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482f1848eaab32c01981dc5e72874e0606777ffff70cdd6f1f551a858a8f4bd2c25f06e3ea778fb17": "0x00000000000000000000000000000000000d74656964652d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482f289336c02a916220db94b831a3cd2a856fb540018c949b64ac01c0f3b2a8610be43f862a70b49": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f353000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471482f319a69e3c81ac408d7f8ce355d1566fc9f796813bb4d3b09ae84279232b2349a1c1ec3f0df45c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714830a08ce1ea6aec346e3b7019bc2b1958609cab353fc3ff67417ea982a84fd43f8161b3b1f1de82c": "0x000000000000000000000000000000000008416e696d61726112416e696d6172615f65636f73797374656d1b7777772e616e696d61726165636f73797374656d2e776f726c64001b416e696d61726165636f73797374656d40676d61696c2e636f6d00000f40416e696d6172615f776f726c64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714832b1944308e1804da331189f1e7a7a6055dab543cffddfe90888044d75791cfcc13fc02e5841664": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148337944019a68ea6a6500e450888dd3758b301a0f99d433264362547ca7d0f7631ea53871aa3be35": "0x0000000000000000000000000000000000094f4e454352595054000015406f6e6563727970743a6d61747269782e6f726711726f6f74406f6e6563727970742e696f00000b406f6e65637279707432000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483731d75f677cc39943c8d0909cfa78a882249bd5d6aa9bc1abaa7ececfc470c6b0d2f8021f67b6f": "0x040100000002000000000000000000000000000000000a44726f696473697a650a44726f696473697a651668747470733a2f2f64726f696473697a652e636f6d0015796f676573684064726f696473697a652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148378b2a58db8f57d444f83d9012f64dc4acd741cd22442e129a0c5d51e3fc88df1b464afe3dedf58": "0x000000000000000000000000000000000004526f6104526f610000157273616c64697661726640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483932c1bdd63f4dd081159bf1cae87c5c026fb0fa008306db2b21d3a742b9da2508d44cb6e126955": "0x00000000000000000000000000000000000b456e64616e676572656400000017656e64616e6765726564626b40676d61696c2e636f6d00000e40656e64616e6765726564626b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483a221c8bc0e6066b2ed7a9394d1ed621c2e4200faed7ba856fbc722aa34996055b414d8517e712d": "0x0000000000000000000000000000000000064d6f797a610e4d696368616c204d6f6a7a69731c68747470733a2f2f6d656469756d2e636f6d2f406d6f6a7961383100116d6f6a7a6973407961686f6f2e636f6d00000f406b7573616c616d616e64657273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483ad6aeb3e5890e926090dc5275e53b65763f135108a9111289aa1ca6331a8ddb3440059cd33d75f": "0x000000000000000000000000000000000009706f6c6b61646f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483af75dd98f115fdc8156333178110191fa71e2c2d85af3f15cf5e4fc191e7a30d14fa03ba4fae01": "0x00000000000000000000000000000000000765696666656c000000000000104065696666656c3533353138323938000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483ce59511097e6b62add0af948eba3b1fcd5cacde1f6fcc70f11ef75056f88ca4d11dcc5b080220e": "0x040000000002000000000000000000000000000000002049204c6f76652043726970746f202d204865616420416d6261737361646f720000001e616c62657274706f6c6b61646f74737061696e40676d61696c2e636f6d00000f40495f4c6f76655f43726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483e3a5f61f9aaf705e7bdc8f8fefc667401cc90e1415d74771543ba45903e763cfec39609e80c67e": "0x00000000000000000000000000000000000c6461706861726d612121210000000000000d406b7573616d616661726d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483f89e0f584ff0b7f60f9b64ebf26b9487c65ada132908745572692aef7cd9c987daf8c9c0c2ff3a": "0x000000000000000000000000000000000012e29b93efb88f20526f6220e29b93efb88f12526f626572742048616265726d65696572001b407270686d656965723a6d61747269782e7061726974792e696f11726f62657274407061726974792e696f00000a407270686d65696572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471483feead6a196ca7384d58485b197a76a478bc70cec24386d631d07789a3fcaa9f2caf559e6f1197b": "0x00000000000000000000000000000000000d446567656e5f6d6f6f6e65720000000000000e40446567656e5f6d6f6f6e6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714840925591fbe6a29706c68ab8f36287cae3a10a27b1572ba848aab662978427464f456f6e7644241": "0x00000000000000000000000000000000001430785461796c6f72202d204368616f7344414f0930785461796c6f721868747470733a2f2f7468654368616f7344414f2e636f6d001930785461796c6f72407468654368616f7344414f2e636f6d00000b4030785461796c6f725f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148414c4f8c9a8cf81640bab9edc54d75165f1924f25f8b979f6b290c1b884b4c5a706bdd25e35b576": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f343700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714841c66ae33e977e77eb07fd02281d018a4c45bab914fc6e2a0f81620663b53ab62432ae62a07194d": "0x040000000002000000000000000000000000000000000b4b6f6272656461627265000017406b6f62726564616272653a6d61747269782e6f7267146b6f6272656461627265406c6976652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714841d45054add5366d228fd275f3f92e8b6ccc56a9437582dc59db70153ab33cdd77562661adda60f": "0x04000000000200000000000000000000000000000000174461726b7374617220e0a590204d756c616468617261000019406461726b73746172313938323a6d61747269782e6f72671c6461726b73746172313938324070726f746f6e6d61696c2e636f6d0000114044466f726b6c6573736e6174696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714842664827980e15e54faa9f0cc59a977e73147865791a9272cd4980db5ff2eee27096d34ff2fab69": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471484424b39102122b2f0c8760979e133469c6c41786f59b4a7c7c6eccad05ee675b3751b83d0684652": "0x000000000000000000000000000000000007544d575349590000000000000b40544d57534959343230000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471484438c43a102074910f57ab33929e8e7dc1f97a59d3e21f67fc50bcc92b4237cfe909749d907d227": "0x00000000000000000000000000000000000d436f6d6d6f6e7765616c746817436f6d6d6f6e7765616c7468204c61627320496e632e1868747470733a2f2f636f6d6d6f6e7765616c74682e696d001668656c6c6f40636f6d6d6f6e7765616c74682e696d000010406869636f6d6d6f6e7765616c7468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714849d9d404714c4e49827c3338307099b89b70abd3f743768f9e98fed36c9f8de5c23684ad4cf0939": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471484bce6312eb819d778608868cc221644fb3de1b580e43c0365dcb7bdfc43730edcd0af67afd3e67a": "0x00000000000000000000000000000000000b78567373706f6c6f4878095961726f736c6176000017646f6c7a68656e6b6f5f79617240696e626f782e727500000a40767373706f6c6f68000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471484c01eafe8e77b497036fc2cc5a44e28d92392be9d9ef3420fe2755cd50ee4f6d6cfc2eaa5888e40": "0x04010000000200000000000000000000000000000000054572656e0c4572656e2059696c6d617a0014406572656e7361743a6d61747269782e6f7267186572656e79696c6d617a61636340676d61696c2e636f6d000011404572656e59696c3134383133383930000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471484ccbb22b59b800b7213534fb02c7638d8d7caf1f62b983225c5aa76b8c14d249f7a704b50ba850a": "0x040000000002000000000000000000000000000000000a4c696e6b2073776170000000156c696e6b6173777561704070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714852be0a8606681ce165cb5a983d875ff3fedd96cf02bbda58aab07f644bc61b896a69e65d7b92d54": "0x00000000000000000000000000000000000b4e696f6e205265616c6d000000146e696f6e7265616c6d40676d61696c2e636f6d00000c404e696f6e4465656d756e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714852c1c067967d16ce0347fd9c9ad8e56eef3dd3bcb364273bccac7261212336b24fc87928021d426": "0x000000000000000000000000000000000004505050000000177065706174726963696f323040676d61696c2e636f6d000009404f637572617331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148549b7fd2bfcfdd9bc0525c374a8198f3288a0733918321dfc26532e253d94da3a6a27a4c3e31760": "0x00000000000000000000000000000000000a506f6c6b6148617573001b68747470733a2f2f7777772e706f6c6b61686175732e636c7562000000000b40706f6c6b6168617573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148583ceea4c5e9e7682be679b08a867b9b6e92189ffaf6fe921e50e38c5204ae46450705fa0f39878": "0x04010000000200000000000000000000000000000000134b6f6e7374616e74696e207032702e6f7267047032701068747470733a2f2f7032702e6f7267144063726561746f723a6d61747269782e6f72670000000a406c6f6d617368756b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485aa231dc6bbaf55949fc105e6f977a37d0d44fb4feabcd0933d87c1f2b2fad95da2bd979bda234d": "0x0000000000000000000000000000000000094e6963654769726c10456c656e6120556b687661746f7661000017686f6e657968656c656e323840676d61696c2e636f6d00000f4048656c656e3639323133393535000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485d657f1acd3f2c92458c79f1b8d080257ba31830f364170c90b6b173be1832ebace48595d193b2b": "0x040000000002000000000000000000000000000000000e4272696768746c797374616b65001b68747470733a2f2f6272696768746c797374616b652e636f6d2f1a406272696768746c797374616b653a6d61747269782e6f7267157374616b696e6737706340676d61696c2e636f6d00000f406272696768746c797374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485db7559145dd87f504320903e1423f2143971b828c16bde706c9649054a2dd6226f4a552cbd7c4d": "0x0000000000000000000000000000000000064b726f627900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485e316d89f98284006783fab54c44733401db93381ce95dbdf7f8cae198a3abd281961d104a6a542": "0x00000000000000000000000000000000000442656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485ed039d265a7ffaa0601b089848ea1f1071885870523f61923c1e6e8000f68ac1a0e03025a21d0f": "0x040000000002000000000000000000000000000000000d73616c656e6b6120f09f8cb80000144073616c656e6b613a6d61747269782e6f72671473616c656e6b61627940676d61696c2e636f6d00000b4073616c656e6b616279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485f67a71efa822abcc3c76905f804cc082bf0dfebda879f5f6c3d37c0139e3e03bef1ed935121620": "0x080000000002040000000100902f50090000000000000000000000000000000000000000000000000000001151554152545a20627920554e4951554514556e69717565204e6574776f726b204c74642e1f68747470733a2f2f756e697175652e6e6574776f726b2f71756172747a2f001568656c6c6f40756e697175652e6e6574776f726b00001140756e697175655f6e6674636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471485f7724f745447635aad391e69d2500ab8d5d6992b8e38cfd3a5937a5667757a875e29a4281f7546": "0x0000000000000000000000000000000000074275726e737900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714860033e5e332e23d6a2bd95c44c00bcad3fef2f7226ad90b8b93c3c1b9679236d5abfdb39c895844": "0x040100000002000000000000000000000000000000000a456e636f696e74657216456e636f696e746572204173736f63696174696f6e1668747470733a2f2f656e636f696e7465722e6f72670013696e666f40656e636f696e7465722e6f726700000b40656e636f696e746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148613e243ad5accda52a6c52dc82940a36fefd1474cc0778517bb1a56b7bda0e308b6c19152dd7510": "0x040400000002000000000000000000000000000000000b4f70656e537175617265002068747470733a2f2f7777772e6f70656e7371756172652e6e6574776f726b2f1840776c69796f6e6766656e673a6d61747269782e6f7267166869406f70656e7371756172652e6e6574776f726b00000d404f70656e7371756172654e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714861d071872c198e2a24e701429baee3c80ed77ab46977c581f43c21ffb13c5a6580366b17d4acb74": "0x040000000002000000000000000000000000000000000e4775617264612057616c6c6574000013406775617264613a6d61747269782e6f7267136163636f756e7473406775617264612e636f00000e4047756172646157616c6c6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148621671899b86161726ac63a0a6a700ad7e1178fef89a87620bbc152a19f74708defc7f08bbc6556": "0x040000000002000000000000000000000000000000000a426c6f636b4374726c00000019626c6f636b6374726c4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148641dd739c11a1441994df5bf0f44342b1719bfbb1561286bd81b6d84f577f55ef45fe7ad6f50e4a": "0x040100000002000000000000000000000000000000000d466f72626f6c6520f09f8ea00d466f72626f6c6520f09f8ea01468747470733a2f2f666f72626f6c652e636f6d16406b77756e7965756e673a6d61747269782e6f726711696e666f40666f72626f6c652e636f6d00000940666f72626f6c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486672c8d8603d645de7fc70edbc29190008415c3b6122dc6390b738453c6f1213b59942b2b76e54a": "0x040100000001002ca07d510000000000000000000000000000000000000000000000000000000843757272656e741546696e436f2053657276696365732c20496e632e1568747470733a2f2f63757272656e742e636f6d2f1b4063757272656e742d63727970746f3a6d61747269782e6f72671363727970746f4063757272656e742e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714867ef0c5910d039618b37b11994703df397ba3817e5a3005c8fc91487518d31093f96dc13f8eae7a": "0x00000000000000000000000000000000000e456c6973616b7572615f61727406456c697361000016456c6973616b757261323140676d61696c2e636f6d00000f40456c6973616b7572615f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714867fc6e4929b002af04c95a6ac10a0db5af28ac44776f95949dd543f494f8b8787925c41fccf7e0f": "0x04000000000200000000000000000000000000000000074f4e54555045000015406876656c61796f733a6d61747269782e6f7267186876656c61796f734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714868406635a107a77f4677f381984864892b8f2646e8474586b5739666db1061ec17e247f1256a73f": "0x040100000002000000000000000000000000000000000b4441564552414d49434f0000124064617665723a6d61747269782e6f7267156461766572616d69636f40676d61696c2e636f6d00000c406461766572616d69636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486998e21ddb35f37688e785a232855035798ed3859b39323e0a889a0bc91433bb2b7491d7552b541": "0x040000000002000000000000000000000000000000000e4761627269656c204e756e6573000000196761627269656c407368696674666573746976616c2e6363000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714869d5132140a00b380971274db9eafa67a4e9baaacec073a76949d8ac63e804fdb71680d0b27d618": "0x00000000000000000000000000000000000f53756257616c6c6574204e4654730a53756257616c6c65741a68747470733a2f2f7777772e73756277616c6c65742e61707000146167656e744073756277616c6c65742e61707000000e4073756277616c6c6574617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486a03b31f22c207f6607dc83a7fc1f33c13e978ee3527fdb2c908ae6b5c0d2dee81bf30a01808263": "0x00000000000000000000000000000000000c426f747469636577736b690010626f747469636577736b692e617274001b626f747469636577736b694070726f746f6e6d61696c2e636f6d00000d40626f747469636577736b69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486a0b39405083331c0df6f52cc5815bbc65e071936fd135fb972c5d2b08f03e4c9a06ab2ba6b446c": "0x000000000000000000000000000000000008566f78656c6c650101010100000e405375707261566f78656c6c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486a3835ceaaa8d91649b3af5a44c0a5a69f905bdbe203eeaaf5dea0695d9d3e307139236f1e92439": "0x000000000000000000000000000000000011546865204b494c5420447265616d657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486a7a7c4bbbdc511e35a5bb9f11f2d71940593c4ff87fba89a7ab269825da6282025c43bf0b4c07c": "0x040100000001005039278c0400000000000000000000000000000000000000000000000000001f54657374204163636f756e7420666f7220526567697374726172202331201a54657374206163636f756e74205265676973747261722023311a68747470733a2f2f7777772e657468696e636f72702e636f6d144063686576646f723a6d61747269782e6f72671a63686576646f722b7265677465737440676d61696c2e636f6d00000b40657468696e636f7270000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486c0d84c17d8fc6ecef2e5dd707eece5bce1ba22a95b527945e78b6ea1a1bf953b8623e9ceba8f77": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000001c436f6e74726f6c6c65724163636f756e74426c6f636b6f6e61757410426c6f636b6f6e61757420476d62481b68747470733a2f2f7777772e626c6f636b6f6e6175742e636f6d1b40626c6f636b6f6e6175745f636f6d3a6d61747269782e6f726717636f6e7461637440626c6f636b6f6e6175742e636f6d00001040626c6f636b6f6e6175745f636f6d0010626c6f636b6f6e617574233131393300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486e44a960bbce9b16064f216e5b0598fd04f234902e175fdff5f78ac58d24856189cf89772c7711b": "0x000000000000000000000000000000000015546865206372656174696f6e2073746174696f6e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486e553fb01bfcb3d16f24ecfa07199b88f010d94f47864ace2c0357aa4f37898f85cb39992e2036d": "0x0400000000020000000000000000000000000000000009476f6c646d696e65000000176272656e64616e766163613640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486e69567b2fc7d85a44fe0211e518d4a7e0d647cb66979cafcf322d3427972abf875d29c7c76d501": "0x040100000002000000000000000000000000000000000f44616e69656c204d6172696369631044616e696a656c204d6172696369631068747470733a2f2f776f73732e696f1140776f73733a6d61747269782e6f72670f64616e69656c40776f73732e696f00000940776f73735f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486e97071fc27afaf9cb3ce3a07b00735ce0f68793b5717985758dbbf1fbdc95bb293adccaf6aea58": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471486fafe6b0ee9fc1c9070bd80051c026f2ad47a498257131f7897df07f9ac2e4850fc0594ffb7c16b": "0x000000000000000000000000000000000000001768747470733a2f2f6465636f6d3838382e7370616365000000000d4073686172795f6465636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714870976f0672085c5f8ff75032359f0de13264a134c3e88089cf6a2a31e5cf3cdfe405a4e272f0508": "0x040000000002000000000000000000000000000000000d547963686f204d61736975730000000000000e40547963686f5f4d6173697573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714871588d7f6c0fdd3002f931bb0cf405212de02243756d8ff665710af7fb234bfb1a50bb78ae1327b": "0x040100000002000000000000000000000000000000000b52617669204b756d61720b52617669204b756d617200154069747372617669693a6d61747269782e6f726715697473796f757261766940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148715cdd917100e492ecd4b1267030cbe7bc4c16f0686b668c3b2c4a63887c4b72ed7e61cdbba8e01": "0x00000000000000000000000000000000000d544845204249472042554c4c01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148729829bc3420b4a8ce5570a948cf1f53af41b9ca5e693e27db42957b5feebd496f294083c7b3334": "0x00000000000000000000000000000000000c426f68656d69612046616d13426f68656d69616e20436f6d6d756e697479147777772e626f68656d69612e67616c6c6572790015426f68656d696144414f40676d61696c2e636f6d00000c40426f68656d696146616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148736623ab752230ee06552c57e6cb90fb36289f12641459616eaba6ac6e12bc8df5d27b4348df364": "0x00000000000000000000000000000000000c75387a7257614d3241504e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148744f5b40dccd408f29b23662a19aafa105a3b29cc512bdf7be3d2d90b9ccdac7c5bde9f690d2d33": "0x0000000000000000000000000000000000024d01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714874cbacaa0bc1cceea8e9d3cfedc8afec25785703681d424e6aba10b728927b89d87a3776b47ee32": "0x08000000000100902f500900000000000000000000000100000002000000000000000000000000000000000d506f6c6b61466f756e6472790d506f6c6b61466f756e6472791a68747470733a2f2f706f6c6b61666f756e6472792e636f6d2f0016696e666f40706f6c6b61666f756e6472792e636f6d00000e40706f6c6b61666f756e647279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148779102a034bee1fee548f8308101986802a4f7e713699b60754d59b3722a83e049d7f9b3669344b": "0x00000000000000000000000000000000000b506f6c6b61446f636b320b50697a7a61205061756c01010100000c40506f6c6b61446f636b32000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714877fd9ae533b076ca8e01f1cd734ef1c9342f84af2616fbc4294fa67a820b8ce979cac5e10aa985c": "0x040000000002000000000000000000000000000000000d4b7573616d61204c6c616d6100000011696e666f406c6c616d612e726f636b7300000d404b7573616d614c6c616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487843e0e467379078c79cbd600c63f0cc90b34e7301b7cef8c93f7a404cbacecab96901fe53d4640": "0x04000000000200000000000000000000000000000000084c6f67616e7467000014406c6f67616e74673a6d61747269782e6f72671a6372697374616c2e726f737369383840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487984f82dcc0d15b4a99af57418d7b0845ef9c692352b5ca08f7372fe7bdf6ba27ab3ccb139ffff6": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487ac7128ed93fd445e50e6e8499b921414360c3da7de7ca78544e38412bb6dc313383aaceb7c2068": "0x040100000002000000000000000000000000000000000a5072656d6975726c790e5072656d6975726c79204fc39c1668747470733a2f2f7072656d6975726c792e696e2f0015636f6e74616374407072656d6975726c792e696e00000b407072656d6975726c79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487b8b4219b989155bc4eccf7ab63522ed3545f9285b79e804b0eabae2cc508814bfbe29e22138d66": "0x000000000000000000000000000000000008534d532044414f0c534d532044414f20494e430f7777772e736d7364616f2e6f726701010000094061647362657461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487f8d378447f4f51b8a038b439b411fb7c6cc2d7315292a3d1649601641cbbe0825ab7fa90ce3002": "0x040000000002000000000000000000000000000000000c46696e616e6365204163650000001661636566696e616e6365734070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487fe49129143221da4cac89e333e01f3718e89b1058470f721310828c70466cc6d460fe321238056": "0x040100000002000000000000000000000000000000000f6534792d636f6e74726f6c6c6572000013406534792e696f3a6d61747269782e6f72670f737570706f7274406534792e696f00000740496f453479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471487ff181aa5f0d72d7603df59789b7e57153ab9fab5615620d3ef95cf7843c106b726ea5792ac075e": "0x0000000000000000000000000000000000194761627269656c207c2050726f6f66206f66204368616f7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714880e0c74f6c4f133daf0bff384569f5b20a6e27845a8926b37049833628f90aaaf1011ea6b5bbe52": "0x0000000000000000000000000000000000144c495a415f534f46495f4e46545f524d524b320a4c697a615f536f6669000010696e666f637672406d61696c2e727500000940536f66694e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714881da501afe93dbc7cc45be885cceb3872d32ccea9670b1fb11ef4fa8ceb7f261605f7bd4d9d8d76": "0x040000000002000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488240c4b087c954670d3d29a5674c684a378005daa252a0bdfb4138054278df93a60061965ae1354": "0x00000000000000000000000000000000000a43726f77646c6f616e06417274757200000000000f4047726564647948616d73746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714882ce79ebcfdf17062834a84148dad7c319b78d0f511593e0a882b0b81815575d37ee06fce78d060": "0x00000000000000000000000000000000001345726963207c2050696e6b6e6f6465205431094572696320506f6800144065726963706f683a6d61747269782e6f726715657269632e706f684070696e6b6e6f64652e696f0000094065726963703068000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714885ebea0f5080b1300f53cf59ee4bae1fc47b5df521d48a3cc2d02d5c15fd5d3bfa3d6a4a2e6a576": "0x0400000000020000000000000000000000000000000015f09f909f426c756566696e2054756e61f09f909f00000013616e74756e40747574616e6f74612e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714887069bc3f84e008c6fdd542b5fec95757cddb7f88df8c14fbc998ae30352528cd0745a21f893a3a": "0x00000000000000000000000000000000000f74696d65666f7261676f7269736d0101010100000a404a696d4a65743133000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148876172ab0d0bba3f89b361ea400867da22fa6a069fdd840819fdc24fee6cc3763b6cf3a8a20246b": "0x040000000002000000000000000000000000000000000c4441524b2d4b5553414d41000019406461726b6c657373323030313a6d61747269782e6f7267196461726b6c65737363726970746f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714888912dae0a7ddbc8268b1d9ea3f3e28439ba92ab93da4a2788b33c3a88b0b8ec776590d5a1ff87c": "0x00000000000000000000000000000000000c4d75636861205069657a6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488a1a9c29731ee3b388fbc33e4adebe4c8296ddf2cf1dcea98d5bb98589cc4965547552ca6dfc215": "0x00000000000000000000000000000000000d436963616461207c204e435201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488a90a53149b04c1fc77c33ab2d50bfa2e62c53701209166f5fdd2afd44e3d9d613c2deb29a2056a": "0x00000000000000000000000000000000000f4f6e652052617720417274697374000000176f6e6572617761727469737440676d61696c2e636f6d000010406f6e655f7261775f617274697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488d2cf1d33c430800ed87826ce11d92d5c738c002d2a0deadc05ede81c6c72d3d22f0bb6e87c274a": "0x000000000000000000000000000000000007546f6d73636f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488de95e48f84c3689085297d964ea873a23b63151b4c82189c1314c31fda6f2d71f83133d0877c5c": "0x040000000002000000000000000000000000000000000c56616c69644f72616e6765001c68747470733a2f2f7777772e76616c69646f72616e67652e6e6574184076616c69646f72616e67653a6d61747269782e6f726715696e666f4076616c69646f72616e67652e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488f2bab6b4633034bee287e579da5137412f2c3bd4d5ae4c6a11c4c420e04261157e04842a2ea641": "0x04000000000200000000000000000000000000000000104b7573616d696361204461626963610000134062756c726f673a6d61747269782e6f72671f73766562697261642e7072697469736b6f76696340676d61696c2e636f6d000011404e69636b7953613338353130363434000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488faf51e2f7bed7746ff2d3857b6622883201338ade0e84de95c9be1587b549bf185e802d29e251d": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34330f62696e616e63655f6b736d5f3433000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471488ffc163fa9907f076f9c831b885b8f1a216a27064fa793733b162ee06afb502a8cdbc2ccd6cc536": "0x0400000000020000000000000000000000000000000009594a52656e7561640000001c796f76616e6e7972656e6175643634363140676d61696c2e636f6d00000e4052656e617564466562726573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148902cecf825f2867273e55ba58de0184bb96e5e691dcc9171ec58658d2b94c42c7e4ca7574f6a076": "0x0400000000020000000000000000000000000000000011e5a4a7e59684206461697a656e2e696f000013406461697a656e3a6d61747269782e6f72670f696e666f406461697a656e2e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148910f5da4fb5fea048e84bb42675b4208dca0a9a06e3e16dfb1820208d363ea473056b4fa280c46e": "0x00000000000000000000000000000000000d417065204379636c6f70732104494f4e2168747470733a2f2f64726976652e676f6f676c652e636f6d2f64726976652f66001466657261726938333940676d61696c2e636f6d00000d4050756e6b324d6f6e6b6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714891b91a049c68e2f8ac73a177aa1ca00ba0fbc44e7d16f9855419e45d6cd9f517a369b9cb39d3a7d": "0x000000000000000000000000000000000016496e697469616c576f726c6443726561746f72303216496e697469616c576f726c6443726561746f72303210696e697469616c776f726c642e696f001c726f6d695f6a6f6e657340696e697469616c776f726c642e6e657400001140496e697469616c576f726c644c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148954d9b6c7704b5c0a912cf4f0c7894598d81d26f2c24f6e5c2541f312462bb576593e9dc549146d": "0x040000000002000000000000000000000000000000001051757069642056616c696461746f7200001b40717570696476616c696461746f723a6d61747269782e6f726719717570696476616c696461746f7240676d61696c2e636f6d00001040717570696476616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148954f8409a1908282288acef72d15ccf97030a0972ba24d944aa27a3e545d9a3f3f5b4e8b613fa36": "0x00000000000000000000000000000000000c61727461726f756e646b731420202020206b617468696c2073696d70736f6e1f68747470733a2f2f6172746d6f6e64652e626c6f6773706f742e636f6d2f001661727461726f756e646b7340676d61696c2e636f6d00000d4061727461726f756e646b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148962ad14faa948d9eae8d17c39cd028fc4e889f74dad887d007342d2e5f76502098e7eea42980217": "0x00000000000000000000000000000000000d646f75626c6520706f6c6b61001d68747470733a2f2f6d656469756d2e636f6d2f40696e666163654149000000000a40696e666163654169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471489667e9959f3863058411145513d689314c9a37396cc497d2f3758a382634f82b2525ca6d01ddd56": "0x00000000000000000000000000000000000b4372697370536b6965730000000000000c404372697370536b696573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148977e9fa22acb7d0d67a205808a76c0dfa0a5a14159d8ed04e0992d31a0671df21a813a8d6ce9b46": "0x0000000000000000000000000000000000094e4654206b696e67010101186875796368756e672e7068616e40676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148980286a570d6ea48865342bccbb2d7592528a183ad9ca54e1738bf98dd7c64e96f4cadf4739542d": "0x00000000000000000000000000000000000c4d656e756d65726f7639330752757374656d00001252757374656d31373440756b722e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148980acab3e7bb9bb1035801fd00144e10a3933ed859f8236bbffb93a7ac515bab9f1ca53cbb3f776": "0x040100000002000000000000000000000000000000000b4a7573745f4c75757575000000166c75752e6b6f6461646f7440676d61696c2e636f6d00000c404a7573745f4c75757575000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148997871f06793d390456840228e994122a2750c966571ca20d2456db20a7cb84603ed8e2d5503776": "0x040000000002000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714899d77357f66a9b3fe56e0dbbdfa9b2197616f3f093228bb9dedcf5677377f4bcce42e4d0bd16eb8": "0x040000000002000000000000000000000000000000000e446563656e7472615374616b6500001a40646563656e7472617374616b653a6d61747269782e6f726718646563656e7472617374616b6540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471489bf72beff341fae9c0504f521d79782f9f198212be1b14b7df0f55e8ba9042f618c6bfd6894d920": "0x00000000000000000000000000000000000e4b52494c4c5553545241544f5200207777772e696e7374616772616d2e636f6d2f6b72696c6c7573747261746f72000000000f406b72696c6c7573747261746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471489df2e19e8562faa88f04758ca57f3a570499fbcb3d10a8d4c9e62662d23223ab5abd805521f2162": "0x00000000000000000000000000000000000e546865204c61737420446f646f01157777772e7468656c617374646f646f2e636c75620101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471489e71b2f143062e5c849c094a957256b4928ed7df80cef4b0e07790ca93c4e35877d6b6c47fb9c40": "0x00000000000000000000000000000000000c4b7573616d615a696c6c610c4b7573616d615a696c6c611b68747470733a2f2f7777772e6b7573616d617a696c6c612e696f00166b7573616d617a696c6c6140676d61696c2e636f6d00000d404b7573616d615a696c6c61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a120585308557016e4020d8682b80d1b7112894cc302ae29735fa311760fda4068d8137033e315e": "0x040000000002000000000000000000000000000000000b4d617373205374616b6500000019656d626965692e6e6574776f726b40676d61696c2e636f6d00000940456d626965695f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a1f3ec68da119f752843653b3cce985caef494fa794e3d6338708ff4f137a3955b5bd18a1ee9d44": "0x0000000000000000000000000000000000094b454e4750454e47000000156b656e6770656e67323340676d61696c2e636f6d00000b406b656e6770656e6733000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a2418436ea9d5744af70f547e94688d2d6398f17ae4b7854b44d38afecadab4615efa4979b45255": "0x00000000000000000000000000000000000c426f6e6b204d617374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a2830d3f9783449b4e279c9042ff410055903287d4cb86f1349b46190239e07698150980e763a71": "0x0000000000000000000000000000000000064372617a7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a3ad77ce069992b8e83d322ee3b892a90f8ac2cc90eae3bcf4470d69ce11f4697072a7ac7ccb508": "0x040100000002000000000000000000000000000000000c48616e6f6948696c746f6e0000184068616e6f6968696c746f6e3a6d61747269782e6f7267116761626138324079616e6465782e727500001140476164646166693630373139353234000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a44d9fb97a9cc4cca90f519f1fa8e69ddd6fa48de4810638bf87b35e59f323ab28cc0e28bc2a62c": "0x00000000000000000000000000000000000d43727970746f2053616d6173001d68747470733a2f2f7777772e63727970746f73616d61732e636f6d2f000000000d4043727970746f53616d6173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a5aa20d3da45f2d029918eebbeb816c3ca22773264f55a58d81c327ab4000d721dc791db0c8c84e": "0x040000000002000000000000000000000000000000000b6775616e696e653235310000001a6775616e696e653235314070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a60668e56121433b0a60407efbd5ce5c071f4267495f8722ad56a6027906052604e2d7d08d36801": "0x08000000000201000000020000000000000000000000000000000011436f736d69632056616c696461746f7211436f736d69632056616c696461746f721d68747470733a2f2f636f736d696376616c696461746f722e636f6d2f0019696e666f40636f736d696376616c696461746f722e636f6d00001140436f736d696356616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a729a52375051e3b44422085bc3088cb79fb9e865d030771c4d2f7babd6b61702d277a2cacf271b": "0x0000000000000000000000000000000000044c463500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a7300288338c9b2327497753b33243d0ce0f0e0d4a4c6e102b628d0ca2f49d606cff851203ee36a": "0x0402000000020000000000000000000000000000000005494f534708494f53472056431068747470733a2f2f696f73672e766311406a6f63793a6d61747269782e6f72670e68656c6c6f40696f73672e766300000840494f53475643000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a74772b80aee66a9ea44891f615653c14d58dbad115753afab7339dbc4cdfc5870f19fd47204c7b": "0x040000000002000000000000000000000000000000000a626f726368656c6c6f00001440626f72697366663a6d61747269782e6f72671b626f7269732e662e6f6666696369616c40676d61696c2e636f6d00000e404246616b746f726f76696368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a7ddcbe937a53aea001e095bd9798f3f8e46931b31953568f444bf4de6245a5cfb81781de277d73": "0x0000000000000000000000000000000000106372617a796d61676e756d2e65746800000000000010406372617a796d61676e756d455448000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148a9080a29f48df317ee04c70647cade0a0bbd6de1b0d21b21136271cd571809e3c1c59424e3e5f59": "0x00000000000000000000000000000000000830784172696368000000000000094030784172696368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148aa02eef8fa57876de87313ed608e73b1c5a4fe34d2336ef43ca2d6d308ae2cc419b932b356a232c": "0x000000000000000000000000000000000001010101186b616e617269612e626972647340676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148abf00f6f189f2ef4a5668af20fe1f0033cd223536a501acc9d39d384513ed2a14d6f41ec28c074f": "0x000000000000000000000000000000000014566c74726156696f6c6574732053747564696f010101164b7573616d614475636b7a40676d61696c2e636f6d00000d404b7573616d614475636b7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ac021761134a4cb6844aff218212e05dff7200a70bffe6b560703ec7541bc47795d3d85c966c14f": "0x00000000000000000000000000000000000d4d6973747279616c5f444f5400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ac96f5c2c35bba5c4eaf39cf3853472cb4ee6809d93108ef7e95284dd5eea32f12a5d1bd0239006": "0x0401000000020000000000000000000000000000000006422d72616410427261646c65792041204f6c736f6e000012627261646c6579407061726974792e696f00000c4062726f6c736f6e313031000e62616f6c736f6e39233337343800", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ae3f21bacbd9a75dc9869be31db55e4f23085f9d300c4dbd6f04c2dac9df98911305b183770b74e": "0x0400000000020000000000000000000000000000000011566972657320696e204e756d657269730000194076697265736e756d657269733a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148af64018762abc4c8644cf1aa56904c194a54bdaf91cc42a95a65bd2e7a6845026d0ca135d430522": "0x040000000002000000000000000000000000000000000d4a61636b20467269656e64730000001a6a616371756573767269656e73363940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148af7bd58a91d6470161254fa03e07813f5eec8b0f734a2976d33a06ea4b57e88d611179e8a8f8193": "0x00000000000000000000000000000000000a53494d554c4143524100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148afa4a7f5b70a3e0904168b519b2745aa1480867fbc7db364c79e03fafd6e30ccc1691e7214ef860": "0x0400000000020000000000000000000000000000000014f09f91a8e2808df09f9a8073706163656d616e0000184073706163656d616e3131363a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148b089e201ac6d25e5e7030e312ba8dd8a9bbffda3d93b34a3ec8d2ff441845be5185e6e0eedcee7d": "0x0000000000000000000000000000000000134e4654f09f9791f09f94a56c616e6466696c104e6967656c20466f726e626572727900001e4e46546c616e6466696c6c61756374696f6e7340676d61696c2e636f6d000011404e465464756d707374657266697265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148b299234c2604004face99d3401cb9b45ee1bc0ec52f4cb35914dc5ad27806230534230eedb8413d": "0x040000000002000000000000000000000000000000000542494c4c0000164062696c6c3a776562332e666f756e646174696f6e1562696c6c40776562332e666f756e646174696f6e00000c4042696c6c4c61626f6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148b72a01f273fec5b1ae6196e6d0656d7b2986e26c2265f462eeace67593da0fe87d1341b0e4ef001": "0x00000000000000000000000000000000000a41726368697669737400000016726f67616e61766572787540676d61696c2e636f6d00000b404c6f6b695061676573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148b99dd128482b33028ef38027a9dca274aa6ffb31e788468c1707dc9e1539164e4be048748244476": "0x00000000000000000000000000000000000b42617272616375646173001b68747470733a2f2f6c696e6b74722e65652f636c617967616e670017636c617967616e677374617240676d61696c2e636f6d00000d405f436c61795f47616e675f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ba9eaa6ab907510383b9fdea1ee994d93bbacd6d67f7cda32fbe6d351d359c257b9e93d92eab75a": "0x0000000000000000000000000000000000114d65616e696e6766756c204d6f74657301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148bd5e851d3f0ece282ab24b11d8ce676a4ddb69f0a2d1a4990c73761bbea86ee509cd5f5af038c35": "0x00000000000000000000000000000000000a484420676172616765011768747470733a2f2f63727970746f2d6172742e65732f010100000e406e66745f6265686f6c646572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148bdc67657419bbeb22ce51e9b096db10638d2889c4a847781e0360f6fd3adffa6280107ef7260f62": "0x040000000002000000000000000000000000000000000d506f6c6b61646f742048756200000016706f6c6b61646f7468756240676d61696c2e636f6d00000d40706f6c6b61646f74687562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148bfc916011aac51348ffcdc60f24e9b546980dba143340f37be597cd0b6135eba9c87c4cb434a53d": "0x00000000000000000000000000000000000a43796265724e657264074265636b657200000000000b406a765f6265636b6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c1c29593b2d5db604c73bb4b37fd89e159ea8dda26c4021a4af572826ad6397d8fa9942c18b3568": "0x04010000000200000000000000000000000000000000094741544f544543480d4741544f54454348204c54441468747470733a2f2f6761746f746563682e756b15406761746f746563683a6d61747269782e6f726711696e666f406761746f746563682e756b00000d406761746f746563685f756b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c24c3ef8bc4c3e412c0e71d326f83f4e6089448e147fdab51b0b7398a7d0cc9a88b0571432e7310": "0x0800000000020100000002000000000000000000000000000000000c5a7567204361706974616c001768747470733a2f2f7a75676361706974616c2e636f6d0017636f6e74616374407a75676361706974616c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c3084898ad5f06e529c401186113eb29d37baf9cd8f00c62ab900c8f45587e224c70af5bc231f66": "0x00000000000000000000000000000000000a507572706c4e67687401010110707572706c6e67687440706d2e6d6500000b404e676874507572706c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c36932cefb7a9ecb4caa4a0e94ce7de3a3b240421eae5ac497d3222dced621b09dc5b0790575538": "0x000000000000000000000000000000000013506c6173746963205268696e6f73204e46540000000000000f40706c61737469637268696e6f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c4a4a005c89c680fa7c443627d84ad0a74c4510d28d286ac0121c70a2a8191961f689957a625250": "0x00000000000000000000000000000000000a524d524b6e696e6a610000000000000b40524d524b6e696e6a61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c818112f3226361ba19adf8ab8528c9f53058b494b6154dde0fadfe2bdeb3a9b9c87761cdcbb441": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c8a104718f01d73d20463560bc0be7d6e5eb0c6f46ac13bbd2a52be9764eb0ea5664224d188b162": "0x040000000002000000000000000000000000000000000b4e6f436f43727970746f000017406e6f636f63727970746f3a6d61747269782e6f7267156e6f636f63727970746f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148cb3a38ac67409ba900d19dc7ddf1723c1b0ee589e54392ae66f4dfdc4e340813d3982ee3c444e4c": "0x00000000000000000000000000000000000b646565706f6c6f6769630b4a616e204b6f6c63616b1768747470733a2f2f646565706f6c6f6769632e636f6d0014696e666f40646565706f6c6f6769632e636f6d00000c40646565706f6c6f676963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148cbad522066132e614740e9f8ba7bc917ece78a0cf3ad3a59dc190a467983fc40b6e10d26df2424e": "0x00000000000000000000000000000000000d656e7665726d65697374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148cf331474cf8ca77789371e25daefddfe31380de2e849beae016eed32ef426bca684a87b2722b226": "0x0000000000000000000000000000000000127361746f7368695f646f7473616d6f746f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d136d7c7984d254da01077bdc025fd779cc21c9760727ec07e52aa132410b82e5fabacb6f45b055": "0x04000000000200000000000000000000000000000000064f4e44494e000012406f6e64696e3a6d61747269782e6f72670e6f6e64696e406969762e646576000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d15d9b9ba448549ceb2a7cee1fe704ef408c1025e5f70a508ce24d0d005b110bb8b92aee6729823": "0x0000000000000000000000000000000000065961796f6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d17af330f9b2c86badb27b0ea87f8b6de054d7ab764af17cfec0a00fa2d9d55ea6317a6202cad58": "0x000000000000000000000000000000000009626163636869737400000013626163636869737440676d61696c2e636f6d00000a406261636368697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d181a92494fefeeb2e15eb8b4fd587fb9d94c5345cbdfa949b059dd12653ebea1df1bc8c00a8d56": "0x0000000000000000000000000000000000046875650000000000000c6875653533363337373831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d22092b65a0be40263e0e2220ee17f5e592687553243ef2cd9dc0f870e3bc8c5aa4759350c66f74": "0x000000000000000000000000000000000009536c617661506f650101010100000d40496e73706563746f72506f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d27cb369656b59b3a2d7c5aa6f73b06dfc3f72288b99609976953f11ed014e38b63cc717e5d9e44": "0x000000000000000000000000000000000006736f6c617200000019736f6c617273797374656d6f6f6e40676d61696c2e636f6d00001040536f6c617273797374656d6f6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d4a0f8bd7262bf796b999767cece29bf12001df86d1355bea8fe46996aeb0ca149f309605794029": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31370f42494e414e43455f4b534d5f3137000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d5f7ebde4f481a866f7b3f3db597d3032c2d767568aa550249c946600a61276910b9c1d21a93371": "0x0404000000020000000000000000000000000000000005534b454e00000018486f6f646965534b4070726f746f6e6d61696c2e636f6d00000d4063727970746f736b656e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d8daac9c069e6c7f200d9578df25fafb6690614aa05052abc6ea28c886c52448f28c8fd1c2a2f2d": "0x000000000000000000000000000000000008576f6f6265656b1743726561746f72206f66204b7573616d616e617574731a7777772e696e7374616772616d2e636f6d2f776f6f6265656b001676617379617374617379614079616e6465782e727500000940776f6f6265656b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d8e7baeef66b6391e9b88072c2f8b8c9b5c730d2b0a65589ba2df45ceb9fec58d35814b2ad5a719": "0x0000000000000000000000000000000000184f55544c4554204152542047414c4c45525920494e432e0000001f73616c65732e61727467616c6c6572792e696e6340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d8ff74133df57ac367801ab22817ca7c25117923cdd6c62889a01c2bf01683cea29e279d14e3e48": "0x0000000000000000000000000000000000094269484f444c203200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d901b92205a25ebbea06e6ad606b2a80822a72aaae84a9a80bec27f1beef1880ad4970b72227601": "0x0000000000000000000000000000000000157061726974792d7374616b696e672d6d696e657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148db172d8f1d1e04ea246cf4986a146aec95dd8a3670e957aa3f0cbfd70583be5b2e1c0ff7992a36d": "0x00000000000000000000000000000000000f616e616d656c657373666f726365045f5f5f177777772e616e616d656c657373666f7263652e636f6d001c7370656369616c6167656e74736576656e40676d61696c2e636f6d00001040616e616d656c657373666f726365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148dbef89e3ac0f0aad86c1cbcda487cd9e31a5e37b2836ebc1c3b3d86b2cd7596da91fae58e876b24": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ddffc86aaebc2d41e5c61cb6941b247d22fa14392fb8710a23493db5857c2904a76b3bcfda7d217": "0x0400000000020000000000000000000000000000000018576562332065647520616e6420696e766573746d656e740000001261686a7863727a40676d61696c2e636f6d0000094063616f5f6c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148de2cc2856d7fb2a8ad06fa44a5669702a29b394424560714a1af90ad9efb57f3864b93b1ff7961c": "0x040000000002000000000000000000000000000000000670686f6e670000194070686f6e676c657472756e673a6d61747269782e6f72671974706c657472756e6740676f6f676c656d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148df29185dccdeea1e881cd70793b3191b905aab3c659140f21d0febd037e0301235c14ca276d762a": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32330f42696e616e63655f6b736d5f3233000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148dfb7086a8af6a0f46a258564182e321ace7b23e06d109edb5fb9fdd7f25ff6693bc9e0fccac531a": "0x00000000000000000000000000000000000e50756e6b205661756c7420233300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148e029dc73c6ca9b6f00272047a1369138c7948e8d193757bd7d6319254926d2b91175398d8250e30": "0x040000000002000000000000000000000000000000000d52544920736f6c7574696f6e000000196a6f6e61736d6f6e64616c31393440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148e44cd35926bdb0bc6864e8808445baf40b99a5704ecdd47f7b0e609c5c4bcde4658fa8cecacfc3e": "0x000000000000000000000000000000000012446f676569737465722043726f776c65790d536861776e204d757270687900001a726f6d65734063727970746f65636f6e6f6d697a652e636f6d0000114063727970746f65636f6e6f6d697a65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148e5dd8f5ec2ae4f178ba8486af484a791ccc52be9aa844efcb97e88161ef3810ceeb4822cbe9297c": "0x00000000000000000000000000000000000a6465636f6d38383831096465636f6d383838000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148e60dc01fb6f9a204244242bbae9826963603e899b19812a4daae3f5bfc1c4c8fb6aacad2d274300": "0x00000000000000000000000000000000000772726967616e0000000000000b4072726967616e313137000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148eb1982dcbab9029e66b4a86783cae6a8ebf3824279bab103478b05ce04d2630e61a4dd9301d7b11": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148eb6988ffcbcddc884c62d27805ac9c7a62086e31dfae23703ac9dfb37fbd31bec95aa611c5d2c33": "0x04000000000200000000000000000000000000000000124e696e67f09fa4a6e2808de29982efb88f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ec37554e12de10ab08b555a5a3b2725e01ba15eb40aa32dc5b781532854b797808ed45e752b047c": "0x040000000002000000000000000000000000000000000742656e64616b0000001862656e64616b7374616b696e6740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ec91a2d2c36d0707a8b217ad8d80016336be124846210559ebf720aecd25ea0d0d11c10f1839e71": "0x0400000000020000000000000000000000000000000012706c6179696e67207769746820647573740000124071756970753a6d61747269782e6f726721706c6179696e675f776974685f647573744070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ec9e0f3e4ed8b00d6886dc9eaca691d9d893c4eb3132e31db7c0aee951805dd5eb463e783ca7957": "0x00000000000000000000000000000000000c417765736f6d655f446f740c417765736f6d655f446f74000016617765736f6d65646f744079616e6465782e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ee3802b033a961232477dcb6bcaad7e38477d8e0bbaee67b4534d0bf49a0d69f1f8051ca9c8206a": "0x000000000000000000000000000000000010427269736b426c61636b4d616d6261000e636861696e677572752e6170700000000011406c6f6e67626f61726466616d617261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ee5e7ff29bbc499c4826569e68b7eee1b5b93406e4951fcd7ab6b40be519a7db5c6732f66da1149": "0x00000000000000000000000000000000001d496361727573202d205374616b696e6720466163696c697469657320001f68747470733a2f2f7374616b696e67666163696c69746965732e636f6d2f001b696e666f407374616b696e67666163696c69746965732e636f6d00000c407374616b696e67666163000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ef014a3ff4856d97472058104d047d60672ab582ac3a345ec5d5d8f0292b7d237ad8aa4f9f93924": "0x040100000002000000000000000000000000000000000f537562737472614b6e6967687473001e68747470733a2f2f7777772e737562737472616b6e69676874732e696f001e737562737472616b6e69676874734070726f746f6e6d61696c2e636f6d00001140737562737472615f6b6e6967687473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f10571113e0ae6b447326399643ec639a0bfde97d8b37f8dd0ca9fcb3c74a1ce017f0476f3e2770": "0x04000000000200000000000000000000000000000000064b495a4f53000012406b697a6f733a6d61747269782e6f7267156b697a6f734070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f3ec1f0eb47047c3aa8cecefcce91950b7cade280f301fca12202043e06b20e1231ebb4fd331304": "0x00000000000000000000000000000000000c6d616e656b69747469657300176d616e656b6974746965732e706172617472692e6265001168656c6c6f40706172617472692e626500000d406d616e656b697474696573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f570a7114f41f2f9238a1cfd09a86d9624c562507c977082ab136ae4cd96747d618fadcdb7ecd2b": "0x0000000000000000000000000000000000054578657a0000000000000b404f6e64726150756c63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f7c8fc33a08b55c5e9e6c9b7fa123c1f3a714edd226b960cd2ea07faa969dac9e3e9e8bc7c6e24f": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000d456c6f646965207c205733460f456c6f6469652044696e63756666000017656c6f64696540776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f8156567d999f4b06c4a2d537ca65341ebf4d0573230514a60ad2d9d7a78339aa2b6a5e4c61250f": "0x00000000000000000000000000000000000464696501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f88e4319e34d2ea16476866c0074663b7d9046023a2b3fbf447c833f4fccfa3dd7a482235f1ec7f": "0x040000000002000000000000000000000000000000000a656e646561766f757200001840656e646561766f75725f313a6d61747269782e6f72671676696c696a61313936383840676d61696c2e636f6d00000e40416c65784b7269766f6e6f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f8a37e7560fdc95e6fdbbb40014567ab47740ab5e52be2492362e3d0459215d1ce3184a8689b42a": "0x00000000000000000000000000000000000d4772697a7a204b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f943fb275b495a03e3622fb285dddefdf8f9ac2ab59aa34e2abb5a316e9ebdc020317220e75f879": "0x04000000000200000000000000000000000000000000076b734d6f6f6e000013406b736d6f6f6e3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f9b3eae413c2cb20cde84600189647d443f6318f068a9cfdf630b1ce842b1a9dbb74712866d7639": "0x000000000000000000000000000000000006626f6e796112426f7373616e204261677368697965766100001773686f6e79616d63636f793240676d61696c2e636f6d00001040426f7373616e3036373131303739000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148fb2b977b7be8246964685d439545f2f1805e498916d06ac142ed440f99ddd3543278cacfb1ddb3a": "0x0000000000000000000000000000000000104c6f792042616c646f6e20417274200c4b61726c2042616c646f6e2168747470733a2f2f7777772e6c696e6b6465636b2e6d652f6b61726c62616c64001962616c646f6e6b61726c6b61726c40676d61696c2e636f6d00000d406b61726c5f62616c646f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148fce8c937cb9835fae24164b69db56408ef6a9e9ba9549be17fb3bd4b88bdff92c06ea9df3776d13": "0x00000000000000000000000000000000000a7369726b6974726565000e7369726b69747265652e6e657400147369726b697472656540676d61696c2e636f6d00000b407369726b6974726565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148fda280bf14a4d9a6c87c1c4489f6b4199bacfb7cd427374374a9ddccc4658413564dc6c41a08938": "0x0000000000000000000000000000000000064b534d20320b526f6d616e20526f696b000012722e726f79696b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148fdc8a1dba69b4009a659fe431e951e6a30aa39a583f2b7f5b0540df31fc3fe126e7604f49479f69": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148fe45272324c1bfc323e890aa0b5c0616ae4ce73ef46986c6e822d9f212ac26528fcb36d70b83e42": "0x040000000002000000000000000000000000000000000753656e73656900000014696e666f4073656e7365696e6f64652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ff1a76fe565275c32f682cd110c69b9666ad45dc6735e18e6b790b524fe347df9fc6027ee9da94a": "0x000000000000000000000000000000000019446561642043616e61727920436c7562204675726e61636500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ff90052f96341279c107fbcac10f60dc1910e27210283c39f8d5951816f8d7c8f5f96d0c71dbb29": "0x0000000000000000000000000000000000084a454f2e52494300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490073106f69e036ffaba4f34d61e2defae2db1f7c712007824c194ad921959efdb4a65dd174a590c": "0x040000000002000000000000000000000000000000000f50524f4f462e434f4d5055544552134d6f6f7365204c616273204c696d697465641768747470733a2f2f70726f6f662e636f6d7075746572001a76616c696461746f72734070726f6f662e636f6d707574657200000f4070726f6f66636f6d7075746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149008545bc6b9104854dae13b8ee7c7b93cfe5d6e3db2a48ad4fd34ef6191684dbab498b234b9cb10": "0x00000000000000000000000000000000000576616c7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149009e250f366165b143b78432fda580e0996f00fce6f1ea8b2a38e4ddbe229eea3b839921eb4215c": "0x040000000002000000000000000000000000000000001df09f8fa2204d696e6973747279204f6620426c6f636b7320f09f8fa20000001778406d696e69737472796f66626c6f636b732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714900d5f104f49317a8ae668d3b1d7fd73a726263ac4a6454634d65f9c874ad7eede11184c6886bb52": "0x040400000002000000000000000000000000000000000a4c554e415220444f54000000196c756e61722e706f6c6b61646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714900f31199a5d4616161cc08adbd7742ba651fac7c0fe5057fa4ac37b16541bb7a20c903a1841907a": "0x000000000000000000000000000000000009726d616e7a6f6b750c52796f204d616e7a6f6b7500000000000a40726d616e7a6f6b75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714902842d3c37f4986a0b2fb0ff6a2effb882dc59e18d1717233e1142051304e76219f825b9da4eb6b": "0x040000000002000000000000000000000000000000000950616e6567616c690000154070616e6567616c693a6d61747269782e6f72671870616e6567616c694070726f746f6e6d61696c2e636f6d00000a4050616e6567616c69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714903daac85f2846d9f0038b583a9edb1847e77fd632f12053eb84e81cd17e9afa3abd4bfc56a30b24": "0x00000000000000000000000000000000000949726f6e466973680000000000000b40506c6f6e6b61446f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149045f9ed16c20b3fee866b5a824a9620446b09bdab8191fe0ab8800e1fbe8185c4ce3488d81d5648": "0x0000000000000000000000000000000000084e696b69746b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714904ced744e494b84188e0101febd96c4801aa0f8df34142d9a5351e5bef51fccba8456b0a29d2030": "0x0000000000000000000000000000000000064e696e6a610000000000000d4062616c616e6365626f726e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714904d3bc15625b8b05c1e0ddb072da402a8732c1dd926dc9befc7e2c9159507a75563b4ac0a2ef347": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490552d7683a533ef8821dc119eb7790c050e97b61a8b93c5e06d7494057f6c773004af1939837a7f": "0x00000000000000000000000000000000000a546f776e437269657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490559a708d4b8f5b9691490b7b477dd3ee98a24ba795c474ac2655fb51c29c24016aea156460494a": "0x00000000000000000000000000000000001ce382afe382b5e3839e204b7573616d61204e696e6a6120f09f8c9e0d736169626f67756e696e6a612568747470733a2f2f7777772e657473792e636f6d2f73686f702f6e6575726f63010100000e40736169626f67756e696e6a61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714905772522f1ed5ae1c9f76582c41ce999555425dcb884e8baa51a21eb8ae524457431ac81431061f": "0x00000000000000000000000000000000000468696f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149060a3c80f6810d992b978cbfa629a5b3fecff0e348a6745690470ea9dc27674a56f757a14e59940": "0x0000000000000000000000000000000000064a6f7267650b4a6f7267652053656e61010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149061dceaf0e1f167f25386e981a22cc69a7bbddc7671e7e471fd95f49098d0f40ebd5bc79730fb49": "0x000000000000000000000000000000000016546865204b7573616d61204e4654204d757365756d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714906d83e2f26e70dd0ed88dff710092f66a4e3da59fa67674985976f493be21879da90be0c1f41476": "0x040000000006000000000000000000000000000000000659616f71690a59616f7169204a69611568747470733a2f2f6a696179616f71692e636f6d184079616f71693a6d61747269782e7061726974792e696f1079616f7169407061726974792e696f00000a406a696179616f7169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149073d801dfde2151c0d998fb9f36dc65132dd06a845548d564e1db500fec59a8926a8fc75a8ba446": "0x00000000000000000000000000000000000a416c656b73616e647213416c656b73616e647220416761666f6e6f76000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490762653147f44fb2479f5e0d2126d87a0ce77cd90278520ed58590d136b78586cbe5c915d5ff16a": "0x000000000000000000000000000000000007436861726c690c436861726c692041726f6e137777772e636861726c6961726f6e2e636f6d00146d61696c40636861726c6961726f6e2e636f6d00000a4063796e6f74797065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714909443962b28076bc4f174c5cd052a7aa222302c7e1c0af713bb28673a504ed1f6a07f03486fc90d": "0x00000000000000000000000000000000001046726f776e696e675a65757338323601010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490969d394746afac8c0cf875f18ab9ca0e60bfc13dba6b4216b74dddf84555ab2f10f0f3b265157c": "0x00000000000000000000000000000000000763726565736501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490a3a06bb6e41d8f1694cecdcc4a83985d1904e6d6709729459eef4a3bd8468f5b11a1dbc352af5d": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30360e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490b1c53cf7dcddbd8a320af9e031a3396f15acdcc65c43008124068226505ee7e12bbb0a12012e60": "0x04000000000300000000000000000000000000000000075061726974791d50617269747920546563686e6f6c6f676965732028554b29204c74640a7061726974792e696f000f696e666f407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490b34a3937b9efce6482a21b7e92055e74bc9b182ded5b0cb86e6f7706090c916f60e8235b8fe51a": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490b7f1fb67016ea9caaeb20361e77d9114bdd85dc196c33e15da72f4c28699085c388a3ecaa17f1e": "0x04000000000200000000000000000000000000000000034c560000000000000b404b7573616d614e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490bfa3ccf24689448eac08398a7441d30d6c48e1cce03d40c4ed1d8bf6764945925e5af4c3c4d362": "0x00000000000000000000000000000000000554616b6f0c53686962612054616c65731968747470733a2f2f736869626174616c65732e73706163651b4074616b6f736869626174616c65733a6d61747269782e6f72671d736869626173637265616d73747564696f7340676d61696c2e636f6d00000b4044616e636554616b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490cb5bb0ae9f291ede1c4c24739f2202961c22424816397b191bd85996985270375c21891d637f5e": "0x0000000000000000000000000000000000124249472d424f472d56414c494441544f52000012406e617465333a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490f5f7cf3f6d8adb903ebbf02f14c17e429da07dc1a372fdd67074849faf98fe93487ddf92f7b869": "0x00000000000000000000000000000000000943616e6172696e6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471490f89f28c98fdb9f9e14a9dd8d2928325d66d5987142ffd9209ea874b9a0d50a07492bd69e94c612": "0x0000000000000000000000000000000000104a616d657320536b7977616c6b657200000000000008406e6654555552000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714910e21740f651a39fa507c9a5d3879d4a7d6654c6a35fef974094bf5d16203d6312f9ea1358ec660": "0x00000000000000000000000000000000000a446f747765696c65720000001c646f747765696c65726f6666696369616c40676d61696c2e636f6d00000b40646f747765696c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149124e4dc6df447e792a0166ebf4b3f197986796419c48c9b61d29369acf5dd4a47ea2c7bd0393a61": "0x000000000000000000000000000000000005416c657801010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714912655d634b54e9a086de7162fbfa0b91a67eee94b697646028edcf484ae78fdc0627e7eef1b2247": "0x00000000000000000000000000000000001353756257616c6c6574204f6666696369616c001a68747470733a2f2f7777772e73756277616c6c65742e61707000146167656e744073756277616c6c65742e61707000000e4073756277616c6c6574617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149155332d1321391214cd612ff7f390b9e90584767a00a4e9b740b61c0f2134698bbac79c6649764d": "0x040000000002000000000000000000000000000000000c6d7968656172746f70656e00001c40616c6578616e64616c6578323030373a6d61747269782e6f72671a616c6578616e64616c65783230303740676d61696c2e636f6d000010404c61626f6461537665746c616e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714915734949771ed554038aef7c58b83c4252c3ac69b38bf7d3df85ce136459a69bea073e24900423d": "0x00000000000000000000000000000000000c54696d757220447562696e0c54696d757220447562696e2068747470733a2f2f696e7374616772616d2e636f6d2f74696d75722e647562001574696d75722e647562696e40656d61696c2e637a00000d4074696d75725f647562696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714915d6c6518f7b5c4c0bbe78d8d6ec69c7ba07f331f2c491f94b7a53986caee31f97011905d5a9b5c": "0x00000000000000000000000000000000000c43525950544f4c4449455200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714915f093e86a67b73629b918a21dae886bcc5cc6f7dead2bb9bcf0a25e7e376ba138882a91d473e31": "0x04000000000200000000000000000000000000000000126b7573616d612d70726f64756374696f6e0000001c637269737469616e636861706172726f6140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149160a699257bae5812e991b50e700d1e52b37300ef0f51538197c0509d9d0b3d77482b4c1a3da566": "0x000000000000000000000000000000000008484a504b444f54104861797468616d204a6162626f7572000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714917bdd412b89d0510cce9e210c473fd1f20178fe889c178956ea1cf325c54b1a439a88bc62fe7851": "0x040200000002000000000000000000000000000000000ee29b93204e4f565920e29b9320054e4f56591668747470733a2f2f7374616b652e6e6f76792e707712406e6f7679343a6d61747269782e6f72670e7374616b65406e6f76792e707700000f406c6f73745f696e636861696e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714917ee600d4ff956c28f9a4e7cff6010ad028c4cd82432afde4dd1269efafcd281016daebf7fe0e16": "0x00000000000000000000000000000000000757697a6b696400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149180662af89403432204f9f580904c74f61c9606d97ba4b8d3149d5a689173b3056a9bf43d003039": "0x00000000000000000000000000000000000673656d616b0753657267657900001673656d616b31383032383040676d61696c2e636f6d0000114067463138764f5639396d635972516b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149185893c3a05ff480488b1a94fa6c2e250d13576c5e3256b263ac9ce966a7ef6e7766921d8d61738": "0x040100000002000000000000000000000000000000000559616b690c53686962612054616c657318687474703a2f2f736869626174616c65732e73706163651b4079616b69736869626174616c65733a6d61747269782e6f726715736869626174616c657340676d61696c2e636f6d00000c40736869626174616c6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471491b543380b6013ea301ca9d61b74c9aaa1fdd9e53249ba415ee86fd4d15130e9dc7ee8d713456b33": "0x0000000000000000000000000000000000076b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471491b5f4bf2b18b9e7c01c495b45751393a71693e7abfae197cbbe0eae7233a463f7be2efd6f13444d": "0x00000000000000000000000000000000000554626f79044f2e4600001a7368696e6570726f6a65637431303040676d61696c2e636f6d000010405348494e4570726f6a6563745f31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471491b6ef1b478c037f5a64d688b6d7eed3e5d25e0c69421de9a10db233c6635166a7be9b61ebb2a433": "0x000000000000000000000000000000000008526f746865727300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471491d6804bda44e439d21ffa34abd2709779ccdef7aa0aaa292c32a986ff3aa6faf7c0af56d47cca5c": "0x00000000000000000000000000000000000541646f6e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714921d891bcf4e728ce683743954d0cb555a54ab21cfb8161f74e689a051d1ac1dbbb94df70be3d81e": "0x0400000000020000000000000000000000000000000012504f5745525354414b45204b5553414d4100001740706f7765727374616b653a6d61747269782e6f726719706f77657240706f7765727374616b652e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714925643626036602a9a92ad7c6dcc51fec9f6d98f8316406ca42bd04dbb029d3ce454330a20fac077": "0x040000000002000000000000000000000000000000000b5473756b6920f09f8c9500000019636f6e74616374407473756b697374616b696e672e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714925e96c4a6796256c0374918863d100dcc69bcab798ce6d52ad129a8b35e170ba00ba414a7be5e70": "0x00000000000000000000000000000000000b487970657220436c75620b487970657220436c756200001a68797065726c6f636b6564636c756240676d61696c2e636f6d0000104048797065725f436c75625f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492688eaced7f4cc5baa8a189ca8c65b64a3fdb0dbeac6a7ca2c00b27ed799f8e5f61b8af0621a162": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149275654d23da48139280f3396e4673c4475c8ae2f041cac0fce02e2551e1beb6d80df55667c66275": "0x00000000000000000000000000000000000e4e6f7261436f646520f09f92bb001f68747470733a2f2f6e6f7261636f64652e737562737461636b2e636f6d2f00166e6f72616c69753038333040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714927911426652f14cf4492a28ead0b315fc68069bcc39470c409d12b4e48259384d63da411bad0129": "0x04010000000200000000000000000000000000000000184d61726b204372696e6365204b534d20636f6e74726f6c0c4d61726b204372696e63650000156d61726b6372696e636540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714927d23a251f0902d7c4f2330f182fd91474849a74d6c681264aeeb57213af82a90fca83248b37477": "0x00000000000000000000000000000000000b446f7453616d61487562055a335230000015446f7473616d6168756240676d61696c2e636f6d00000c40446f7453616d61487562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149297e19198fb83a580540a824b03b96ba36fd30af41f8de9de93ce30ef8a16299bb9d938e62f3f68": "0x00000000000000000000000000000000000667626163690000124067626163693a6d61747269782e6f72670000000840676261636958000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714929c071a7d0883d10a6fa0a39e064f33dfb2fb47e30e19aaa7bdd13291d582535703ba7e8b273528": "0x00000000000000000000000000000000001247726561742054656163686572204b657a00000000000011406772656174746561636865726b657a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492ac2b44e9df4524865ca05d8bee6d8b21d7c48b543c5a154f5cab3079deb6718a775707c86fff5f": "0x000000000000000000000000000000000008726964646c657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492b894b9740836cdce2e98564f421ca69a64608d68480080f5f317f4de4e400af3c065181e0c8a11": "0x00000000000000000000000000000000000d4c6971756964204368616f730d4c6971756964204368616f7300001a6c69717569646368616f732e6b736d40676d61696c2e636f6d00000e406c69717569646368616f7335000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492bd0d654a0b34ffb640b7373eb438306069706e984d4725d91690d4685648f2caf3d1aef39b4003": "0x00000000000000000000000000000000000a52652e4d61726b656401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492d3b8b7eabbcd46524842180999b774cea511715b38f557018c75b586d0fbebaadb52adf0a44447": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000a5374616b654261627912536b696e6e7920426f74746c65204c74641668747470733a2f2f7374616b65626162792e636f6d0016636f6e74616374407374616b65626162792e636f6d000000001e68747470733a2f2f646973636f72642e67672f5679514558584564556e00", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492f879f180f6a02408b712a589f5cb71cd7094809785ab0a924358d3cb52b27efd4933b6efc14963": "0x000000000000000000000000000000000010446f6e446965676f53616e6368657a0000001c676176696e776f6f6469736d796775727540676d61696c2e636f6d00000f4053616e6368657a43727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471492fd5ac6793d3e958ea2f0d9cd27c799fe691f45c532865beab623b9225e078d980b1b2e86b3026a": "0x0000000000000000000000000000000000194b5553414d412050415241434841494e205354414b494e4700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149302748bb1f52508b2ed4e35c8a3e577dbd30e2bdc03b475588c236484315857088e86bc74df1b31": "0x000000000000000000000000000000000003594800000011796172636f6840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149306f9d2b20faa1224ec6e0f9e1ebb3e0a363ea3ad99d21dcc0f15b2c9587349d2e843d748f71232": "0x0400000000020000000000000000000000000000000007616c657865690000000000001040616c657865695a616d796174696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714930a2be4692e62f7e26e878810d319dd39d85e013a0cac3f232e6d9682b1d829bc3f7830ade12855": "0x000000000000000000000000000000000006736172616d0000001479756a756e31303138406e617665722e636f6d00000d406b696d736172616d313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714930c02ed2be38f57f8f51f44c3305ee50a92b2e1bac6b7103abbff664718d06dc10f3112c82bf61a": "0x00000000000000000000000000000000000d43726f6d6d2056617264656b0e437972696c204361726c69657200194063726f6d6d5f76617264656b3a6d61747269782e6f726719637972696c6361726c69657240686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714933b413030a2193b0e4d677832209548c8712ca7ba1e72a885bfea75f7c639552b20b7a395df3f70": "0x0000000000000000000000000000000000010101010100000c40446f7453616d614c6164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149345f7e620413feb30b15f14ec3f05e821524d0bce378ef332d19b60476d88870deddc5e9382af16": "0x0000000000000000000000000000000000115065746572207c2047656e736869726f0c457175696c69627269756d1868747470733a2f2f657175696c69627269756d2e696f2f164070657465725f7374723a6d61747269782e6f72671770657465722e7340657175696c69627269756d2e696f00001140457175696c69627269756d44654669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714934cae89366fc06960aded936fc747de820f80ae1ea2f02671395df2e87f5b8e296545d4b3d0bd29": "0x000000000000000000000000000000000006486f7368690545676f722168747470733a2f2f7777772e61727473746174696f6e2e636f6d2f686f73686900186b68616e656e6b6f2e65676f7240676d61696c2e636f6d00000f4045676f725f4b68616e656e6b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714935e5672d20bc186d483a43afa5895b93249e9cbd00ffbea478ae2fcc21f5aaefb6fd9cfe30f4a4f": "0x0000000000000000000000000000000000064e696b546f104e465420436f6c6c656374696f6e7300001663727970746f64696e657240676d61696c2e636f6d00000a404172744a6f686e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493641724f6b9e368deffe6c6afb3c290639377d7cfb16bf69dc9039b46014f6eaaa13b55a71aa606": "0x000000000000000000000000000000000004646a6200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149366d4cd051fda98c47741beea936cd81fcb6221e2f2f6c9d6b875ed92133706a4b8eb70271fd003": "0x0400000000020000000000000000000000000000000014f09f8d9320506963636f6c6f6e6520f09f8d9300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714937b9ba6877f7e80f80761baccb8c83580e6a9bcd98c05d11ebd9fd6c666fc09f00b055daa4d6e2d": "0x00000000000000000000000000000000000a4672656e636869654200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149390a024fbd35d6154bc9d96ec0ac259bb9cfadc33fe9ed4db3ab50168b329e86d68189e9ab1451d": "0x000000000000000000000000000000000017e29a944772756d7079204a61636b2046696e6ee29a9400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493a9c3c86003c444c4f1fdb0c67daf9e2302565a974d166ddc74b65219694369569eedd43e2bf308": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493c499446dff130948b985dae79adcb9becca19ca2eba2aada6416020dc01abd59f8b4419cd8a002": "0x00000000000000000000000000000000000b4d41442043524950544f0000000000000b406d617474756e636869000a6d617474756e63686900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493e08f85a76d37a7328b6e90d27539b8224a0ba4139f305a6bb2d97540a722e2ad470ecf43b4a341": "0x0000000000000000000000000000000000084d4c4e204b534d0e4d696c656e204d6172696e6f760000126d696c656e406d6574617079722e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493ee60d0d680c677224705fc7cbd3f254286b3e9fa19a113267a4628d213884d6a83179c41206b08": "0x00000000000000000000000000000000000a507572706c654254570000000000000f405265616c507572706c65425457000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493fa88b509112c5cc8310cf96893e0013bdf5ad21fbdec7cc9423de8ddc27c30022c47fdf4c3cf11": "0x000000000000000000000000000000000004e5bcba01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149401230589822c5d48efa32a0569824a03e7a969f40d50b2ec796164b4d774d20d0d488513f3eb1b": "0x080000000002040000000100902f50090000000000000000000000000000000000000000000000000000000e33394b7573616d6120f09f998f00001a406175746f636174616c797469633a6d61747269782e6f7267116b656e6c303940676d61696c2e636f6d00000b406b656e736572736f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714940d03ca7ec7ffbbecf9b1d2f50b9518f91e67d42a34bc73512d68f34a8371f5c45ecf9af2d8570a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149414b9a45988e9b186717d35d7cfe3c6fe1c4996268614f6503e8c2caf64521fd9e14b76c57a9b07": "0x00000000000000000000000000000000001047616c6163746963436f756e63696c001c68747470733a2f2f67616c6163746963636f756e63696c2e696f2f00000000114047616c6163746963436f756e636931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714943fc2ac54f4c37ccc10dd1946b0fc65c8993ff7f47052713e9aa4b1cb72c913bd397c34adf4f949": "0x0400000000020000000000000000000000000000000009416264756c62656511416264756c62617369742053616469711a68747470733a2f2f74686973636f696e6461696c792e636f6d000000000a40446f63416d6f6b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149446885b0b18680ae8e0ac0aa68a0c138a3aa84813f0accae4ed7d6ae4b4905495026f16eda4e069": "0x04000000000200000000000000000000000000000000097370617a636f696e000000137370617a636f696e40676d61696c2e636f6d000008407370617a7674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149464a51c61bcb648ee56126859de69a3539f0e8910ca7e775243f18c6257954a65e020eb229be912": "0x040000000002000000000000000000000000000000000de29d84e29d84e29d84efb88f00001740696365636f6c646e61743a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494673f91681becc4565d3c8cd1fcc93ed837d3f9830e333659cd0962ae7fadb7c87899d0b1431822": "0x00000000000000000000000000000000000e524d524b204d69677261746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149497fcfa74b9bd271c1fcc964adadc336e55f884716aacbe0bbf32540003b0279a158cd2748f3f75": "0x00000000000000000000000000000000001e59757269476969207c20524d524b2e617070204661766f757269746573001668747470733a2f2f7777772e726d726b2e6170702f0018797572692e6769726a616e736b6940726d726b2e61707000000a40797572695f676969000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494e8a3699d4cfcb72cb3165d3c084782aa0a3fdd77a70596c63814b3fc1ac0999fdb2afb5e1f4f40": "0x00000000000000000000000000000000000652656e4f730101010100000a4052656e4f735f5250000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494ed5c295f9bfa2588f28e17671ba1808d7b02cd3caaf80113066a467127666f4d80afc50bfbc127": "0x0000000000000000000000000000000000097a6f656d63666f78000012407a6f656d633a6d61747269782e6f72670000000a407a6f656d63666f78000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494ee9a4fadbb7dadbc5d026a7be48559570fc2a3a72d59b58d5971aec58530ab740c35d9f6a29416": "0x0000000000000000000000000000000000094c617373756b6b61064c617373651174656b6e69696b6b612e63727970746f000000000c404c617373756b6b616161000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494f3111594a138697873a3c888462af6d6717791ad60019b0b5fdbaaa5aae703c4cf9f95766c5479": "0x00000000000000000000000000000000000941657465726e757300000013616b32373530616b40676d61696c2e636f6d00000a40616b32373530616b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494f3132d9220bd5bda6eed44e320bc280e758203c8a184a3fb21e875e860be78e2c479bd7b851e08": "0x0000000000000000000000000000000000044b656d000000156b656d706f6c6b61667240676d61696c2e636f6d00000d406b656d7373737373737373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471494f5bc61099238f7c904f1e0902db076f8b1b593db28140bf6bace7d8ff5c7bf8968728098f13afc": "0x04050000000200000000000000000000000000000000124c696768744769616e745374616b696e670c4e65696c2048617272697300001c6c696768746769616e747374616b696e6740676d61696c2e636f6d00000f404c696768744769616e74496e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149512e7cebb2ab2b2206dd955d4ade8d59bab18cba031e664ae888491d173084bc9a0efabf0be195e": "0x040000000002000000000000000000000000000000000753616b7572610000174073616b757261746563683a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149525351d4777dc940efea838f312ff60ff62ce2914adfaaeb41d81dc4b81a8bf0a41be031e79c918": "0x00000000000000000000000000000000000e4a65737369636120416e67656c0021687474703a2f2f7777772e6a657373696361616e67656c617274732e636f6d2f00186a6573736963612e616e67656c40676d61696c2e636f6d00000d4063727970746f6172747379000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149538c438fbcd89d8988376cfad02f636e059969036a05034046bd3a59b97c57cf23b272c9e8b0d55": "0x00000000000000000000000000000000000a4672616e6e694265650b4672616e6e69204265650000176672616e2e6173656d6f746140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149540f12061c8ade9c0114150a79f0572d3d86fd1411ac282bd8b62beafdd7b4bc2d5cbacb48f3a55": "0x00000000000000000000000000000000000a42656c6f775a65726f0000001862656c6f772e7a65726f2e747440676d61696c2e636f6d00000f4062656c6f775f7a65726f5f7474000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495523a80019f8438ccd28a48526105f8ea01f27c133b3971a5d80c26ded2fe4a695b10ab9875136c": "0x00000000000000000000000000000000000642617a7a7500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495636345d78c41f24c9006835bd0eb918b1e1a7bad79b1bfc0f70b752acb9dc1aee47819e4df0f06": "0x00000000000000000000000000000000000a736a65766572657374055975726900001670637072696f726174736a40676d61696c2e636f6d00000d405375766f726f7659757275000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495bb65b41d18b99cacee95ed0e6c831a02112564c89d87a67684229e79a702700f91009c34f6e17a": "0x00000000000000000000000000000000000b6974734e6163686f373900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495e5354b81f0f460da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a": "0x040000000002000000000000000000000000000000001453696b207c2063726966666572656e742e646500001540646576305f73696b3a6d61747269782e6f72671a73696d6f6e2e6b726175734063726966666572656e742e646500000a40646576305f73696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495ee9607d490e8687a1cc366cab83c63f1d8a6ad090b038ac6057e235006619bde17ac85597be109": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495f3f5d4f1926f98b2010431ca44985a2cb0950ec7564333c86983dcd44b85c093e16723fbe19031": "0x00000000000000000000000000000000000953616d75726167690874697a69616e6f000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495f941adaa91654a28322946bfaec48af9564e56ee4134655dc1748ffc206c3694a9c6bddbe8332f": "0x04010000000200000000000000000000000000000000136379626572627261696e2e6e6574776f726b001b68747470733a2f2f6379626572627261696e2e6e6574776f726b001b636f6e74616374406379626572627261696e2e6e6574776f726b00000d406379625f6e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495fb7c212eeb16bc3cbd5d669b224d75f6d54031abdac468efddba8ea48d4ec25f39996687e6bb23": "0x00000000000000000000000000000000000e6b7269735f616e66616c6f7661124b72697374696e6120416e66616c6f766100000000000e406b726973616e66616c6f7661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471495ff23600e669c4a60deb73d358494181a302d0ad149af4aa52df621afe024c6179d7d0b39929e15": "0x00000000000000000000000000000000001346756c6c4e6f6465204d6564697461746f720101010100000f406e6f64656d6564697461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149600c2a7db131074ea2f5d8d81a9e713040a65a058dbd3304f787f82be1b7d7fa7e136193ccdcb62": "0x04010000000200000000000000000000000000000000074c4950454e4715e5b2b3e588a9e9b98f204c6970656e67205975650016407975656c6970656e673a6d61747269782e6f7267147975656c6970656e6740676d61696c2e636f6d00000b407975656c6970656e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149629ea052725c3692cea1b9d395f1497930efb3c25135fff46e120b747d490cfd62c66f4573e976d": "0x04000000000200000000000000000000000000000000134554484943414c2056414c494441544f5253000017406576616c7561746f72733a6d61747269782e6f72671d6574686963616c2e76616c696461746f727340676d61696c2e636f6d00000d404556616c696461746f7273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149639866340f488369cb0d4ddd32f9332dac7059de238b8e489afb55502d1756d7f50b78b58e20c70": "0x040100000002000000000000000000000000000000000b72656470656e6775696e0000174072656470656e6775696e3a6d61747269782e6f72671a72336470336e6775696e4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496466553cdf2029286f520b752675b6242f1b3c6e1dcd704058e3f74f81fba9afe10aa8113dc5068": "0x00000000000000000000000000000000000c4d617374657272756c61780000000000000d406d617374657272756c6178000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496627741b7418892667eb6da0231e2e63b881d8a8936e6bedadbf4a4f3900e5e657301d410c8bf02": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714967dd10b13066df77243fc7f5f476ee7c5fad9de673f1ccfdf59c3e92530c09d6d584ff19452c87c": "0x0000000000000000000000000000000000115361796564406b7573616d613230323100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714968689303d5e0ea80686d249850c389953211c7ecd77d76f031bc8e9e0289b51f602fc8097122324": "0x0000000000000000000000000000000000086f7461626c656d00000000000009406f7461626c656d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149688ac8c5537830f120207cc128159479d48c4bd2213274517c13fda02c1783d2f38232ff1feb11d": "0x00000000000000000000000000000000000e4f6d61725f5365616c7469656c0e4f6d6172205365616c7469656c1c7777772e61727473746174696f6e2e636f6d2f7365616c7469656c00176f6d61727365616c7469656c40676d61696c2e636f6d00000e406f6d61727365616c7469656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149696dce1ccfdcb0910908d002661d99caef8f6cc090f6f3f9853dc554b78dfada32b219398840c0d": "0x04000000000200000000000000000000000000000000147468697369736e6f746d797265616c6e616d6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496a0953ddf0eeb24d71c3176c00b028a841880392ba8cd903836b938a971ad12857ca842ba29973b": "0x04020000000300000000000000000000000000000000114163616c6120466f756e646174696f6e001668747470733a2f2f6163616c612e6e6574776f726b12236163616c613a6d61747269782e6f72671468656c6c6f406163616c612e6e6574776f726b00000e404163616c614e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496ad8bee6040ef3c5b473ba833712cddcb59d2569e9f2523d66f2ac183c8470e74077682262eb486": "0x00000000000000000000000000000000001a4e554a4120484f4f44207c20534953204f46204d592042524f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496cb59db66691c528e583eded93da9417b2c0b6dc1446ed4704f3553d065b4d20efed3a1e0c93626": "0x00000000000000000000000000000000000e4b726970746f66696e616e636500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496d9cd4e5f65d9cf821ba83ece24cfead00c045d6873d0f80cf12503a812e285afd007a6a9d81328": "0x0000000000000000000000000000000000087365616e5f66620a5365616e204368656e147777772e666f7267696e67626c6f636b2e696f155365616e40666f7267696e67626c6f636b2e696f157365616e40666f7267696e67626c6f636b2e696f00001b68747470733a2f2f747769747465722e636f6d2f565365616e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496f4aad0cdd32c3e8a6d7fd62a2ca5609d25c2574a275de76a6fc5322482aa0b0d29f0a8f8f83b53": "0x040100000002000000000000000000000000000000000d706f6c6b61646f742e70726f001568747470733a2f2f706f6c6b61646f742e70726f001368656c6c6f40706f6c6b61646f742e70726f00000d4070726f706f6c6b61646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471496fde7fff7b4278c8adee5c0c1d45c80592e817fd4914806f2929fbb1c80e8687faa8ad632c32e6a": "0x00000000000000000000000000000000000b5175616b7a204c6f7264000000147175616b7a6c6f726440676d61696c2e636f6d00000b405175616b7a4c6f7264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714970399168fc6b4bcf20436bc406afae9bb15efd905cb4ab40b338e14a2bfda1c174859cdb06c9b6c": "0x0000000000000000000000000000000000087846756e6e6579000000147866756e6e7930363140676d61696c2e636f6d000009407846756e6e6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497087a3a72f4f8b4c8f553a628a3ef2534f91452ee33fe84549dc8ce3fe330f07828af345f52f849": "0x000000000000000000000000000000000010636f746f706178692d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714972eb164c7f5e4f208a0291a4b1bafb431607e66865c9fc5538a3eec1e9e859431a2265b701af077": "0x0000000000000000000000000000000000094a61737a4469617a000000146a61737a6469617a7a40676d61696c2e636f6d00000c406a616369656c6469617a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149733ee530cd28230b8745db0b5f85fae7e64f061d3d4c058cb4f51af12097a6fe666bd81b8251d7f": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497389e32ef925ccd6c0197856b35c7f631f5aa8d9cfd83f7e75202b0d821e67d2f344e4e4b5fc10f": "0x040100000002000000000000000000000000000000000d506f6c6b617373656d626c790d506f6c6b617373656d626c791968747470733a2f2f706f6c6b617373656d626c792e696f2f001668656c6c6f40706f6c6b617373656d626c792e696f00000a40706f6c6b5f676f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714974bb4bce2ea42e09224219c0ac40ab90370be268d128fdc9528fa2effc0e28e39ed400a14536e08": "0x00000000000000000000000000000000000953616769747461570545474f52000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714974c91f6b33b06ff9437d00e9bdb34a8bfebb9a526f16a3eec890d0003c6d5f9080a10b04c00b112": "0x000000000000000000000000000000000012506f77657220486f757365204d656469610450484d00001c696e666f40746865706f776572686f7573656d656469612e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714974f1452190fc371fada8b71c5d2906a12a63adb35dac00d22349528af0d39e9dcf9e8d43d828878": "0x000000000000000000000000000000000004504a530000000000000d40504a533034313239383932000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149751a6b5ec392a79700407f5904c7ad8b610fdb40d1a8a1047efa8f00e0f2320791b6d7da8a69103": "0x00000000000000000000000000000000000c61316b616e646175726f7700000017616c2e6b616e646175726f7740676d61696c2e636f6d00000d4061316b616e646175726f77000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497890c1341c73b0186f0b4a93947c72764f0bf771a5652371344df481a206d2d25e9b5af88a0690f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149794f920c8bc28ab34e5e97e6921f126dce794b8122543bc3923d7c7abec719405f5822d8818677a": "0x000000000000000000000000000000000009416c6578204d747a0000000000001040416c65784d617274696e657a5f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149797b884384074cc4c0f34840840d39f88e5d7d2a55caa7416961c17c29ba9552206e5a0bd54093f": "0x00000000000000000000000000000000000a4c75646f63726f737300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497b2a64b241954e9a2ee169c829a65fef4ebadc97883a35a3694c2f2995a3cc61abde4fc9412a91e": "0x0000000000000000000000000000000000124272756e6f207468652043757261746f720000000000000a4062697466616c6c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497b7c5b692c6ced4162ad78b4445890bb6f135b583b9775a5979a25d0065a55310943c8d090cb97c": "0x000000000000000000000000000000000007564943544f52000000136d657461766974694070726f746f6e2e6d6500000a40566974697265756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497c4bf937bc625125ade8b34a0f0a1a7975476df53f96cb3b0fc5c4043716af5bc833b4c194bbd79": "0x00000000000000000000000000000000000a616e6e69655f6b736d00000015636f6c616e6e636f6c6140676d61696c2e636f6d00001040616e6e69655f736f726f6b696e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497ed1dcda161ffc758eaac5ecb89b593ea486a2581dbb2df07745b96a7d49125d3bc33c654015243": "0x00000000000000000000000000000000000b4f7a796d616e64696173054f7a616e000000000011404f7a796d616e643737333635373636000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471497f069f11577b05c5414c8bde77dbaa6324c3261025c2d46399d615712a539723ab89fe736577a05": "0x000000000000000000000000000000000004416c690000000000000e40616c696d617277616e693130000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149814eae07bc4079400da54310700ec4bd026010c3ec89737129446f75a25c0daf55cf6d432f6437d": "0x00000000000000000000000000000000000c4f6e6976657273654e46541b4d2e205665726c6579652026204d2e20426f73736368616572741b687474703a2f2f7777772e6f6e6976657273656e66742e636f6d001c6f6e6976657273652e6b7573616d6140686f746d61696c2e636f6d00000e404f6e6976657273654e465420000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149837c343b899ac37125ab2fe5c8d89a80539712b54765ee2e8414f15d23e96f9d1413ed04bfa151b": "0x04000000000200000000000000000000000000000000116c696768746e696e672d737472696b6500001440736d6f6b6532363a6d61747269782e6f72671d616c6578616e6465722e73686174756e6f7640676d61696c2e636f6d000011406c6962657274617269616e313937330012616c6578616e64657273686174756e6f7600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714983aa5b573c0b22174017a0c081a6b17c99ae305b6a0df072a6786bea22d7c9eea7da4cba2938862": "0x00000000000000000000000000000000000b416672696327417274730b4166726963274172747300001461667269636172747340676d61696c2e636f6d00000a404166726f4e667473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714984b0aa6953965fc57f62eb53f8a94086775a809b67bfab4ec5127e8fc6d0e9b92901d40e4536f8a": "0x00000000000000000000000000000000000a4e696e6a612042697a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714987646fbabf7f0564a67865ebf0419d4e5cba04612864fac7999130a5294e4687512bb8c9bf35b35": "0x00000000000000000000000000000000000a4b696e6720506170690000001530786b696e677061706940676d61696c2e636f6d00000c4030784b696e6750617069000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471498844ce2f37772c214f96c193e11618ef9d1991cf06367361e5a5e2d1a91eb44146ea15c240e4819": "0x000000000000000000000000000000000010746573742d706f6c6b61646f744a5300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471498ccb53a68ae0b0f4caaec0669936d9c7e402ec3c4ccfa546ffd288f015cde72f99b800dae71e932": "0x00000000000000000000000000000000000650617272790000000000000a4050617272794e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471498d79f063b9276569ebeef0150a33357023e678bfff549602e6943b5b85d8bfdb58473992fcfaf63": "0x000000000000000000000000000000000008546869626175740000124074626175743a6d61747269782e6f726700000007407462617574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149925e4c33888e571eca22b1d356b4618e38499b2c2616bccb048c2a835af5cb142b77ca799622f59": "0x00000000000000000000000000000000001043727970746f5f70656f706c6555411043727970746f5f70656f706c65554100001567656d696e693834353540676d61696c2e636f6d00000c4067656d696e6938343535000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714995bf0301d5a832de2be45f0061ce0bfd9ef023a354bd1beaa9bad14345aa18c95f9e05043dc1641": "0x040000000002000000000000000000000000000000000d4b495241205374616b696e67000015406b697261636f72653a6d61747269782e6f726716706172746e657273406b697261636f72652e636f6d00000b406b6972615f636f7265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714996507482af7276afedae0f19e624e485c0a2b8a9aa4b65608c89cc9908f0f90aa5567ea384cfe7e": "0x00000000000000000000000000000000000c536f6c6f7665692e44414f08536f6c6f7665690c536f6c6f7665692e64616f000000000c40536f6c6f76656944414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149975fbaedde7756e12840f0626ac847d41089c4e05cf0719c5698af1e3bb87b66542de70b2de4b2b": "0x0400000000020000000000000000000000000000000005733063350e446176696420426172696e61730014406461766964623a626c6f7175652e7465616d12646176696440626c6f7175652e7465616d00001040696d6461766964626172696e6173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714998ba9677cf5170c0e987cae440058064c72c16ad03b745e151a1a33f62d51f011f7888efa22605a": "0x00000000000000000000000000000000000470383701010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714998cd9a07d23d28d50ef3cbba6eefa5127e662a1286c69c3f8cd10aa328d394df9e69919af449b45": "0x000000000000000000000000000000000010496e73696768742046696e616e636508676f7374616b651368747470733a2f2f676f7374616b652e696f0014657269635f64776a4069636c6f75642e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714998d2d283f44bf3e5e034f68b3255263d1b64c5d02c720da4748d990576a032dcf42e6e8b02dc658": "0x00000000000000000000000000000000000744617679637a000000000000094044617679637a5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471499928322b885a79b32f055569357341d406869cefbe52ef0ea059834a52e4de30b7e9306b364c56f": "0x0000000000000000000000000000000000074f636172696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471499ad9accdb6256f3d8783497b4c06f05dfa6ca91a0502e77ea7ffbc5c33c7142a5d9d1f0322d783b": "0x0400000000020000000000000000000000000000000007535041525441000018407370617274612d636c75623a6d61747269782e6f72671b7370617274612e636c75622e3230303040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471499adee9a95267a606aa596e011820c7af6fcc90e52499158d286106baded690924651f7c9a4b8114": "0x0000000000000000000000000000000000044b48520a4b6e7574205261656e0000117261656e6b6840676d61696c2e636f6d00000a404b6e75745261656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471499d69c79e3dc754e8e80ceded3cf93fe205a4e71d4bfd6b8419cdf12d85244bd7fe7c82733417b51": "0x00000000000000000000000000000000000a4d696775656c616f6a0d4d696775656c204f7274697a000b406d696775656c616f6a146d696775656c616f6a40676d61696c2e636f6d00000b406d696775656c616f6a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a1921d6885d9479040279d8f4ad6cdcf1792ac373cf6d44ecef27e6ab4a61a9057602b37b6dd028": "0x000000000000000000000000000000000006497a7a795f0101010100000b40497a7a69706f656c5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a217f9388c8f902d66ac04ad10dbb5ac16a6a477dce727d647cbfd809d18b150cb402ae1569b555": "0x04000000000200000000000000000000000000000000066d63666c790000000000000e406d69676874796d63666c7931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a224cc249859b470efa942be958c4d368e9a0564ce34aa652a9c11727669dfc841dc73e8403497c": "0x00000000000000000000000000000000000949686f7220322e3000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a24c66abe29ea3716d5b643fdfb1b22d5dfd3a50157104df0580c910d2754987afc25fe0aaf5827": "0x040400000002000000000000000000000000000000000b556e69636f6d62617365000000166e616f6d6174657469383140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a27fdfcf005531660a973fbc6b1a63e1db41101515df4eecb19bf04ad29e9b5d46b37c919c10975": "0x040100000002000000000000000000000000000000001754686520446f7453616d6120457870657269656e6365002168747470733a2f2f546865446f7453616d61457870657269656e63652e636f6d13403238646179733a6d61747269782e6f72671c767240546865446f7453616d61457870657269656e63652e636f6d00001040546865446f7453616d6145585043000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a359c8738cb74379c4731457546007a4ad4e09ba0ff6cc40477c2c2984833245706d8ed2cbeaf61": "0x00000000000000000000000000000000000a6d616b6b616661646102530000196d616b6b61666164614070726f746f6e6d61696c2e636f6d00000b406d616b6b6166616461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a3e5bfc049b0f4a20c4f3295a3fee34bc398fa31f6efea34220772fe18bbe8dae6db750f531e847": "0x040100000002000000000000000000000000000000000c6b747a2e6f6e65204b534d11476975736570706520436f6e736f6c691068747470733a2f2f6b747a2e6f6e6511406b747a653a6d61747269782e6f7267116769757365707065406b747a2e6f6e65000007406b747a5f65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a55a8f4ff0cbfb7d01ba1d7366983e4c464bdf4eb0572ed51599225d503fd0cb750fbdc945c244e": "0x000000000000000000000000000000000007657a7a656b6c08457a656b69656c15696e7374616772616d2e636f6d2f657a7a656b6c0116657a7a656b6c656d61696c40676d61696c2e636f6d00000a40657a7a656b6c636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a60ad0be33cf6b14e533a2fd6a6ff9987c6dc0659b6b20de1ae31461bea7171518a927287b1fd0f": "0x000000000000000000000000000000000007e9a39ee9b8bd07e9a39ee9b8bd0101156733393433323039333740676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a6f18c4a47ae9cc5837571d1c2bb8e45ce2913ac68ae693a05769b8396a68663457f3e186c4ea20": "0x00000000000000000000000000000000000a524d524b5f4d4152530c4d6172696f2052657965730101166d6172735f39323036406f75746c6f6f6b2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149a80b9fad3bcc75d94b26c1afb14feaf0a625a144350b10268e91f2a4e4c615cdce69fe17096453f": "0x0000000000000000000000000000000000044d415800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ac6c20f1672e23e22680983f848c5191bedb6f13277b5c078f54cce890f70aa0578d20652ada058": "0x0000000000000000000000000000000000085061756c20486f0b416c657373616e64726f00001a63727970746f2e73616e64726f373640676d61696c2e636f6d00000b40416c6543616d6d3736000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149accca3fde6b92f7ac7f6c84e2930d1ccd60d6a317040f1ffba1c704dbf5a277a324262eb3854c1d": "0x00000000000000000000000000000000000742656e204d6f1442656e6a616d696e204d6f747363686d616e6e1c7777772e62656e6a616d696e2d6d6f747363686d616e6e2e636f6d00106d6f696e67657240676d782e6e657400000c4042656e4d6f696e676572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ad5a4ebb0ba372da6abbcd974cf24668c6e67a248f1f84c54f1737cf8d5547148e0c5835e61ed69": "0x0000000000000000000000000000000000074361707065780743617070657800000000000e4063727970746f636170706578000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149adc88690451f27780ab25ea34cbc164f9bb13a28523b162cb4ed572b57e7c957f868c3d486f326b": "0x00000000000000000000000000000000000856616c686f6c6f034a41107777772e76616c686f6c6f2e636f6d010f6a614076616c686f6c6f2e636f6d00000d4076616c686f6c6f6465636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149aea00c445f734edbaf3f15b9e83dcfc18b50fe91e601fdf446c008c72c3d17799c21a64877e8d3a": "0x04010000000200000000000000000000000000000000125374656562657220536f6c7574696f6e73165374656562657220536f6c7574696f6e73204c4c432168747470733a2f2f7777772e73746565626572736f6c7574696f6e732e636f6d001b68656c6c6f4073746565626572736f6c7574696f6e732e636f6d0000114053746565626572536f6c7574696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149af67195cc171e66489f12b69a3d689791aae4d4f8fe89d35e1acb4bab87327360bfbd13fe8a324d": "0x00000000000000000000000000000000000a562e4c616e204172740d56696b746f726961204c616e2168747470733a2f2f696e7374616772616d2e636f6d2f7669696b615f6c616e5f0014762e6c616e2e6e667440676d61696c2e636f6d0000114056696b746f7269614c616e5f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149af8b5e8cfc8bafef815a7da50a69bdf81fa99c2681c3ac41eac9d1a9ced9467f210b26740af3660": "0x00000000000000000000000000000000000753616e6f756400000017636f6e746163747275626279407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149afb96de5bd6c558f6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a": "0x080000000003010000000200000000000000000000000000000000054a61636f1644616e69656c204a61636f627573204772656566661a68747470733a2f2f6769746875622e636f6d2f6a61636f677219406a61636f67723a6d61747269782e7061726974792e696f0f6a61636f407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149b04176b93f2fc32d6b7b9e28c90ba6d9d96a6a65201e7b6d068289cfdccb14a87e3647d1be27f73": "0x040100000002000000000000000000000000000000000b4a616b75624879647261000000116a616b756240687964726164782e696f00000d404772656775734a616b7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149b2b73f74e0bcbe48098003566e8882540368bb1facdab06615168afd78758bb5b2cb3609be94851": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000a416e64792042656c6c00000015616e64796a7362656c6c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149b3023cfe38b696b623d04580e847693a8fca215668f44c36ef4077074c0d96365480597afaa4265": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149b38ffd646249ff7cc705f0ff73e771cc660a57a9540e469edf5ace2219b1f8452cf66382d915f07": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149b4583306b0319a120e484544431d1f4a52f2e1be4a2493c8e4f5214d4c8c0e45f88c443efbefd7e": "0x040000000002000000000000000000000000000000000e414c45585f41524b4849504f56000016407361736861313938333a6d61747269782e6f72671f616c6578616e6465722e61726b6869706f76383340676d61696c2e636f6d00000d405361736861313830383833000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149b5c7c3faa653236a262d4db5b43d634096d43710d9eb3976fad629dab987b894e92cf3d5b66e978": "0x04000000000200000000000000000000000000000000094772696d66616365000015406772696d666163653a6d61747269782e6f7267126e6f7461746b6940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ba6a520a92802ba82e71c97217b0299f2ffaa8c4d6c1856fee7046a5e904a542d8c17ca8bb95510": "0x00000000000000000000000000000000000542594c49001f68747470733a2f2f6769746875622e636f6d2f637572696f73697479797900163234637572696f7369747940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ba746407882e793d49fca4c127d246783d23e388e34c09446b624d2d5e1f7773c9590823d451019": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149bb030d576315e075272318422a6be3bff308aef9c12a0a9304e65fff73541c82f67f03ec757355f": "0x0000000000000000000000000000000000096d617269746f6f6f064d6172696f0101166d6172696f5f66616c40686f746d61696c2e636f6d00000d406b696e6573696f66756c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149bb1413da54b080a2691d8004aa9a03212cd950a811d53cb31fc736fe956d2fdc814e44ac0aaec2a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149bd02aeac53e527cb85b79dfde710c26c2e5b70de5cafb49213d6c867d92d4c5eef5ce9d79c72c4b": "0x000000000000000000000000000000000007506174617465135049455452554343492042454e4a414d494e00001a63727970746f2e70617461746540686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149bdad91263f2376dd46eebf8bfc22b8c7a156472e9630e85a3733a5441d305c7a11e85f2533f8d2c": "0x00000000000000000000000000000000000644657765791a427579207374726177206861747320696e2077696e74657221000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149be10627200d7958fa65ad25c6a51ba28504fe803d9e3d542135924ba9fc0736cd3f1d9b83901778": "0x04040000000200000000000000000000000000000000094a656468614e6574000000176a656468616e65744070726f746f6e6d61696c2e636800000b406a65646861686f6f6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149bfcf61c34036fae141755f3929b5c0b0f20c64648d7f04e6b2e87e513cefdd8a1a882ba47081a37": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000a7464696d6974726f76001d68747470733a2f2f6769746875622e636f6d2f7464696d6974726f76154074737665746f6d69723a7061726974792e696f00000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149bffd90013482c8a841d14814b8a9f5b29cf42401b098442706e254e5993c19225b420f31f37164c": "0x00000000000000000000000000000000000e4e6f626f64792050656f706c65000000146e626470656f706c6540676d61696c2e636f6d00000b406e626470656f706c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149c11f75a37508012e84d6f02ea5a833165a345080deaa9777eff59e32c3ea2dda077f0964220ac72": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149c2836ee11edbc0342bbd23dfc82edbf3cc9770f902c0165492b1ddfa03f3bad07a2b8b8c1736a49": "0x00000000000000000000000000000000000a61726368697465637400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149c3652738d9db765c02ac0e3b7a5063502ecc00937811834207d4942585ebc50d2380f27dbacc932": "0x040200000003000000000000000000000000000000000d5068616c614e6574776f726b0016687474703a2f2f7068616c612e6e6574776f726b2f12237068616c613a6d61747269782e6f7267156d617276696e407068616c612e6e6574776f726b00000e405068616c614e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149c753b3833f46cecb47513040660e2e37de135835e13289e6a632cd6b7156bf16680d55895c08834": "0x00000000000000000000000000000000000a4d6f7573657944656500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149c7fedf2907893262a57aadd6bf7482891546cbd398277759854a920bb413299ea04093bd5588d2b": "0x00000000000000000000000000000000000e4f204f204d2049204c20552044086f6f6d696c75642068747470733a2f2f7777772e626568616e63652e6e65742f6f6f6d696c75640000000009406f6f6d696c7564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149c880ae2409dd46de8d7a76e2c92c53b569cd53fd0e51f5c97f8bec55686bd56d2bafae3ad7c0753": "0x00000000000000000000000000000000000c446f7473616d616368616e0000000000000d40646f7473616d616368616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149caba676d9ddf7d068ce96d86c921ccd2cf48357aed5b53c12a7db332b3d2c2d49fdcdc4fd92a355": "0x000000000000000000000000000000000006354e504c5900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149cbcd9f3144633ac5eb0f44e687b84fa4126f5aebd57e66c8f92a27df1f3f0ec260719841b3ad70f": "0x000000000000000000000000000000000014426c6f636b636861696e2052696f20323032320f426c6f636b636861696e2052696f2168747470733a2f2f7777772e626c6f636b636861696e72696f2e636f6d2e6272001c6672616e636973636f383231363235303140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149cd04164b151c8211a903015b9ceaaf0f183eb409d3a38c4f0c9a685066ed90b32c834940c689e1c": "0x040000000002000000000000000000000000000000000d43727970746f6772617068790000001963727970746f677261706879766c4070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149cd0ac122701f28d7ec5e89c029a05224b2759566042a94c54966d125934a8ff8beb8e0b017cbd67": "0x04000000000200000000000000000000000000000000074b594f52595500001540656967656e626f743a6d61747269782e6f72671b6b796f7279752e76616c696461746f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149cdc08512e255b7738f6a9fcc82174482d492015b744f81cefaaa03e88a005508ed10f5936bff335": "0x00000000000000000000000000000000000942696767776f726d0000001862696767776f726d4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149cdc46c29a406ad85cc9959fbf01495ec080df904dda709cbef65932c5007dacbac2125eb92cd371": "0x00000000000000000000000000000000000956616c6b797269650000001776616c6b797269652e6e66744070726f746f6e2e6d6500000e4056616c6b797269654e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ce78b12d1a5f4bf8ca62534073e8f15e51dc72040064bbd6ed63db5636fa6e57c40c00a9a5a7739": "0x0000000000000000000000000000000000036e6f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149cffe130a8fe4c1636a0843c25944887176cece9b16aeb480c7afa88f5e8048db2b43a8c63918425": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d0599596e6697cb7a1662770d7b3161c9ad84c07463893ee9da4cd45ba01cccfada15540e411a37": "0x000000000000000000000000000000000008556e6e616d656408556e6e616d65640000184b534d50554e4b534070726f746f6e6d61696c2e636f6d00000b404b534d50554e4b535f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d0cae984350fc7374bc1a01463386774ad67d8a822d4896a7603fc322eb4c6991a0ac38aef50b20": "0x0000000000000000000000000000000000134b6f6e74726f6c206761746f726b6f7270730000000000000a40676b31385f646f67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d0d5a898faa577da8b91ecff4a3016e6fd4172b9119fbba17c3bbf61dbee8269c17583296038553": "0x00000000000000000000000000000000000b4b6f646154657374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d1991a04d10dd3ac08fcbab8a091bafb08f6d2264738fd06178368a93f75eb50d45c43c8272db60": "0x00000000000000000000000000000000000a636c61726b3230323600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d20d76620b47fa66610405d8ddaba4dcfca1fe4d14f83496de1055fe97efca594f2813a82900e40": "0x04000000000200000000000000000000000000000000164e6f7a6f6d692053746174696f6e73205374617368000015406e6f7a6f6d6968713a6d61747269782e6f72671373746174696f6e73406e6f7a6f6d692e616900000a406e6f7a6f6d696871000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d28492b2214a8bf7c286d9263ab3205e13208aade05ad50ec0d73b338649a630029e7f86e99d145": "0x0000000000000000000000000000000000155361746f7269204372656174697665204c616273075361746f726900001c7361746f726963726561746976656c616240676d61696c2e636f6d00000b406368616f5f73616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d3098889f53b6da26b0a4bc93447c5ec3fa281302974ac3669c0f534fa4a3a8f98954e2633c1e6e": "0x00000000000000000000000000000000000e4f7377696e5f4576726c6f6f74000000126f7377696e406576726c6f6f742e636f6d00000e404f7377696e53686966746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d34cfa440b95864d3754204488186b41e90a93d0607992b9cb992932ff66c2faef8a984dfe4a234": "0x04000000000200000000000000000000000000000000054d696c65000016406d61746865726365673a6d61747269782e6f7267176d6865726365674070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d406c203f1082a2c0b248917ec51942009e6cb18f634b944827d04edee517c29deab27d755cd100": "0x0400000000030000000000000000000000000000000018f09f998df09f8fbce2808de29980efb88f204a757474611244722e204a7574746120537465696e65720018406a757474613a6d61747269782e7061726974792e696f106a75747461407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d41368f1d880a3b3ef88f51188ea054ff03b902d8706c6d9b1ea56c119b34e0b88e915b5d02da5d": "0x040000000002000000000000000000000000000000001a506f6c6b61646f745f506f6c616e645f56616c696461746f72000016407374616b656e6f64653a6d61747269782e6f7267166b6f6e74616b7440706f6c736b61646f742e6f726700001140706f6c6b61646f745f706f6c616e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d4747c2dff0bc7f50997acc48aaa0cc73c966cb01023e4c220e62285f41e92f293e0dcc3dc81132": "0x00000000000000000000000000000000000950656e41726a756e001b68747470733a2f2f70656e64756c756d636861696e2e6f72672f000000000a4050656e41726a756e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d4b6496be09200b2009101253005ed413215bee9fa78987ba1a5d9edcc9e80b341b621ea976d218": "0x000000000000000000000000000000000006546565627300000000000009407465656273696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d5e6e9ef7bd98711e7745ab2aae1c51e0588fbc7a5978fb0cad1e2521b9e16831422d3814868f2d": "0x0401000000020000000000000000000000000000000007426572727944000000186b6e6f776c656467656e75676740676d61696c2e636f6d00000c404265727279445f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149db8704940c3089460bd998bd01ce669f92bbaf2ffd60e0e332e8932dd20bdc825a6293032d1cd49": "0x0000000000000000000000000000000000084e79204861726c000000146e6179616861726c3740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dbbb4d22419e712fe2ddf82f8499b6f21a96fb3718b3e596c75e11f8c411bb564812ffd5ebd4702": "0x040000000002000000000000000000000000000000000b476f6f64204b61726d61000016407468656d61726375733a6d61747269782e6f7267196d6174746865772e6d617263757340676d61696c2e636f6d00000b405468654d6172637573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dbf1ea1fc3bfd2c58ed982e21ea95d74df1bd6901b6b088babae979b24aa93a205957e1e75ee90c": "0x0000000000000000000000000000000000086f64696769747900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dc1bbaf5f8b85cdd40a52fa2efbe7929910db51addfc222ceaa46fffc82d601f6cfb7289596f609": "0x0000000000000000000000000000000000084c6f6f6f6f6f6e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dca516239778ea2ee3e62db730d5ded66d818668d4dad82f6e026703e9fcbaa91d06fb8f6678b44": "0x0000000000000000000000000000000000064974616c7900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dcc277753735b96e04ca25cf1cbc516ed1c138492a7f2e606f60c5a9ac96cb405eaa3914fd12973": "0x040000000002000000000000000000000000000000000b626c6f636b736361706500000013626c6f636b7363617065406d7761792e696f00000f40426c6f636b73636170654c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dcee803646fe05ab0ef511fbed15d88d75933d12bb50b56d1bbed109380b2fe0c7ec72d44119152": "0x0400000000020000000000000000000000000000000008414c455353494f001d6c696e6b6564696e2e636f6d2f696e2f616c657373696f6f6e6f7269134069726f6e6f613a6d61747269782e6f726718616c657373696f2e6f6e6f726940676d61696c2e636f6d0000084069726f6e6f61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dd0a74dfe9045f7184d701295be7bb38b2c0c58a35bf8edc592671c53d149d206e037dc7c9beb7b": "0x040000000002000000000000000000000000000000000a48617368517561726b00000015636f6e746163744068617368717561726b2e696f00000b4048617368517561726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149de7b0783ac120f57e2653c8926623f3abcb7862638240e78d978128f73749a2b533c89e25d54f03": "0x00000000000000000000000000000000001043727970746f20497368696d7572610c4572696b205461736b696e0000157461736b696e6572696b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149def61665adc4306fec2c5ffb46bfe1dbc7935f493a5c9323520878aad74b5a32276a7a268abdb32": "0x04000000000200000000000000000000000000000000076e616667363900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149dfcb7c9db5d6bcdce2f88fadaaf6505b613082d0f8ceb04c8c0016c7b6afe57ec0c5226f45e5c45": "0x0000000000000000000000000000000000067374696d73064672616e6b000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e091d0dc11bd3ea62bcdbab2bc3f7e3c40b6c4a0f619b63ef65978d6ec0427651e83a59fea6f658": "0x0401000000020000000000000000000000000000000007415a494d555407415a494d55541e687474703a2f2f7777772e617a696d757470726f6a6563742e6e65742f1940636173685f5f617a696d75743a6d61747269782e6f726717696e666f40617a696d757470726f6a6563742e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e10ac134fee62edcea1f1014266a2b187ff31427aba732be9c6856099354ff536469087226b8453": "0x00000000000000000000000000000000000b50696b6b6f6c6574746501010117746f6d696f6c6179696e6b61407961686f6f2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e13c3a754009d072cddea2ece3afb01311814e16109d213b56d56de1e4299f697689e5f2a155f5c": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31350f42494e414e43455f4b534d5f3135000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e21ce449387a9e130d6f231bc79dc0b10d4b09c38f9deada991ddf9234054b5bf8791a576c18a50": "0x00000000000000000000000000000000000d6320f09fa59e206c2065202100000013637874726f6e636f40676d61696c2e636f6d00000c40636f6c65735f5f626167000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e5255a8d274d43c14a2c525bcba9a332c97d2d18c549fd3f134bfd9b8cf73837472fc66909e684b": "0x0400000000020000000000000000000000000000000006766974656b000014406d72766974656b3a6d61747269782e6f7267186d7263727970746f766974656b40676d61696c2e636f6d00000d4063727970746f766974656b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e57d4958a2ed9c63484f547d8726bb31f014613b3e2bfd4491f67b8c56a7e585b7505f9498addef": "0x000000000000000000000000000000000010506172697479205365637572697479105061726974792053656375726974790000137365637572697479407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e5b705cbdcc776ab4410d33f13c053dca87be657a0ae3cc87655baf43f7efdd454ff74e3a9d8a2f": "0x0400000000020000000000000000000000000000000014f09f98bb205374616b65204b617420f09f98bb00001340666d6f6e7a613a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e60cb268814889cd4fcdee494cca404d6eaf8c4293efef5159df2957859f2ef2c4b35c231911f7a": "0x0400000000020000000000000000000000000000000015f09f90bc50616e646157617272696f72f09f90bc00001a4070616e64615f77617272696f723a6d61747269782e6f72671970616e64612e77617272696f72444070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e738312b74520571ba583787c302d270bf87c9febd2fa4b471cc951c73400270789d5193bede10c": "0x040000000002000000000000000000000000000000001f4368616f7344414f205265666572656e64756d20436f6d6d697373696f6e0000000000000a404368616f7344414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e94efbcced786be9ad97bf6cfb3fb36b24b221c27ea22cbdbfb4dd4b2c54f80d8235d490be9113b": "0x040000000002000000000000000000000000000000000a416c6578616e64657200001040616c65783a7061726974792e696f1d616c6578616e6465722e746865697373656e407061726974792e696f00000c40616c65787374796c696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149e9aa0898cd6f4e764c3926d1b9f9d44e8a2533c9a4df185d087a06601c49b7cbf12a8448fb45976": "0x000000000000000000000000000000000006737872737200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ea440de636efc37dab0b013939f1b243f4674d76815ce2059fdc16425b04de7b01065e40d1dc46e": "0x0000000000000000000000000000000000126c617572656e7463617374656c6c616e69134c617572656e742043617374656c6c616e692168747470733a2f2f7777772e696e7374616772616d2e636f6d2f6c617572656e00206c617572656e7463617374656c6c616e692e61727440676d61696c2e636f6d000010406c617572656e7443617374656c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ea68c0718a528a6f62e96783cff0b94caad6a13634ffd527d6d02d45f2cb810424cc47904ec284b": "0x040100000002000000000000000000000000000000000b6166726f7373743030390a412e2046726f73737400001a6166726f7373743030394070726f746f6e6d61696c2e636f6d00000c406166726f737374303039000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ed6094855a6dc83081c465a655cf27eaa73bdf9554abcb46ca2d56fe7fb0a20835c1a5ddec4a325": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ef6562b57d1a60490c7f4e84347dc6e4e176f9156b2347378faa9b538a857b404cee3e341706305": "0x040000000002000000000000000000000000000000000f6d6f6f6e6269726469652e636f6d000017406d6f6f6e6269726469653a6d61747269782e6f72671a6d6f6f6e6269726469654070726f746f6e6d61696c2e636f6d00000d404d6f6f6e42697264696533000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f053c2746e722456610a5024c2a5db3d02056d4344d120ec7be283100d71a6715f09275167e4f38": "0x040000000002000000000000000000000000000000000e5374616b65776f726c642e696f001668747470733a2f2f7374616b65776f726c642e696f17407374616b65776f726c643a6d61747269782e6f726713696e666f407374616b65776f726c642e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f06ff187af4df40163022143f2dff082630195ea8c8518036f5fa8110c90eabd2ef5cb4fc0c4235": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f1fa798d8345173525f464cc5364f7f7852731d5cd9b78500f1c43cfdb92c9eede3f5a0eaa03f25": "0x0400000000020000000000000000000000000000000006566f76696b000000156b73756d61726b31323340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f461d99d2f7b43efaef36db79bfaff596eb52fcd57f5231c07548f88cf3149a6c5e16fc8a02fa56": "0x0000000000000000000000000000000000074e756c6c657809566c6164696d697200001366726f6e7478323540676d61696c2e636f6d00000b4068617269746f6d6173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f4efbdd6555e0b768a449eb95cac957070a045678b83a9eb272296d2d6a73fc8fb32c1d3bf34967": "0x0401000000020000000000000000000000000000000008266e736869726f0000001366656465746f636340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f52902e443180208cf503bbe53110bea4f9fc4db5c69cc297d5468dce978b2c16babacff8dd686a": "0x00000000000000000000000000000000000553746176000000194564646965313032344070726f746f6e6d61696c2e636f6d00000a405374617634303936000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f5b73b14b74941844028623ab4774d78118028619961cc7ff178f9fac433b80d4f59761c60b6110": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f7946d98858bbac124a3f9569f9ff89daea4ccf602d528f8da44f34ecf48bc6973eed3b5165ff10": "0x00000000000000000000000000000000000b54726173682e4865726f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f7c71dd97969da5263df801610ab2b9d7d2f33089b6bc0309ff8b8dd03cd5c7ed6a63d7a3c1f962": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149f8de5a4034454281e984e6d5e51685cee9d5281a4cd1a8ac5cc9885941adce24e5aa7c3c52dc664": "0x0000000000000000000000000000000000064a49534f4f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fa09da6038a3e69bae09878d7a9b24afaedfc8f7583489d17b8f8f960f2d568e23b235fde2c3526": "0x00000000000000000000000000000000000b69736f7669746578696e0000000000000c4069736f7669746578696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fab1af956c8e372583b27d0269f0d86d9c19a74eaddbbdd6885d999c9a4d4defc2697e294c1e722": "0x00000000000000000000000000000000000c446f7442756c6c7344616f0c446f7442756c6c7344616f000016646f7462756c6c7364616f40676d61696c2e636f6d00000d40446f7442756c6c7344616f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fb9d67d9f4e2fa2ba72901b5cad51e0d3f0b63845f17d071a84abdcbf78a3ff56c61ffbaf02d56b": "0x0000000000000000000000000000000000086b696c6175656100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fcaf6c7a62c9137a6299b602cc853e89ea284f820806f4451609c9912ae6d975263344d5a840752": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fcbffeac9a335a1b4959a54c2ae7ea7b9200d5e5c1584654ff2d18e88e50265474b2d3888bc740b": "0x00000000000000000000000000000000000f44656d6f6420506f6c6b61646f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fd3584b98fe6bcabc5aae116c7e9946559d10511d4782e36aa971ff50e4b7a3394208a2a68a087c": "0x000000000000000000000000000000000007686966756d6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fe4058d2daf1d0ac63b1a57aae969fc1d0796ce63d7f2175b568b461ced1ba46679b5e51cd13d30": "0x0000000000000000000000000000000000096368616f73626f6900117777772e6368616f73626f692e636f6d000000000a406368616f73626f69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ff692371ae01a939a033ac371b5adcb02ce6f22dbfc953767c2f4ff6140f2fcb18125eb4cff9820": "0x000000000000000000000000000000000009506572736f6e616c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ffd1362c0ca2353c85cebb3f21b5e97737a7bbc14d8376a79dbba9c2849a28edae77c776d1e4a08": "0x040000000002000000000000000000000000000000000c7072656d61747572617461000018407072656d617475726174613a6d61747269782e6f7267207072656d617475726174612e76616c696461746f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149fff764f278ece0638008b23e7763fadc90d6a0b5d1ebbf8b930e95ab5eaccc3d4cbad41df8f726d": "0x00000000000000000000000000000000000b537562737472614775790000000000000c4073756273747261677579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a004ed215b6f26ec367a414bdfb35809b2ab3febb46b75abad9a72cac29918e5501f080841af412d": "0x04040000000200000000000000000000000000000000055472616c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a01290fe5b06995f4c17ad2c0a71fbae7beb3bed91a1e8f90289ffdcd7089c881ff247b3b70fb03f": "0x000000000000000000000000000000000008415254204445580000000000000d406b7573616d615f646f6773000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a026881ddc77059cfc793f88c007467e78399bf6490ee2c84bf2679eb27ed13a86e0399d291e8525": "0x000000000000000000000000000000000012536e616b6573206f6e206120706c616e65000000116d626279753740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a028e921c9041581bef3f1aa71b32bba775b3886b900a2e3fb4f4163d58c1bce0aaecfe0b55c1b5f": "0x0400000000020000000000000000000000000000000016f09fa49620526f626f7420486561727420f09f96a400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a039f5a44265aa6630e02b0b9846874c53f5fcc3f9260a60f0b27c7239102eb97ab13f5ad29d2273": "0x00000000000000000000000000000000000970696e617475626f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0476abd38ede3949653bcf18e30531092fdc1c52afe06cf61f56fb1fa5d719078cd6914d395ed0f": "0x04010000000200000000000000000000000000000000114d61737465726e6f64653234f09f94b10d4d61737465726e6f6465323418687474703a2f2f6d61737465726e6f646532342e64652f1540616c65786b6964643a6d61747269782e6f7267176b7573616d61406d61737465726e6f646532342e646500000e406d61737465726e6f64653234000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a058a0c0476768208476db8162516f3ed29a4227dbc9cff53d4f2c342907a499e9517cc16f94356a": "0x0000000000000000000000000000000000154d6f726f6e6963204d75746174696f6e204b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a062138be3539cdbd8876695e0680719107b9ccb595ad5d8bfdc4ccc8e8e4656091fcfe652c0f155": "0x0400000000020000000000000000000000000000000009564c4144494d495200001a406772617465766c6164696d69723a6d61747269782e6f7267196772617465766c6164696d69724072616d626c65722e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a06e8fd58cbda126387bb92ab860d29d43aaa2f6a9a97d658a52291111654489f8e294301171f908": "0x00000000000000000000000000000000000844722e204d75700000000000001040676f72696c6c6168696768646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a078de63f42f4d3d89abf449cfb7d9b862b775abe556bccbe647820fd4d7a50b63872b657c96506f": "0x0400000000020000000000000000000000000000000010444f5453414d415354414b452e494f00001c40646f7473616d617374616b652e696f3a6d61747269782e6f7267156e6f646540646f7473616d617374616b652e696f00001140646f7473616d617374616b655f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a091d0f89a15b5c8260bedc3bc39a4394c59b58e3adfc89b23caca4cdf695fb96fff3e0a556f8a00": "0x00000000000000000000000000000000000948616d69645f6d6d0f48616d6964206d6f68616d61646901010100000a4068616d69645f6d6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a09342269424baaa12ec709076fedbe0737ed2b7aa80e029f5de68e2faa5a303fc55cef3b1ca5a4c": "0x00000000000000000000000000000000000a42616a6f717565746101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a09af68755800aad94ef44028b5c2649905e23e0abe33d4542688a2ed40bcc0f169f0d535816f43e": "0x0000000000000000000000000000000000094e656f4e756d6973094e656f4e756d69731668747470733a2f2f6e656f6e756d69732e636f6d2f0015737570706f7274406e656f6e756d69732e636f6d000000000e4e656f4e756d6973233733313600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a09f49890c6bdef1acbfbc894060d93d772850a601b3f4b69d02c8026b2e7d99433b4067feabeb29": "0x00000000000000000000000000000000000f4a756c69616e6120436162657a610000001b6a756c69616e61636162657a61407961686f6f2e636f6d2e6272000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0a5afe895a38848e60eab4376491bae1381d70519031e7dcba87563353d85d4553ed98102882c26": "0x0000000000000000000000000000000000074d696368656c0000000000000d404d696368656c6c6c6c5f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0b881b0063a363a02bf32e061073c44300056b416cd66a4fde1e6c120dbc0089bb65134f5693a3b": "0x040000000002000000000000000000000000000000000a6d7564646c6562656500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0be3d88f3ec6175e4a17c9a02776b617e255d70b32ffa9313bac0f99e7f1f376e449bd51816901c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0c7bc8aeaa262f14ac4eaed36e5c54f045b46cb54f533b2d3949c0ca7137e89ef03ee3f56f8155f": "0x040000000002000000000000000000000000000000000c477233336e4861747433520000001b477233336e4861747433524070726f746f6e6d61696c2e636f6d00000d40477233336e486174743352000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0c8c65147c2d821f2259af2c52fcc70ca4e85fc39b56d87ffd4411fcebc547e9f92f3314a25c112": "0x00000000000000000000000000000000000d4461766964205472656e647a114461766964204a20576f6f6462757279157777772e7472656e64796368656573652e636f6d00176461766964407472656e64796368656573652e636f6d00000f4064617669646a757374696e3834000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a107be39dc1d3e29e461904b1a914a11bfcd4ea252c04de536dcc0af7fc36de82431af75f08ef13a": "0x00000000000000000000000000000000000b42697463682054697473001d68747470733a2f2f7777772e6d617968656d6e6f6465732e636f6d2f000000000b406170656f6e61636369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a10e77c34a7d9ba5b8a2a7e1c5807c9b5241a00382d483537eeaac2fc756dfde564af6a368fbc275": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a117fdeb44584c3b762311603c2642b9de046bc7b653733b25cb40e98871ce9835c65a249e735533": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f33360f62696e616e63655f6b736d5f3336000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a11a320b9a8feb01f857311106c8d7b0daf6e096db9a0d759b52403e439ab23fd6559780a8b1c803": "0x04000000000200000000000000000000000000000000095374616d70656465000000197374616d7065646563727970746f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a125e781d83ce9a1a8fdbb1c5950c16c8e725a857c3834b8647b1751fef78079de2976fe5516176e": "0x000000000000000000000000000000000011416e746f696e652045737469656e6e6511416e746f696e652045737469656e6e650000000000114065737469656e6e65616e746f696e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a157ecf5817eb51ef005d960b7bb25e0979b9533817cff27aca11f7bec09a69235d17622aaa7776b": "0x040100000002000000000000000000000000000000000c6c6c6f7964732e746563681d4c4c6f79647320426c6f636b636861696e20546563686e6f6c6f67791468747470733a2f2f6c6c6f7964732e7465636818406c6c6f7964732e746563683a6d61747269782e6f72671174656368406c6c6f7964732e7465636800000d406c6c6f7964735f74656368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a17318e09fa7855318d059728fac3dabd4b7058c455c4cd0c636520da4d9ce4e6cab9932b23a3a3d": "0x04010000000200000000000000000000000000000000076e616d72756e000016406d6931332d3563346e3a6d61747269782e6f7267156e616d72756e2e6b736d40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a17e7770b29efc26845498df40e85e2ba9d9e213d1f476e7b147aab6a9098f1bb250e00251ef8f5c": "0x0400000000020000000000000000000000000000000015436f6c642053746f72616765204361706974616c0000001d6a6d617a6140636f6c6473746f726167656361706974616c2e636f6d00001040636f6c6473746f72616765636170000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a18d4df5394e01a8d23bddef5d1f2e9b9d3a49363d6ff94c517aff97ffbe186acb22564a4dccc94b": "0x000000000000000000000000000000000007436f7a6d316300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a19b37e844707d72307183930b2264c5165f4a210a99520c5f1672b0413d57769fabc19e6866fb25": "0x000000000000000000000000000000000006537a65676f0d53657267656a2053616b616300001773616b6163737a657267656a40676d61696c2e636f6d00000d4053616b616353657267656a000740737a65676f00", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a1c8d0175e914150ac13bb5ebe1fd2af47758b14ed5f26987831f053be20293e20064a68393dbc6d": "0x00000000000000000000000000000000000e54696d656c657373204172747a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a1cf23b5be0cbaf3f43436557ab3a98460458c52dc9e8795303af2f3772122c712af60e530592d4a": "0x000000000000000000000000000000000005446963650000000000000e40646963655f696e5f64696365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a1e3b34bf1f2c1ce6abdcbbb3d328d87db10f5948e4fab5d12e7470826c4fa9ede73f40bd4ae1721": "0x00000000000000000000000000000000000a4d65746170756e6b7a00127777772e3864646f67636c75622e636f6d0013696e666f403864646f67636c75622e636f6d00000c406d65746170756e6b7a5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a20215acf2cee769a26f9a811e752199217945e52bb96fb08229d7904bc030f6df73b5b4e6bbdb6e": "0x040000000002000000000000000000000000000000000c4a6f686e5f43616e617279000000156a6f686e62726f73734069636c6f75642e636f6d00000c404a6f686e5f42726f7373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a209cd26c6c53911aab241100ccfed63c10453f0772355250fca0a4bb826afec2692f11416e0392b": "0x00000000000000000000000000000000000b4272686e4b63627936310000000000000c404272686e4b6362793631000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a20c478424158a838edfbe8841fb9f9571f356320c1cd5df5b6365e25f83305141940b25a2bddb03": "0x00000000000000000000000000000000000569686f720000001a70616c616d6172656e6b6f69686f7240676d61696c2e636f6d0000114049686f7250616c616d6172656e6b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a215c23d3f30e28acc4fac060bf7e92c94836df38993b1851e3c2a9728335340fff42ded89ea2326": "0x00000000000000000000000000000000000a53757065727269736b10416e647265612056656e6472616d651768747470733a2f2f6269742e6c792f334644766b6757001f73757065727269736b2e74686573616e64626f7840676d61696c2e636f6d00000e4076656e6472616d655f616e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a22b2644a532020e102cb9e9982a073c22c641fcf04338ccaf8f34047acfd430ee0490488c85201e": "0x0000000000000000000000000000000000175a6569746765697374205461726f74204d696e7465720c5a6569746765697374504d0d7a65697467656973742e706d0115636f6e74616374407a65697467656973742e706d00000d407a6569746765697374706d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a232fb94a5267854b2fe1d9da0178b40163865fe41c0a593a6444ea39efea4325cf3a8a2ad2ad279": "0x00000000000000000000000000000000000a4379626572446f6f720101010100001140417274687572573630303532353036000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a26e21db13bc9cb6d4afb112d3a3a1ab9e8e99dade99ee8afefbb7547f8bb862100557ceb9fb9047": "0x00000000000000000000000000000000000b48756e74657272723739074d757969776100001a6d75796977612e6f6465696e6465406c6976652e636f2e756b00000f404d75796977614f6465696e6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a27174c44291c2200c27409c0741df6780a595424f9e421ffdc6da847a45b0d382d6797e30371213": "0x000000000000000000000000000000000009506f6e64617475730000000f706f6e646174757340706d2e6d6500000a40706f6e6461747573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a298d0b8580cdd4b2075be44eab367537b65f751a9198164e4b7c80790015494216465284b9e422d": "0x00000000000000000000000000000000000e496e66696e697479204d696e640e496e66696e697479204d696e641f687474703a2f2f776f6c66616e677279636c75622e74696c64612e77732f001a696e66696e6974796d696e646b736d40676d61696c2e636f6d00001140496e66696e6974794d696e644b534d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2a6a1ee046288c04ef671d2efdd37b165d0cf115e33450b96ed967d730b3c3e6b89e649ffda7352": "0x04000000000200000000000000000000000000000000097461696368756e67000015407461696368756e673a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2ae90c382196439e01757b530f7bdc77daf168300e833e402c73828d934814e124e9b14df068a21": "0x00000000000000000000000000000000000f4645454c2054484520465255495410416c656a616e64726f20476c6174741163727970746f706170617961732e696f1040616c656a616e64746f676c61747413616c65676c61747440676d61696c2e636f6d00001040616c656a616e64746f676c617474000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2aee766ebb6fb7c4edf81ba4fbeb6ea13cd45ba93cc1d689a6e2e5c6dfc35a458a971823a324218": "0x040000000002000000000000000000000000000000000b506f6c6c7320636f696e000000176c69636572696f73686f727940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2b8fab3ba0aef26c86c5ec7bc852b2bf9b5847ca343f9117c1edbd761cc6e40a5233e5764020579": "0x0000000000000000000000000000000000064b6f626179064b6f6261791c68747470733a2f2f6c696e6b74722e65652f6b6f6261792e6172740101000007406b30626179000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2ba603094678fe1c650925980e670634900f8e902da89bed9c9702ac51aaf08cb5043eec1f10345": "0x0000000000000000000000000000000000084b756273616d61084b756273616d6100000000000e405365637265745f5f53616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2c470192fbbe716643b60a34e88347c82257693d4429296b7822293c9a7bfdb2b08341529513c67": "0x00000000000000000000000000000000000c4a696d6965204475636b7a0000000000000c404a696d69654475636b7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2e21db14ae164a8ec94a820c5dfc7420392ebb42e844a853016ab1310838a42e7ee315c7e07ed7c": "0x00000000000000000000000000000000001053756e7368696e654175746f732d4300001f4073756e7368696e656175746f736e6f6465733a6d61747269782e6f72671c73756e7368696e656175746f73696e666f40676d61696c2e636f6d0000114053756e7368696e655f4175746f735f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2eb6257919dedbd0297ceb4d82f5843b3339ce0ecdb2a76c041eaf00c60e3b1c069f34111c7c967": "0x00000000000000000000000000000000000b626c61636b6c6f64676500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2fb598c76f739aff4f2348bd92ca853d527b99144ad3f1d62b1ccab25e646b052dd5a3311773f76": "0x00000000000000000000000000000000000659796173680659796173681a7777772e7979617368736f756e6464657369676e65722e636f134059796173683a4b6f6461646f742e6f7267186e65636b63656e736f756e647340676d61696c2e636f6d00000c40427562626c65626f6969000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a2fef89bd91c048c8b37db52b514d523a0fac84ec631db132c7532f317bbfa5ecd094c891bf65c81": "0x000000000000000000000000000000000009462e492e522e4d2e00000000000008404649524d335f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a305800a21679f161a0dc738566c0d456e72772f31b0df32843245857dfc5fed13f2780a3e785771": "0x040000000002000000000000000000000000000000000a7374616b657468617400001640616e647265697369643a6d61747269782e6f7267167374616b6574686174687140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a30ff791ba0dd28618c7f5a8530d6aafc1b191156294a9e27bb674128607896f3fd5914282fb196d": "0x0000000000000000000000000000000000064b616d696c104b616d696c2053616c616b686965760014406b616d696c73613a6d61747269782e6f7267146b616d696c7361313640676d61696c2e636f6d00000c406b616d696c5f61626979000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3122414b52a0a0e18e0e8642a07089983ff62c55ab6f151c2ad58f43a4cb9f995cfaa5769fa9568": "0x040000000002000000000000000000000000000000000a456c7669732050617a00001240656b616d693a6d61747269782e6f72671a656c7669736775737461766f70303340676d61696c2e636f6d000009403078656b616d69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a319bb2ed17a3f850374c8228c74fbe266e3f5612322de99d130666ccc639162034c6b0ab135bfe1": "0x00000000000000000000000000000000000c4368656b6f7620524d524b001668747470733a2f2f7777772e726d726b2e6170702f000000000d406368656b6f7638736f7570000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a31e75d5b109bd2528a94bbd46b41a6c7e7d0c776bbfdb48c6d72886fadf7ac49c62f014959f2852": "0x040000000002000000000000000000000000000000000b636f6c647920f09fa78a00000018636f6c64636861696e40696e746572626c6f632e6f726700000a40676574636f6c6479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a32760f6427ce1809aed8974aa64c7f31f4f0f60e863eb811ad1a6c75fd32dda92b19645fe5b0f47": "0x00000000000000000000000000000000000a4469706c617469636f0000000000000b404469706c617469636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a327ed779367e66e9a283ffd707bcb531dc655e2a4d42124a6366355f088936f05d181aa469e2e0c": "0x00000000000000000000000000000000000a50726f6d6f5465616d001e68747470733a2f2f70617261636861696e6d6173636f74732e636f6d2f001c706f6c6b61646f7470726f6d6f7465616d40676d61696c2e636f6d00000d4050726f6d6f5465616d5044000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a331b5a5d1eacc6ad6474ace9590159e08525e3c7273256016a640e300eaca921ce88713b44c9a5b": "0x0000000000000000000000000000000000044d524b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a35762ac0f6b70b004028af3547c1c24c7b1d6ade70e4b20a94cd829457bc0d126f8d05b8d298775": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a35b58e91836d05e60c6e940d5c74596755e6bb1b31ec98958db10d841dfaf66954b5542c95c462b": "0x0400000000020000000000000000000000000000000008414252415241440000154061627261726164693a6d61747269782e6f72671861627261726164694070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a36ad1dff06875450ed3eb9c7be61e0f8e13abb04857d82be899c1d7c3203998e02538720052ad34": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3833fe87343f3df36b5dcb29928d8a462f493e0250e895158fc4fc54eb5d00a2a6701fe36a4283d": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000b5069636f6e62656c6c6f0e5069636f6e62656c6c6f204f551768747470733a2f2f7069636f6e62656c6c6f2e636f6d0017636f6e74616374407069636f6e62656c6c6f2e636f6d00000c407069636f6e62656c6c6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a38ea7997f350d35d66d89d096c73b1d834e6d3114051cce2f13dc14014a103e9a61a97f4db2a818": "0x00000000000000000000000000000000000b50657065204b756e54610b4b696e67204b756e54610000176b696e676b756e746132343940676d61696c2e636f6d00000c406b696e74796472656164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3a4e6df5615cbd134a3f0845fecdf74f7aeb569953da8cf8f8217a9a167a4e7d6b3438d8bb6d828": "0x040000000002000000000000000000000000000000001c416e756269204469676974616c204d61696e204964656e7469747900001940616e7562696469676974616c3a6d61747269782e6f726716696e666f40616e7562696469676974616c2e636f6d00000e40416e7562694469676974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3a7ea9aae156340321d4124142f13d96092f57fb2635388bbd7337f2ef526abda0d3e011c361627": "0x00000000000000000000000000000000000b48656b746f7273616d610f47656f726720547369726f6e697301011967656f72672e747369726f6e697340676d61696c2e636f6d00000f4047656f7267547369726f6e6973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3aa8a884996480b8041562016f6a47fe5d5a4ef7a3e51e71c399b5d7c03850f381b278867e08207": "0x00000000000000000000000000000000000c4d7242617468696e4170650000000000000d404d7242617468696e417065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3cec71a40cb80cfd692990e340f0cd542caf9eced5e6bbdaf269fb9637fdec4cf1c30156f451e24": "0x00000000000000000000000000000000000453616900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3d3732bc41feae490f0a6ad888e6a209c647f9c7834ecef87df797be3acb971708e8b73dc64236a": "0x00000000000000000000000000000000000f486f757365206f66204368616f730000000000001040726f6d65686f7573656368616f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3d7c54c6084b5aa5ed235ac2a5c0f5ea70c3c75169e1c0439f5e6a56005ae7aeada55080d512944": "0x000000000000000000000000000000000012407068726f647269677565735f31393836135061756c6f20482e20526f647269677565730101117061756c6f5f3139383640706d2e6d65000011407068726f6472696775657331393836000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a3f10cae030a6d30b0c42cd546571a3529880973bb9be4952a9bd568d57e55fbdefae7614187ce5c": "0x000000000000000000000000000000000006736e69666600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a409a5b38e9a0943eceb07c477bd40d22f83b08cce78f2375bc1e4cf188c0de1ffef592570383e59": "0x0400000000020000000000000000000000000000000009496e66726170697800000013696e6672617069784070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a40bc803acf9306792a118b2db66b83b0687645ec1283b836ed95f3646db15ff4a2fb0f05a4d237a": "0x00000000000000000000000000000000000442434111426c6f636b20437265617465204172741568747470733a2f2f7777772e62636165782e636f10406263613a6d61747269782e6f726713626361727440626c6f636b6172742e76697000000b40426c6f636b61727436000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a41965f505d4d7b50cdccfda77f98ad5ee49c1056eab38e6dbc2028e5ef46d90618e2ebac4cdf249": "0x00000000000000000000000000000000000741726e61656c0f4d696b65205a676872797665747300001241726e61656c6d40676d61696c2e636f6d00000a4041726e61656c4347000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a41e44784a9e830d2e47391ba4e18c5aeb3978bc6104d9d4d99453b16cb55150d10e590bdebde066": "0x000000000000000000000000000000000005416e6e6110416e6e612053686368657262796e61000017616e6e613230313476696b7440676d61696c2e636f6d00001040416e6e5f53686368657262796e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a42050992f99e93b160719558ddd4f7497ab5e4be273872a6ae0ef556b87ce5a246a927f417ba278": "0x000000000000000000000000000000000008447572706830390e436f6e6f72204d6168616e657900001563726d6168616e65793940676d61696c2e636f6d0000094044757270683039000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a42a7f2fc85a4d702255f3051ce179f64c735c4f46438bf790faf9c1e295e068bac569b80ac23961": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a42dd34ade18972444a9743d676ca9759f7897d55fd7fa240058fc1b2e0cdf37d49e588036213a50": "0x0000000000000000000000000000000000074131363030460000000000000840413136303046000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a443701cf93179113acdfb6cd734dd3e624b6512e0903724c1c90a516c03c81a9af756491ea8e15e": "0x040100000002000000000000000000000000000000000a5374616b65666c6f77002068747470733a2f2f76616c696461746f722e7374616b65666c6f772e696f2f124069373439353a6d61747269782e6f7267127465616d407374616b65666c6f772e696f00000e4073665f76616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a45f60fb1fe385b96a39514d62c18e0f36ea214a5d6e772c653af20e647ec87f0f6985fdeba13752": "0x0000000000000000000000000000000000154b6e75636b6c657356616e42656172646875697300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a46019660a76ac1f5889dcc187231dbcba0bc0dad136d1ecb09633bc7cd5e27e04daa0277009ff2f": "0x040000000002000000000000000000000000000000000456444100001440766461303339303a6d61747269782e6f7267127664613033393040676d61696c2e636f6d00000b404456656c657368696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a461cd7dfddc684c664b2886e95f12e168b420f06b90c11d8cdfa7ee747bc12e235a6d5efbae6e12": "0x040000000002000000000000000000000000000000000650697032340000134076656c616e613a6d61747269782e6f72671572617a69746f7431323240676d61696c2e636f6d00000b4056656c616e61563036000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a467ece912d3a063167e362d3f5635ffb7527605a5e9004e8691b954f19a34ab86f4451cb0be6956": "0x04000000000200000000000000000000000000000000095354414b452e5355000016406d722e6f776e6167653a6d61747269782e6f72671d7374616b652e736f766965742e756e696f6e40676d61696c2e636f6d000008406567726d7368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a47a994958e0ce59ae58ba526977ac8c888aaec71da2be93459c2c6ee4a33f0881da7bd585b43a66": "0x00000000000000000000000000000000000f546865204b7573616d617269616e002168747470733a2f2f7777772e796f75747562652e636f6d2f6368616e6e656c2f00185468654b7573616d617269616e40676d61696c2e636f6d00000f405468654b7573616d617269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a48bc4964ca9af844480a961c77e6771723cbb95384839f9a287779affeba7b7651d748927c2901e": "0x00000000000000000000000000000000000c447261676f6e73746f726d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a495a0a3926f96507eb86c4dfcd61617f0896775d0b2094ccb49ada7914e044e532760feef32d85f": "0x00000000000000000000000000000000000970616e6a696e616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a4990b5c0a8a5952088513ec07599b212d37b1cf18eee0538759ab65ca3735d47d1c5433e3297e02": "0x0000000000000000000000000000000000057261696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a4b9e382b3c28c9432fe137591e4faf75d462ae5769e8b08a138fcc920ac9387c4a7ab86cb87be23": "0x000000000000000000000000000000000018537562737472614b6e6967687473204d65726368616e74104d65726368616e742057616c6c657400000000001140737562737472615f6b6e6967687473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a4ddec1e6dbcf011629c17f4f4a24ec53f85a7beb1c70b13379fb8e4f969560704d2c25133ba8d24": "0x08000000000100902f500900000000000000000000000100000002000000000000000000000000000000000d416c7a796d6f6c6f6769737410416c7a796d6f6c6f67697374204f791968747470733a2f2f7777772e7a796d6f6c6f6769612e66690015636f6e74616374407a796d6f6c6f6769612e6669000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a4ebe0825e5d7b90e20a9ef731e714cabd44479f1e39f9877a8480eff0ffc05e0d4dd701f7dc8650": "0x040400000002000000000000000000000000000000000a657269637a68616e670000001265726963406c6974656e7472792e636f6d00000e40657269637a68616e67657468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a530449273055581500359c0429d00c60d1da56e08054690497c0537931717f462b454362d363e08": "0x00000000000000000000000000000000000b67726f6d62617264757200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a53864ffd30a765388d1505492274985d6049cfae833ce8ce11597aca19d0f06a29ddb0a7a5fb97e": "0x00000000000000000000000000000000000756616d7073790000000000000c4076616d70737966656172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a54fac6210e70b7fb8d7d63b5e953e9004bc94357dc2f2b11654c220d871bd3c8b05b8047faa2a6d": "0x00000000000000000000000000000000000a53686565702052617000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a558ac2b375bd02bacd4501a1fc78e38cfc3b45660c9487ea36fc5a85aa7a7ecd3fc7c31dece0d43": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a57f9bacdb1086c63892e43e9200a587c535ada26933f3f8279e2d75e7e77cb9d3ce33153e5ad973": "0x0000000000000000000000000000000000104b7573616d612041706520436c7562001c6d656469756d2e636f6d2f406170652e636c75622e6b7573616d61001a6170652e636c75622e6b7573616d6140676d61696c2e636f6d00000b404b7573616d61417065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5856810995ea72550ddcd537dceb0e95c72a9e2984c8703f4d9d76e8067305f365905a909ae3a47": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000547473136000018406c7562616e7979797979793a6d61747269782e6f7267136c7562616e7979797979406d61696c2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a58931525b3ed3cb1024d5c7c359048f593fac90652e61b58cf9cfceab4f2828ab77743735bc9611": "0x0000000000000000000000000000000000096772756e746c65640000001a63696e6f63727970746f4070726f746f6e6d61696c2e636f6d00000c4063727970746f63696e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a59acabf7cc5c2db3a0b67c6e4b35133a18ff9c3b56d6cd28662f9e47f38afbfc508543087966870": "0x040000000002000000000000000000000000000000000c43525950544f4e495441530000001e63727970746f6e697461732e6365727665726140676d61696c2e636f6d00000e4063727970746f6e697461735f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5ad0e5d9fecbb59ecbd732a91bbca19dcbcd8339644f8a6bdb752229a861140998663eafaa8f871": "0x0000000000000000000000000000000000084d6974737572690101010100001040636f70706570616161616161616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5b9b36d9ffbd7602c527cb7d17e0fe6df0e0da303a71f3eb46ea5bd309858389666ce6dad8efe15": "0x040000000002000000000000000000000000000000001cf09fa6bff09fa4962057686974654e6f646520f09fa496f09fa6bf00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5b9eb0c3f28851660f981f150d72abe1fe2f48f8e825f32baadd440d5114b0242b7d5b85044da07": "0x04000000000200000000000000000000000000000000084e61636869746f000000196e61636869746f2e63727970746f40676d61696c2e636f6d00000c406e61636869746f657468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5c4abc52a115cbd5a3a2cbb4e72978f14e758e1ecf46d1d98cc080f7c7213ef9fb5fffdfeca6c11": "0x000000000000000000000000000000000006416c6f696406416c6f6964000013616c6f696464313340676d61696c2e636f6d000009405f416c6f69645f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5db7a2686e7ec402cbac2d6ac81d2169fa6e455b0497cf0389bd5dd2a11b24a53e6d94053765a77": "0x040000000002000000000000000000000000000000001be29ca8f09f918de29ca8204461793720e29ca8f09f918de29ca800001140646179373a6d61747269782e6f726714616e746f6e406e6f766177616c6c65742e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a5edded3fab580ac0e330ec8982011f9e4c1b0399335eeaadf410f721def14cd16df28e905af3905": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a60b4b1b2473719caeab30137868944fe970131f3d1882ed41e526020e9429818e90649413f94430": "0x0000000000000000000000000000000000064d617837340000000000000e406d617837345f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a60dad8905663a8126acb4e6372fd11f9cf419b845964385848977d6e37b6221ea9d69d58d27d623": "0x0401000000020000000000000000000000000000000016444557205374616b696e6720536f6c7574696f6e73001a68747470733a2f2f7777772e6465772d7374616b652e636f6d1440646577706f6f6c3a6d61747269782e6f726716646577706f6f6c406d61696c66656e63652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a61e7bfd7e80c927d04063c17aa00b3f0a378bf91acaa686257ce04972b6ee190cb6a6f16327d37f": "0x000000000000000000000000000000000008496e7641726368001868747470733a2f2f696e76617263682e6e6574776f726b000000001040496e76417263684e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a64992f36040c17f4866f45ae7b07019c03464e3c8c1324e96d3f05a2c5205e889fe597b0af2a70c": "0x040000000002000000000000000000000000000000000b46524553484e4f44454b0000001a66726573686e6f64656b4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a64c3dcbca109f3eac1d2d82c4a69b16c3ce9eb5d0b6f34f948a34efe62488879a514bbc837e0e50": "0x0401000000020000000000000000000000000000000010f09fa49620506f6c6b6153746174730b506f6c6b6153746174731668747470733a2f2f706f6c6b6173746174732e696f16406d6172696f70696e6f3a6d61747269782e6f72671a706f6c6b6173746174734070726f746f6e6d61696c2e636f6d00000c40506f6c6b615374617473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a6505dd741382407a681b32afa58ec5134541c0f960edfe5d8dd9a94d792d191e238c5a6948c236c": "0x040000000002000000000000000000000000000000000473657800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a6654b740dcbab2288acd34d32a3874f7eb5682060fe570c8100554c401bbef2c49dc26ddb1d6d77": "0x00000000000000000000000000000000000933444368656c6f73064368656c6f01010100000a404368656c6f733344000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a67945dd518154113c6767288e0013ce7231aa2c1d5e76c7275e1ccd380392e8bed9ec6fc5445a6c": "0x0000000000000000000000000000000000086d617474736b69054d617474000000000011404a65727a6577736b69747765657473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a695a70bdbfc2aca60f79791d32f2f1d2c352b68b114c682dda46f4ea5f0bcdb891312b6faff670b": "0x00000000000000000000000000000000000454756d0000000000000a4074756d697370726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a6e070a349b0a057e037d692951f268505d48389c9ffc60e38b126f3eb8e9adf17fdf6c8961b9323": "0x0000000000000000000000000000000000084c5549354b534d0000144077696c64646f743a6d61747269782e6f7267000000084031784c554935000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a6e2ddb0c0dffe479051cb07cf440e1d0d26c6bc80c568a2f4d91367d76fe3bb0bcf215a7753196a": "0x000000000000000000000000000000000008476976657237350000000000000b40676976657231393735000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a6f2d5d4c23323f8aa91fc0201f26b713a018669bcd269babf25368eee2493323b1ce0190a178a27": "0x0401000000020000000000000000000000000000000007696e736970780d416e6472657720506c617a61001340696e736970783a6d61747269782e6f72671464657640616e64726577706c617a612e64657600000840696e73697078000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a6fa620b4d132dd76691ffb1fea3613197fdf95dc2d850f7ce48d2bb458810e81b47aed4997ea262": "0x040000000002000000000000000000000000000000000c4869746368686f6f6b6572000018406869746368686f6f6b65723a6d61747269782e6f726710746f6d6d69406e69656d692e6c6f6c00000d406869746368686f6f6b6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a708d9865081ec8abe4bc35b26cdc006c69c1f827d4bfa75e4bfd4ac0094ceaeec8ac70469cac51f": "0x040000000002000000000000000000000000000000000e54656b69742048616e636f636b001368747470733a2f2f68616e636f636b2e6973124074656b69743a6d61747269782e6f72671174656b69744068616e636f636b2e6973000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a71676abeb9f57f44a2802e70326441f6dafa719f9debd8141431a532066f7233b8d5ebb25428e72": "0x00000000000000000000000000000000000c7370616365736d75746a6500000000000010407370616365736d75746a655f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a71bb03524b3e99ae4c74212b31e0efc7f5f271a6636fafea840cb1cc318631b64788543ed12d02b": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000095372536c61796572095372536c617965720000187372736c617965724070726f746f6e6d61696c2e636f6d00000b405372536c617965725f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a729fbef766dde7fd6a0b3f61eb031d847fb2d7d262b7d0e409c01042b2872ebd6c673759c93ef7b": "0x00000000000000000000000000000000000941726d696e5261750841726d696e617300001541726d696e617372617540676d61696c2e636f6d00000a406b6c656261733364000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a72db66667b370238e0fa6d4c1b60eb068b64c965c9c5aba29266a793c130c9b12a1003f01b09d07": "0x000000000000000000000000000000000008536e656d65736807536572676969000012736e656d65736840676d61696c2e636f6d00000940736e656d657368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a7543bc341341829e240ebdf6a3eb4882a6ec2284a2b886071cac52c92dde637b7d8e45b1cfc4a59": "0x0000000000000000000000000000000000044c6f7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a7565e1dd549d62a4e7a56a7e64fd0c4c1d42d431e9ba7749f3a6c733fde04072437b2940338707b": "0x00000000000000000000000000000000000d4d41582d52455741524453430000001364757a6972796e6140676d61696c2e636f6d00000f406972796e613235313432303332000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a763d7749a6cd60306fa1c58ca428edb67bf43766f26256a70bb171428f72e7502f582efa8e4146a": "0x04000000000200000000000000000000000000000000084873696e636875000014406873696e6368753a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a77985bb6c007252867ed88f416454578da3d92589383af4698e89ac93642e6b0aaa2bd8eeba1f02": "0x00000000000000000000000000000000000849726f6e6d616e0a416c656b736579204b000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a794662671bf6a9b2c0ace75e5847f22bfcdf0fdb1ee5a9fc15fe32756572d7c685fba050445b143": "0x040400000002000000000000000000000000000000000758696e797565001368747470733a2f2f78696e7975652e64652f1b406361707962617261676f706865723a6d61747269782e6f726719736f66746c69706173636861726140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a796b643a26045c59c0e1507051438eed8a85c64953a88ac670df8459d30d0686083f56dc1943d53": "0x0000000000000000000000000000000000084e4654636f6e6711496c6f6e612047656c69756e656e6b6f001540696c6f6e617669703a6d61747269782e6f726716706172616469732e64697240676d61696c2e636f6d00000d406479626f7661696c6f6e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a799abc18a65974508cc32a0f27384c6ec57d0318d34e9f90cdc1ed6a2218a630bd57c2465fc661b": "0x0000000000000000000000000000000000064161726e6101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a7a78778d8ac8668c6488a5a0f937b633f9db3046dcb765909e508ac70bad487c614e1002e2d9b2c": "0x00000000000000000000000000000000000c537472656574426561737401010114736861646f76765f636174406d61696c2e727500000c40436174536861646f7676000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a7af572908447d41c05e32ccc9a75ec27b5be1c3f1d00b038e63a487122cd18aa7253b19ec2e6411": "0x00000000000000000000000000000000000846697265466c790f416e647265792022416e645a6f2200000000000b4046697265466c794747000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a7d81691bdb191cf96fbd4b6d115fa19831f56d19076161af05e75f5eae031543e0f52eee0fed57b": "0x00000000000000000000000000000000001a43616c616d617269206279204d616e7461204e6574776f726b1143616c616d617269204e6574776f726b1968747470733a2f2f63616c616d6172692e6e6574776f726b00000000114063616c616d6172696e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a80bd3d653629195e0bb2043610b76d08387a24e267e36bf9a98d17c1958c93f6e4bf35139475877": "0x0000000000000000000000000000000000074e65336c707300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a815c482c3ce0537682c870c88abd2e7ea14e124ee19177b04629a51c7de560038ae850b8707ca4f": "0x0000000000000000000000000000000000054e61636801010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8178389a74a7e720cab3274e2045c86d9dcb81708c13df2a3dd4db5665e9dc64dd9dc148d89955c": "0x0000000000000000000000000000000000054b534b4e154b6f6e7374616e74696e652053687574656e6b6f00001e6b6f6e7374616e74696e2e73687574656e6b6f40676d61696c2e636f6d00000c406b6f7374617362796d64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a82e5a53d12a09aab42563a17307b5666d9a19a03d819884c58f14aaa5c7955eabb0373cc51df56b": "0x0000000000000000000000000000000000064e65656c6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a834d4f336c27b55eed1f0f53dd77141b7e14c986f47952c83bceaa85330bbb79bd5049c02c6002d": "0x0000000000000000000000000000000000022e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8640543b19f19a84ad9207cc7c637de005975cbd7a18c25678fe0539c72da3aee5e481107214e51": "0x00000000000000000000000000000000000954776f506f696e740101010100000c4074776f706f696e743078000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a86cb47311794162923cc59f21372eacb629a4237273e3c7b70e38b7ee6fe2943243577fb3dd5927": "0x0000000000000000000000000000000000076c6f6c6f6275076c6f6c6f627501010100000c405072656d536f6c4d6161000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a88614383e45393734feeab011852aa4af8789a515e9fcf699fe44efc4089da2aeb9b3180f55db22": "0x00000000000000000000000000000000000a4261627920426561720101011662616279626561726e667440676d61696c2e636f6d00000e4042616279426561725f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a88877471b8c0203f6944b2b5f590f132203e5dd4f04c56e594f43b5681a48b210899382c3880b4e": "0x04000000000200000000000000000000000000000000114255454e4f2056414c494441544f524f000017406275656e6f76616c69643a6d61747269782e6f72671a686f6c61406275656e6f2d76616c696461746f726f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a89d5309de30e31c3a10656b4d5bcb51a5c28fa791cfc445c03dd331b1a4201fbf3e7682fbf7ec63": "0x0000000000000000000000000000000000085265737970746f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8a003d6a2d0177ca664f354c48dde8ffb75856a2a6d476cf4759eb2cba712f5f34d24da87a33119": "0x00000000000000000000000000000000000b616c6c636f6e6e6563740000000000000f40616c6c636f6e6e6563745f6672000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8a3ea9a9a3cbf30d21eb80113b2f57759d263c0eb1f02291dbc81a41d5a98029ad55f941eea3153": "0x040000000002000000000000000000000000000000000d77656233616c6572742e696f001568747470733a2f2f77656233616c6572742e696f164077656233616c6572743a6d61747269782e6f726712696e666f4077656233616c6572742e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8c0fe4965a9220bfa0873857fb6d7ea4167b7176e459f3ad4f9a84d9d32c37c97cc07ef71021c3f": "0x04010000000200000000000000000000000000000000094e657762616e6b730f4a616d6573204e657762616e6b730016406a6e657762616e6b733a6d61747269782e6f7267164a616d65732e4e657762616e6b73406d652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8f89080f3d629d01e069328eb826785f0f58f3f42d0921da45c2c8f60230bc7a6d9f23e420f6524": "0x00000000000000000000000000000000000c44524147414f4e4f5254450b456c7a6f204e65766573000017656c7a696e6e6576657340686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8f9b83743f647ef6aa99658e2b0755ca9f1ead5bde1ff6249f25d37cf1e7b5214dc31ce2d67e35e": "0x0000000000000000000000000000000000063031656767000000136b73616e6164757540676d61696c2e636f6d00000d4065636e6c6f535675726576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a8fb89fb3cff01fbb8a042528b36775f3f2644ef54a2f4cf34ad33ebbe538ef1112af09244428d71": "0x0000000000000000000000000000000000094d6973746572334400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a916ff8cbaa3dbb2e048fd6e69598e9af4aa6bdb31c470c5350cb29433bdaadd05fac776f7447e24": "0x040000000002000000000000000000000000000000000a5374616b656c616e64000016407374616b656c616e643a6d61747269782e6f726716616c6f63686b616d696b6140676d61696c2e636f6d000011404576616e4d6f756b68743232303034000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a922ab100b50050438ee604a9f82f3f702f49b4bc794c684e7097aafc63b4c2ec3f579110fc77102": "0x00000000000000000000000000000000000444525900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a93c6e207f351cebc5c184f0565e2192d6aedae584ee736cef875f0e1c558ee3ede26869acd0b4d6": "0x0400000000020000000000000000000000000000000013f09f8c8c204e6f766173616d6120f09f8c8c164e6f766173616d6120546563686e6f6c6f676965731568747470733a2f2f6e6f766173616d612e696f2f1140646179373a6d61747269782e6f726714616e746f6e406e6f766177616c6c65742e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9420133b7f85dd418af8d860e3138ecbde8349b7062c6ea5e440850c028e9c1625253890f1e5628": "0x040100000002000000000000000000000000000000000b5a616368204a616d6573000016407a6163686a616d65733a6d61747269782e6f72671d65786368616e6765696e717569727940747574616e6f74612e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a94e1e206d46f06cf451d9aea4d117a8724a9d55c25c968a7a8027a0912bbee2543e3a38eaabe94c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9541c4772f19bee9cba8900744a61a81cecd63e84ba19aec07dbfdf0dcf8e649daa9b31545f2e7c": "0x000000000000000000000000000000000012524d524b20506172746e657273686970730009726d726b2e6170700011636f6e7461637440726d726b2e61707000000940526d726b417070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a96b781a4270f369de797dd6265e5d3b12a9701b7cf7612c6104610fd35f6c61b5d760a5cebc327d": "0x00000000000000000000000000000000000c4d617a656e2053616c6568154d617a656e2053616c656820416c6a6f68616e690000116d612d7340686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a97f5e4fe69abc071c3c0915fe5c823928143e78ebe2046676d0c84a9dc73a51df007e094fb4046b": "0x00000000000000000000000000000000000764657673756200000000000008406a696e786338000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9939a663235c70ad2b5076d5c090233682d61cf1b2668d1466255e2030bfce0e38eeea730a1ae75": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9abc96ba1ca531998d97c7f257bdc631d5a9a10e639a7a3402177a67669f01bfce163abdc14bc11": "0x00000000000000000000000000000000000a7665726f7961746e6f001e7777772e696e7374616772616d2e636f6d2f7665726f7961742e6e6f2f001e7665726f7961742e6e6f6f6f6f6f6f6f6f6f6f40676d61696c2e636f6d00000c407665726f7961745f6e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9ac2596fb290717a4f1e970b856afb2bb1ef07cbdc9308267d54033c1d602da5939c46ff3decb10": "0x0000000000000000000000000000000000046e6d6300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9c0101f5bde7e255a47dd2d6aca2d7373c5bf19ef5f771ce1646f0b869d0f34271785de8e44e51f": "0x04000000000200000000000000000000000000000000127374616b652d6d616368696e652e636f6d001a68747470733a2f2f7374616b652d6d616368696e652e636f6d1140616b6d653a6d61747269782e6f72670000000e405374616b654d616368696e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9d5aef332a19f2e0ceee7d84f1e2c0f6b4d3b29eac3a3c5b2586d3fd13f12e2c90427f5208e610e": "0x040000000002000000000000000000000000000000000a686172766573746572000000176e6f6b6f676972692e73727640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9e8d7579b6c63d09c994bd7ab2ac6093f2a3bae11b36c1dadabcfae55c21afc9c823239c151bc59": "0x00000000000000000000000000000000000d50756666657220426c75647a00000016707566666572626c75647a40676d61696c2e636f6d00000d40707566666572626c75647a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9f08d3911f890e17a0625bffca33ce094f74f399580b16674ae3e0cc8ef259cde618e60e927ae53": "0x040000000002000000000000000000000000000000000d4b525950544f53434841494e00001c406b727970746f73636861696e5f79743a6d61747269782e6f72671b6d61726b6574696e67406b727970746f73636861696e2e636f6d00000e404b727970746f73436861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9f9ca9189790e6d984a272e9701a4280010de2ca4b6a8036ad527f4f8a4d3f8568dd40ca4bbb929": "0x000000000000000000000000000000000006526164656b0000000000000a405234646f736c3477000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa006ae101e5026b0e76e3ac1594a10ba3ac43455a6195b9ade199408127ed344a12e1feb4c1fa1e": "0x040000000002000000000000000000000000000000000879616e6777616f0000144079616e6777616f3a6d61747269782e6f72671179626461626140676d61696c2e636f6d0000094079616e6757616f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa02456a3c239f66f43c777cb76a32b1cabdf02bd5ad1ec330663043d33917da9151323f3a846023": "0x000000000000000000000000000000000008455845515445520000001765786571746572646976696e407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa06495c700f98f1f446b0fa660760f015c4fc7cd39c89deb69ed5f7e8b9652f6b14516bb2698517": "0x00000000000000000000000000000000000b4c6f75696520524d524b06627265747400000000000b406c6f756965616c7473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa31b7d6b6c621c5280c01b232926c260a77f08c52e13c6b87e56e6172b6cb767a9274ce15b7f254": "0x000000000000000000000000000000000007616d69726b6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa5d460a7e61942d6c05e68f748e5a4a68cd353ddf96dcc22395722e9a03cd814a9c5bb964d7aa30": "0x00000000000000000000000000000000000950697869446f74730000001470697869646f74733140676d61696c2e636f6d00000a4050697869446f7473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa66c809e7c7caee244a202cd6b29e2026b65a07c3fb32422138a122e581a627e35791da331bc905": "0x0400000000020000000000000000000000000000000008566172656a6b6100001440766172656a6b613a6d61747269782e6f726718766172656a6b616c657661796140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa73eb5624e30cd3ce8d12b99ce263a7d3c6ef0e361551a4fcc80e777b61ef1866ffb47a288dc15d": "0x0000000000000000000000000000000000086375746661636508637574666163651e68747470733a2f2f796f75747562652e636f6d2f632f6375746661636501156375746661636570726f40676d61696c2e636f6d00000b40637574666163655954000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa755f1de043396afa3a43c08b6d2eb836c98ffe0e3936f50f54bbd2a31e5a2b4686c6ce187cb479": "0x000000000000000000000000000000000009636f746f7061786900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa76e80be7235fbb9404ddc2d30b821106b545eabb8d22b38ceaf86ed56a37f9f14a37140050bb4d": "0x00000000000000000000000000000000000a4f6c6568204d656c6c0000000000000d406f6c65686d656c6c5f7561000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa7bbf43874b9d190c0a3067cabf39e1a8bb185fbd95b274aa838916e6adcb968cbe99fcc0b0c779": "0x0000000000000000000000000000000000044e54200101010100000b404e617373696d543932000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa92e5948766b8968e3b5643d507e6af52fe12a5b4d4d095881e687cdba55e9d0e9f81600ab30b18": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa92eeacb2f4017c0a409ce1eed912358015a8139383b02292284b392bf23ef9eb89c7f31ed7e10b": "0x040000000002000000000000000000000000000000000b47616c6178794e6f64650000164067616c6178796d656e3a6d61747269782e6f72671767616c6178796d656e34363140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aa96f99f2185e3646069548e7913a106991a40988bd63d25996d6788f9302ef0a86ec40b4e6bd36f": "0x040000000002000000000000000000000000000000000e426c6f636b20427265616b657200000019627265616b626c6f636b706f73744070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aaa3cef8c09f417f2a807fc9b3748a0d6b964bff11360e00040fb5fc569a9595532f935286a45f47": "0x0401000000020000000000000000000000000000000011e2999e47616d655468656f7279e2999c001668747470733a2f2f67616d657468656f72792e6d65184067616d652e7468656f72793a6d61747269782e6f7267136d61696c4067616d657468656f72792e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aaaaeef2f5df648fccf47a2ac8ff8fdf1511044e5040f946f617915ab09a35a4d2b7f16b60bdba1d": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000001a55542046696e74656368204b7573616d61204163636f756e741e556e6976657273697479206f662054657861732061742041757374696e1368747470733a2f2f7574657861732e6564751940757466696e746563686c61623a6d61747269782e6f726712636573617265407574657861732e656475000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aacd06621bc7fa58402c5a21657ed72700a7b5b18773b060eef6d8fd448a86a01138dfcd9a41677b": "0x0000000000000000000000000000000000085343414d4b494d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aad10b10ac673adf84354a60e57e717efbf60e05a7f8df7982a6054f48fa6c34b2d66a1f2f940f4e": "0x00000000000000000000000000000000000e68756d6d75736f6e7261696c730e42656e20477265656e626572671968747470733a2f2f62656e677265656e626572672e646576001862656e2e677265656e62657267407061726974792e696f00000f4068756d6d75736f6e7261696c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aadb474af3b7652ba4e3fe06c7686f779f50f956b9a36486107808a86666a1105c598abf0cdd9020": "0x00000000000000000000000000000000000b43726f636f7a20426f790000000000000e404b7573616d6143726f636f7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aae05b931631df4deab5016cd6102b4684337646ad1c880eccc696a5279bfd1857a4033f418f014f": "0x000000000000000000000000000000000018546865204372656174697665204d696e6420576f726b730000000000000a4075676c7970616c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aaeed3ff5f7c6546305106e806e5964b54882b0253bbe6bb25fc4437dcb7d162551b2114a86ef81b": "0x0000000000000000000000000000000000105370656369616c204167656e74204b0f4b6576696e204b616d696e736b6901011b7370656369616c6167656e746b34303340676d61696c2e636f6d0000094073616b31333337000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aaff4d5a3b6c0d71aa7880fe9ca2bbf331fc13e40525dcb0da661f143df506fed76d8ada3db8f551": "0x0400000000020000000000000000000000000000000008536b7974726f6e00001440736b7974726f6e3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab090ef5db55f2a2a6a50a55a5a9ae7f9b80282cd64afb109232a94ff5402785e6174c77f5364740": "0x00000000000000000000000000000000000c427564646861677563686900000016627564646861677563686940676d61696c2e636f6d00000d406275646468616775636869000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab15b2cfee5d067cfeff500e183af7ebb6c66d217a35540bc99f91f5c8ca745f189c7a8e02523263": "0x00000000000000000000000000000000000a6176655f766c61647900000015617665766c616479313140676d61696c2e636f6d00000b406176655f766c616479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab1b531c27836eb194fe1c5670fe87032f21aef7ab7089328f0014a104085c9ec123a18fa46bf23a": "0x00000000000000000000000000000000000d4b5553414d412046524f475a000000166b7573616d6166726f677a40676d61696c2e636f6d00000e404b7573616d615f46726f677a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab2f26fdb66b7e0f02603a8ccfffd5b74a929869750a452583b36782928fbb4d21d467d31ca5912d": "0x00000000000000000000000000000000000f706c617374696320736e697463680f706c617374696320736e6974636800000000000f40417274556e6465727261746564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab47f5a74f1518f11e3a86311df89c922a9fa04ce93d9233ae6ca68e9a4e84514c833bc62b98ae57": "0x000000000000000000000000000000000012477261766579617264204275646469657301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab4cfabd58cd57c4b057b598310f90e7b899cbaea0bc1866fcbf3af525641e40b1b1a983bf840f30": "0x00000000000000000000000000000000000a73796e636c75622d350a53796e636c75622d35000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab6c59cef8a0b91fb0bace3fd1908d2fd2894c39d218b13c2095285a9b0f8634e12689ef0963186c": "0x000000000000000000000000000000000008547261644172740b4e465450726f6a656374137777772e6e667470726f6a6563742e74657a17406e667470726f6a6563743a6d61747269782e6f7267136e667470726f6a65637440616f6c2e636f6d00000c404e465450726f6a656374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab727efb89c9f962a44b893b7b290c0e65eef94bde35efc9dda666544da7c59843c64db46850e915": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab7ded53df100477da35e75473c26344448602f4c2ae540e1a28dbb2772529f06930cf61a3b7ca19": "0x0000000000000000000000000000000000064c55524f420d4c55495320524f424552544f2168747470733a2f2f6f70656e2e73706f746966792e636f6d2f6172746973742f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab7e3e98c718729f7a895955042cb3fe863f3564e7b30e9130e37b6d905be11c0cf91064de1cd83a": "0x040000000002000000000000000000000000000000000853544b442e696f000015406672617a7a6c65643a6d61747269782e6f726700000011406672617a7a6c65645f64617a7a6c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab817fd9c538caa7e615d6d583a7c958db2c97347de2c8830e3f6246e9b7adc272f28e373be3366c": "0x00000000000000000000000000000000000a526f6d616e6573636f001568747470733a2f2f726f6d616e6573636f2e6169001368656c6c6f40726f6d616e6573636f2e616900000d40526f6d616e6573636f4149000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ab8afdd8f0ac6b745e7b0fb60cbb96d9e6325a80e8e14ae76826a53a944f299d3408337436a69631": "0x0000000000000000000000000000000000084861776b69736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714abd298c8604cc4203058bc565c6c6fac47bf50cb3f14df3f7e0da993b4e8be978963740ddd96a52f": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30330e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714abd8088ba391de8242245c83d3a57fb95b74c05157a15cef637c0c64573b1ae493f8f3c3df13714e": "0x0400000000020000000000000000000000000000000007414547495332000013407369676e79393a6d61747269782e6f7267117369676e7939407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714abe7caa62e5fc36ae6d808f3c2107a51d89762cd838ca246c9b4fe83d15077732694fe9dc9279165": "0x000000000000000000000000000000000012496e73696768742066696e616e63652032001f68747470733a2f2f6d6f6c65737761702e696f2f63726f77646c6f616e730014657269635f64776a4069636c6f75642e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac3727c0a32917e62c5bca9fd4c92b051e35c47617175d8f28aba000ccf921cb24bdf555662f2d41": "0x04000000000200000000000000000000000000000000056b6f7a750000114067757a6f3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac41f4731ee7b7d67058b4f0cca3807c138068a8c98af65745d8ce4ce287c704a113c80bcc19874b": "0x00000000000000000000000000000000000e54686520496e73706563746f72000f61626f7274696f6e2e726f636b73001561626f72744061626f7274696f6e2e726f636b7300001040646f6162617272656c726f6c6f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac5da0493129f685f005964968c50de1ad4514e1453fbed546bcae7508185f8f6f116b98df392c3d": "0x0000000000000000000000000000000000154469676974616c204e6f697365204d757365756d154469676974616c204e6f697365204d757365756d176469676974616c6e6f6973656d757365756d2e636f6d000000000d404e6f6973654d757365756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac6f1c6373257f1a4284fa7c290fb6052b9437610cfb2e19b3b37081fc72140e444d5b57ca01924d": "0x040000000002000000000000000000000000000000000e576561616b204361706974616c00001a40776561616b2e6361706974616c3a6d61747269782e6f726718776561616b2e6361706974616c40676d61696c2e636f6d00000e40576561616b4361706974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac7dc49ac8e1155e3ebc5e567e66f61937449b0c00ca928ae0b2c45e6331e426b756fd5787c73036": "0x00000000000000000000000000000000000e53686964656e2047726f7774680000000000000e4053686964656e47726f777468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac8c20eece56914de20112991cc5c6843ed49189f02b5665847d3e408202737bea3fa2d01a69a10a": "0x00000000000000000000000000000000000c5468756e6465726b6f6e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac94e97916c4c22f789becfbaf6d1af5ce67bd164e99eb01d0d677f830d54db4b6aae25543857465": "0x00000000000000000000000000000000000c4b5553414d41204c414e440c4b5553414d41204c414e441868747470733a2f2f6b7573616d616c616e642e636f6d2f001a68656c6c6f6b7573616d616c616e6440676d61696c2e636f6d00000c406b7573616d616c616e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac97e11542df6e0b98c7819c80977d8895f62907d6f2583177ee7ff77c6c661989b43f834d534d7f": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac9c3b250f38c666aa4f9b4fe0e5591c49e938bee099a2462e7d1b274f652ff14376b6ec37c9e335": "0x00000000000000000000000000000000000b4d617273684d6344616e01137777772e6d617273686d6364616e2e636f6d010100000c406d617273686d6364616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714acb114a0152b1c7e2e6bfbe96e1c1a46e86a7e085fe5d748c8d0f38dc0d721378d8c9a55fc27c446": "0x0000000000000000000000000000000000074665726162670101010e62757263756740676d782e617400000c406564697a6b726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714accc7e5f392e9a0c9e758090b4cf20c4ffc9b30b07e41823bf447634b448c7b12bd011631735c814": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714acdafe2a83e3f2dd48f9d09659267bbe934aac85662d64591bae57d22266311f7fb8dfd458bd9338": "0x000000000000000000000000000000000007616e6472657910416e647265792042616c6173686f761768747470733a2f2f6e6f766177616c6c65742e696f2f1240626c7368763a6d61747269782e6f726715617762616c6173686f7640676d61696c2e636f6d0000084062616c736876000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ace3fb0f376c313f2ee247d45c4d034caf805fa22e3bf529b78d04bf33b11ba9a1cf10f7275c4c08": "0x00000000000000000000000000000000000d487970657220536861706573055065706500000f7365736f6d406d61696c2e636f6d00000b406d696e75737269746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714acf521c66337a1c992aa2496da20d35abf5407fcbcfa62741358276109b86ef2d0bf3774838b9649": "0x040000000002000000000000000000000000000000000b4d6178496e4d696c616e000000196d6178696e6d696c616e4070726f746f6e6d61696c2e6368000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad2218b3decc8eb22eccf3598b22853bd4de4a8340363f1af10f217a578892b569c76e7368253734": "0x00000000000000000000000000000000000b706f6f6861746e63737501010101000011405061756c5061743534323133343530000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad2c753ff14dd79164820bb673da18602df1750a214ec8e3ab14815994de12d01bcc46e9a6de476d": "0x00000000000000000000000000000000000e4d6564696f63726574697665730e4d6564696f63726574697665732168747470733a2f2f747769747465722e636f6d2f6d6564696f63726574697665002073696e67756c61726d6564696f637265746976657340676d61696c2e636f6d00000f406d6564696f6372657469766573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad2d645b1ffcbcd23afbbdfaee3e5ed51710c3aa8147b4c28f5260c8bb94e75735e8c4004452d555": "0x00000000000000000000000000000000000c4c617356656761734d616e0e526164656e6b6f204a75726f730000176a75726f73726164656e6b6f40676d61696c2e636f6d00000a405261794a75726f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad342401c1554edb98299ef0de2ffb12a98370326e70ac683862c78d592970f7294244c1fb370d4e": "0x04000000000200000000000000000000000000000000074e6f6465733100000018616c6578616e64616c6578324072616d626c65722e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad35c1615f01572956d629a2c80762d412fad9c15d8cc973b463f600895170d43a10ca504b4f454e": "0x040200000002000000000000000000000000000000000852594142494e41001368747470733a2f2f72796162696e612e696f144072796162696e613a6d61747269782e6f726710696e666f4072796162696e612e696f00000b4072796162696e61696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad8ddc0ca11a0cfc2cc3c4f5e22e3a59a0ca34de4ed55e532bb842ea36626ccab7a01378dbcffc31": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ad968b9e29de99cf0c705f5ccd12c95bddf10c698f7cbb92d224b099fc759f5f9e1ebf220a685972": "0x00000000000000000000000000000000000753515541445a0000001873717561647a636f727070726f40676d61696c2e636f6d0000094053515541445a5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adaaaeb1d3993c798ac9852f42ff7fde06bd98fb2c2c4b3f18ecc0d7117cefc3acffca60a86a395d": "0x000000000000000000000000000000000006454a56494900000011656a6463303740676d61696c2e636f6d00000940454a4443417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adaacbddd276fad892b68c8f6d36b8ca3bf3f31c200750ef773419b294216127f2aaeed9834e8f12": "0x00000000000000000000000000000000000d414e494d45204c4547414359001e68747470733a2f2f646973636f72642e67672f416743557a44353737760019616e696d656c65676163796e667440676d61696c2e636f6d00000f40616e696d655f6c65676163795f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adb4fe3a15170520a6659e4c3f22c2aa97d54a36e31ab57a617af62bd43ec62ed570771492069270": "0x040100000002000000000000000000000000000000000a525454492d353232300f5261756c20526f6d616e75747469001c407261756c2e727474693a6d61747269782e7061726974792e696f177261756c406a7573746f70656e736f757263652e696f00000b406e6163686f72747469000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adc1094f94b7e6a19e33f55832314d732b6201019a34e6bee2d0050d05e48792f908927004807d4a": "0x040000000002000000000000000000000000000000001052656420446f67205374616b696e6700000019726564646f672e7374616b696e6740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adcb6799f01113f1147f672b1be04ef277b6175efd27a5691d4589944175985e37fbd4a50fc49e1f": "0x0000000000000000000000000000000000086c7563696f6377000c6c7563696f63772e65746800126c7563696f637740676d61696c2e636f6d000009406c7563696f6377000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adf6f4946cd7e9bd36d893f519ad2ade0e563049a74f7f4a629c664344e294f12dcf295dcb9f134b": "0x040000000002000000000000000000000000000000000850727a656d656b001968747470733a2f2f6769746875622e636f6d2f727a616470134070727a656d656b3a7061726974792e696f1270727a656d656b407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714adffa60d83e2d26fd63749b70cd25854d6accabefa8939f92bd2034e19b32deb67130ab0141c3228": "0x000000000000000000000000000000000003494f00000016494f37384f494070726f746f6e6d61696c2e636f6d00000840494f37384f49000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae0f2e475df6cdca56b0bce13b96ed2d2e3d93cb0b96d21117352df2d473fdd111ac7febbd721a3b": "0x000000000000000000000000000000000008416c69736177790841627562616b7200000000000b40616c69736177793031000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae19368d93e1a11446ac55edf7126c062f60ddf13c421406126155fe5377abc33bec6e7ec9b98f54": "0x00000000000000000000000000000000000a4c6f7942616c646f6e0c4b61726c2042616c646f6e2168747470733a2f2f7777772e6c696e6b6465636b2e6d652f6b61726c62616c64001962616c646f6e6b61726c6b61726c40676d61696c2e636f6d00000d406b61726c5f62616c646f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae19ce23547ca726ec822a69ea8e95513f81967b0c048386598a107c88c49dae54f1d94b0cba802c": "0x00000000000000000000000000000000000e416273747261637420536563740b54796c657220526f776500000f746a726f776531406d652e636f6d00000e40416273747261637453656374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae1a5c36a02b18e9103a9ebd690d8e1dd5e8f3cb43b05586bbfbd8c36ce3e976b6f45da4a60ff01d": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32350f42696e616e63655f6b736d5f3235000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae2793d04574eccc063443a7dc2c49d6256a61c92bb0515ce6a641bacf9b42c9ec78b913f72c470f": "0x0000000000000000000000000000000000075069706c6f70075069706c6f7001010100000a405069706c6f707070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae29da2b825c96019285049cf1f37e3e312e2367a3768fb066598d309d4a4ccacfb70137714a4404": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f31380f42494e414e43455f4b534d5f3138000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae2ca4581ebd097944e0753f9e387f2ad25607a94c8e17afe7fc505d65bf7de78d4e87d4a8804414": "0x0000000000000000000000000000000000184b7573616d6120447261676f6e7320547265617375727900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae35f46bc40f624a76488519b246e6c8fc7ddc438a876db42446cfbe25ee73a873e696775821615d": "0x00000000000000000000000000000000000f546865756e69746d6f6e7374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae37ed4115e2f104feb895bf0e5923afd22e8edecfb4a9ce6263d447ba45375dc4d280ec0d3d1a16": "0x08000000000100902f500900000000000000000000000100000002000000000000000000000000000000000a41554449542e6f6e65001268747470733a2f2f61756469742e6f6e6516406c6974746c656972643a6d61747269782e6f72671068656c6c6f4061756469742e6f6e65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae47ffa8b83cf8eb1cfd7bfee0e9629e1fc2a35a40fedf43436915a1d1a14604d788eb0a5cd12442": "0x00000000000000000000000000000000000c64656c616273747564696f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae4964a1652132ffe242bf627ae3347d67991e1b2ebff0a013bcf27ddb96c5cc4c09f1720bbf8471": "0x040100000002000000000000000000000000000000000847616e6a616c6601010115617269735f6b6f6e3934407961686f6f2e636f6d0000104047616e6a61496654686547726579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae81b3857066f7b0202a4b121f7c19db32d07246ca42ba38faaf82f5d7fbb929d6c35ace78f4d521": "0x00000000000000000000000000000000000a4f6c6568204d656c6c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae93bd56eb26fefac88b7d581246140ac334a9701a6b63b609c0e4d1e0a4dc7ed518093e7977c265": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae9b31f551254fb3ea1751759b8191b2b400bfe38b56f0442edb875c3390c2af3c1edeb2892f300a": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000008436c61697265650000001a6b6c61616161726b61614070726f746f6e6d61696c2e636f6d00000f4044655f6c756e65436c61697265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ae9ba12db96645e32c24642cef14e77315bf467c00917c749a19c3e5a6df705548a67aa7ad0ad138": "0x040000000002000000000000000000000000000000000b504f4c4b41574f524c440b504f4c4b41574f524c441c68747470733a2f2f7777772e706f6c6b61776f726c642e6f72672f1740706f6c6b61776f726c643a6d61747269782e6f72671c7869616f6a69652e70616e674066786861736862616e672e636f6d00001040706f6c6b61776f726c645f6f7267000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aea617318e829b5f12ae4cc150cef3f9e224d7b6cb10383e91a355a9c9052e21c1c638dbebab9921": "0x00000000000000000000000000000000001d57696c6c69616d207c205061726176657273652054616c69736d616e000016407265706c67686f73743a6d61747269782e6f72671577696c6c69616d4074616c69736d616e2e78797a000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aeb7ceb911a5fe458c2f8f1570391214b89f82df1e2e0c12f9e2e814cc8e38b3d8baf3692724a311": "0x040000000002000000000000000000000000000000000b44656c6567612050726f0000001c7061756c6574746576616e686f6573656e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aebcdd1a0eab5430c284a353b40066c06ccde4c573083785d245d5b2838c1ee1281f09c14f0c4b3e": "0x040000000002000000000000000000000000000000000a50757261205669646100001c40707572612e766964612e6e6f6465733a6d61747269782e6f72671a707572612e766964612e6e6f64657340676d61696c2e636f6d00000f4050757261566964614e6f6465730010707572612e766964612e6e6f64657300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aebd88238d3a6853e4340b480dc1067cc6eed90dbfbb55eccbf4b290860eac100caac06cf7bfe50f": "0x00000000000000000000000000000000000c536c75675468756767696e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aebfc4a3abbe2861e2b2f3f1826834a30b035da7502c657d702287f295c944292ceca13436f2525f": "0x00000000000000000000000000000000000b6a6a706f6c6b616465780000001a6a61796173696e6768616c3230323140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aec040a9a30c2fa408dda0877b73535dd8e892916397ac9ceccb44b8441122bb434b17e2db376d03": "0x040000000002000000000000000000000000000000000c636172626f6e7a65724f33001768747470733a2f2f636172626f6e7a65726f332e696f001c7374616b652e636172626f6e7a65726f3340676d61696c2e636f6d00000d40636172626f6e7a65723033000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af08e5f294e1dbf3e08ca157a6b33c275a3141a8f1d0d26fdb69cdfabcd9bbbc04121009ab9eac6d": "0x00000000000000000000000000000000000c416e647265772044697a7a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af0f194ca5eedf8696cfb23cc08b9267a778c38e9aba684d2708786813c14ced80a51c32014e8c17": "0x00000000000000000000000000000000001067697073797472616465722e646f740c6769707379747261646572010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af17ae08f9526c52d2eeb4ca57167ef272dd79a7e07be6b9e0f825932c46bc21e64c9d4d96c80f47": "0x0000000000000000000000000000000000074b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af1c32392abb5cec8884900b83686025314b36118c490de387482dd7aa54c1fe3ae3f3b74cd0f347": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af26cecf04b0d6f91a48da57cd9e71d434c2c4c043d7304ab2d0b4f04db9194f6bcb1a7d5cc7b822": "0x0400000000020000000000000000000000000000000007726f64696f6e00001a40726f64696f6e706170613030373a6d61747269782e6f726718726f64696f6e7061706130303740676d61696c2e636f6d00001040526f64696f6e3034373039393331000f726f64696f6e303037233535353300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af2cc3fd6d2f53af265f0277528dda506dfc7451261a78f74b159bf1032d917b8622657d0fcffc4f": "0x00000000000000000000000000000000001d526f6d65726f2074686520446567656e65726174652041727469737401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af36192670e89a839ecb437788f1e911c3a324b0d377b46bc2e56ecd68cdc11f827f3edf81e7a23f": "0x0000000000000000000000000000000000094a616465204b6f6101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af36a552655d8727a03a7d4a2e5b472c56e6282ab563aa3c9dbe1fcd82f2d954ef86d8c67c89575d": "0x0000000000000000000000000000000000106361727465697261206b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af64089eb873bdca2ce5f06beaee8b512f2cbb5192296ad4c2ff3359fdc2cea9cd613903a7c8360b": "0x04010000000100fc8d0e800000000000000000000000000000000000000000000000000000000d506f6f646c65546f794e46540d506f6f646c65546f794e46541f68747470733a2f2f6c696e6b74722e65652f506f6f646c65546f794e46540017706f6f646c65746f796e667440676d61696c2e636f6d00000e40506f6f646c65546f794e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af8778444f4de017a26dac20e5b6200fcbbd2fe377f3db8101a7ac0f97dcd30cf21a9ebef4728d2f": "0x0000000000000000000000000000000000084570697374656d000000196570697374656d6963726973697340676d61696c2e636f6d00000d40496361727573526973656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af92c79ba730b3d974494d37fcd7c5ba35a87b4d9a5c86a890b4b10e0c00e935ef4a8d0853428637": "0x0000000000000000000000000000000000084e464b2044414f001e68747470733a2f2f646973636f72642e67672f355550763242475565530000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af98277273da6e43692f87b14dc9169f22bbe981d976de2d7fc7495c361dafc154eb21a03c5035a2": "0x040000000002000000000000000000000000000000000d4c494e4b45523639f09f8ead0000001530786c696e6b6572363940676d61696c2e636f6d00000c4030786c696e6b65723639000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af9993b81e5473d034a31d751a0ec52fbf411513a3cee3c7c6c1a2c2bacc3f809f3ead9eb9bae348": "0x0000000000000000000000000000000000064e696e654600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714af9ae6e4f434181d9c322cfa42b80ffb1fa0a096ffbbe08ff44423ea7e6626183ba14bfb20c98c53": "0x040100000002000000000000000000000000000000000c456e73526174696f6e6973001c68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b2f1840656e73726174696f6e69733a6d61747269782e6f7267166c7340726f626f6e6f6d6963732e6e6574776f726b00000d40456e73526174696f6e6973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714afa63c93073adc978e06bfc989509d6d625c085209adb405867bdbe4f167ded7e61ec126c683165d": "0x040000000002000000000000000000000000000000000653617368610000000d68694073617368612e696e6b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714afab87883b2986dc6ee5ad3ea0da40510f11f42c3281fd543f5a6bfad54ebef7381a7320bb509a0d": "0x0400000000020000000000000000000000000000000010477572755374616b696e67f09f91b3001868747470733a2f2f677572757374616b696e672e636f6d1840677572757374616b696e673a6d61747269782e6f7267167374616b6540677572757374616b696e672e636f6d00000d40477572755374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714afc3bdc7245962d07c9f7a1b77cd672ba9c9f01a933ce98effbc36bb57503a4f671bc6f01e25f335": "0x00000000000000000000000000000000000862796e61745f5f114e6174616c69612053616c64697661721968747470733a2f2f6c696e6b74722e65652f62796e61745f00000000094062796e61745f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714afdc8afb93fda6f506a3316928fa06115766132478d1e7b9385bea8e0e411a8c6056f12b3d13ce7c": "0x000000000000000000000000000000000014395374616b652028436f6e74726f6c6c65722900000017397374616b652b6b7573616d6140396761672e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714afddd653b3cc45ff4036da32f7b6ae9df4e3f7e29f2f0c3e42d893976c993633b952bd8c8754d408": "0x00000000000000000000000000000000000b416c6578204d616e74610000000000000e40737469673330385f74727565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714afdded1663a63773142eba87db082b693b5f35e88d7a70409b0ddb61d430abf218884d4467af1024": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aff1fbb6c9b02bcf8213f1a5a5efc5379fc21131f5c9425dfef0f628cc858c2d54b713e96b1f607b": "0x000000000000000000000000000000000007436f6666656500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714aff2ef9eab1786a6a680f1d3b6abc1351b6b0afd91a54c1d466b7820abeda0bb7e059513a4d80c04": "0x040000000002000000000000000000000000000000000b4e61706143727970746f00000013746f74657374656b40676d61696c2e636f6d00000b40546f74657374656b31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b009963bd6cf7f553e3fedc679e48594357377ab604693db948db02922e5f7f1740581d1d6fc3608": "0x0000000000000000000000000000000000154b75626942697420496e64657820536861726573000000000000104074686567616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b05ea025efa6e1a0aac311fdc8e841ba529158c0da3b3b0e1efabbeb980b2186d7f6194388da6131": "0x00000000000000000000000000000000000668756f626900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0726c73592fd7dcacd0b478fd9586fcfde7d71aaf49bab9777e0e1ccfeef5d5922bfe68fe68c96b": "0x040000000002000000000000000000000000000000001053756c74616e4f665374616b696e67002168747470733a2f2f7777772e73756c74616e6f667374616b696e672e636f6d2f204073756c74616e6f667374616b696e672e636f6d3a6d61747269782e6f72671f73756c74616e6f667374616b696e674070726f746f6e6d61696c2e636f6d0000114053756c74616e4f665374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0a155d537be68bc40c46bdf410fc4998d2413619de53b7cf4619abca4e8ad87d8a3adc50ec73f2a": "0x0000000000000000000000000000000000086b75736d616d61001c7777772e696e7374616772616d2e636f6d2f6b75736d697465636100146b75736d697465636140676d61696c2e636f6d00000b406b75736d6974656361000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0ac057a255285ea7000a09ee477781f180c3ce5ead45d6ed8d92d24a5abcfec3f24837c38ca1a40": "0x0000000000000000000000000000000000085348525553484100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0c27f90ac9d10a58adc4e19e79b3d2c744f88fa5aca47ef05ccaae141f6435c2d50df824433ae48": "0x04000000000200000000000000000000000000000000144859504552535048455245204449474954414c001d68747470733a2f2f68797065727370686572652e76656e747572657311406876616c3a6d61747269782e6f72672076616c696461746f72734068797065727370686572652e76656e747572657300000e4068797065727370686572655f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0c82179e29e010760c9cc0b9b314c31215486883e1b0ee9faf0a64ec4c9abbde63e53855bdc2219": "0x040000000002000000000000000000000000000000000568696d65000018406c696768746e696e6773623a6d61747269782e6f72670b73624068696d652e616900000e404c696768746e696e675f444e000c4c696768746e696e67534200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0e8c1857841459cc005652d40096e4fe6d2ac773d8834e30e31ec39e455f5116ab76176f2b30166": "0x00000000000000000000000000000000000757616c6b65720c4164616d2057616c6b65720000186164616d77616c6b657238344069636c6f75642e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0f0b3ac307cd751749ddc93a65dfec3af27cc7478212cb7d4b0c0357fef35a0163966ab5333b757": "0x04020000000200000000000000000000000000000000094b6565704e6f6465094b6565704e6f64650d6b6565706e6f64652e78797a11404472756e3a6d61747269782e6f7267156472756e2e6d6167696340676d61696c2e636f6d00000a404b6565704e6f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b0fe6b98334d7d6cc4516751df2e5803bac3bf9cf7b6d55cf4acbd76f861ad0a2a2b71b7a5ed8054": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000010626c6f636b6461656d6f6ef09f988800000018737570706f727440626c6f636b6461656d6f6e2e636f6d00000f40426c6f636b6461656d6f6e4851000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b10065a77e52723a249ac734e3c93c449fb84dc63e3305a8bf8280ecb3fce23f8b59fc4d22695264": "0x0000000000000000000000000000000000074b734d6f6f6e000000146b736d6f6f6e70726f40676d61696c2e636f6d000009404b734d6f6f6e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b11058f1454ffb44d2d09f95d0f12add7c3917ee547d24ed7e1f11bb5d93a1c59fe79c1305604128": "0x00000000000000000000000000000000000a5472757374426173650a5472757374426173651a68747470733a2f2f7472757374626173652e6e6574776f726b000000000f405472757374426173655f4e6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b11aaa4195d2ac6dce35dca783c5b947a69d789c5d3f10e3e2a5177321d1e6bf88a7e7b46c57d329": "0x00000000000000000000000000000000000f546865204461696c79204d696e7400000000000011405468654461696c794d696e744e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b16947c55a8fcdca9cee29ac72489e226911a3e13cc12e83655f3b2ba98c72760cd8e066c5f6bb1c": "0x00000000000000000000000000000000000b4d725069c3b1614b534d00000017636c617564696f70696e616340676d61696c2e636f6d00000d404d7250696e6170706c655f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b171be44e280759d380e0679794d9d5b8202444c893a17cff2cd2e65e76d095eeefaaa9362a3cf42": "0x0000000000000000000000000000000000057065706f000017407065706f6f7370696e613a6d61747269782e6f72670f7065706f4075707274636c2e696f00000c407065706f6f7370696e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b173257b17c32ecd724b7e940995b11d1e65f91a3ce3362429f941dacb9ad3e278acce9325308213": "0x00000000000000000000000000000000000841727563616e75000000000000094041727563616e75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b181c04016578e69dcbc0885fe08b19fc1a3c71b5a62c5710b6da20a20b3730c58a52c51ac567e30": "0x040100000002000000000000000000000000000000000c57616c6c6574792e6f72670c57616c6c6574792e6f72671468747470733a2f2f77616c6c6574792e6f7267174077616c6c6574796f72673a6d61747269782e6f72671268656c6c6f4077616c6c6574792e6f726700000c4057616c6c6574794f7267000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b19b71d671b6baa2aad8e905d4c09ac501fc3f74833019107288077bdaa77291588b5e021330657c": "0x0400000000020000000000000000000000000000000010534d4152542d4b5553414d4120535400000015736d617274617034303640676d61696c2e636f6d000000001440736d61727461703a6d61747269782e6f726700", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b19c3eac0c4c1de9dcc1c3cc78ba39c3d7b416dd47da6dd8a5fde83f454a55157caa477b5fb0c734": "0x00000000000000000000000000000000000b44617277696e4475646500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1a4415d3fe3b73f4cd5f7ee69df1d1fb53e664569fef68fcb2d7dfd9113107d6b108e5c27e2a725": "0x00000000000000000000000000000000000f506f2d4b7520547265617375727900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1b49b2e110517e354722d3648065cb3c0ee5de9ef5d7161e707e317fc897b2b109b062520f0ed23": "0x00000000000000000000000000000000000a4952594e4120322e3000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1ef8d6360daf3d016f1f5077a316bcc580964e83ce2af8c24574233aa13883fd4c9e37425fe5671": "0x000000000000000000000000000000000010524d524b2041756374696f6e656572001168747470733a2f2f726d726b2e6170700011636f6e7461637440726d726b2e61707000000940526d726b417070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1f5b788e8cb3020222f4af632639b2a6c24dfc4532b82a49c4d1010cb324bc98c8223ee2003cb6c": "0x00000000000000000000000000000000000e3120666f7220746865204b75730000000000000f405468654b7573616d617269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1f8cc3f226516048828d861f59282edb359070315c4b6e20be9ddd0ef58de47512c3d98b628c72b": "0x00000000000000000000000000000000000d4c6974746c654f6e6770696e0000000000000b40636f72746578726164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b21612d15cfbf7080ec594c4b9d16ea738e3c034498ea20655423f3861fd2df568ae379751cca262": "0x040000000002000000000000000000000000000000000d636c6f75647374616b696e67000013406d6f6761616c3a6d61747269782e6f726713686940636c6f75647374616b696e672e696f00000f40636c6f75645f7374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2315ce9bb1e5e9af89ed17c957b4a6de1ee5f3a36f7eeff3b5e53aba13792e64e471ee8775b6b31": "0x000000000000000000000000000000000004496b7501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b243ac33f5105fa6c01379a41a162af5a91e480a73369c4dd773a1ad16759a44cd3bb6935cd67e3e": "0x040100000002000000000000000000000000000000000b4b7573616d61204d4841000000196d686163727970746f4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b246a1c9081ca716a86d962e9922cd2213f9ea746767e3513957f86a335d940c8529d8357c106413": "0x040100000002000000000000000000000000000000000c5a4b5620436f756e63696c001868747470733a2f2f7a6b76616c696461746f722e636f6d001577696c6c407a6b76616c696461746f722e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b25006accff8cd9d064ee3e94e269dfcf8d09d4e0980bb3123ca16dc734304128e328bb5a40f575f": "0x0000000000000000000000000000000000074d6179776169000000156d61797761692e6b736d40676d61696c2e636f6d00000c406d61797761695f6b736d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b257cc47df162822949b344d8706a170108f20aa5457fb62d19ac4d1edd7bb450b07f6790d16283d": "0x000000000000000000000000000000000007446573796e63074d616e75656c00000000000c405f4d616e75656c5f4c5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b260711c449324e13e1a3571a435d9e2de0a5336428458e38e0e0c84179450ebe4466b5db8efea76": "0x040000000002000000000000000000000000000000001949204c6f76652043726970746f202d204375726163696f6e0000001e616c62657274706f6c6b61646f74737061696e40676d61696c2e636f6d00000f40495f4c6f76655f43726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2850a82780da820548a3bc51f5f2ff006d0dd63d17248752bd6b46800314a689f69ef9f3570937d": "0x04040000000100902f50090000000000000000000000000000000000000000000000000000000a4d6967617373657473174d6173736920496e766573746d656e742047726f75700016406d69676173736574733a6d61747269782e6f726713616c6578406d69676173736574732e636f6d00000c40416c65785f4d61737369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2a0c16700350d52421185b141843818f93549a95880537b331573bad5cddc5b42856740ef3d2546": "0x0000000000000000000000000000000000085a7a2e2e5a454e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2a2c140593529fde6d8480e3a48bbdf79da217e7e017b06513f25276f3474773d5cac5ccd7eb96a": "0x0000000000000000000000000000000000104c6f76656c792043617472696e6173000000196c6f76656c7963617472696e617340676d61696c2e636f6d0000104043617472696e61734c6f76656c79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2aa0fcea34ca1baca3fe10047d713cd9fab0a5e42e48ca47378781652f40f19edc6cd1fbe815e60": "0x000000000000000000000000000000000012636170656c696e686f732d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2ac9fe1e9a7f5470ec778d2cc791b2d30c6d1986418f864b5c5f9032b52c59083e48f77d8618001": "0x00000000000000000000000000000000000879646473626c6c0879646473626c6c1468747470733a2f2f79646473626c6c2e6f7267001f79646473626c6c5f7374616b696e674070726f746f6e6d61696c2e636f6d00000e4079646473626c6c5f4e504f53000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2ccbd867d990e4d2c17be94b5327001650a4bb5cea4a3673c99c9c55b1ca911ab72703b50d8a742": "0x000000000000000000000000000000000012446f744b7520506170657257616c6c657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2e76be759cb39c0f6a250b388d7fb1233e530d1d2a904ecc28ddd85d0c642e2012f9163cd496c65": "0x0000000000000000000000000000000000084167656e74313301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2e868baf7804149e881c372e5f6f2b82da4e8a08dfb2a2b463a02ee2228f4c3abb5515ca6a7ff1c": "0x00000000000000000000000000000000000b5468652042726f6b657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2f651117e3fd34c84bda1949a2b78bfc3b12dcc8f2c8e8822912efe0c693a23effaf7f3b54e9a5c": "0x040000000002000000000000000000000000000000000b4279746520766973746100000019636172646f6e616a6f636162656440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b2f76aa3ff10a37e84fc49ce30071ea611731838cc7736113c1ec68fbc47119be8a0805066df9b2b": "0x04010000000200000000000000000000000000000000134475646f3530207c20506172615370656c6c0d447573616e204d6f726861631d68747470733a2f2f6769746875622e636f6d2f706172617370656c6c00166475646f2e6d6f7268616340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3074442a3a8a9ae98e9edd65f5caf8136db93b2f8213f4f91637ee4facff286fd491f904d691f75": "0x04040000000100902f5009000000000000000000000000000000000000000000000000000000086d657472696b610d4d657472696b6120496e632e1768747470733a2f2f7777772e6d657472696b612e636f0010696e666f406d657472696b612e636f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b30a0d7012b77142a86620314a174486a9938856e3b939de3bcd73458780f542388be0cd66379e28": "0x04010000000200000000000000000000000000000000124b52414e412e5620f09f9a8020f09f8c9900001b406b72616e615f76656e74757265733a6d61747269782e6f726717737570706f7274406b72616e612e76656e7475726573000010406b72616e615f76656e7475726573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b341499a31d863421ebbb4642a0056d17938932a9c46aec001297bc51e0b4a9dc2a1eb730a9fe521": "0x00000000000000000000000000000000000101010117353275316a79737437327969406f706179712e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b342eacf1a7bb7924440fa58f447b221d6353497312ea0c1596f7d688b84fd0f55e68ed89c3f1827": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b34bc4a4815f0a13cde66d4751e5ba025658b0f605dddb25a3ed08c9dd54e597304ba7a139706e00": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000c5375625374616b65e29ca8094b796c65204c65650015406b796c65796f6f6e3a6d61747269782e6f7267116c6b796f6f6e40676d61696c2e636f6d000000000e4b796c65596f6f6e233339313200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b34d53e3735a0db2c0c2bbf240b3e8306ffe68dde3373cd1446bf162f8a09e2f259391f2764d0d39": "0x000000000000000000000000000000000015444543454e5452414c495a454420656e7469747900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b357e4ead78873ac2aa53f55efa82a9820f3c2569d4e52dc467475a1a11cfc9861ce5440316edb7a": "0x040000000002000000000000000000000000000000001056656761735f6c6966655f6d61696e001668747470733a2f2f76656761736c6966652e696f2f1440636372697330323a6d61747269782e6f72671876656761736c6966656d61696e40676d61696c2e636f6d0000094063637269736c76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3581561695f63fabce0e8afbf04533cc92ee13d29374cd930e1b65505e2b5d9d3ea672bb4512c1d": "0x00000000000000000000000000000000000a486920496d20426f62104a656c6c65206465205a77617274650000146a64657a776172746540676d61696c2e636f6d00000c404869496d426f6244434c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b35c78d2f5f8365e32df05004fe9cc14f3b60a5afc3533aaa519399dc75d5b65d338f3f497ffe156": "0x08000000000100902f50090000000000000000000000040000000100902f50090000000000000000000000000000000000000000000000000000000653796e746800000015796173696e2e73696c4079616e6465782e636f6d00000b4062757977696e726172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b35dce1f552fdc17f6e6c46211d81310a08c8b683a6cca98743ad98bd21447687b9f55aebaa9881c": "0x00000000000000000000000000000000000e53706972616c20536f757263650000001a73706972616c736f7572636531303840676d61696c2e636f6d00000e4053706972616c536f75726365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3873b7b002e1c99ee60b67ca3f293af1531a28c25fba9f970bcf4bdcf77181a4a707454d252ee47": "0x0000000000000000000000000000000000076d6c6962747900137777772e6d61726b6f7a7562616b2e636f6d0012746f5f7a7540686f746d61696c2e636f6d00001c68747470733a2f2f747769747465722e636f6d2f406d6c69627479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b38b581ee35eb27176d688692159d622d85ab2deed48eafc143c9678d34bc8e6b080f7676187f105": "0x0000000000000000000000000000000000084e594d45545641000015406e796d657476613a2e6d61747269782e6f726700000009406e796d65747661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3a116ce56e09a4ad6166cf88da98fb2caa21af4f23c89b489c65faf585fb0015f74bbaafca8ff01": "0x00000000000000000000000000000000000b7374616b65617765656200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3bbe235e317bb0ec8205518d8e268b0ff306b684cda2b22bb68c4ecbeea54f377fb9d1481699b3e": "0x00000000000000000000000000000000000666722e6f6d001a7777772e696e7374616772616d2e636f6d2f6e6f6e656d7963000f6d79636f6c40696e626f782e6c7600000f404d79636f6c4e65706574726f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3f32eef5a4f87c32658b40ec2b02f94d22dc082219558da0be0a3a902a9e33445a81fe75fd41e43": "0x00000000000000000000000000000000001647656d2048756e746572207c20524d524b204f2e47074b696572616e00000000000d40646567656e646f74636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b3f50e5d25996acc8c6c261024db524af0eb5c2f6a913875a2b1be99ae03f2e7ae461f1a62201648": "0x040100000002000000000000000000000000000000001053706865726520f09f87a6f09f87ba11454f53706865726520507479204c74641868747470733a2f2f7777772e656f7370686572652e696f1540726f7373636f39393a6d61747269782e6f726711726f737340656f7370686572652e696f00000d40656f7370686572655f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b40191c2f127f31a083c4c20b076d878baa0815fcfeb5f93a60d9ca7861413d6295ceced417ab876": "0x00000000000000000000000000000000000d4e69676854686f75676874730000001c6e6967687474686f75676874732e6e667440676d61696c2e636f6d000010404e6967687474686f75676874734e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b40757a983c744376e2a534e0403f363633ed63219a73fb31ba077f03fcc1a4818ade82dd77f9077": "0x00000000000000000000000000000000000d6e696b6b695f73756e73657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b40975722af3500702088d2b822148eedc93dc55bd7b4e890a44b783233aa936e9ff714df1fb2351": "0x000000000000000000000000000000000007576574657a32001568747470733a2f2f7777772e776574657a2e696f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4113e7993545da1482bd6f002eaa6a7affb7e570fbff9878771a213873c31dc6f5c20d15c10ce64": "0x00000000000000000000000000000000000c5577652043657272726f6e0016687474703a2f2f757765636572726f6e2e636f6d2f0014757765636572726f6e40676d61696c2e636f6d000007407577656365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b415242948e48c4af65b2541075f4ab6dd22df200f9a5d19a3c65ee8e16f10a04d390a33f9550c7e": "0x00000000000000000000000000000000000742726f736b6901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b42bd9796193505f78f29bdb93bce99ebfaf2d05f45e3b0cc5e20cc3655b00c7a87efd0714b6b221": "0x00000000000000000000000000000000000a677265657a626c6f67000d677265657a626c6f672e7275001361646d696e40677265657a626c6f672e727500000b40677265657a626c6f67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b444a082a34087094c1dbf673aeb1c17f8f51c2fdbeef84d02a33a8ed3f558ccd48b744a3a7dad7c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b448e5a7e01085b6d6f077ab8fa173ff524e3b4a8f7c4216cdc06bc76c3b620547a929b5ec6ea834": "0x00000000000000000000000000000000000c477265676720466972737400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b455b694dad128e9722c9b4173ba6950b862740bf60abb3b081012e3a5bed9e7ec139666f0690f1c": "0x00000000000000000000000000000000000f4d65746176657273654368696c64000000196d65746176657273656368696c6440676d61696c2e636f6d000010404d65746176657273654368696c64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b46f79823607ed8672ded8001e89fb9e5f2e7a9eb1913ab57211a7efc262a58b68c0af4db193f05c": "0x000000000000000000000000000000000012696c696120524d524b2047616c6c6572790000000e696c696140726d726b2e61707000000b40696c69615f6f6e6963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4736827e2622569824651190f1d20237fea2d5953bb53ec59df25d581e54f291d6978c9a8017741": "0x040000000002000000000000000000000000000000000d536d6172742043686f69636500000019736d61727476616c696461746f724070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4763e158852db7edea87703a49b3e2cd535dbb0187c3dc240dc585cedc7215d31b6f5b5e6be1309": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b47781cbd1ef364b044921f1a8a44f37ee55978961047fbeecc19c2529c73d367847ef04dbdfb852": "0x000000000000000000000000000000000007427562626c330000000000000a40536562636c653339000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b48b1b8f79a7433f88b9f3a722747e8f637b2583963ea7f1215adc8c75c3957554fdf92fcbfa5034": "0x040000000002000000000000000000000000000000000858616c616d75730000144078616c616d75733a6d61747269782e6f7267136b7573616d614078616c616d75732e78797a000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4d902a5e3ceaacbe2c0be196404087dd756eb35190f731531a6e66ab6a157d9e8755a0b1ce8157b": "0x04000000000200000000000000000000000000000000093832344d616d62610000001b3832346d616d62616e657665726f757440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4dfa73f600178ff3a9e64ec8308c39b8ec28ac2e7bb6e6eba1ca2fb8a87dc446e0fa3b232f84648": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4e729082bc0effa0c691601793de060491dab143dfae19f5f6413d4ce4c363637e5ceacb2836a4e": "0x04000000000200000000000000000000000000000000064c65656d6f000000166c65656d6f407468656368616f7364616f2e636f6d000009404c65656d6f5844000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4f035960b0d010c102ecd1c98119bb49b5fdcdde4160e597892cb30aa1aa3a40dafe3717e59a74a": "0x040500000002000000000000000000000000000000000e4e494b48494c2052414e4a414e0e4e494b48494c2052414e4a414e0000156e696b6c61626838313140676d61696c2e636f6d0000086e696b6c616268000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b4f0c4c16f8fc06e34d5e51cae79df0f3ee7229078ab968d7f9948de296c0fa8b5d92d574f269506": "0x00000000000000000000000000000000000a41746c616e7469636100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b52e4d96f225ba523ed709144add542687b9827a767b3291f991d568f2cb27662f0ffd5f55c74945": "0x00000000000000000000000000000000001243616c69737468656e696373627261696e0753696d6f6e651d687474703a2f2f7777772e76756c63616e6f6669746e6573732e6974001b696e666f4063616c69737468656e696373627261696e2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5421b6506f7f790ac59122f8bc8c527a8efde87156403558ea66ca0ef049cf3fa4f671f98517d61": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b552fbf6f1a1b77a86c3585c906e4928f030b4735d375cee0410db104908788133281b53533b5633": "0x00000000000000000000000000000000000853616e6368657a0000001473616e63687365706840676d61696c2e636f6d00000b4073616e63687a657068000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b56cbcafeb6c89004cd9ac314578bf2f172acdadfb93f39a59794ac258b7de50c38814f4187a5d35": "0x00000000000000000000000000000000000d6265726e61746665727265730e4265726e617420466572726573010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b574900a55849d7c2c30c7923251b4c2b6ac0a13589e931912e35672c525d05a9ccb48bc19a7db4c": "0x00000000000000000000000000000000000a43727970746f5349440000001563727970746f6f73696440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b584e1a4194b9d21fea234d679d4dc45e5e2373fec6e40659bf0e6918ff73502cea99ee7e7e9f750": "0x0400000000020000000000000000000000000000000010726f616473776974686f7574656e640000001774617469616e612e6d6b686e40676d61696c2e636f6d0000000015726f616473776974686f7574656e64233331303000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5857832389789b78af348b187a2e94f7dfcacc1de5c71b55f6ab8a50e75f0ac1a15baeebfd92e03": "0x0400000000020000000000000000000000000000000010472720457870656374204368616f7300000015672e756e69743234383140676d61696c2e636f6d00000b4067756e697433313234000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b59303ef0c9246ef0e58776f7b5ac468803ca692cda97289cbc6412e2c8dd832f30d74bd480f7529": "0x00000000000000000000000000000000000e736c696d74726164792e4e46540e736c696d74726164792e4e4654000018736c696d74726164792e4e46544070726f746f6e2e6d6500000e40736c696d74726164794e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5bfb9c15abda4d344fd0dd3c86f7bac5e3c502d08bd06add439cd568af4ae1399ad617764c84349": "0x00000000000000000000000000000000001a446f7473616d61204368726973746d6173204368617269747900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5c8f247935e6ce99e0bb283b2d2522a090d71d9c8fb484c7966d3e28b21bc513419ef7f70d6a563": "0x040000000002000000000000000000000000000000000a4a41434b464c415348000016406a61636b666c3473683a6d61747269782e6f72671a6a61636b666c617368374070726f746f6e6d61696c2e636f6d00000d404a61636b666c6173685f56000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5cbc9967f19afa3e295650fdd71d7046633b1fafd0881a3207719c573f17725fccddf854a8b5628": "0x040000000002000000000000000000000000000000000744617276696e0000184064617276696e30303532343a6d61747269782e6f72671664617276696e323238313640676d61696c2e636f6d0000104064616e7961706f7a6e79616b6f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5d2b4bc4d7b8aae7673bd5e6320b489eeefbfb7fc372b5aafc3955acdab0592bd1a5dd63b581376": "0x00000000000000000000000000000000000641544c303700000016646f6c61706f746f6b616e40676d61696c2e636f6d00000d40646f6c61706f746f6b616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b5dece0984444d31a0c077265fa8ebb05329c968fe13efc415460cc5c379fb392a652ac07c9c2f7d": "0x04000000000200000000000000000000000000000000125a6574657469632056616c696461746f7200001d407a65746574696376616c696461746f723a6d61747269782e6f72671e6f70657261746f72407a65746574696376616c696461746f722e636f6d000010405a6574696356616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b60b504a11ae006d8a26b6e4d6934f03e3f094197206bf224c8e863582b77c794141eef1719b2f60": "0x0000000000000000000000000000000000084d6f6f6e4d616e0101010100000b406d6f6f6e6d616e3831000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b61c69cf9ed79934d275000318be3386cdc343eb0d5dec56f65b8954a6946576b773e6eebc27e169": "0x000000000000000000000000000000000016425241204355454e5441204445205052554542415300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b62acaa32f7e218efcc5b90bc1891b7d905423f7a00ffb4e8f3d59aa97491b5a1d45b82548639936": "0x040000000002000000000000000000000000000000000a547574694672757469000000156b7573616d614074656c7574696f6e732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b62b777d8f1d409cc2533fecb62aa788edf60c15825bc7ecdb4516096007dd24b8a858d5c4434920": "0x0000000000000000000000000000000000054641444500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b63533e1e147f27d823265fcc4b6ca5e77e4fdeb4c6ff019564e3afa70a44edc1cbeb13a175dc365": "0x0000000000000000000000000000000000125374616d7020466f7220556b7261696e65125374616d7020466f7220556b7261696e65000000000011405374616d70466f72556b7261696e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b643ba1f89b73794ea3fb9aa4efc85db2a51959b1654caeb11576dededff098bf4692440e75cbf2b": "0x00000000000000000000000000000000000d43726970746f6d6973686b611cd09cd0b8d185d0b0d0b8d0bb20d0a0d0b0d0bad0bed0b2d0b8d18700001763726970746f6d6973686b614079616e6465782e727500000e4063726970746f6d6973686b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b672def05cb0d96f4e35d916c13e4bc55676d21e94120d4e27e10e1c9aa9e0fae59434ea8856817f": "0x00000000000000000000000000000000000847696c73616d610101010100000e406b736d767374686577726c64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b67386b3a2bca62fa6805c6dc7757cea227e11839257d4e24ad39520621e99e6016ee0e1907c3315": "0x08000000000100902f50090000000000000000000000010000000200000000000000000000000000000000034d430c4d61726b204372696e63650000156d61726b6372696e636540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b67f107771c3b26f78daf5556df89f21e14e2e07a132f523aba6a03c21792d14f7d41a5192c53453": "0x000000000000000000000000000000000019437265657079467269656e646c79436f6c6c656374697665001c68747470733a2f2f637265657079667269656e646c792e636f6d2f001f637265657079667269656e646c79636f6c6c65637469766540676d61696c000010404372656570794f726967696e616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b69333f8c0d86b1248c2f61e58783887d3652c07bc6bcddffa6373246c2f2b5270e7d5d3b57af315": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000105a6569746765697374204d696e65720d5a65697467656973742e706d1668747470733a2f2f7a65697467656973742e706d2f00106869407a65697467656973742e706d00000d405a6569746765697374504d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b69339fdfcab0d9f1cbf2d072567bdfeb00359e9d318e7b425a65449eb94b1a8f5ca0c28a9513878": "0x00000000000000000000000000000000000659616d6e650000000000000c406572615f6974616c6961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b69e21ddf4af61a05a89c086659b0ae940285ac34a75b3d1e846350f647cd7ac1236377fcd9d4405": "0x00000000000000000000000000000000000c496f616e5f54656d6e7565054976616e00001875736d766964656f363432324069636c6f75642e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b69ffb015d88545c0470d52d80c8f777e2a326e028444cedc0f910af3db5e49ca84751736d086f4a": "0x0000000000000000000000000000000000094c656e6f63686b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b6a30b89e64a46012419b405a61cdeb929bcc1883a7368b2fba867bd78ff4886800ab56b273ccb3f": "0x00000000000000000000000000000000000452757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b6c8b7052e61ea994437c8a23f1c5d221ddaaee441be0a9f38c638300e2805018abb4e72f7de753e": "0x00000000000000000000000000000000000b5073796368697465637401186c696e6b74722e65652f50737963686974656374417274010100000d40707379636869746563745f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b6cfd687de7a23b4d60cf655685824e9966b0a10c01dc8b17b37e24944fdd760e4dd73ff1dd4ac14": "0x040000000002000000000000000000000000000000000e416c74204f72646572204361700000001d616c742e6f726465722e6361704070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b6d97ff4578c0fe536fdcc8b78421a34a864a6a100bd9426c9f154381739a74f617b7f5988dced32": "0x0000000000000000000000000000000000114b6f6461446f745f7374657761726473001468747470733a2f2f6b6f6461646f742e78797a0000000009404b6f6461446f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b6ecd013f449a75f58f2f7dd26682082ccd78611deeeffb89b38bfe97fe95be7e2047cd8e346ad1d": "0x0401000000020000000000000000000000000000000005474465650c47656f726765732044696200174067656f726765736469623a6d61747269782e6f72671667656f726765732e64696240676d61696c2e636f6d00000d4067656f726765735f646962000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b6f81cd81eee83ee72559667d3ccc1f96dded8d17e6299c5ff111ae37d9aba73bc7e6cbb53e6dc0d": "0x0000000000000000000000000000000000105468652048756d616e2042697264730000000000000f4054686548756d616e4269726473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b70e7e870eb10773f4e890b0badca21d04941659525012545053c6fda2c75381553fb91394b8d92a": "0x000000000000000000000000000000000013466169746820416e6420496e647573747279011d68747470733a2f2f6661697468616e64696e6475737472792e636f6d01206661697468616e64696e6475737472794070726f746f6e6d61696c2e636f6d0000104066616974685f696e647573747279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b718fb63dc5e0eca26b4ebe12602aeb02aa9d74a361a687fda2155814b680edeeb26f5159cdce741": "0x00000000000000000000000000000000000d4a415649544f4152524f42410000000000000e406a617669746f6172726f6261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b71a89138784643960235425858d04422d3183b91e97c522d39b532a547065d395532b60542b752f": "0x04000000000200000000000000000000000000000000096b6f6b6f72696e390000001b6e696b6974612e642e736f626f6c657640676d61696c2e636f6d00000a404c61676172743073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b727995258469c869c9db3e7b4aa077d5df26c65a2f98f8fedc50f8cc445cd7cfc26a96ce57b9654": "0x0000000000000000000000000000000000047373730473737300000c737373407373732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7461dfb8eafd0dfeafe7afd0a43dbdf3ed4d2691aa15907978fe457ad52bc326be51cfa098dd865": "0x040100000002000000000000000000000000000000000e6d617274696e2e6a656e73656e164d617274696e204cc3b873657468204a656e73656e0020406d617274696e6c6f65736574686a656e73656e3a6d61747269782e6f72671e6d617274696e6c6f65736574686a656e73656e40676d61696c2e636f6d000010406d617274696e5f5f6a656e73656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7636fb25a038da49c78b621dbae80aa6797a28f752059eef1abd763dabda3595560a0348ff82e39": "0x080000000002020000000100000000000000000000000000000000000000000000000000000000000000000b5354414b452e5a4f4e4500000010696e666f407374616b652e7a6f6e65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b76acca59a92ef07ce072084c159fb3547381b718ac1660d14030e7bcbe9db68eef0f7c0e340f33b": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7792dfd8eea068b88b9e241d5bc525d51b2784a4545429311f373202a8fca5706ed6c49141b350a": "0x0000000000000000000000000000000000067265616c4d0000001369636f646f6a616b40676d61696c2e636f6d00000a404b614a6f446f4369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b787cc241627881d7edf6c4de505630a4dc222c9de78e78becb4bc08a72277ee786da979ed4d8075": "0x000000000000000000000000000000000006746569646500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b789289293d8c850dcf93493400b853ddb07cd0ddf190ac86817206c9ad23dfcd64a480384c8bc0d": "0x0000000000000000000000000000000000074d61726c657900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b78cbac72154fae87aa524afbdeb18aa240f0b09780fd634f24ef48d87e5f328cd7471766bfd4c7a": "0x00000000000000000000000000000000000979657668656e69790959657668656e697900001879657668656e6979333939393340676d61696c2e636f6d00000b406672756b7474616a6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b797ee954f7fdc00a0aa404a3a1178f1337564cf2a5a70db2819f832ba23c92346d6b74271928126": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000e5068616c61204e6574776f726b0e5068616c61204e6574776f726b1668747470733a2f2f7068616c612e6e6574776f726b0014776f726c64407068616c612e6e6574776f726b00000e405068616c614e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7ad4b1d953b9c6d84fc160fbb01b3a8dfee1ec843cf2e3c60cf7062de3c0a7614eb8d79c58dc46b": "0x0000000000000000000000000000000000056d696e6800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7b8b1b5a75ce20d524cf67b5db0c0e6a04d9509f1e6c980623094ad9e870adbd0a7a1b85a11e345": "0x00000000000000000000000000000000000c546f7276616c6420536f6e08546f7276616c6401010100000d40546f7276616c645f536f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7bec5191a59492f82230d13be153b9db2876a9b26c9e35486c41aa8c987eb16bcc8909a481b4257": "0x0000000000000000000000000000000000057534696101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7e08c50407adb61c00f8f18bd12975ae69a9b145cde3835109e4dfe2a18d7da51e98e54b62d703b": "0x0000000000000000000000000000000000084372696d58656e000000136372696d78656e3240676d61696c2e636f6d00000d404372696d58656e5a65726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7e95879065eb42bfcef3034912f1b6b1bbff67d362083286698d80defff9ab1ea0279da0fd2d83d": "0x00000000000000000000000000000000000b5468652043697263757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7f3be7246e94277d6ff0e9daf6baadc9aedaafad3db973385df8124cb0e35cf2d183c1539ed4109": "0x0000000000000000000000000000000000114d6175726963696f5f446f7453616d6100000000000011404d6175726963696f446f7453616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b7ffd9218f5ca5750e0797db0e2ae604c97ba48e3f3490ed781718d28e6c6162fcef61dca4d51404": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b80c4ca47b74cc28b425b49b63e7422dc709b51218af8f981f7d4dbc7745fb2e3b91a64ff3d80570": "0x000000000000000000000000000000000009466f73666f726f73001b696e7374616772616d2e636f6d2f666f73666f726f732e6e6674001e616e647279757368612e66726f6c6f762e393340676d61696c2e636f6d00000d40466f73666f726f734e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8114461fdcaf8d8046b4467eec7e673d63c621a3e9cac72b515014c74f9046de1caf79ff798f23b": "0x00000000000000000000000000000000000c496e64696365735f4e465400000016696e64696365735f6e66744070726f746f6e2e6d6500000d40496e64696365735f4e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8131ca67ebf42dda6addc873dab36ed63418ecfcaf4e40f6ab30badeae2cae08c5b307d3527eb4d": "0x0000000000000000000000000000000000134b7573616d61204672616e2079204661637500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b81a60ef7174fcff4adaa68a6139ecce46e6f5fa0608f3c60d34787bd25d7a57f1a49e42c935c315": "0x080000000002040000000100902f50090000000000000000000000000000000000000000000000000000000c416c65785f4d6178616f6e000016407361736861313938333a6d61747269782e6f72671f616c6578616e6465722e61726b6869706f76383340676d61696c2e636f6d00000d405361736861313830383833000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b81b10d0eaa7b26976729e17ad31469debcb60f3ce3622f79143e442e77b58d6e2195d9ea998680d": "0x040200000002000000000000000000000000000000000b4d61746857616c6c65740b4d61746857616c6c65741b68747470733a2f2f7777772e6d61746877616c6c65742e6f7267001568656c6c6f406d61746877616c6c65742e6f726700000c404d61746857616c6c6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b825d933ae3512dfb6dd45ba18e564b4aa812a9974ce45e71d51355d2d93335d22f6804d782cf43b": "0x00000000000000000000000000000000001d597572694e6f6e6475616c207c20524d524b20636f6c6c6563746f720009726d726b2e61707000167975726970657475736b6f40676d61696c2e636f6d00000d405975726970657475736b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b82ca38b993a4d8b5a7aaed28c23b0b10d2fc6a0a914c93ce965749d67d7f657facb010255e4852e": "0x040000000002000000000000000000000000000000000a5374617475746f7279000000196d697368616b656c6d616e37373740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8a088107fc00e82440ca03d91b4a7a9ac7f74d416e1ed29899ae32c2ac81fd5380f8a07e3713812": "0x0000000000000000000000000000000000084e6168204e6168000000116e61686e616840676d61696c2e636f6d000008404e61684e6168000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8a497e0503c1d16bc063e9ffcd1f15193240f7ce33e9ae2faf17345ea06cc4781208e4a4585cd46": "0x00000000000000000000000000000000000e756e636c6520676f72696c6c6105616c657800000000000a4070616f6b34616c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8b5006d5797640e6e753aa0bf6a3699bf1820cd8cb87cd1fd7c88d0c3e9c194a5055bbf6d338047": "0x00000000000000000000000000000000000d53656372657420416c69656e0000001473637274616c69656e40676d61696c2e636f6d00000b4073637274616c69656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8dd952c3de3ccebca83919d5d59734897305b32ff1eeb190fa168b7a8f10d613a5fa9067c708f7f": "0x00000000000000000000000000000000000744616d69656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8dec3cd52567f7d50deac6bb330e0370fb0f6e25693717ed7c05ae1d43c22b93e9ec5814e318d25": "0x00000000000000000000000000000000000564616e6b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8e12a80176f0c830aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b": "0x04020000000200000000000000000000000000000000114272756e6f207c20524d524b2e6170700e4272756e6f20c5a06b766f72631d6170702e737562736f6369616c2e6e6574776f726b2f406272756e6f154062697466616c6c733a6d61747269782e6f7267136272756e6f4062697466616c6c732e636f6d00000a4062697466616c6c73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b8ed6b693822d4a77825b33ec8baf2d437c19856a6ce74f09bbf49c284602a18ecc0683874dd596e": "0x0400000000020000000000000000000000000000000012736e66206b736d2076616c696461746f7210496e666f73656320436f6e73756c741c68747470733a2f2f696e666f7365632d636f6e73756c742e636f6d001d69687562616e6f7640696e666f7365632d636f6e73756c742e636f6d00000a40736e696666736b69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b902e56a5ec842fbc8018be75da4c5757d622874c1dd478950b27baff9b50ca4c0e7670c237f626d": "0x040500000002000000000000000000000000000000000a77336e3a657269636b0c457269636b2052616d6f7300001577336e657269636b40686f746d61696c2e636f6d00000a4077336e657269636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9206afde78e38223a154cb2e55ed80b9b671b240ccf20a8e2a47a7097a61f156eaebdc98fe4780a": "0x040000000002000000000000000000000000000000000a4d616964616e5f5541000016406d616964616e2e65763a6d61747269782e6f7267176d616964616e2e657668656e40676d61696c2e636f6d00000c4059657668656e69694d31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9467b909c56e93efc49c631023463a74ee7b3a3294cfc62479ed9879d7b96cbac4b31cc480bfd68": "0x0400000000020000000000000000000000000000000008494e5349474854000016407368696e79666f696c3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9541ad999d600439c2010321b6f64024b485ffcb9c2c6218bc6baae3b30ee2edce121033c4e443a": "0x0000000000000000000000000000000000074a617a7a75730d416e6472c3a920446962c3a9127777772e6b616d65616c6162732e636f6d0014616e647265406b616d65616c6162732e636f6d00000c40616e6472655f64696265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b96d7c19d50508c4cea875e1a4dc1d17e8f7a389467ce388a27f4e6bf47d48bee57490922ea64764": "0x00000000000000000000000000000000000e5361736169204b756461736169000000000000114053617361695f5f5f4b756461736169000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b96fec1148c50fd53277094fa10fb120ac35dc09a0b57ad3509699366dd95c36c79390832dd1d978": "0x0000000000000000000000000000000000094e61726973657469000000196368616e752e6e6172697365746940676d61696c2e636f6d00000f404368616e753436313836313331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9792ddb83a0fbf980a42994e6266629750cb091d1cd6abd99b9f8371d7ac1c9572fbff31a9fd108": "0x00000000000000000000000000000000000866756e6779737300167777772e6c696e6b74722e65652f66756e6779737300000000094066756e67797373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b982d49de1e3d631c6423f3a139fc55c4cea94f27c7472a1ff86c9d7a160b750425d1182bfd83858": "0x00000000000000000000000000000000000c546f6e694d6f6e74616e6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b982dbb2e3c6ee865ac0bc1423595a61eac2804e8007dd17c6106c9f3153210ea9a7646d486da513": "0x00000000000000000000000000000000000b43727970746f476f6c6600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9840b5e244be97a3c2ebd0507647e389d89069d87d98594c0390f15b774ad70d69a506cc0721262": "0x00000000000000000000000000000000000b43727970746f2e4c69750ae58898e4b89ce6988a1a68747470733a2f2f7777772e696d616e676f646f632e636f6d011364686c69752e616940676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b989abb8037b868632cd5ca83f4f70c0570b608c91253f4ec8bb7aef34d6ea23813268a08be1f50b": "0x00000000000000000000000000000000000544415a5a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9ba5adedd76a0a63443089409ef5b3fe6fe1e79bca1ed3f035b35af2353cf6f9036b598c852cd74": "0x00000000000000000000000000000000000f706f6c6b61206d6574616d61736b0000001161656b6d656e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9be7b84d6056f5f427dbf56380f49793c83aa5a8e7a4f577be76293593a99b3b3c21e47d3821e36": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9d502fce7c93459067e77e8ffec0eb4beddd71651aae4ca9f05dfe519e5a83745103c15abe7556c": "0x0000000000000000000000000000000000076b656e6c73740000001531336b656e7473756e6740676d61696c2e636f6d00000b4030785f6b656e6c7374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9ef95a6cf7ae500d20b07471e8891d2417c00839dab57c278bd59e855b8c0ce5e7d75bd48dcb303": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000006786e30306200001a40683474743072692d68347878303a6d61747269782e6f72670d6b7535346d3440706d2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9f6138c9463794508379206f81bebd18953ff826599e0b8c0bceedfc72a996c52e343647f0d625a": "0x040200000002000000000000000000000000000000000d47656e657369732d4e6f64650000134076306964756d3a6d61747269782e6f72671e6b7573616d612e67656e657369732e6e6f646540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9f65131235fe195ce5c65fecd7bb733ee636a381fa9dd916f8cca91e2e403c8aea2f7ed32b31d68": "0x00000000000000000000000000000000000c424c41434b4d4952524f5200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b9fa90bddc30fe5cbe29ae471fd4b81a6efb3dc6bc7fe4b65b52d646e24373b4237613322099e63e": "0x0000000000000000000000000000000000065374616e6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba17b7a7c96751bad490a44a398ef9ddb3d9fc9159ee9211cad8b42ed24378fc8ec6a2051559ba4d": "0x0000000000000000000000000000000000096e616d656c65737300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba2e001c3fdf3cc590980036ef824bdf5e58efd3a0bcfd3b9ce9a6d08584a5aa4631f0fecdec287e": "0x00000000000000000000000000000000000c466f726573742047756d7000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba3272263a601b26705bed5a79303588fb60600fff425e0d0c1129332c341a9f28af16f70a0d0072": "0x00000000000000000000000000000000000c43657361722059616775650c43657361722059616775651668747470733a2f2f636573617279616775652e65730016656c667265736f6e65726f40676d61696c2e636f6d00000f4063657361727961677565617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba34277ae1163be29c81bfa3aff6c4db81aa876fd24384ff7147fe58fdecae448ac4c2591235042c": "0x00000000000000000000000000000000000c494e54454752414c5f31380f494c5941204b555a4e4554534f561e7777772e696e7374616772616d2e636f6d2f696e74656772616c5f31380012646a6e6176767940676d61696c2e636f6d00001040496e74656772616c50737963686f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba39954813b8c8e0c835ecd271a6b07d93931cdc3ed8f1501cb15130db011c1e1e19bd229bd0827d": "0x04000000000200000000000000000000000000000000136c616e6465726f73207c205374616b655570001668747470733a2f2f7374616b6575702e746563682f15406c616e6465726f733a6d61747269782e6f7267156c616e6465726f73756140676d61696c2e636f6d00000d406c616e6465726f7375615f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba4212be20da972e4601d5e1601ee14b4ab46a8db6841f6165e7af0a05f91dcf5625c56b88294e51": "0x00000000000000000000000000000000000753617676615412536176766174697920496c79756b68696e0000187a656c6761646973657865313340676d61696c2e636f6d00000a40695f536176766154000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba4a9572710e11eae4b3182c87d1d282b76398757c96af32377066b3941fa21a038885dbffeb027e": "0x000000000000000000000000000000000013524d524b2050756e6b732053657276696365001768747470733a2f2f63616e6172796e6573742e696f2f001652656d61726b50756e6b7340676d61696c2e636f6d00000d4052656d61726b50756e6b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba57612f37ff87d8c0f6272125c7aa7259ab82cafc9e7f170102cc50818299a90a5807debfdb0957": "0x0400000000020000000000000000000000000000000009676c6562616e797900001840676c6562616e79797979793a6d61747269782e6f726716676c656270656e6b696e3840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba594f7276ff200c4e531ab22f712634089201978511b49aa987322314dcd8f16fa241f0055e3737": "0x04000000000200000000000000000000000000000000094172696e676f74790000001674307468656d6f306f6e6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba5e9cf778fa9a309ee26710c447115a1467aa6cddcb5b11a450522fe50f8c328ad7018ca3ca5109": "0x040000000002000000000000000000000000000000000a57494e2d5354414b450000001677696e3737377374616b6540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba67fb7fc8a0aa49a6915d6fb30cd30367f23194c68842a6018f565c773ea0c544eb2a62597b1b34": "0x040300000002000000000000000000000000000000000b4c696562692054656368184c6965626920546563686e6f6c6f67696573204c74642e1268747470733a2f2f6c696562692e636f6d001068656c6c6f406c696562692e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba6839973e6e9ad1e2a0a933d2b1e2dfd0c06baf42557bf4aa2ad84866859e6c869733d6baadf152": "0x040400000002000000000000000000000000000000000c637279707445676f642d31000000147761796e6f3733333740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba91bba06b9f9bc520214ae0372ce9446bff0c4b6c1d56b8d5f8bedd43e563d12dd888e910a67069": "0x000000000000000000000000000000000011f09d9488f09d94a9f09d94a6f09d94a405456c696110656c69612d6f7273696e692e636f6d0018656c69612e6f7273696e6940686f746d61696c2e636f6d00000a40656c69675f5f5f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ba9c47cbe1e3127fc6f159cc01916d03e79dd23ddb4f32bc3505f47f99548b36c8dd85cb3d703f17": "0x00000000000000000000000000000000000773686f6e79611253686f687261742042616773686979657600001673686f6e79616d63636f7940676d61696c2e636f6d0000104073686f6e79613036343734373836000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714baa78287fb8b42a5f89cdade39dc2b7f42cd668be4a3aabfa432524f9732ec2b38362ad8b6b6d17e": "0x00000000000000000000000000000000000f5468655265616c4973696c64757200000000000010405468655265616c4973696c647572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bacc123aba961dfdac7c228c0c2f9f8bd69a79694a21c0aaa11fa0bdffb8a24f8a2b2c7c71dd4464": "0x000000000000000000000000000000000008616c657867676800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bad35515a8d5aa0ce26cc8ecc7230bf0579be3d530cfcd6cfe8e18f560a20bb651dcd4bc5877c442": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f353100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bad85d54508d6840b433c85404bf9625fccfe9f33ea14dc941c5f2d33a2ee131b462526ed834365a": "0x00000000000000000000000000000000000c546174617461205465616d0c546174617461205465616d000013736179656e34696b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714badc22310930427ba763de880dfe6c4bbdad18fab60e27002f648c221df5248b7d44a575b4bc7342": "0x04000000000200000000000000000000000000000000054d6f626200001240316d6f62623a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714badd0717f1d37bea9a351f499b0c0ad66910f50ad9b28097a671da936b170ac23440194c803b8c2f": "0x0000000000000000000000000000000000000000000000000d40766974796163727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714baf2344ffd48e8ba62b57bdeb1e972c6f82ddeac93c75c9068b57649792c34110443f6a5cab2757b": "0x000000000000000000000000000000000006646c73393306446f742d58000016646c7340646973706f7274656c65636f6d2e6e657400000840646c736d7173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714baf41e8958962423603c30a2fec5564ad9ab97b2545ea990e3c1e6ad80537b9f49ee5ea077c37a29": "0x00000000000000000000000000000000000f63616c69636f666c616d696e676f00000000000011406d65746170686f7269636472796674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb0178d1513af2c9c8aa860ecfe404cee1ae6ae1e175966ffc5d0ed9518febe66c949472d9ccea52": "0x00000000000000000000000000000000000954616c69736d616e0954616c69736d616e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb146d7c8d93ce7a7874637d61f8a35d5cc1f042c93a1eac375025b66d469df55822b40d374a146e": "0x00000000000000000000000000000000000f4c697a692050616c6b696e697a6900000000000010406c697a695f70616c6b696e697a69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb1a60ea00d6b485d26dde9e6d3cce0d69ae970d6d9ea7c3a5e39c197fc4360a063f68da22df3c30": "0x000000000000000000000000000000000008566f6c6174696c054e69636f000015766f6c6174696c64756240676d61696c2e636f6d00000d40766f6c6174696c64756273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb23b116b16ec5027ef5168fd3e20f6dd7063f3d7654fa986e326da23f6132acadddcd47c2fb7634": "0x00000000000000000000000000000000000b617065586368696d707a001c68747470733a2f2f7777772e617065786368696d707a2e636f6d2f0015746f75636840617065786368696d707a2e636f6d00000c40617065586368696d707a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb316e0c469f968b5064b971aae8c27d90e75935176851e03c3b30d7737a81b4ebaafae61e86e008": "0x0000000000000000000000000000000000064a756c69650d4a756c6965616e6e65204e672168747470733a2f2f696e73746167722e616d2f6a756c6965616e6e653139393400186a756c6965616e6e653032323040676d61696c2e636f6d00000d404e674a756c6965616e6e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb3c046d0a6fb474e0084f5bd539e9f109706deacc25d346a52b1c61870f5f47d80b65defb7c9174": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f33370f62696e616e63655f6b736d5f3337000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb439f2ecc149015560189524f9e8a5a319945ba02d9696b8e17068709af4f3a3b37961b21b73a25": "0x00000000000000000000000000000000000f4c7575752040204576726c6f6f74064c75636173107777772e6576726c6f6f742e636f6d00116c757575406576726c6f6f742e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb5235e6238a13f3f496e79339df9183c3498406c6a885d6b381e33eeca4fb217751cf02fcfe1d72": "0x00000000000000000000000000000000000f4a5755204368616f7320323032310a4a757374696e20577513687474703a2f2f4368616f73436f6e2e696f00166a757374696e406465666973756d6d69742e636f6d00000b406368616f735f636f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb5ac47891b1706c02182bd1df5c617cd764a92111372e138c8f2de893e2870e1ba6798b69629e65": "0x00000000000000000000000000000000000654616e6b610f54657469616e61204b6c796d616e00001874657469616e616b6c796d616e40676d61696c2e636f6d00000b407468655f74616e6b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb6fb2c1a1cf337b7ed3dd1132e1f216cb30c2440b46423faf32c6effd0a2d9a9f24e52f57af6677": "0x040000000002000000000000000000000000000000000b4c415552454e5454524b000000186c617572656e742e747572656b40676d61696c2e636f6d00000c406c617572656e7474726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb90b6ee5cde60ba10a769ca3066979c556735c449cffae412f7ba4bb7f8eb1377e0b3f11a8f144b": "0x000000000000000000000000000000000004416c7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bb98a2562e4cc62d54c768b91070d322e396886d9ba5fbb6d75ba6d04b244ba8efc1c318b3591b52": "0x00000000000000000000000000000000000e62616e6461692d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbb543598a54ca6b9c974e668dd5d28bd12df4e36aabde599fa1623ee8b97811dbfde761fe762857": "0x0000000000000000000000000000000000085361757261626800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbc7bd73b2748c6f96672955216c27e79001bf18f21b977f2765ef1d0f2aa2f037725ba051311537": "0x00000000000000000000000000000000000d535550455220504958454c530000000000000e405355504552504958454c5378000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbcb83d90d25faefbadef2fe7ed3061a98b743c923501b7e196735e1a8bd1f066b1c3c960511445a": "0x000000000000000000000000000000000016f09fa4b5f09f8fbbe2808de29982efb88ff09f90900000000000000d406d725f5f77686f676f6174000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbd9f3a4a489a29e46b99e4f0ae2bfa4a719980c7833c4fc1a6f78fd8b4ea4aef68a036e6ba4b845": "0x000000000000000000000000000000000007656d65656e610000000000000940656d65656e6134000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbdd44aa00ffeb9790174218ad9d5531fc97c3b347e073d347d157cc40a470ad89b75604b0d9dc33": "0x0401000000020000000000000000000000000000000012546f6d61737a2050616e7461205268656910546f6d61737a205761737a637a796b1568747470733a2f2f7761737a637a796b2e636f6d1b40746f6d61737a7761737a637a796b3a6d61747269782e6f726714746f6d61737a407761737a637a796b2e636f6d00001040746f6d61737a7761737a637a796b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbe6cdadc6b5f81166abfdc8c3f01b4913bb09c1690b3ad15179ad20fb3e1f46d90e0104ea90951b": "0x040100000002000000000000000000000000000000000b4e69636b20536d6974680f4e6963686f6c617320536d6974681768747470733a2f2f6e69636b736d6974682e78797a2f00196e69636b2e63616d2e736d69746840676d61696c2e636f6d00000e406e69636b63616d736d697468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbf2c08ccad2373618270c23416bc290f3e029234130076858ec2b13753249521efc90f74ae62656": "0x040100000002000000000000000000000000000000000a53696c7665726561751053796c7661696e20436f726d69657200164073696c7665726561753a6d61747269782e6f72671c73796c7661696e636f726d6965724063726970746578742e636f6d00000b4073696c766572656175000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bbfce08e9e5bda94e2cd3cc85125534b5ea71b50545fea6da949704fc53b8ad0fa6a6e53c1e8b60d": "0x000000000000000000000000000000000007544f544f544f000000107a6a6b32343030403136332e636f6d00000c407a686f756a69616b7569000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc013d27fd77c44a621062161709870a2adfa220222901a2eacfeecc3a4d57ec0ceb0892770f4d31": "0x040000000002000000000000000000000000000000000a4d6568616e696b6f7200000016706f6d69646f6572696b7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc11b42293c053bb8aaaccc15d1e83263b6f51805be7a175838e9039d93a4c510954d03b8928fc51": "0x000000000000000000000000000000000004616e740847756f204b616900000e6875616e666f4071712e636f6d000008406875616e666f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc2d8754336d8fa7da2b89ee8960496527b6374ec753a1f5fda3e39e9e9b03d9badfb4bccf6e8f56": "0x00000000000000000000000000000000000742696f4172740101011362696f617274383940676d61696c2e636f6d00000e4042696f4172744c6561677565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc39f04eeba5e074def7e734f3e6f486dab2052f0ec6f574424cfbabc1d9f8c707c831398bad520a": "0x000000000000000000000000000000000008416e74616c657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc547c1424fb130ccc26f3f343300ea20b4ce386372382e3d33e9ece9a27e0a01fa995338c0f651d": "0x0000000000000000000000000000000000055155455300000000000011406369676172696c6c6f6f7074696d6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc668f7dfbaa59cb02d7a8a8876312537dcdef0ccc8d7aa11011b1e95d82e0d4be84f40b5e97537b": "0x00000000000000000000000000000000000864796e616d694b0101010100000c4064796e616d696b756e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc6b5bdca0cef0328e80f01c037bbec2db122fbd54406add4e7876dad507df9686a4602bf41cf664": "0x040000000002000000000000000000000000000000000c59657668656e5f56616c3200001a4079657668656e626173617261623a6d61747269782e6f72671a657667656e69792e6261736172616240676d61696c2e636f6d000011406768366d786a78384f437754776373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc737a0b2b1b692a444c69e29645f58dc986ea6c666c7d6fa7183d0e517d9bf72bdc4f642d38c163": "0x00000000000000000000000000000000000d426561726f667468656e657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc7dd41f6fa996306a36dac17180d46bcf920c75b4e77f8000639ff41f6e55f2232a7650002c2934": "0x00000000000000000000000000000000000d576f6e6465722057696c647300187777772e6a6572656d7962616b6572617274732e636f6d0020776f6e64657277696c6473406a6572656d7962616b6572617274732e636f6d00000a404a6572627a576565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc95df3416acfce29ec982d60f3779d8f0043933ee6d1b2a4346df17d07e44a22a2cd91a31076352": "0x04000000000200000000000000000000000000000000076f726469616e001a68747470733a2f2f6769746875622e636f6d2f6f726469616e0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc9c5c7658dc2a36b45071647184e1df1afe1d9165a5762fb9b986c4041f744c95c15fbd55359951": "0x0000000000000000000000000000000000104d72204b7573616d612f5041424c4f0e537562737472616e617574732011737562737472616e617574732e636f6d00146a756e65736e74776b40676d61696c2e636f6d00000a406d726b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bc9fa9104384658136e4b176f4f8c8e93d1f038c4ad53d6ce6308764888af81d0b2acc9903f59a3d": "0x000000000000000000000000000000000010756e6a6f626265645f63616e61727901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bca25b49658f3abbc422e2ea493a1dcbb08fe47a38b7a06ff11372588ff78f041e2dec92932a274e": "0x00000000000000000000000000000000000a4a6f73616e6b4e4654001e68747470733a2f2f747769747465722e636f6d2f5468654a6f73616e6b00196a6f73616e6b4e46544070726f746f6e6d61696c2e636f6d00000b405468654a6f73616e6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bca4e93e46a1ee7a83c75b56557a84fe8261cadc0c308577b0709cdc54311afc5ec8d348b939f589": "0x000000000000000000000000000000000010416c69616e7a612048697370616e6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bcc32e782ecc9fabd8cd80b17fc41772945cde33054bcf50ba34a036208b9799414c92a187742226": "0x00000000000000000000000000000000000e436f736d6963204a65737465720e54696d20566572686f6576656e177777772e636f736d69636a657374657233332e636f6d0016696e666f4074696d2d766572686f6576656e2e626500001040636f736d69636a65737465723333000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bcd1f1445ae81362c8dee77020353131d4765e808b2c6cc7b6210eb6fcd3124ae83425c4fc054b69": "0x0000000000000000000000000000000000074d696368616c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bcde3d13baf8df94629a1162629bfa1c1b9291bdb4cd489a90b996ae15af912e8eaa384967b23668": "0x00000000000000000000000000000000000b446f75626c652044656500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bce3132e4ef55facd425daddf60b2545e07c695d32d6bea2b9343f1528052b4edd1a777e93058565": "0x040000000002000000000000000000000000000000000b416c7363616c61626c6500000017616c6973616261626c6572744070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bceadde40165af33fe5a9cca6c5a8bd14c35c961d2a673268d204c2c36d15ab86335ea7954a8e963": "0x00000000000000000000000000000000000e50756e6b205661756c7420233600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bcf5cae0679b87b9aa192026f9edadc2b37b96a189bb52a799bc6b81c38af03294269f4f1f40371a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bcfdd67ea673f1f2641768da63aab1ad01b2ffed1a44b41c4475f3efdcb74d1e45cf3c490db0c11b": "0x040500000002000000000000000000000000000000000b7863526f6d312e646f74077863526f6d310000167863526f6d314070726f746f6e6d61696c2e636f6d00000a40726f6d315f646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd003bec2e6f36549a303844f021a011c22d653fb6259b4b8fab1d68b0c0874b185583da201bdf28": "0x000000000000000000000000000000000008507368656b656b08507368656b656b00000000000940507368656b656b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd07137d6081d8b92430a1698a57e4e339ecb9de55ad5673044714661b246edb2c1ea5a2646d9c73": "0x00000000000000000000000000000000000a4d61696b306c5f303000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd136d88ba01ae124af9159027de5ea1662da355ea7cbe3fe413d6531e07aa239d1ba6d9a1c09b12": "0x000000000000000000000000000000000008526f62737465720000000000000a403030375f526f626a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd1575bcc84ab1311010f8f677bbac23220af0b0ac65736ebc00b02e974963a5d006d266bdaf955e": "0x0000000000000000000000000000000000074e756e7a696f00000017616e6e756e7a6961746f636f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd17f907497d7c56a0cb11fa6afcf3be8012015df4a96a7b2020cd7271718a05f8a51027af726971": "0x000000000000000000000000000000000009427275736f66657209427275736f6665721d68747470733a2f2f747769747465722e636f6d2f627275736f66657200216272756e6f736f61726573666572726569726139323940676d61696c2e636f6d00000a40627275736f666572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd2ecf6ad5d9dd9aee019d37459e8eed15e0f5009e508c41af67a4e7be45b790cd9e62d9033dfd5c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd3136476e89f2d1688a4b3d49b7fa3e1587f8a8e3b445c7c3e830d524a6dc0bfd89a0f8627a6f08": "0x00000000000000000000000000000000000b616e746f6e6169796c790101010100000c40616e746f6e6961796c79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd39bcb26e4bbeaf9e5d65b57e68b695519207678cf4e14f3311e3b37918551b2859fa20acf5d538": "0x00000000000000000000000000000000000f4a6173654d61746963546f73686900000000000010406175737369657061727479626f79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd3a85fb653543aea882853228a1b570c5461bca6cd0457e2c8fa58c6aa52aa78f29bd5ecaf3513c": "0x000000000000000000000000000000000004544a420654796c65720101166a62743432324070726f746f6e6d61696c2e636f6d00000b40746a616d6573313435000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd3e1f96cf2e126e7054e5eabbdb6217217110e775a6f6f0b90c7ae2ca9effeaa9364eebd4eb206e": "0x040000000002000000000000000000000000000000000b48657865722d6e6f6465000018407370656c6c6361737465723a6d61747269782e6f72671f7370656c6c6361737465722e6e6f64654070726f746f6e6d61696c2e6368000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd728b26f60d3178f0fe1b04915cf406ce80faca3c18fda01d62d2ce52181870c984fb91c3a7df17": "0x040000000002000000000000000000000000000000000b5361746f79616d612031001b68747470733a2f2f7777772e7361746f79616d612e746563682f00197361746f79616d612e7374616b6540676d61696c2e636f6d000010407361746f79616d615f7374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd73eac9321df2b4bcb330a49b5766dcd63fff92cf95243ec2a29c4131f19155724095e5cfd5197a": "0x08000000000100902f50090000000000000000000000040000000100902f50090000000000000000000000000000000000000000000000000000000d47726567207c2041737461720f477265676f7279204c756e6561752068747470733a2f2f706f6c6b6176657273652e636f6d2f40677265676f72790013677265674061737461722e6e6574776f726b00000f404c756e656175477265676f7279000a68656c6f233331393400", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd7cb7fed15797d09eaf21efa0b5543ff7a8f857e47440732a45b5e8a5089741c02b56df13410944": "0x000000000000000000000000000000000018524d524b20537570706f7274207c2056656c696e6f766101010113636872697374696e6140726d726b2e617070000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bd922ee4590a662b5220aaa3db247e52267f6c127eb427c31e5a6a73cdcfda6b2c716f945527780b": "0x00000000000000000000000000000000002150656e64756c756d204b7573616d6120436f72706f726174652057616c6c65741950656e64756c756d20446576656c6f706d656e74204c74641b68747470733a2f2f70656e64756c756d636861696e2e6f72672f001c636f6d6d756e6974794070656e64756c756d636861696e2e6f72670000104070656e64756c756d5f636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bdaa6fd826d3e849dac5c7f54060315d58706b0956b5ba06ee5418f9c6ef558a7d95446c29d0e73c": "0x00000000000000000000000000000000000b617065586368696d707a001d68747470733a2f2f6c696e6b74722e65652f617065586368696d707a0015746f75636840617065786368696d707a2e636f6d00000c40617065586368696d707a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bdb707c454d386493ed4491f24c65d4af76d353ac2932457ddaf3d27df87ffa4445ea40f979b9c60": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bdb8c60de2e112d532d982ef0b332719d3a292188fef7138daa785a5c1a3d3d55eff4cdc71eb5069": "0x04000000000200000000000000000000000000000000094c6f6e674e6f64650000001c6c6f6e676e6f646576616c696461746f7240676d61696c2e636f6d00000b406c6f6e675f6e6f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bdd0aa5b808b0d34b437f703710d52aed228ae7f941f8e08b32edde56e683dcc94664c3dc8622e02": "0x0000000000000000000000000000000000114d65726b6c65426f74204d696e746572124d324d2045636f6e6f6d792c20496e632e1768747470733a2f2f6d65726b6c65626f742e636f6d2f000000000b404d65726b6c65423074000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bdd53ac7ebda26846230b351838edf68965d65538b501241b45871b5e0c20414e8fbae73dfda2a34": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000009436f696e57696b690000154077696c6c6e6176693a6d61747269782e6f7267113139393230343639324071712e636f6d00000f40636f696e77696b697065646961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bded1c61bcf50ff15615825944703a7f9494aa2901e4bad051e2f06763f755a3b010c887be77fd73": "0x00000000000000000000000000000000000b4178616e746173616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bdff2bb6b49fe71dc0125eaddaf1645d52cad388414ee3d814aab298a97d670d1d5172d4f5b8db0c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be092d7e5aeb9a7802948b18cd5001e68a33499343bd8ed974fc8398bbfdc3dfafbc7c478544f67d": "0x0401000000020000000000000000000000000000000006696c67696f001468747470733a2f2f706f6f6c67696f2e636f6d1240696c67696f3a6d61747269782e6f726712696c67696f40706f6f6c67696f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be3183951dd1f1d5e626934768e68509f3b657372165e6f98fdefe615cc8e669d5bbe033a6478556": "0x040000000002000000000000000000000000000000000bf09f9491204b65697468000018406b656974683a6d61747269782e7061726974792e696f106b65697468407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be3990dcba28e51a80dea82a6a4704d208bd43d1ea1d5a0bd97a9d20c5237beb348be8c82f37d93c": "0x0000000000000000000000000000000000104d617274696e20f09f8cbbf09f8c9e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be3a70de3dc8981a02098b5f718885f0d6f0f18359a7d16b44c9229857934efe66daf4d9f0eb7a43": "0x04000000000200000000000000000000000000000000084e6f646561737900001540637261626265616e3a6d61747269782e6f72671577656e7a686968616f406269746f7069612e636e000009404e6f6465617379000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be41c254bc739ae910473e87fb3a40efd144767bd4a2b66c551947290d28eb81798dfcaa2981c134": "0x00000000000000000000000000000000000d4d657461204c696d697465640c4375616e205361757465720000156375616e73617574657240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be67a4a924a2f024ae7c2e1a07ea367f42d8a50cc1b05e67313b2d0961a176bc914ce5418093a816": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be6eb4fcd98b5e48225f2459239641fc50300041f8980fa044cb07705db61fefb340804172b1c25d": "0x040000000002000000000000000000000000000000000f43726f75746f6e4469676974616c00001540746f7861333333333a6d61747269782e6f72671763726f75746f6e6469676974616c40616f6c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be87f9c4b210b250122ff96f07bd9c9b3961c4387d71362315d05addda58f1dcce642888a643f930": "0x00000000000000000000000000000000000853435954414c4500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714be986efd0a14e39c8ecdc51d7c98b64a51f2c4c19e2be313af46a41bbb620432be7f2f78a27f7c1a": "0x00000000000000000000000000000000000a4f6d6567614d696b650a4d69636861656c20420000196f6d6567616d696b6540747269736b656c696f6e2e6f6e6500000d406f6d6567616d696b653834000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bea99ac32a4539bc724d262fd25c8cc975189c3ae4f0dee1ba2e17080cda69183412d0928b49db0f": "0x040100000002000000000000000000000000000000000b7375626c61622e6465760b7375626c61622e6465761368747470733a2f2f7375626c61622e64657600126f616b6c6579407375626c61622e64657600000b407375626c6162646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714beb64061aa9b85f752cf40bb293c3639c52e8d1102816a0eeb15adbdcb34985f4f555d83d6fd9f35": "0x00000000000000000000000000000000001f53414d4241207c20526f79616c20536f6369657479206f66204368616f730d576f6c6667616e672053616d147777772e776f6c6667616e6773616d2e636f6d00146e667440776f6c6667616e6773616d2e636f6d00000f40776f6c6667616e675f5f73616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bee578c453b0ec8a10dcba5c743f0ac5f458c84cae222de427205dbdb1ea5c38070be7a728d44109": "0x00000000000000000000000000000000000c5468652043757261746f7201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bef054a6e8d99eba983c5a0d1f1e697c1a0f9798bc25543603751b41102d41c3b0e23cbc6e3fdc0b": "0x0401000000020000000000000000000000000000000008566978656c6c6f0c566978656c6c6f204c4c431468747470733a2f2f766978656c6c6f2e636f6d1440766978656c6c6f3a6d61747269782e6f72671268656c6c6f40766978656c6c6f2e636f6d00000b403078566978656c6c6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bef3200eba174d218000262b138778788d2c01044e23dbb7b4159a60cc72b36455320866545ea72d": "0x00000000000000000000000000000000000d44616e656c694172746973741044616e616520476f6e7ac3a16c657a00001664616e65676f6e7a612e6340676d61696c2e636f6d00000e4044616e656c69417274697374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714befec0bbe28bc4156cf103d56cc23ec72abe93fa1bb8b2ce999da4c64cf87a6382fc6f743a176d71": "0x04000000000200000000000000000000000000000000055a756b61000015407a756b615f3131363a6d61747269782e6f7267127377343832363440676d61696c2e636f6d000007406f6b37693300097a756b615f31313600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf0b85bf56b1122f2644199cf370ae595ee0fcfe125cf1f57ccad32c435b62ba43ea09b7652aaa78": "0x00000000000000000000000000000000000f4b7573616d61204b696e67646f6d001f68747470733a2f2f7777772e6b7573616d616b696e67646f6d2e636f6d2f000000000d404b7573616d616b696e6773000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf13eac6858519dcdccfd108cf2a01b8e6cf878849eabe75728f267ea10fd8f18b6fe92220c8991d": "0x00000000000000000000000000000000000e4c696c6c7920506f727363686500000000000011404c696c6c79506f7273636865417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf17a0437a59fce41c45953edf44501060286e3eb61e389d86d13e7c2a6e4acd6bd1df389d34f358": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf2341873b4d4cf676587217399584996f3d1f2135f8c76cd128e795fc5e04018e3f15be7aded120": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf284bae8cc1a1845687439c0a1ffe34131bc8f47408fd64663de30e4eb54aa128e578db2745c749": "0x00000000000000000000000000000000000962656e6c75656c6f0a42656e204c75656c6f000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf4f9995d06677041cf0dca0b7aa11a240e5706fcb3475f60a375814d69755c9362f65caeb55a867": "0x00000000000000000000000000000000000277000000000000034077000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf5e40a7dfc4431c8a99501bbf355e2b2f19a22c79915c2deefe1a3e19c957a9db910b7d3f6ff24e": "0x000000000000000000000000000000000008456c65786965720000000000000940656c6578696572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf6bd75b748928f06effd095a398639dc8af6f449a6362b40ee962e69700369eb9e530629bfa386a": "0x00000000000000000000000000000000000f4b7573616d61205a6f6d62696573000000186b7573616d617a6f6d6269657340676d61696c2e636f6d00000f404b7573616d615a6f6d62696573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf74188b125a3306308b59a947eeb792acf6de27fa47a92ad37d53a15a7b97cd25f11c25455ba253": "0x00000000000000000000000000000000000e4c6f63616c436f696e53776170001a68747470733a2f2f6c6f63616c636f696e737761702e636f6d00177465616d406c6f63616c636f696e737761702e636f6d000010404c6f63616c436f696e537761705f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf85c9682d95267f0459226895922ebcf36a4fd2441690ddeca7404cd4ee5403ebea4c9ef367fe4b": "0x0400000000020000000000000000000000000000000008437269735061700000000000000b40437269735f50617038000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf8e0379b44b6804dcf2917d37c64e3d60416e47b5185b4d6c3965ca531ecbe29e1d2cf759f5f871": "0x040000000002000000000000000000000000000000000f554e4956455253414c444f5430300000001d696e666f40756e6976657273616c646f742e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bf9ec12dc8498206bc43e27bc2e8f85dd0bd886f3512866f82132844654c78465fd3b23dc7988e0d": "0x04000000000200000000000000000000000000000000074b7269737479000000156d6172786f786f6c327540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfa9ffb31899babc08fabdcfdd509f6f46ae0d3d94774a5555f448378075d9d6e2818dabcfcfce4a": "0x00000000000000000000000000000000000744726f6f736b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfaa3c41adc4090b76b408e1da2f3e3aa9933dfc856970e1910172ca002f7c692aef2cd814a4d16b": "0x00000000000000000000000000000000000e49736874617220537072696e670000000000000e40497368746172537072696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfae967d3e6d06430263fbfa5728d893da31a94b7b23aea0fc23e87b2e24e12e08e372bfde42fb2a": "0x000000000000000000000000000000000007426c61696e6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfb6186ececfda792ef97696585f2074e73c1a7e50fd86be024eba3cf4472ab02e9e5e60658a9f0f": "0x0000000000000000000000000000000000096c6d61747a38323300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfd1adb8160d3d9cec8c97edfab0a07c37625d53be2075b8ea64a00ca71d80cffe94edb44d215e00": "0x040000000002000000000000000000000000000000000c6e6f6b6f67697269737276000018406e6f6b6f676972697372763a6d61747269782e6f7267176e6f6b6f676972692e73727640676d61696c2e636f6d00000d406e6f6b6f67697269737276000c6e6f6b6f6769726973727600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfd37fecc62ed30d50d3a21916778f488ad7fc8be11e29ced183651fa35e9a5a4148077e3dffb146": "0x0401000000020000000000000000000000000000000004535044001b68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b15407370645f616972613a6d61747269782e6f72671773706440726f626f6e6f6d6963732e6e6574776f726b00000d407370643537303638333935000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfd63dc631849c7f40a40af94843458d2a32dffda8c113143c4c263b689fb22feb2817d44b557447": "0x00000000000000000000000000000000000c476176696e20426972636800001340676176696e6e3a6d61747269782e6f72670000000d4045746865725f476176696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bfe419a5c9e5d3ad6c4e8b48b79ec203ce159cd966e441d6e96f1250639d1ce8e2cca50574a1cf20": "0x040000000002000000000000000000000000000000000b4a756d696e73746f636b000000156a756d696e73746f636b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bff2bb4618f007527cee2043a1c5ab3ca7b376a1038e0200b82436d83c6f12cee8a2838f3374511a": "0x00000000000000000000000000000000000d616e64726573616e656d69630e416e6472c3a973205065c3b161117777772e32316d62756c6c732e636f6d0017612e6c656f6e6172646f706d40676d61696c2e636f6d00000e40616e64726573616e656d6963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714bffb48c65264e596623a83df18a4035e3f753cf28bd99cfee9d86937a0249e64c0edfaaf774aad70": "0x00000000000000000000000000000000000a30784b727970746f6f00000000000011404b727970746f4d616e69614b343030000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0076111676aa5c932585bcfe3a06cc536501471159584b934d07923e03f69ec4e7101f6d21b9a42": "0x0000000000000000000000000000000000084b7573616d626100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c017c9db88e20ba7d6ea290b1d0c9db6b60e1ccf45cd46ccdfca05d0eefb211f8737138d5f23e81a": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c01ea55f307c73957ef55983821ee123bb7141da96e85024e537b7c3d4dabee51f6bcc458f2ce77f": "0x000000000000000000000000000000000003474d06502e204d2e000018616d706d5f43727970746f734069636c6f75642e636f6d00000e40616d706d5f43727970746f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c04a9c7d0caebe131693a51ef6a5e8d8d7f8254be6e1da86af31c6fadc8cb63c489d3676012a6d46": "0x000000000000000000000000000000000006445245414d0e447261676f6e20456d7069726500000000001040447265616d447261676f6e456d70000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c04ca87c3c9a9c0e54f7907932d3b6acc91644057bf2732683d772a7b69f8df49f91cadf50e0ca41": "0x00000000000000000000000000000000000e506f6c6b61646f7420426f73730000000000000e40506f6c6b61646f74426f7373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c07690bc374b92f796acfe70c04eae75f56d603fa55ea58adc1a5be6f7780f6bb8b55ca788ad670f": "0x00000000000000000000000000000000000c5375706572636f6c6f6e790c5375706572636f6c6f6e791868747470733a2f2f7375706572636f6c6f6e792e6e65740000000011407375706572636f6c6f6e795f6e6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c07b13ed9c7bd5784a9bcc5ed3d67b713c73686690eeaa8d56d0e933b1767d04e6a78c5bcfb0b953": "0x00000000000000000000000000000000000656616c6c791256616c7961204e617274736973736f76611d68747470733a2f2f6c696e6b74722e65652f56616c79614e61727473001556616c796131353331324079616e6465782e727500000c4056616c79614e61727473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0a3a98b551ee046f623943323c10fca98730a4dcae0b6f710f51a9b574a415f4c84617389345024": "0x00000000000000000000000000000000000a5768697465776f6c660e4a6f686e2042616c6c6d656e7400001b7768697465776f6c6637354070726f746f6e6d61696c2e636f6d00000d407768697465776f6c663735000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0b698fe85dc7f07f46a2cda2040566d6299f92cdb1132a231dc2632ff84b711e3db8634c344f93e": "0x040000000002000000000000000000000000000000000d47696f726765416264616c610000001767696f726765616264616c6140676d61696c2e636f6d00000e40416264616c6147696f726765000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0c86ee622ccbd7b50cf2ac5c2184c5b56bcc4020ff5858a46411c63eafde5c0073033aa9183b008": "0x0000000000000000000000000000000000094d6172666f72696f000000136d6172666f72696f4070726f746f6e2e6d6500000c4030784d6172666f72696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0c97d65a24f61b1143b4dafb938b67c2305804cedd61580d28079cc89366c4d02754275188e8207": "0x000000000000000000000000000000000013506f6c6b61646f7420636f6d6d756e74697901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0dd630e2b48c6f1883235753d2d2fbdcde84d5bedf9d4e3049d3aa38eae44b6baf7f90dfbc27c77": "0x00000000000000000000000000000000000d616c656b736969627261766f001d7777772e696e7374616772616d2e636f6d2f627261766f2e70786c730014627261766f70786c7340676d61696c2e636f6d00000e40616c656b736969627261766f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0e60e80c24de0077c140ace22ed9c9542e5bb2a752621225ce07325c26d02a494883e860329921f": "0x000000000000000000000000000000000008446f7473616d610f5269636172646f2043616d706f7300001b3137446f7473616d6137314070726f746f6e6d61696c2e636f6d000011405269636172646f3138393538393533000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0e968a177335220aa220871834d1f214169691dfd97c70823d90d192b246378dc01a59daafffe0d": "0x00000000000000000000000000000000000c487970657273706865726500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0f5d760b3d480556c406cd98bab3d290bba03d428b468a9b6b5a4a53101cd11594fad41a27b2754": "0x00000000000000000000000000000000000e69636c6f6e794163636f756e7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0f7c7b14b34538fba5cba767a8f31682b274dbb330de35c26ad281d7ceab309649a99d7ea0f8b05": "0x000000000000000000000000000000000005416c616e05416c616e000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c0f837b7cd7e3836b02b8226fe805f72e05b5c6b634b076a01c30d1cce7f1ab7127e63d6e3eaa06d": "0x0000000000000000000000000000000000054c757575054c7575751d68747470733a2f2f6c696e6b74722e65652f6a7573745f6c75757575001a4a7573745f4c757575754070726f746f6e6d61696c2e636f6d00000c404a7573745f4c75757575000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c103bcc5de571eaad01b3c1368fe9f57cf7dcd732ce35249557f2ce8876a9d083f0921529afbe52b": "0x00000000000000000000000000000000000844696d6172696b01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1177e10764520f0286ed5b9c507942cbe163cd75a2cd6de711b44216438b6618c2b1a5af864a31e": "0x00000000000000000000000000000000000e62696e616e63655f6b736d5f360e62696e616e63655f6b736d5f36000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1182c59277d714b4697f390f0f6624792b81cc517134435760de5303fed079a7f3ada19c3622900": "0x0000000000000000000000000000000000084a6167754e465400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c11b1c3f82b75014e4d733aa6e16d24e220efa69687f6ff198317062ab5ee12a059d47b732c27624": "0x040100000002000000000000000000000000000000000a507572655374616b650e507572655374616b65204c74641b68747470733a2f2f7777772e707572657374616b652e636f6d2f0013696e666f40707572657374616b652e636f6d00000d40707572657374616b65636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c153bf084b7770907a60b5bda7a39f689d7e836cd6496066d3959e65ac56da32ced67bab4454d678": "0x0000000000000000000000000000000000044c656f114c656f6e6172646f2052617a6f7669630000156c656f6e6172646f40706f6c696d65632e6f726700000a406c72617a6f766963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1766eb50d30248b986cd47abb7ad417f9b127dc8c38b34fba72a604cd2643f74b0ecead90af9a57": "0x00000000000000000000000000000000001357696c6c69616d204c696d204b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c18ee488c392d992f888820459c387645732dc07dce5bb6884a13caf0c41dc1ee81734a74f19e07f": "0x040400000002000000000000000000000000000000000850415452414354001368747470733a2f2f706174726163742e696f16407975656c6970656e673a6d61747269782e6f72670e686940706174726163742e696f00000d40506174726163744c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1a57f5abdde93362461cf63ec5df1c71102f6122af9fca5fab21a9c7bedb84f21f2a07504d98213": "0x040000000002000000000000000000000000000000001e48756220556b7261696e6520506f6c6b61646f7420f09f9299f09f929b00002140706f6c6b61646f745f6875625f756b7261696e653a6d61747269782e6f72671d706f6c6b61646f74687562756b7261696e6540676d61696c2e636f6d00001140444f545f4875625f556b7261696e65001c68747470733a2f2f646973636f72642e67672f353743444568363600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1ce12824a5cf3c7b2bbd89d32024cfa3f782fd05b0e325cb9d364d419d85768bbce95395f124e18": "0x000000000000000000000000000000000006432d31303014436974697a656e204f6e652048756e6472656400001e636974697a656e2e6f6e652e68756e6472656440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1d7648a3e3194dab2bdb0d774986625498e0b5fce860c7d58103bdb6b7b348054d525fddc3f3e7f": "0x00000000000000000000000000000000000a506f6c6b61506f6f6c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1d9151efd144bc7c6e2ca836b28b68978aa39dc41d5b7ef3a7b8630a3e432d8ca99f24fd86cbd05": "0x040100000002000000000000000000000000000000000a64616d736b796674770000001c63727970746f64616d736b794070726f746f6e6d61696c2e636f6d00000b4064616d736b79303031000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1e288e289580287886286c58d67217bdd854832d5e9f1b218dec6a0ff7e0b7573147ca94a233a0a": "0x040100000002000000000000000000000000000000000c4269742e436f756e747279001468747470733a2f2f6269742e636f756e747279000f6869406269742e636f756e74727900000f40426974446f74436f756e747279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1fb74b2482e1fa3be485a0806e6773e0f8df67b7a7849f2171fd0e42db790dfd9d9e923e79e6d30": "0x000000000000000000000000000000000015747269636b79206e6674206172742074657374730000000000000d40547269636b795f4e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c240fbc12423680f764c70f6ae87fd18e901fbe3da02098ba42459d29bf26602ec68c229292f301f": "0x040100000002000000000000000000000000000000000b5374616b656454656368001968747470733a2f2f7777772e7374616b65642e746563682f001b7374616b65642e746563684070726f746f6e6d61696c2e636f6d00000c405374616b656454656368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c247e5052d61631f088a514be77fc6e8c07ca16c66eff21fabda2362183d9342b017b7f4e3abfa1b": "0x0400000000020000000000000000000000000000000008696c347231343100001440696c34723134313a6d61747269782e6f726712696c347231343140676d61696c2e636f6d00000940696c3472313431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c24a329489b706b1e402e6024bfb3168e669c83931a367668e2cb6721ae85d549caeefd9cc74523d": "0x0000000000000000000000000000000000084769674d696e64001468747470733a2f2f6769676d696e642e61707014406d6d61686572653a6d61747269782e6f72670000000a406769675f6d696e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c24ad04d4c11675896324cde80264d4b481bbfff59c179288380084d346630e3d69ae79a584ba27a": "0x0000000000000000000000000000000000067375736c6f000000195365726869792e7375736c6f40686f746d61696c2e636f6d00000d4053657267696a5375736c6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c24ccc1f4f0c01535860ef101dbbcbd69d9c3c0d43cdd6ac285ea2d81e5de77ea31c9b5f46345507": "0x00000000000000000000000000000000000d5468652053756220436c75620d5468652053756220436c756200001967616261676f6f6c676c6f62616c40676d61696c2e636f6d00000f40546865537562436c75624e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c2531fceab22368da26c51051a9031ebcc5ae2a4eb9a72e444a5bff59b995ce4612ed8cabe8a2a70": "0x0000000000000000000000000000000000144272616c65204b7573616d612057616c6c6574064272616c651368747470733a2f2f6272616c652e78797a2f0012737570706f7274406272616c652e78797a00000b406272616c655f78797a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c26b60c340f2850fe003e4deb7ba19046cc38a5b19fce737a9b85dbcffd02c7a9b5ac939c649bc3c": "0x040400000002000000000000000000000000000000000e4368656e5a6f6e6778696f6e67000013407a786368656e3a6d61747269782e6f726711637a78637a6640676d61696c2e636f6d00000f404368656e5a6f6e6778696f6e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c2d515788ab8e1a0e27efcd0fd4d153900de5a5eef0ff376e377856eda61b99e351d8b0feab02271": "0x00000000000000000000000000000000000850617a204c61620101011474686570617a6c616240676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c2d9f475a129afb3de35d75951081e7ba5a6bd03a14547079abd9ba3e02b86be08857cb2300fe370": "0x000000000000000000000000000000000008526f6d312e696f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c2fca83922e702d9fad031becd3e949c4168031dbf67cfd0425c23cc9e97602945557cfe94f9686c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c30921ca6904d9b0481d2289e340dbe924b2d24032e0382fa4385ee579617d900962044ef8f76d78": "0x000000000000000000000000000000000005574f4e4700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3125cbfe931ee052c08cfa5b2dbfcf6850a3b836596d82a9ed7d2d743b42aa5c69798b502b29b57": "0x04000000000200000000000000000000000000000000104e6175676874794e6f6465732e696f000016407472697072616d626f3a6d61747269782e6f726718737570706f7274406e6175676874796e6f6465732e696f00000e404e6175676874794e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3177ffd686ff73b887aa7b29cd25037b5adbc515ffe27ac96d457cd8af6bb2dcd486fd29e89c955": "0x00000000000000000000000000000000001454686520476f647a696c6c61204c656164657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3187f2193d5784124833c81b9862a86b8f6d9b7099661ec45acf14f1831acf5184dc477d5f1445b": "0x000000000000000000000000000000000007707369633474000012407073696334743a646174612e6861757300000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3288af44cc8896786018db371564be5c7f5c49e28d43d00c70d34cbf53f71705f1f670a3dedac5e": "0x0000000000000000000000000000000000184f6e2d72616d7020426f756e74792043757261746f727300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c32db95f6c40dffcec4b556151cf2da16df2febda18f31e50231881bc5d55a845958bfe87c59e12e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3307fa4d9163f3c203066b0a657bdbdbe9974c20a2644881f384f9b206c7c394054c0d411d7bc6e": "0x00000000000000000000000000000000001c526f746b69204b7573616d6120626f756e7479206163636f756e7415526f746b6920536f6c7574696f6e7320476d62481268747470733a2f2f726f746b692e636f6d000f696e666f40726f746b692e636f6d00000a40726f746b69617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c33e475fb0c3b46a9af751af01e61162cc3339e23de3d5387e209eb8ceddc992e4ceff620ccb837c": "0x0000000000000000000000000000000000064261726f6e0000000000000c4047656f7267334c6f7964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3427b260581a0d4dcd6bde04b554d3bc0cd72a5cf503ec854b4a44a4e5a9f8057dc2d0cbcaf5b41": "0x040000000002000000000000000000000000000000000977646d61737465720000154077646d61737465723a6d61747269782e6f7267136d6f6c7465732e6740676d61696c2e636f6d00000d404d414b53494d3738383736000b6d616b73696d3133343900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c347cff095b54034e6261adac5418d9d46cb1d02d640d2afb74d5d27945a2c28e176049a6d757d5b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c353eaa2aa4b36d7c48799cc5e6109c73e8502411177081cd1c77881a6ec2f61bd0d11df09c40804": "0x00000000000000000000000000000000000e62696e616e63655f6b736d5f330e62696e616e63655f6b736d5f33000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c35fa9be4d106de5521cb7c68dd8c9563fa2cdb0311f820f8aafae31da6007aa89730cde9f46db3a": "0x00000000000000000000000000000000000773746572796f0012687474703a2f2f73746572796f2e78797a000000000a4073746572796f3335000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3724f9765a6e28605dec8ffa7205cedfddf7d4a5d76b469d764a9833a3929b33c39a8479c3762ef": "0x080000000002050000000100000000000000000000000000000000000000000000000000000000000000000d44494e4f56414c20f09fa6960000144064696e6f76616c3a6d61747269782e6f72671261646d696e4064696e6f76616c2e746f70000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c38be37ff19e3a8a7617b9c6475f887ba801cee49b322a4d888224c8d0791bb0d5c999b6605e251a": "0x00000000000000000000000000000000000a73796e636c75622d310a53796e636c75622d31000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3903a41eb7b0ea04a1e5db2241a15c418162119c39fe2e9570abaa5b36c7225e4a5b306cc39c047": "0x000000000000000000000000000000000006576f6c664b000000000000114063727970746f6d796c6f75776f6c66000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3946172675052829aaca335cc3dce64d9ed58100cafbefb2bb2973985671676c7d645936a5d172b": "0x00000000000000000000000000000000000e54484520434f4c4c4543544f5201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c39daa94631294ae14ce4e09b999c54351c75b74d0bafdd17d86d98b6aab5176b9068e1be13e096f": "0x0401000000020000000000000000000000000000000014f09f909120686f646c2e6661726d20f09f9091001268747470733a2f2f686f646c2e6661726d1640686f646c5f6661726d3a6d61747269782e6f72671068656c6c6f40686f646c2e6661726d00000b40686f646c5f6661726d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3a4d5d0c403e3b4387cbbabecc63d610ae7d4e8089aa6b341a52764f822342e887ba35160a26a61": "0x0000000000000000000000000000000000074b68656f70730000000000000e404b68656f707343727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3a7aee697f8537eced0a17e590489a73c7187393c0004adf62f7bb12bc01c2eab624a81f7b11225": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3aa48e3a86671870cd7f4ead4230679019f6a6728e1b01daa539969c1ff6e5d7659ee88e6e7792e": "0x00000000000000000000000000000000000c44696e6f20582044696e6f0b506c616e6574204e656f1768747470733a2f2f706c616e65746e656f2e636f6d2f001b6361707461696e2e6e656f6e40706c616e65746e656f2e636f6d00000f40706c616e65746e656f5f636f6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3b1ad8cdba491b4b2379dab464407695ce9efad8a5b30814255ec0a7b680ed5e90b008d5991a730": "0x000000000000000000000000000000000007566963746f720a566963746f727272520000000000094056696352646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3dee0cf198fa26528148ad524276363bd3c138bcbf71d62971c8e7a4e67e4833dad82d554d1372a": "0x00000000000000000000000000000000000a446176652053616d6115536c6565704c65737320436f6c6c65637469766500000000000d4064617665646f7473616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3f203317925ee60342908079a81bffbcebf5120459750595a066d3d1a00547f26a5b8602ae1ec51": "0x00000000000000000000000000000000000c686172756e6f686561727400000016797575626172696465737540676d61696c2e636f6d00000d40686172756e6f6865617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3f2c1579fa4e27478baec43fd49badfce811cbba08b3f0ccf758b5e22f0c4d745452f5dad6eee07": "0x04000000000200000000000000000000000000000000154150455254555245204d494e494e4720f09f8e82001b68747470733a2f2f61706572747572656d696e696e672e636f6d194061706572747572652d6578653a6d61747269782e6f72671d76616c696461746f724061706572747572656d696e696e672e636f6d0000104041706572747572654d696e696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3fdb0ea29d362e6b83d19e4a3ad242102f94a4452381300ace74c5d50fbdd9675a869401d3bff64": "0x040000000002000000000000000000000000000000000645726e69680000001a65726e6968656e656c626f7371756540676d61696c2e636f6d0000094045726e6968626f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c418004698b256eae08a0336e48b06e7993c654fe5a4eb0926b945368ab819ca106038ff7d951601": "0x0000000000000000000000000000000000064b656e6a69001768747470733a2f2f6e656f6e6372697369732e696f2f000000000d404372697369734b656e6a69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c41c1de12f5ccec960c320ebf47a6248effe7b1e0d9fa1a05472d9c9face28267a2d6f3897d8460c": "0x00000000000000000000000000000000000a4a6572656d313933310000000000000f406a6572656d7931397061726973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4203048b255be4d94d18f58da33ad88b8f369b0550f4f119c29487db123a8fd7808192c7515d51d": "0x0000000000000000000000000000000000054d696b65010101136d657461646f6f7240676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c43479830549f3b92b1898eea254aee5a9b583a87935d2fdc343cf246324922e7c843d13d4858f02": "0x040100000002000000000000000000000000000000001443727970746f50726f63657373696e672e696f001c68747470733a2f2f63727970746f70726f63657373696e672e696f0019696e666f4063727970746f70726f63657373696e672e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4352fa303548bd816e0943d412bdac132040c9c6c72b1e67f2669b9b9ed534c919ad61536fd6631": "0x000000000000000000000000000000000009456c6f6e4d75736b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4369a5a713b27e3fc7fa982540bee375242fda3776a68bc6b8f1a017d10060303b2a1492d508d04": "0x00000000000000000000000000000000000f656e436f72652e655865f09f91be00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c437a1a197732969421c28afeed76e4961a3def6e7a9df8c5bdbd2917e7dc07e16df23f858f06f63": "0x00000000000000000000000000000000000c4379636c6f686578616e6501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c43ae492abb7aee99234e13aa20406b05abfa896fd51dedf36648b5a73a45bb0518593a779c0503d": "0x00000000000000000000000000000000000941627320417274730000000000000c40416273417274734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c440bd35b1a2b564545efafec313a5bbbcbf30f172e615132bae08debd8141b0255523338127f52a": "0x00000000000000000000000000000000000d756e7a656e2d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c460ca530497a319165990d6152cdfdcb7ec7b5c44e5651d5061f0cc95cb30da6d5537cd8aa06321": "0x00000000000000000000000000000000000e43727970746f4c6f63616c6c790e43727970746f4c6f63616c6c791a68747470733a2f2f63727970746f6c6f63616c6c792e636f6d001861646d696e4063727970746f6c6f63616c6c792e636f6d00000f4063727970746f6c6f63616c6c79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c46ba4a0042e414d9ee1fa0d8d4e022ed5680b5925d19718a7ecc9f8f2ff77de54f0822978d27755": "0x040000000002000000000000000000000000000000000c476f6c64656e2047617465000016407365726269616e37343a6d61747269782e6f72671662637374616b696e67406f75746c6f6f6b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4706b7c96f81ec6cc89eac7f80e6c83bf44918ca04feb8a8a2583b4cba629d7388fd98f2ae14164": "0x00000000000000000000000000000000000b426972622054617065730000001442697262546170657340676d61696c2e636f6d00000b40426972625461706573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c48230cebc1a6bcabcd06bcfa928213a6402fca4096b81a51bbfce4105322ab80881148437d6e44c": "0x04010000000600000000000000000000000000000000084b6c69646f7a6f136a6f686e6e6174616e2067726973616c65730000116a67726973616c6573406d652e636f6d00000e406b6c69646f7a6f5f6e667473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4b6532d1c37b711aa18b3cf52cb27fd19d5b80fe7982ff955e0d5124dae26ac360056f401dad846": "0x0400000000020000000000000000000000000000000005454e4259001d68747470733a2f2f656e62792d636f6c6c6563746976652e6f72672f1140656e62793a6d61747269782e6f7267196d61696c40656e62792d636f6c6c6563746976652e6f7267000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4c023a99cd1728bba1b4c6166343cc8598bdebc0ed4baabf5aa3e212e19fbe876e9b2bf8ea8015b": "0x0000000000000000000000000000000000074754524d524b000000000000094047545f524d524b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4c10952fe64fecb528169b51314b1ec0f014bcd4453d83fa21320e5b19a3b2e02657d0c21f8882a": "0x00000000000000000000000000000000000e50756e6b205661756c7420233200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4cc158572b1a1217c49d0e3c5129947f9a8ff4e10fad98714c31499918013e8594bf3928fc5da3d": "0x00000000000000000000000000000000000c4b6c6175735765696e363901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4deb83fd3636acd789a634476bba8c44dda974b349800e3618b64732c488f98e75cd6941605ae1f": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c4f3bb9a6a26a4b7249aca910e224a87c14afb90980ef0db0a6b12c9d6b48c1acae111a1dda36617": "0x040000000002000000000000000000000000000000001050617261636861696e732e696e666f0000000000000c4070617261636861696e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c516a00589c5f1062af1849b7c7bedbe910d02ee342f6318414d33f17a50f00c029ec0eb359c6174": "0x040000000002000000000000000000000000000000000744616d696d690000134064616d696d693a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c51a01ea9809075a3a42cbc61ac54236d45147631d7fb2b7b32003bc2d53e6e9534ca518084fd814": "0x0000000000000000000000000000000000114b6f7374796120436f6d7a756d6f6e6500000000000008406b6f6261346b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c531d8ad189c5d4d660e9b4063cfa8684f52190e679f8cbdcbeea8886bdca31d38c6da70c07bdf4a": "0x04000000000200000000000000000000000000000000096c61676172746f73000000176c61676172746f73313938374079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c544e460580be7c67c05666c7b84f6e937f6972ec3117110bb0750d2994bf1f680b133d990b98e1b": "0x000000000000000000000000000000000007796f7534323507796f753432351868747470733a2f2f6e6f74652e636f6d2f796f75343235000000000b40796f75343235796f75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c54cd15798f98d6ffa84a4002c8ade8078eeb6ee7d4516e548c6eefbbed2d87acaf329d77f29a378": "0x0401000000020000000000000000000000000000000009576f77204c61627a1c576f7720496e7465726e6574204c61627a205076742e204c74642e1968747470733a2f2f7777772e776f776c61627a2e636f6d2f1540616d69742e776f773a6d61747269782e6f726717616d69742e73696e676840776f776c61627a2e636f6d00000940576f774c61627a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c55831fe1424bc8f4a2a8a33eb13857917959b364672391a64e41f03129c74dc5bd7856fc0fcf964": "0x00000000000000000000000000000000000a416c706861204775790101010100001140616c7068616775795f63727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c560adb2f53e7fdbba0518b2408a0883ce26ff4ea90f8639ac05332bf82260fc45033d7b5baa0a20": "0x04000000000200000000000000000000000000000000097279616e686967730000000000000a407279616e68696773000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c56c778db308e44b8e32641448f9a5ec78ad04a33b7874a2942ca7ad4c7e8ee2e45409cee1883e06": "0x0400000000020000000000000000000000000000000009436f6465676c6f770000001f74727564696562616b616e6175736b617332313040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c574259a47c36e9cc6730bbb5f77a45b3095c85b50d6d536d358147478f05ed0337d07f43a4de17a": "0x0000000000000000000000000000000000065369676d610000000000000f4043727970746f5369676d417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5873c02a0650aff3cd8c53d034ca3f0878d3b02c6d2f42084d49c024f08ac1637b7446c6d48b952": "0x0000000000000000000000000000000000134c756e6f20616b612074776f636c69636b730000000000000f40706c68615f73655f686c617369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c59c65c996cb7128c8d887817cd801c256ae0adad712737a18a89e23eb061b7002839d16530fa0d8": "0x000000000000000000000000000000000009696e66726164616f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c59e3ec2cf0fb44e4e0bc107a3826d65cc8a42f501c9b0bfa88ccaf00041fd568566b99adeb3c154": "0x00000000000000000000000000000000000b4f484c414c412d4e5943104f6d6172204865726ec3a16e64657a1668747470733a2f2f6f686c616c616e79632e636f6d0101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5a064463897ec28ba98d1704adcb69b1d50aebfab39709c03713555e3d49e75690492b0a02f547c": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5b4b74e80892500b46d25d53359fe3d532417e8eae2cba1ed38c7c3fc775a4bd30df90f820d900f": "0x040100000002000000000000000000000000000000000b5354414b45204c494e4b0b5354414b45204c494e4b1968747470733a2f2f7777772e7374616b656c696e6b2e696f00116f7073407374616b656c696e6b2e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5dad8e8b3b4327c8cc1b91e8946862c2c79915a4bc004926510fcf71c422fde977c0b0e9d9be40e": "0x040000000002000000000000000000000000000000000976696b696976616c0000144076696b6976616c3a6d61747269782e6f72671576696b696976616c406b6f6461646f742e78797a00000a4076696b696976616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5fdab086521b971d0e861d8e4257e09a778688629f5283e51f9875a3def184722a0112005cc931e": "0x00000000000000000000000000000000000a53616c73616f7368690000001473616c73616f73686940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c605f4a4cc9de0cf60e353afd3230a13cbb023c276697f7c42071973b470b9b1e79a4c1d99f27857": "0x00000000000000000000000000000000002131334333384e657a734a4d6e434c7a56574d5070546b64504779696d6e71773600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c62159eb22aa2f9ee882cec1afe19967602ee2cb6ec847b913115fc2d2d1293b467f41f2a817f80c": "0x0000000000000000000000000000000000094d722e4368616f73094d722e4368616f7300001b746865627572726f776f666368616f7340676d61696c2e636f6d00000e404348414f535241424249545f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c62d71f1d9e80b5e284eb76f4116f4b75a718fd1a374cc5b6e02fc18f37e02deb3054e57539c5328": "0x00000000000000000000000000000000001ee29b93efb88f20444f542056616c696461746f7220416c6c69616e6365002168747470733a2f2f7777772e646f7476616c696461746f72732e6f72672f636f001b646f74616c6c69616e63654070726f746f6e6d61696c2e636f6d00001040444f5456616c416c6c69616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c637b13dd6b9ed4474c76b2bb6e2e4b16fec1849aefadeae913aed26e72e2101a4dc34abb3e40776": "0x040000000002000000000000000000000000000000000e43687269732d5374616b696e67001b68747470733a2f2f63687269732d7374616b696e672e636f6d2f1240636c616e673a6d61747269782e6f72671863687269734063687269732d7374616b696e672e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c654d73fa3ebaa0b52de56cc1be8f484e681df0b45bea0eed7149eb4b83af80723b44eba4d04db1b": "0x04000000000200000000000000000000000000000000084c4f4e524f5448000014406c6f6e726f74683a6d61747269782e6f7267176572696b2e6c6f6e726f746840676d61696c2e636f6d00000e406572696b5f6c6f6e726f7468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c65c9dea76fe6a4a04c560690aaf6359dc5dd27d7ad3424eb447f4460f1dff44949de5dadb457545": "0x0000000000000000000000000000000000064b657474790d4b6f746b6f7661204f6c67610c6b6f746b6f76612e6172740013616e747a616b617a40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c662ab00c0706d5924c127f0b5492bc5439fb0dc1acfed7132bc27b761eb5ac5904670091251d12f": "0x00000000000000000000000000000000000a5468654d61737465720000000000000940636f6e78657074000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c67401b1f25d1590b45b073f1e692d18c2dcebae861b2f166a4dbfd95d9780ffef603c9e61d00935": "0x0400000000020000000000000000000000000000000004536f6c00001a40736f6c76616c696461746f72733a6d61747269782e6f726718736f6c76616c696461746f727340676d61696c2e636f6d00000f40536f6c56616c696461746f7273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c68cd80f169ec5de3040ea71921e73b1d72152deb0d9076de5b09d810cc575fb6d11b14820fbbb04": "0x00000000000000000000000000000000000974307a656d30306e0974307a656d30306e00001374307a656d30306e407961686f6f2e636f6d00000e40416e64726577346973686572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c693160e6ea97aa8369478717731349632db8341d2a8502aab460f8109dfd249957aeb9b77c3b546": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c69417cb51b0b3c2440d92a969cae5defa9cce85c117ff51435b149ce2a58c38052b195a64f8d050": "0x000000000000000000000000000000000017526f79616c20536f6369657479206f66204368616f7317526f79616c20536f6369657479206f66204368616f732068747470733a2f2f726f79616c736f63696574796f666368616f732e636f6d001e6368616f7340726f79616c736f63696574796f666368616f732e636f6d00000f40726f79616c736f666368616f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c69593e93494eefa1a2b74aeaa4f3d498de298ffb9775c2918de5e045085edb29dc9f3e339045929": "0x00000000000000000000000000000000000b4a6f652041646f6e69730000001363686566796f6d7a40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c6ad09b66af3693b2e9169837f2af124b7e7fbbed4f8b50f26e37f8cb31869d85bb773e9d9c6950b": "0x0800000000020100000002000000000000000000000000000000000a4a4657454e49534348000016406a6677656e697363683a6d61747269782e6f72671463727970746f4077656e697363682e7465636800000b404a4657656e69736368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c6bbf3f9dd9143a5fe6c31fcff28694469c3d4c1681270bdacf6edf7ec39bda6c68cf25738268b79": "0x0800000000020100000002000000000000000000000000000000001b494e46524153545255435455524520434f52504f524154494f4e00000020737570706f727440696e6672617374727563747572652d636f72702e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c6c6796a808b7f32a8a99a7f49f1d3d72656674fea67bc18454325f00c9a5921ec6010c43409d43e": "0x0401000000020000000000000000000000000000000009496e66696e697479000012407a656230393a6d61747269782e6f7267107a656230394079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c6d8287d03be1c4e906896c321ac4e1c5b1fbdbadbe087fcb428471c1fa9509bec0baaa61bd69c78": "0x0000000000000000000000000000000000124b7573616d6120436f6c6c656374696f6e0101011c6b7573616d612e636f6c6c656374696f6e40676d61696c2e636f6d000011404b7573616d61436f6c6c656374696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c6df602a0447f12d4ec842ef2dc300df355e4193020bcdd204bdb78978963f5a97afefebeed4c43c": "0x00000000000000000000000000000000000942616d6f72696d5f00000015622e616d6f72696d303840676d61696c2e636f6d00000a4042616d6f72696d5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c6fc06d7099c81042ae8b4dd8a198039584f0bb410ba2a196dbbbbb5198d21b0932029e389c92c20": "0x00000000000000000000000000000000000a536f6e6963303538380e457667656e6969204f726c6f7600000000000b40536f6e696330353838000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c706366b7fce759bea11db7fb06ce5dd7875ec9573d1c2666d4f079eb40a23df9a4e7295a72c3b56": "0x00000000000000000000000000000000000766727061726a0e46656c69706520416d6f72696d000000000011406d696e686176696461706163617461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c71b74a26f01154dee57f7f5b5354df1ba908ea77cd152cb3376295e904616bb8048e0ec0a731800": "0x00000000000000000000000000000000000a477265656e20446f6705466f4c69000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7289bc44ade334e8db5c746c14cf05e182b10576a9ee765265366c3b7fd53c41d43640c97f4a8b8": "0x040100000002000000000000000000000000000000001144617277696e6961204e6574776f726b1144617277696e6961204e6574776f726b1a68747470733a2f2f64617277696e69612e6e6574776f726b2f001768656c6c6f4064617277696e69612e6e6574776f726b0000114044617277696e69614e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7306504e44e5ca6b6e98494bfd1254db60b4239094d4ef9e9b0d011ae4b27419d31b265f52d3b1e": "0x00000000000000000000000000000000001054616c69736d616e204d696e74657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7431d97f66121b2fe0a9613f17e9a72fa193ef556525358015d183e34a58d63832eddb68fc78873": "0x0000000000000000000000000000000000094c696e6b53796e630e4c696e6b53796e63205465616d1768747470733a2f2f6c696e6b73796e632e746563682f00136e69636b406c696e6b73796e632e7465636800000f404c696e6b53796e635f54656368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c75dd7643a34b25812238aff71d46adf8a5d90a96a764310904cd460493fcfd8b59aec1e9a44781c": "0x00000000000000000000000000000000000c536e696666657220446f6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c75f3283311aa7a1ecbe5cbbe411d0184ebbea1f6e66191f16cf08b10394de1504377a522b67bc38": "0x0000000000000000000000000000000000084a616b2d50616e000011406a6b75623a6d61747269782e6f72670000000a404a616b50616e696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c76c5b0b61a843d020f7bade1ae4ca9f39f905afab90dc0973f36f6c6f4bf8a4869e074ff2fa7529": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7a8b14e7c045596a8f4e76e2abfd5c4ad2714c6882ee548d8bb2673a8c5fbd4d5d7d8f156d02c52": "0x000000000000000000000000000000000009417274466c616d6509417274466c616d6518696e7374616772616d2e636f6d2f6172746631616d652f000000000b40417274466c616d6535000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7b5421a37e04c7cf27d586740d74313a7f109afe5b90bbbf4ce7bfaf6012e8cd417f517658bc665": "0x040100000002000000000000000000000000000000000f446f745363616e6e65722e636f6d0f446f745363616e6e65722e636f6d1768747470733a2f2f646f747363616e6e65722e636f6d001561646d696e40646f747363616e6e65722e636f6d00000f40546865446f745363616e6e6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7c50372810d645f1e58008212a2c39b0f3366f8698c6f4b3971fe5d694d943d60695da4c7307e7c": "0x040000000002000000000000000000000000000000000d57686974654861776b446f740000001777686974656861776b646f7440676d61696c2e636f6d00000e4057686974654861776b446f74000d77686974656861776b646f7400", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7d0409d778a3abd0a25fa0107b9d17ab528cfa9364e83d15ab9cb6b23cbb8e95434a10265e78861": "0x040100000002000000000000000000000000000000000a5369726975734c6565000018407369726975736c6c6565653a6d61747269782e6f726712616c653461696e40676d61696c2e636f6d00000c405369726975734c656565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7e1ca011cc6d3a254c2eb516540f8e793d64120867503bc75ab13dbd7d372a84deb2383dd34be37": "0x000000000000000000000000000000000006504c4b445406504c4b4454000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7e9bc04cc0841dad6030dd61ad78ca1900865d2b53dd163bbbb5b40c82f94d25cb6ecc750a93c25": "0x040000000002000000000000000000000000000000000d536166655374616b652e494f001568747470733a2f2f736166657374616b652e696f1640736166657374616b653a6d61747269782e6f726712696e666f40736166657374616b652e696f00000d40536166655374616b65494f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c7fb1e9c29198d8a5a85dc8a03b70155cfa555804f87078d55ce094d664b93ca4fcb691b04581b4b": "0x00000000000000000000000000000000000c4f6e65536978747954776f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c802b345e9db30fc5ee13a0870d2fe2f9fe52be9487d3981daacb54c0f5be2d258211757f2fabf45": "0x00000000000000000000000000000000000a5355534c4f20322e3000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c80d06b5de46ac115084e4f3181522430ad839d9f8ab908a9311f7bff7960d5620a4ece21dc6c373": "0x000000000000000000000000000000000003626e01010119656d697432746869734070726f746f6e6d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c81b2ea6aabcc47572d9e3049948847b9e6a6530644c05a2cb45c106837134cf856a850edb5d984c": "0x00000000000000000000000000000000000e62696e616e63655f6b736d5f310e62696e616e63655f6b736d5f31000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c84305f46d65de06525b16363e519b5050accad8bf325992eb4277f962c34a45908a3856d9b4df13": "0x040000000002000000000000000000000000000000001d4261626573205061706573207c20626162657370617065732e636f6d0000184062616265735f70617065733a6d61747269782e6f7267166f666669636540626162657370617065732e636f6d00000c4062616265737061706573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8459543e4138852ec8bcfca5a803b4b7ff05c9370c75a32eb54ea934d0b70a79e28f3cf6f083f7b": "0x000000000000000000000000000000000012566974616c696e61204b6f6b6f6c736b6109566974616c696e61000019766974616c692e6b6f6b6f6c736b40676d61696c2e636f6d00000f40566974615f4b6f6b6f6c736b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c87a0357c51f3bb52c12d0743cebb84ccae67b4976d38c592750755318e088a58787ed6748af1b06": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c880212d643a2db0cece410e91027546424d251e4f6b3ea9edda00a3436226fcfa0caf2d4abdd243": "0x00000000000000000000000000000000000a42697457697a6172640101010100000d40307842697457697a617264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c89160c2ea73fddbd66187af628f50edc02d990b6b1a67b9891a65885b9bb34c07ba4eda1b6c316a": "0x0000000000000000000000000000000000084d63466f726765000000174d63466f7267654070726f746f6e6d61696c2e636f6d00000a404d63466f7267655f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c89f64234957ad3efa26953ec6ea1b5ea142dc695d8b2d021297ad12925a3c8dab825c4b77eb3a71": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8bc7c91a9135daa9c41d150136ee8ce0413d0d3b8943a3b40012daec573830dc5380540965c287e": "0x00000000000000000000000000000000001674686f6375747431303230534d53466b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8bd1d64af2d39cd2aa84a3b6e4fa40f02ba25778f3b48821f93170a88a06541f5f4d0e98fb0d444": "0x0000000000000000000000000000000000086e656d626f6b6100000000000009406e656d626f6b61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8c652a6c6cc03c086b64d128a69e9b1029f83eb7bf9fb1df919eb2986dd79d22800df7090ab2410": "0x0000000000000000000000000000000000034246034246000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8c74a2a3e4f4b82be8ca3e846ae7a889e4c1da80d271e206587513f37f603af9fbb27d79cdca91d": "0x040100000002000000000000000000000000000000000d444953432d534f46542d30370e4469736320536f6674204c74641a68747470733a2f2f7777772e646973632d736f66742e636f6d154064697363736f66743a6d61747269782e6f72671876616c696461746f7240646973632d736f66742e636f6d00000e4044697363536f667457656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8cf8e50848b5813a6005418ec9127ff3a23ff34480dfe3434895be2245e6f8673f4d44423f99b6e": "0x00000000000000000000000000000000001454616c69736d616e5f465220f09f979defb88f0000000000000d4074616c69736d616e5f6672000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c8e58aea5331a2e440480cf82274010064f8deaa5c77dab6a2fa59daa455692ce54d12c9a994b269": "0x04010000000600000000000000000000000000000000094e46544261726f6e06526f676572010113726f67657231343940676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9004303b036c946663e90acdccbcfe743f4c5452f91ff1839756d4799ff6459b49aaa5a438fb754": "0x000000000000000000000000000000000008636174736f756c00000016636174736f756c626f737340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c91fe577b6a958b7284f0b64b6dee82e7183d0ba4c04670afd04ff4a63c9e1e14bda8a73f3b65450": "0x00000000000000000000000000000000001d4b7573616d612d437270746f666f6c6c6f776572202d20537461736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c92c1ed9cc10809adcc362696a6099c29778cd123cbb6d0f495e3f1a9e72afeed4b2db4f2139626e": "0x00000000000000000000000000000000000e4b7573616d6120436173696e6f0000001a6b7573616d612e636173696e6f40686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c936f994b872349594c58421e4f981eddc24e9609efe14d2a9842c941333909917c948007928f203": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c937b7672d52bb682e5bb027d9dd92dce26c209287f9d28539eafca5a061f4813518986f7a938824": "0x0400000000020000000000000000000000000000000006416c696e6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c96059c5a9afeefeba0cb35373e16ab18a85e196f1ee92c262bdcb1a5633bfd4e0d2de5566c7fb28": "0x000000000000000000000000000000000002410241010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c978425d9379314ea415a980463876c54b503c358613b5c02d8ac9781c13378797c54ab37fc07c05": "0x0000000000000000000000000000000000086564797a65726f086564797a65726f0014406564797a65726f3a6d61747269782e6f7267146564797a65726f40686f746d61696c2e636f6d000009406564797a65726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c98618f1bd5a9559866b5be7949c1d9d84c3dcb5261213de3a6de7673c9010f7228d3948025ea51e": "0x00000000000000000000000000000000000942657a53766574610b4b6f6e7374616e74696e2068747470733a2f2f6b617274696e696b692e776f726470726573732e636f6d0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9894f2fca6676bee29fdae6c638b84830ee42c3038d1422fa07f3b588f818d58652187753c99747": "0x00000000000000000000000000000000000d5472616465204f722044696500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c99f95af84d55e0f7c1e751284e8cddc8b0ba57858b136458feea7fc3d78913c2a222e1486b81951": "0x0000000000000000000000000000000000074e4b59323235074e4b59323235010101000008404e4b59323235000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9a1faf09b047ace962bea82e7158b909964ed9a4cda3c07f9ceec8a8f3150264e706fe9c323a91e": "0x040000000002000000000000000000000000000000000857656233456475001a656475636174696f6e2e776562332e666f756e646174696f6e0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9b1a3c984ec1527125166e9a73e926987e64576b3c811f492f4f68e014ea24d780d6442897b6226": "0x000000000000000000000000000000000005706c756b11446d6974727920566f726f7a686b696e000013706c756b3239303640676d61696c2e636f6d00000840706c756b3239000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9c02a3bfc8b9747e2b3d30136a5bf1ad99ed78efc1c0cfdc6a2c65d3e30d86b3303f3533e155032": "0x040100000002000000000000000000000000000000000a4d616e74726144414f0a4d616e74726144414f1b68747470733a2f2f7777772e6d616e74726164616f2e636f6d2f0016636f6e74616374406d616e74726164616f2e636f6d00000b404d414e54524144414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9cbe4bcf11c1191d2eb148157fb8d45267e129807f60a442f1ccc47ae4df830afa70d9f43a57b7c": "0x0400000000020000000000000000000000000000000011426c6f636b6f7073204e6574776f726b0000001d656e67696e656572696e6740626c6f636b6f70732e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9eb326fa16dfefb70220894f522a1bc8fbef6774ee1c8a5a9ec8d1279b87238a7e19dbd30e72240": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9ec7a14c6f069793af2efd3517588570b437e94d0681cb274292bcdc5691a669cc50c0359599419": "0x0000000000000000000000000000000000054375727500001140637572753a6d61747269782e6f72671363757275666972654067616d696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c9f8fd074bd000b91e08d2544c9cd5587cbe30a3108cfc4cace618a9be8b454f063c9c572328a811": "0x00000000000000000000000000000000000544652e4b0101010100000a404b61726c69734433000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ca0bdf2dfb6adbfd82bb64e45f4f9a337768606d2742d2d9a8f74c5b182538988f3f482385c5d710": "0x040000000002000000000000000000000000000000000e77332e6369736865722e636f6d000013406369736865723a6d61747269782e6f726713737570706f7274406369736865722e636f6d00000c406369736865725f6c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ca359eff9e5c98c4540dee563747c9e9b41643cdab9e52e9af92a94e44f4c66dd6fa90f384c2384d": "0x00000000000000000000000000000000000542656e6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ca36ea10611335000e26a5618f2b9e282f4d6638ed18fee981c6a14c8e9062fdbcb2e6d40f8c0e02": "0x0000000000000000000000000000000000135354414b4542414259204b534d205045525300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ca6541d4aefa2e0e7e7ffb2550dcf65f92cfe6aa95b1a6a14f48c7cccbbb86dec448ce0bc7d1060e": "0x000000000000000000000000000000000008537573616e746f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ca89595ab373b7c7cc441e3c9176c763162f1c4653557b5d8db2826617b3047c71304d56af3dbd45": "0x040100000002000000000000000000000000000000000954726f70696361720000000f74726f706963617240706d2e6d6500000b4054726f706963617233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ca8ae099693f9dabd8004911e882a05affdcf81aea45f611077f07a29dacf6b754bb69ab118ae067": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714caa21989ef628ddcbc63ced3f8fec642128f2aa9c37e989a9313a67e9635dd85e8bd689ae8d0ce1d": "0x040000000002000000000000000000000000000000001bf09f9191204b696e6720f09f9191204b7573616d6120f09f9191000018406b696e672d6b7573616d613a6d61747269782e6f7267156b696e676b7573616d6140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cab78cfc920692024cc2c4fe71152a41691987950d065635bc8c151be2a230ec84bd9fc8174b2414": "0x0000000000000000000000000000000000044a6f65074d65646c6579000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cad2d474a0dca84ae2a70ba05a38bfe12181cdbed954062cac47eb43b03bf8681d21ad3cd1622610": "0x0000000000000000000000000000000000086976693830353511596f656c2047757469c3a97272657a20000015796f656c736b6174653140676d61696c2e636f6d0000094069766938303535000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cad415ee82b7dc86eca814d4775cf33d04650685b06650cf09795a82bb5190ae30f566fd4479c63d": "0x0000000000000000000000000000000000075349474d415201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cade31e76e0a70d17603f2862f044ccc7500542f4b7c1a506a906b92328e1f2b67bf5024d2af920c": "0x00000000000000000000000000000000000b504a53204b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714caf961ad1b6e226da072610f1e1ffade38a6d64df55a89e6b07f65ed2be0eb6efffdade4ca576c12": "0x040500000002000000000000000000000000000000000b4b6972696c6c5f6e6577000014406272797a67616c3a6d61747269782e6f72671b6b6972696c6c2e6272797a67616c6f7640676d61696c2e636f6d000011404b6972696c6c4272797a67616c6f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb01c78fd35d35a1947a4a4de496a602e3a59632dbae52cae69ec75b3553f4e23d65480bd892463e": "0x0000000000000000000000000000000000064d69616d690a4e6f207468616e6b730d6d6f6f6e6265616e732e696f00136d69616d69406d6f6f6e6265616e732e696f00000b406d69616d6973616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb0f792fe8070fe270499e87a23c3f1f543386563f418c35cc2be29aafabeb0cff59a0f15cddd465": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000013536b794c616220436f72706f726174696f6e001868747470733a2f2f736b796c6162636f72702e6e65742f0017627573696e657373406b727970746f7666782e636f6d00000d40536b794c616273436f7270000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb15c6b86fc6d4c40c6a06de638df5f682965b5fc5e146942a192ce193d18f9d16a5c83e1c2d0e67": "0x0000000000000000000000000000000000076465706f6f6c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb175b4b598df6c7d264719b38fdf6e7c0826edbe8f577806f45dfc22730cf9c9c880eb6ca4f1258": "0x00000000000000000000000000000000000753696179766f094b61746572696e6100001963727970746f6b6174653139383840676d61696c2e636f6d000009404541726f766161000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb2e9537050cc6d62c945b125c1ddc7093d9eb5108eb5fb03fd7f5b2a356a60550e74b9e64597d56": "0x00000000000000000000000000000000000954726176694f6c690954726176697320480000185472617669306c694070726f746f6e6d61696c2e636f6d00000a405472617669306c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb3200a490ec72062033f1e89095d22a9c51162dbcce5e28a6b12957fdcb4c3cf11ea8def5ea1e22": "0x040000000002000000000000000000000000000000000d426c6f636b20736869656c6400000017536869656c64626c6f636b734070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb33c8d6014b97d6009acf482631bef09c51464c57d5db30ddd875c5f21dd1199450ca32ef023955": "0x00000000000000000000000000000000000c4269674c69646f77736b690000001a6c69646f76736b692e63727970746f40676d61696c2e636f6d00000d404269674c69646f77736b69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb4a358712ffad148aee4e164d5d70ac67308f303c7e063e9156903e42c1087bbc530447487fa47f": "0x040000000002000000000000000000000000000000000b6c6f6c6d637368697a7a0000000000000c406c6f6c6d637368697a7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb682ba63a12c17de85518efd0a4dd7c45fdd8c606b0ee505a47a27d346217a2109408ee13274c5c": "0x0000000000000000000000000000000000064a44756273064a6573736500000000000a407761726d616e6a6d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb6a20ce60145023dc3ef96500d9246616e58c2621b52b0fe610b2877cc448729a0fa245d76c2e12": "0x04010000000600000000000000000000000000000000066a696865650a4a69686565204b696d0000156a656568656537383737406e617665722e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb6fae720ea9e75188113b77ec9a05954eb87c58258f605a9e987cd76da77c6db8ba3fabeb8be144": "0x000000000000000000000000000000000006526f62627900000014726f6262796e66747340676d61696c2e636f6d00000c40526f6262795f4e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb7cdfdf0c41b9fc9638b522bb7d9e74755fdaa96ac541ca9b3b1f287c413befaaa90d0dbeac2627": "0x00000000000000000000000000000000000b526f6e204d657869636f0000000000000a406a61647979637076000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb88098f8f0bdce5b8a47aa823c43efc9b5ffb19e212e2aa2cf3fd23347f618dbdb49319390fc870": "0x00000000000000000000000000000000000e43727970746f4368696d65726100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cb98884ad3631884800aab741beaf15ba953897b937ea73ec9d823b1f882e375e6e0863e1537d840": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbad766d1d5ed042d8af91f9bc822770333d322df946d3fd70b816725c14aa94fbbd668cfe1afd26": "0x00000000000000000000000000000000000a4e696e6554616c697300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbb80a8be45d87d27c766a66c689aeb53cfadb70d916bc8a976d5732a3e8657a43ce679104dd115a": "0x04000000000200000000000000000000000000000000046b6d76000000146c6164616b6d76313340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbc6d5a0fa733344dc1f18d3495ab571a17c68c9c9142e58c590637c1f07c582969acb8d3ef67603": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbc819e175aad208ac2709eb9569c861e63940eefaec1f51ccb76eaa84544e56331adfcdec859911": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbe70110da64cd0f364ab212143283a263d9a026f023d91bca9053138592463508fa9eebbb597235": "0x0000000000000000000000000000000000074255424c4f5401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbeb065643b9d95a5e79c3b5b7ac8d930fa186708560edb94e9330c19942ba44830da6ee42171327": "0x00000000000000000000000000000000000b4475636b206f776e65720e446d6974726969204f726c6f760000176c6f7665636f6c6f72646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbf301ce3bba9ceb6ab369ac6c6a1d4c5f3b22db6653f8a9f69a1337c993e224329c82e7c0fa0d72": "0x00000000000000000000000000000000000b414c43455520424554540b414c4345552042455454127777772e616c636575626574742e636f6d0116616c6365756265747440686f746d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbf8387678df0b09a4b09d484bc36928c3153a6beeaab89e92572b30c1bc4cffd7ef086994d01324": "0x00000000000000000000000000000000000754616465636f0e54616465752053616e74616e6100001074616465636f406c6976652e636f6d00000f4074616465636f73616e74616e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cbfa34eb67b328eafaf4d633c738f86a7a26ef5c993a9079fd3fef82a565b65f14f9c4cc8e569e47": "0x00000000000000000000000000000000000453434f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc169cf732b5dc8c32b2070011076282b898fbaa43821fa6bb6dc3625b2698e52d79337b37c258d8": "0x00000000000000000000000000000000000c44696e6f20582044696e6f1144696e6f204d61696e2057616c6c65741768747470733a2f2f706c616e65746e656f2e636f6d2f001b6361707461696e2e6e656f6e40706c616e65746e656f2e636f6d00000c4044696e6f5844696e6f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc3222aeb2d95a7cf60bb5621e8977718636c7ccb5a45c83def9c670175c845b9b38455da2718014": "0x00000000000000000000000000000000000b4a6f61642e726d726b2000000000000010406a6f61645f726f6472696775657a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc35db54eb98ba1950e5130bfbe3f3c62d83fd50e01b839fd4d45ddf4e07b19faf39a183ec21a93a": "0x000000000000000000000000000000000009656c6f6e6d75736b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc38c8458a0ac5f12e4ec1a3f402d5b1d0164802b0aab98ae581a6c248cf84093634916377d2e733": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc718a6b9e9964318ef5289702f6b8c7d22b3562ffda7d5593a5f6414226925e72097efbf9b25720": "0x040100000003000000000000000000000000000000000d5265676973747261722023310d5265676973747261722023311868747470733a2f2f7777772e63686576646f722e636f6d144063686576646f723a6d61747269782e6f72671263686576646f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc73c26e52b725e15869e5f3b7da844b1638ae3d076f73a439bd4477701b2b95bd4137893bd0a727": "0x00000000000000000000000000000000000944616769654465650000000000000a404461676965446565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc8d0888d5d6f924400daf17b98e3592f65147d0fb6dbd1c322e5562ffeb11ebcf6763a171eb144d": "0x0000000000000000000000000000000000055354414e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc8de026a3642284a0e2ce7bf17dd65ae193d2b0a5723d089b5d2969045b2c7ca722a43d7efabf64": "0x040100000006000000000000000000000000000000000843727074646f740101011463727074686467373940676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cc9822c9da4c837c86b7409a11700afb027924cb40fa43889d98709ea35319d48fea85dd35004e64": "0x040000000003000000000000000000000000000000000ef09f8dba2047617620f09fa5831544722e20476176696e204a616d657320576f6f640c676176776f6f642e636f6d1c406761766f66796f726b3a6d61747269782e7061726974792e696f10676176696e407061726974792e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cca36d817010587dacdebce9d35e7cdf4793cd9eb2a1223e568c2ed0684d9b852fc21b70a0c86237": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34360f62696e616e63655f6b736d5f3436000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ccf50f8320382ca644da8d011a0f821b2e39d6151f8e17c417c0e09b664587dfe2021a194ee95d74": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd07125b43213e171c82102e4554587f23cbd4bfdb0f43c9d2879d18feb6102bbed977930f695f22": "0x040000000002000000000000000000000000000000000e444f5a454e4f4445532e434f4d00001240646f7a656e3a6d61747269782e6f726716636f6e7461637440646f7a656e6f6465732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd16bfe2352b1748923f2994a4c517694b0c566751a4670c49cd95c9b545e37c46b9af820dd7dd6e": "0x0000000000000000000000000000000000066465766f68000000146465766c696e407a65697467656973742e706d00000b4064627261626173736f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd1ac1ed28e6a58174b2a542bf7ec24dd9947ac9584d8352191f0154185cf7273f08a79e9ea75f00": "0x040000000002000000000000000000000000000000000e53504143455f494e564144455200001a4073706163655f696e76616465723a6d61747269782e6f72671b7370616365696e76616465722e646f7440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd23612967eaf930b8970463116cf97047eb507bc4cbaf1bf77b88216bb6e89b1da5672a44f02f4b": "0x040000000002000000000000000000000000000000000b414b617069746f6e6f76000014406b617032666f783a6d61747269782e6f7267126b617032666f7840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd367e518a4206c79653ea6fa2a3e4072178c4de671464a69d9c72c7ff7170bc76697b46b3947b0f": "0x00000000000000000000000000000000000453616d0d566c61642053616d6368756b000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd3c992836bd43255a17ce1052e06f947dda66c6144fffbbc07492394521bc16427f9b9851b48821": "0x00000000000000000000000000000000000642696767730000000000000a406269676773636d73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd4606afef2e28ca7eb19cdd47013d60f73e4c9b3e7e95c07dc40841c72d62951b8ed39d46d64a2a": "0x000000000000000000000000000000000005636f646500107777772e636f64656e6f64652e63610000000008405f5f63306433000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd489db0874b4738a6483f0d061421d62af3e621dccb1ed608a177e4043ba4d2d73e0935976fcf2a": "0x00000000000000000000000000000000000a6b666775736d63323100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd4a30ce889e7a55c04f1633da0ab6cb71f71ece4d1a5c32926d3f707d250f66ab712d65eb374b2d": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd5a4e9b4e3a205200778b6f2104578c212125b47b52181aed777a047f3b299353c36063a5028a11": "0x0000000000000000000000000000000000115468652041766572616765204170657300000019746865617665726167656170657340676d61696c2e636f6d00000e40617665726167655f61706573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd810312c75ed239feb72a25692ef5988cbd2a2b0d5712c47149820d2cb35f0c7fc97635b2eb4b4d": "0x0400000000020000000000000000000000000000000007477573746176000000166775737461762e6e69706540676d61696c2e636f6d00000c406775737461766e697065000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd8ba9536297030e5eb369d8759d592d5bab556aff1e2bac770979fc9bb30cb7dd503788a154826e": "0x000000000000000000000000000000000003445300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd92383c67926cf490b857bd025228fc9efe2f2ba5a58a0bacfb3c40dcc0557e484c17a63be1cb1b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cd9a6f0d7176c667f8903521d75aa8e9c24de8f9fea4011c1ba56c613da7b12bc9a894b896ae7a79": "0x00000000000000000000000000000000000c4d616e75616c204d696e740000001a737562737472796c75734070726f746f6e6d61696c2e636f6d00000d406d616e75616c5f6d696e74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cda0448328a47d986e78d0861320e3ba6c6b8eecb666b245d2bf06652c1fa86f7c150e9b2b6f772f": "0x00000000000000000000000000000000000a7061696e6b696c6c7a0e4d6f68616d6d616420417761640000157061696e6b696c6c7a4069636c6f75642e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cda070697bb44382d2cfdfb80cb90a4a5826c98846a367489fd25d3a2561838fa372f39f3f7fb138": "0x040000000002000000000000000000000000000000000c503250205354414b494e470c503250205354414b494e471868747470733a2f2f7032707374616b696e672e6f72672f1240316c3363353a6d61747269782e6f72671a7032707374616b696e674070726f746f6e6d61696c2e636f6d00000c405032705374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cda793c07d75efb0d4b3dfa23d4da0e7b854d81a2da2d369bd1358ff743fedff29aa5cc1f5fb6444": "0x040000000002000000000000000000000000000000001141495745423320636f6d6d756e6974790000001261686a7863727a40676d61696c2e636f6d0000094063616f5f6c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdb0222db39bc78600516484b2e6bac9fcaeeafa925b183ccd118b747074c475f188348e98d85644": "0x000000000000000000000000000000000009737544726f6e696301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdc30a2149db3bc32a5473f95881089686743849021bc41ddafe705b0654f4fbd84a8c7f7518ad49": "0x00000000000000000000000000000000000b4578706572316d656e7409416c6578616e6472000010636f6f6c36363640756b722e6e657400000c404578706572316d656e54000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdcaf2c89675be00ca5963dcd0af5bd2441dd34631995251b151baa252bfc5b80b78637b779b8518": "0x00000000000000000000000000000000000b4e6f5f53747265535f5300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdcb048b3228e1971c167f680b246a86565aa36eb8e525d2ccde935f9be8f53ff592326d7d7bec61": "0x00000000000000000000000000000000001c496e2070757273756974206f6620746865206d657461766572736501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdd9fdbc6dbda2f1362f9efe78a0d238501313e68a74a9b6257f406c5c62c9162d96852a13f79902": "0x00000000000000000000000000000000001853696b204e4654207c2063726966666572656e742e6465001768747470733a2f2f63726966666572656e742e64652f1540646576305f73696b3a6d61747269782e6f72671a73696d6f6e2e6b726175734063726966666572656e742e646500000a40646576305f73696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cde110fa4c51bbb438a48b1b98077c557c474ad091c854286fdf929b0e710299b16daae9e0ae4a77": "0x04000000000200000000000000000000000000000000084d65726d61696400001a406d65726d6169646f6e6c696e653a6d61747269782e6f7267196d65726d6169642e6f6e6c696e65407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cde412338d7923785ebe5000d4785e181f7f84d06445071b0d4f5a98cc30d7c566830811b6d33c5f": "0x00000000000000000000000000000000000c54657373615f4461776e310000000000000d4074657373615f6461776e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdf45b2bad669b8abcb3857cb91529a5fb21358b1ce837e4c12dac8c095e87e689a91dcd58e9bd3c": "0x040000000002000000000000000000000000000000000d426c6f636b2042726964676500000016626c6f636b6272696467654070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdfdcd6d89826c1a521909b30a6816fa9a8796e5233ba76cae620e8577a525dd5606baf0797bcb6e": "0x00000000000000000000000000000000000d64726177696e676b656974680101011764726177696e676b6569746840676d61696c2e636f6d00000d406f6861796f6b6569746879000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce039cf8a6e0c411546c4b57539ccb82e3ca981340b2eee5b3c973798f1ffaa671d6276031a6d16f": "0x000000000000000000000000000000000007416e67656c6f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce0fc9b4caf7f03d56923fcb0c362b333a2833175025883860f6b93996233319503a4ac478b7b115": "0x040000000002000000000000000000000000000000000d414c474f207c205354414b45000016407368616465776f6c663a6d61747269782e6f726713696e666f40616c676f7374616b652e6e657400000b40416c676f5374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce591cccc3c347d0fc90e922a45ef6a5dc3c8abed38bb0aae5b9aa7efcd388fab60e329fe9c2d945": "0x04000000000200000000000000000000000000000000084252554d4d4945000017406a696d6d692e313939383a6d61747269782e6f726718756b2e6a696d6d692e3139393840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce5f7c846b1c490828bbb43cf5a770578c5bde89fbb3e4a71d3d19e7e28206bd70f41477984ca123": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce79163e5f308367344c5f7ce70559bb401142aaab72f4f6edbe78b4908e6769084cde89349fe63e": "0x000000000000000000000000000000000014546865204772697a7a6c792057697a6172642000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce8d111891bbfa55b4a5accc15f38c85625e18235ef02b0ac671d5016397b23c9d866706db431033": "0x00000000000000000000000000000000001143727970746f5f41726d6164696c6c6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce98d27dee4a6c1028258fd47fd5ab4a8e87741bad51dc7a17217617e1d7105bc9b2f8ae4b4fe708": "0x0000000000000000000000000000000000054c656e610000001763696c696e6761726a616e6140676d61696c2e636f6d00000f40656c656e613937363534333235000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce9a50917cf77bb19681fe005baa3099a7d9c03a46e539b173d2b3de75b11e86cd5fbb7d4e92993c": "0x00000000000000000000000000000000000a4c69676874736f6e650e506564726f204d6172717565731968747470733a2f2f7777772e726d74657272612e6f72672f00196c69676874736f6e656d7573696340676d61696c2e636f6d000010406c69676874736f6e656d75736963000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce9f04748b26cc2d2a6bfaf3c320491696e649842333c75f041faf71e2676d8bfb45f71580372e48": "0x00000000000000000000000000000000000a417274204b697474790000001c6172746b697474792e73696e67756c617240676d61696c2e636f6d00000c404172745f4b697474795f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cea9b7b0be6d4be2f0e5ac8e356d7a3867e9919b8cb1984ee5a070b1659b6195deb85039a3b69928": "0x040400000002000000000000000000000000000000000b56344c494448344e44590000154076616c69646e64733a6d61747269782e6f7267166b75736e64734070726f746f6e6d61696c2e636f6d00000d4048616e647943727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ceac28e060489d6e601c5348ef25d1c6c432065db0ce29dc6c0b45abe9b5f5e7f2e8f57a49479b6e": "0x00000000000000000000000000000000000b706f6e79737461626c65011c68747470733a2f2f6e66742d65786869626974696f6e2e6172742f010100000c40706f6e79737461626c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ceb2fa92c621e2f85abce4b7d2e2b94046f1b7e77885b955a7cb214fa4a63055945accbf01debe17": "0x0000000000000000000000000000000000114152542047414c4c45525920494e432e0000001f73616c65732e61727467616c6c6572792e696e6340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ceca4f391ff42f7042316a3e69911695b705e5428a3be87a2b656a09126fdcdd2ef105995132de1e": "0x000000000000000000000000000000000014546f6b656e20576f726c642050726f6a6563740f4761627269656c2053616e746f731a61727473746174696f6e2e636f6d2f6761626f75776e65737300156a67616273616e746f7340676d61696c2e636f6d00000d404a4761626f75776e657373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cecd17edf1cf34fa3640cf6c8548a076a324a04190b30c74a44809ee11fd684f49a46134204aa47c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cecd3df8f50e86adfea23409b33280a4e0109a957dff8a732b88b7e8f85e415a124d64664176a155": "0x0000000000000000000000000000000000094d617279313636300a4d6172696131363630000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cedae9c81b8ef8ff42be75cb933073a967d8cb8c6c723028208a678c5a58f5e8f49a237eb33e1654": "0x040100000002000000000000000000000000000000000d4a61792043687261776e6e61001e68747470733a2f2f6c696e6b74722e65652f4a617943687261776e6e6119406a61792d63687261776e6e613a6d61747269782e6f7267194865794a617943687261776e6e6140676d61696c2e636f6d00000a40476c646e43616c66000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cef56560701eb05fbe5e55779d8749406e8ccc62030eafaeeaacb7fe4f583104b2c617c71f4ffb1d": "0x00000000000000000000000000000000000a42617272656c44616f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf11366ef8733f58e8926b5917a291918a2f0381c1213800798ff37689901f16b6cf42074c61f076": "0x00000000000000000000000000000000000d73756761204469636b736f6e00000016737567616469636b736f6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf1172ac1fb91b86c07040b1be7aedb10ffc0f136b7e147e4a1ad56944c1c76d6c2f6ca089cf316b": "0x04000000000200000000000000000000000000000000094252415645424154001668747470733a2f2f62726176656261742e696e666f154062726176656261743a6d61747269782e6f7267176272617665626174696e666f40676d61696c2e636f6d00000e404272617665426174496e666f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf126c7c679daef68cbc7210c46afb6cbcbcc10c096d3d5f2c9032242bb4e919abf56300abe3ba37": "0x00000000000000000000000000000000000d50617368613139383870726f214f6c656b73616e64722056696b746f726f7669636820486c61646368656e6b6f000019676c61646368656e6b6f3139383940676d61696c2e636f6d00000d40416c657832303231626574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf32922a67ceafba60ee9ce321ac84dee361edcc6f26a0e04a937a13c6ac1e9c5668805383331311": "0x040000000002000000000000000000000000000000000e42617a61722d5374616b696e670000001a65646f6172646f62617a7a6963613140676d61696c2e636f6d00000e405f43727970746f42617a6172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf5169125cd7414c8875bb054b7e9b35a2d84c19152d17947b1ff629edbf1759ddd9f04ce33b495b": "0x00000000000000000000000000000000000753636f7474790000000000000f4043727970746f5f5379646e6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf9fb3a7967406dbd08ff136a249a1e0fa14d1dd102f4ca95436d000428a6bcf3dbc178afe19974d": "0x000000000000000000000000000000000009566976617269756d001868747470733a2f2f6372617a7963616e6172792e6f72670016766976617269756d6e667440676d61696c2e636f6d00000e40766976617269756d5f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cfab6a8090dafa3c00ad3ac9b1478e7fe24ec13e47acea1de9c52dc4b1dae34311524bacf23b5d0e": "0x04000000000200000000000000000000000000000000154a4741667261697343624379662d2d2d65644e3700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cfe36321ef78340db0d6a32a5f2a51d3814658dfdb3c0f9448c57cb18a766c755a6310166dae3137": "0x00000000000000000000000000000000001e4c6567656e64617279204b696e6720262053776f72642042756e646c652142757920746865204b696e677e4765742045766572797468696e6720456c736500001a6e656d6573697364656675656e746540676d61696c2e636f6d00000d406b696e676d6f6f73616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d001fc2ba95e343662be9aad248398097b439acd2534396228c1fbe87deb19fd5ba444715fe0e143": "0x00000000000000000000000000000000000d446562746f7665726c6f61640f54696d6f74687920436c616e63790101166d696c6f3837636c61737340676d61696c2e636f6d00000e40646562746f7665726c6f6164000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d00914612039bd0a8c2906642eb60a6fc2223771fc33c3a96e94eba9683bc50a6e2b5c70db6fbf2a": "0x000000000000000000000000000000000007506f6c6b613100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0122e96825a0068745a3099faa56c038133a62829a680ebda7b368b1659dde5237d8eb1a60efb30": "0x0000000000000000000000000000000000096c756b69636438380c44656a616e204c756b69630000186c756b69632e64656a616e383840676d61696c2e636f6d00000c404372797074446f673838000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d013db7b7a6128798e6fef1631647c0defb15811a12f19e3a964322dbe0293f329824ff6d94e9805": "0x00000000000000000000000000000000000a6d636d61637374656e0e4d41524b2041205341594c45520000186d61726b2e7361796c6572313040676d61696c2e636f6d00000d404d61726b5361796c657232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0197e8e8f3672a578cb58e575019116c0f5e1d698210f9e1981eac0b1bdd419dc029ba193accf79": "0x000000000000000000000000000000000011f09fa5b04d414d4143495441f09fa5b000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0201be4d1c2cc92ee92a79760d0480aab1a940b0abab817dfcde83655e4d2c71682ce272b26ef0a": "0x040000000002000000000000000000000000000000000c4a6f73652e43727970746f0000000000000e404a30736552616661656c3132000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d022db95af4618a2a875793cd52c841f83f61d346cd7ba2f5d6219e8a6ddb951b73df0a1887c7619": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0524a63ed8afdc650df6ec6f3dbb1134df6fd1d572d4dfdbe1058fca0e7197ef8d0f3d05a720f5e": "0x040000000002000000000000000000000000000000000a446f6d694e6f646573001568747470733a2f2f646f6d696e6f6465732e696f001368656c6c6f40646f6d696e6f6465732e696f00000b40646f6d696e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0569ffc10d41f9a4c70ba55ca8bec67d63f35b1a88daf1bae874e0f8df029e9b026447c3f025917": "0x040000000002000000000000000000000000000000000a56616c6c65746563680d56616c6c65746563682041421568747470733a2f2f76616c6c65746563682e65750012696e666f4076616c6c65746563682e6575000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0579c696be22af2a8b653aaf32a9addc7d2ed4216a147eb03688ceccf00ec0970dcf2a3b01c0227": "0x0000000000000000000000000000000000134a616d696526e282bf6974636f696ee2938b0101010100000a404a504b3130383120000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0588fe1333a77f1467535f6ed22a8ec7da3d7e7529f8c68380ffda3201bcecaf2d4d86c45618d78": "0x04000000000200000000000000000000000000000000084d656c616e67650000134070616c6163653a747a636861742e6f72671a6d656c616e67652e7374616b696e6740676d61696c2e636f6d00000b406f6d676c6f6c323437000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d086b21014fcda260a50bd5098bfc45338fed742fc7a935aff9ed058c5377b20116585907f106201": "0x040100000002000000000000000000000000000000000f44656c6567614e6574776f726b73001268747470733a2f2f64656c6567612e696f1440636f736d6175743a6d61747269782e6f72671664656c6567614070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d08db4c7456c2d34dab5043bb5134f4438965a1abaf5d431109935a6f973b5b9355c6e4811688f2e": "0x00000000000000000000000000000000000f4368616f7469632042696174636800000000000010406368616f7469635f626961746368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d09bef61f6731fab549209edfbe534c3455d7fee7e340f8f8c8c78e4af36250ef8771556f5006d0d": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34340f62696e616e63655f6b736d5f3434000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d09eaf34f53d7c401480bc228ee751c1aca34061c4952efb304aa94beed8e38fd9c5e693f62c3f26": "0x040000000002000000000000000000000000000000000d63657361722063727970746f00000016636573617267653133303240676d61696c2e636f6d00000b4063657361725f676573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0a4a707f90f5d345a1351655f559e75b557ba12681698329a54cb32af516149d3022170a8e9da2e": "0x000000000000000000000000000000000012f09f98902067686f7374207c20f09faaac000016407265706c67686f73743a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0a70cfbeda907dac69dc00ee1c6849e18d9c051c8c1b1b0ceb69ae18ab0d65ef7c47a2bddee462b": "0x00000000000000000000000000000000000d4a61684a61684a61684a616800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0b071ed4c82c6f2523d37e118dbbad00009bf4c20c246c8b2b671bfb53d1fcb43d9471c932db910": "0x00000000000000000000000000000000000d52756675732054616e67656e00147777772e727566757374616e67656e2e636f6d0016727566757374616e67656e40676d61696c2e636f6d00000e4072756675735f74616e67656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0c787a6865b130b8edef9f52ba1a7f47dc10e12cb4744142161796b5b5c7e75d680bc3b81c90a2a": "0x00000000000000000000000000000000000c5366792047656e6573697300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0d9546392e1385bfcb1063d22c8af6fcd6eadf0954652aabfd55276889537d52a30cf388380a503": "0x00000000000000000000000000000000000c43727970746f67656e696b001568747470733a2f2f73796e63626f6e642e636f6d000000000d4043727970746f67656e696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0dbdf366d9f3ca08ec383bdee26bce0aa83397a3b9bb7ba40991930ba4aee2d9f2d34243e89c217": "0x00000000000000000000000000000000000c43726f77642d4c6f6e6572001768747470733a2f2f6269742e6c792f3330354e635250000000000d4053616d3837313632353637000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0df4de4538d923df2a82c1d57641de66f431f758780229672378cd679da86f6eba0b433162d8003": "0x00000000000000000000000000000000000f4275726e696e67204368726f6d6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d0fb318e6895ef127add073714bbf9da81fe49db63778e918217e56c55e4f81f68e7d2e7d0e59d0e": "0x04000000000200000000000000000000000000000000114c696768746e696e6720426c6f636b7300001c406c696768746e696e67626c6f636b733a6d61747269782e6f72671b636f6e74616374406c696768746e696e67626c6f636b732e696f000011404c696768746e696e67426c6f636b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d11ea423e08f049a7a7c74e948826a6398a493f365bf1804333f3c11e86f19836d5c10586a66cd47": "0x0000000000000000000000000000000000174b7573616d6120666f72205375627374726170756e6b1c5368656c646f6e20417274696d7573204c65746f6e20446561727200000000000e40417274696d75734c65746f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d1310d7acc9400e91e434355bc1417f634ec3ee756d9dad562220624b106c1dbc756953a47784d72": "0x00000000000000000000000000000000000441756e0b4b696d206a7579656f6e00000000000b406b696d6a7931303239000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d1366f9ff3873f7d487410e002435daffbfedffa6d8618013f1e36554abbacb543030be0b7967b54": "0x00000000000000000000000000000000000b6d617472696d2e65746800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d13778bef3c90858128b1857f835ab1569c06a71e4de49df3154a9d5a5fabfa2a4f1ab1c458bc140": "0x040000000002000000000000000000000000000000000b50415354415354414b450000174070617374617374616b653a6d61747269782e6f72671570617374617374616b654070726f746f6e2e6d6500000c4070617374617374616b65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d14a0dfd491494bd5c57aa62fff146488c4f113b98906af70fc9ab8ec3684b907674631e68dbb60c": "0x0000000000000000000000000000000000054164616d06576f726c64156a6176617363726970743a616c6572742831293b156a6176617363726970743a616c6572742831293b1877656268756e7465727332323640676d61696c2e636f6d0000156a6176617363726970743a616c6572742831293b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d164f9f8d9b541902e69ac91dc2b3e54afd2d74736e7dfd95faa1e738dab066c80328980c7c9076e": "0x04010000000200000000000000000000000000000000054572696305457269630014406433636b6172643a6d61747269782e6f72670d6572316340747574612e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d17427312158ad52740a79bb171acbce71d00d7b3ba20b473c97e24210b6fc72709437cb2f255232": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d19c764f1166955be6618c285b3ffd78f73aca116933544ad022b9144c2b610e7e608e267d529060": "0x00000000000000000000000000000000000952657a69737465720747656f7267651f7777772e626568616e63652e6e65742f47656f7267656f72756439323861001947656f7267656f2e727564646b6f40676d61696c2e636f6d00000c4052657a69737465725476000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d1ae9c278f9f249deccc7facbab0732bef0a1feacbf9ba3330b0cfa4869ee8176fbe89bcb0e36e67": "0x0000000000000000000000000000000000115961727a61722020f09f87b2f09f87b200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d1c6a0460fda08feac9e892f6429cb00d736600e22204ad08382011d46fb5493ef1463d04346417a": "0x040000000002000000000000000000000000000000000d4445564741494e532e434f4d000015406465766761696e733a6d61747269782e6f7267126d61696c406465766761696e732e636f6d00001040446576656c6f7065724761696e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d1dd5241c7691a93e48a9217aed06778d9f2b22fb910dc2344aea38e5746bfe344094f33de9ceb2d": "0x00000000000000000000000000000000000747656f42697400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d21419bdc819121d18b69aebec4f5274c289716bb8b61f192243046dd34040a3f3c7a8d5ae9dff7c": "0x0000000000000000000000000000000000046b6970116769726c7320737461666620636f6f6b000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d21b6f71d23b15bb1ea86f3c82538c486a25d8abca26760e57e76a01212419c7f1c8b510121fca73": "0x04000000000200000000000000000000000000000000074761746f727300001d406761746f72732e76616c696461746f723a6d61747269782e6f72671b6761746f72732e76616c696461746f7240676d61696c2e636f6d000011404761746f727356616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d22a996b9e9b22ce7c26453f69b2035a88c47342946a277c38c8f0b186edc76c70669d1cada5cf61": "0x0000000000000000000000000000000000096172676f6c61627300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d22cff40d8b99c1922a526d0737cdeb4db20761888e847735b40344277d06c13cd4c691a1ec5a45b": "0x00000000000000000000000000000000000749414d594f5500147777772e69616d796f756d757369632e636f6d184069616d796f756d757369633a6d61747269782e6f72671f69616d77686f796f757468696e6b796f7561726540676d61696c2e636f6d0000104049414d594f554f4646494349414c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2350e1f5f2021c3d2170dd5961428199af9e238cfb231d3396505876859e13d08e89e39d7b4201e": "0x040000000002000000000000000000000000000000000e4b5553414d4150524f5048455400001a406b7573616d6170726f706865743a6d61747269782e6f72671870726f706865746b7573616d6140676d61696c2e636f6d00000f404b7573616d6150726f70686574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d23775b734524690003c82da67b26395b86b46bf7528a984e5593a9305e598b18829c1a9409b8c52": "0x000000000000000000000000000000000007627562626c650000000000000c403078696e766573746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d24c3c8c823f5e00224346ed63fa298c8064eddece0712330342a50f2f152a5fafb454f009a56855": "0x0400000000030000000000000000000000000000000011416c20736369656e7469737420773366000019616c6973746169723a776562332e666f756e646174696f6e00000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d25b2b83caf5ac06d857fcac7bd9bb03551d70b9743895a98b74b06e54bdc34f1b27ab240356857d": "0x04000000000200000000000000000000000000000000065465736c610000001b7465736c612e76616c69646174696f6e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d264c3aadfa8b5d504926a875678c28947f61c56cd0a8fc948ff18e48315721fe44aa4be38489476": "0x00000000000000000000000000000000000b4172746572614c616273001768747470733a2f2f6172746572616c6162732e6f7267000000000c404172746572614c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d265ee733a44472d560fbd75b3db96ef71e33b61600e3f37a926400887daaaae380d3636949c0767": "0x0000000000000000000000000000000000064a6f736879000019406a6f7368796f726e646f7266663a6d61747269782e696f0000000f406a6f7368796f726e646f726666000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d26b218cd225b87f20b9f0216e1f1c33834df5b215115336368c549891ac1171e9710c2126753c00": "0x000000000000000000000000000000000020f09f90b2204b7573616d6120447261676f6e7320546573742057616c6c6574002068747470733a2f2f6c696e6b74722e65652f4b7573616d61647261676f6e7300186b7573616d61647261676f6e7340676d61696c2e636f6d00000e404b7573616d61447261676f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d29a5a781e83f345f618d8489511f00682df9f7d794d081cf5716b012d014846c01a162e94091d15": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2ccbf0f9e33bffd5446c059c4c78c9ead43f0694ab1eda254de55c5db245c4f8e45d95fc62def47": "0x000000000000000000000000000000000006576176657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2d52954fa3e2a736ad94ba63e2b5f27cdf2b293076d03d6fdff2c14a4613668d3f37596a78c9847": "0x00000000000000000000000000000000000e4669676d656e7420427261766f001368747470733a2f2f6669676d656e742e696f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2f1f3681fa9bb4720112dff656489548b0a7815a06d3a59f93880ea46ee2662a6439bb431bab046": "0x04000000000200000000000000000000000000000000096c7578382e6e657400001540616d6133313333373a6d61747269782e6f72670e696e666f406c7578382e6e6574000009406c7578386e6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2fad4b1e4fea8e60e04422d0a8edc33aac00d194877069ce2b3b5827b78bfe9b54124a24294d811": "0x00000000000000000000000000000000000b426974537461636b2d31001568747470733a2f2f626974737461636b2e636f6d0010626440626974737461636b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2fd31147177f387ca4b1c51a3bf66af076145f088443de0ef7cd283e0db88a50032a1cd34f3232a": "0x0000000000000000000000000000000000064b4f4e414e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d308cb70d43f28085c2a5b5f64917252f743cfd8fec900587436c383086598aa71c93692661e5f59": "0x000000000000000000000000000000000008546865204d697400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d30c2eb96b5970eebe15890524198006c60a31bcd93a4bbf321e5ae01bc561da4e64bbbcc6e9b359": "0x00000000000000000000000000000000000e4d616e7461204e6574776f726b0e4d616e7461204e6574776f726b16687474703a2f2f6d616e74612e6e6574776f726b2f0016636f6e74616374406d616e74612e6e6574776f726b00000e406d616e74616e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d30ea9c98411c92b82ec846c0a52b9c033f68406b9a83aa780305272c0cdb723aac4bcda7595b640": "0x04000000000200000000000000000000000000000000086269672d626167000014406269672d6261673a6d61747269782e6f726715692e66617a756c6c696e4079616e6465782e7275000000001338393038393431303039393835343133353300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d32859a272c0a2203614bc16c1df6ff786504c9b02854f49a59bf5379f5e23cfefad24e77cf00152": "0x00000000000000000000000000000000000f42696e616e63655f4b534d5f32340f42696e616e63655f4b534d5f3234000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d344c21842905461f4561fb4cff90fcf5afefa2f170eabe539b19c1dd5d9d5df5dead7b26c98cf19": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d347ee113906d431bc8411a57314390768f469e76222ad677bfcddb342ad54dd76c3116593faea3a": "0x00000000000000000000000000000000000c4761627269656c566f6c7408457667656e69790000176469766f7261766f6c74393140676d61696c2e636f6d0000114038346c6870774277646e4753486833000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d37aeb944733e681aa19053750bfb4dfacdab0e8ea94e0914fbb1b0aed9450755bc38df95f13f441": "0x00000000000000000000000000000000000b416e677279204269726400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d391d9d986f924c71875965235d98860a9695076ca95b03f5c532d79f0d0b8a53fa6247090fe1505": "0x00000000000000000000000000000000000b5261696e626f774e46540016646973636f72642e67672f416743557a443537377600157261696e626f776e667440676d61696c2e636f6d00000c407261696e626f776e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d3a269b657e1dfd090a4c78f16c247b4b438a25734d0479b32c196cacb25ecc95a79480dfc6cee7c": "0x04000000000200000000000000000000000000000000077368616d6230000013407368616d62303a6d61747269782e6f726713722e7261616a657940676d61696c2e636f6d00000940307368616d6230000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d3b4bb9b7ce70c8d4e3711ff0fdcfc953c9ff93355ed42146e442c256b6010ddd5b5fe0ee8b8ac1c": "0x0800000000020100000002000000000000000000000000000000000f43727970746f537461636b696e6700001b4063727970746f737461636b696e673a6d61747269782e6f72672176616c696461746f724063727970746f737461636b696e672e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d3c431103710ce4ece8ab75ebb8a44502bc0a55f439d421f8d59372b5d9bba22e31b770e0317c236": "0x0000000000000000000000000000000000154f7263686964784d616368696e61202844414f2900126f7263686964786d616368696e612e696f0000000010406f7263686964786d616368696e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d3d814d7f08cf77d28b199c10b2b388ce480499767f81d871cd1bc381f7106d810f69183ff0bb600": "0x0000000000000000000000000000000000097073796368656d79097073796368656d791568747470733a2f2f7073796368656d792e756b2f0011696e666f407073796368656d792e756b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d3ede878555e1dcebebf5aa73bf19935376f19460dacf00bf0dcd021ca37d6a2284cc6347dfbb13b": "0x04000000000200000000000000000000000000000000115354415244555354205354414b494e4700001d4073746172647573742d7374616b696e673a6d61747269782e6f726719696e666f4073746172647573747374616b696e672e636f6d0000114053746172647573745374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d3f55d2a3bdb036484de146db749ad6f982921078e8dec36432724c2e58ee2523018794d66b4b33e": "0x00000000000000000000000000000000000f646f7473616d612067726565656700000017646f7473616d612e6772656740676d61696c2e636f6d00000d40637261696777696c6c3733000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4033833f41b67add80d0b0a6fe11c8257ab574e3379491172cf2e6398fdc12413ff1e8cb0dca602": "0x00000000000000000000000000000000000746524f444f4c1044414e49454c20564143554cc38d4b00001137766163613740676d61696c2e636f6d00000840377661636137000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d414938ade2ffd6ad42bdf23d39282dc625dad8b2ffc0b8682b15b2fe16386a8b7d7670ef49c1034": "0x00000000000000000000000000000000000b64616e69656c74616e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d423ef3f47b52bf7c48a7d8c907eda4ec2ea41d9bc09584ef7bdf9771212672f0fc065a28eb5d809": "0x00000000000000000000000000000000000e50756e6b205661756c7420233400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d426b9c30d551db958a7854669ff1e281e737aae0f84d013eec326ab95a273c0c1632d009f02361b": "0x00000000000000000000000000000000001241646d6972616c204869726e77757273740000000000000f4061646d5f6869726e7775727374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d42a0215208f31fdb6ccd54659f4b9ffd747e6ba2dbebfd5d2a64ad3ab8dcf6b647965c20fde4b26": "0x000000000000000000000000000000000008416264204e46540e416264616c6c6168204661697a00001b616264616c6c616864657665736f756c40676d61696c2e636f6d000008404162644e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4351e7307bc37c8d82318297ca7af51ac2546ea6bd24acca272e1627db952e2ca35df527a3cf257": "0x0401000000020000000000000000000000000000000007416e6e76616c00001340616e6e76616c3a6d61747269782e6f726714616d3539333137383640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d435a9777e7ecc393c5862ed65c524b7bb3564776a81904218f44f3d7c35162a608e39dbadbcda05": "0x00000000000000000000000000000000000f4e6174506f6c6b6177616c6c6574134e6f7220536166696e617a20417a726169650000166e73612e70796e7574323840676d61696c2e636f6d00000b405379615f50794e6174000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d452102e2cdc7c6d0615a0ee03c20ebb5fa2073580dbeb208997a4cfec6d0c45eb6aacae346e7341": "0x000000000000000000000000000000000010546865204b696c74204d61737465720000000000000f405468654b696c744d6173746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d454f28df46217c3a413aba1432d6c746556ce43688ff333612f6abe674cd018143a0f819f9ae011": "0x000000000000000000000000000000000010556e646572646f6741636164656d790000000000000f40556e646572646f674163646d79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4615d4a4674bc89b80441d3a9d744772eef9c1d6f9babafdc2cbd1b641134372accd4cba23b602a": "0x0400000000020000000000000000000000000000000019464353206b7573616d61207374617368206163636f756e741946696e6f6120436f6e73656e7375732053657276696365731668747470733a2f2f7777772e66696e6f612e696f2f001b636f6e7461637440636f6e73656e7375732e66696e6f612e696f00000a4046696e6f615f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d483e0981fcc955908f241657b6fafb70ad61e1d2ca48854400ac5499472047e2313837f22dbdb34": "0x00000000000000000000000000000000000559657469125969c49f697420c4b0c3a7696e6465726500001879696769746963696e6465726540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4860cb6eb01ff314c5586b7da01ac92974de944023354a80c57d22758be9e56ccc8fd3fce706556": "0x000000000000000000000000000000000005736562691253656261737469616e205265796e6172640000197461737465736c696b6570756e6b40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d498e8af62b9b81f48cd9f664b904e5fa2943cb433f83c4747aa5503b65db20c3323ef45e3533c52": "0x040000000002000000000000000000000000000000000b4d6178426f6f6b50726f000017406d6178626f6f6b70726f3a6d61747269782e6f7267156d61786a6c7565646b6540676d61696c2e636f6d00000c404d6178426f6f6b50726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4bbaded83232e480a7ddf52460667c3f7adff6e3940814273085004a1ea440514c031b04273840d": "0x00000000000000000000000000000000000c427573696e6573736d616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4c23f7b6dead31a72f6d064648a26d887389b6693722008d4caf3806559b92fb1ee8dfa0a45d033": "0x00000000000000000000000000000000001c63796265726f6d616e6f76202f2f2f20686f775f746f5f6e6f6465001968747470733a2f2f742e6d652f686f775f746f5f6e6f64650000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4ed4dd340a2cebbbc486ed2f394da6e6b58b130687b48d3d19f756ba6d0655d37bf58ff0f59f974": "0x04010000000200000000000000000000000000000000124164616d5f436c61795f53746565626572124164616d20436c6179205374656562657200154061737465656265723a6d61747269782e6f7267176164616d2e7374656562657240676d61696c2e636f6d00000e406164616d7374656562657231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4efb6a7c466273b168cf2d861c66db1a3fbaf0ecf25df661c7d55787615a390763518e98de0b747": "0x00000000000000000000000000000000000e426565667920426f76696e65730000000000000e404265656679426f76696e6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d4f3cca21e8eadd0dc3b9a6dced09d3d392ba7a559c5505304cb3bec0168909d1ef3ddea59bc3f40": "0x000000000000000000000000000000000008436173744f6f62064b656d6574010940436173744f6f620100000940436173744f6f62000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d509c5c59195b1ec5c3739d60301126756a7510e34f9d656d4435cd4fe64bbd001f1f3473bc9c333": "0x04000000000200000000000000000000000000000000055a656b65000012407a6d6f73743a6d61747269782e6f7267137a2e6d6f73746f7640676d61696c2e636f6d00000c405a656b654d6f73746f76000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d513a4d26b535221784eec0cca663bb2db534e9f62df416453ba125d1b7164fbd0e57cd3e8e97b16": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d53d5d90d84924fe4677245c32c396fb92974ba9bf94b8fd84a6ac489a98bbde7c24ac48b1105160": "0x040000000002000000000000000000000000000000000b5374616b656177656562000017407374616b6561776565623a6d61747269782e6f7267157374616b65617765656240676d61696c2e636f6d00000c407374616b656177656562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d55375322bd7510232888663bc260532b200b41cc9ef2fc128b68e8d533e3a7a948f9ac39f50ee0e": "0x0000000000000000000000000000000000104c6f776b6579204c75636369616e6f194e69636f6cc3a173204c756369616e6f20546172676973650f7777772e636176697065782e6d781b406c6f776b65796c75636369616e6f3a6d61747269782e6f7267196e69636f6c75636369616e6f323540676d61696c2e636f6d000010404c6f776b65794c75636369616e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d5591ec3b4ca405c90dae70c96bd25cc1a05708607846a56409ac0f5583da69993dbe51e9c745e71": "0x000000000000000000000000000000000006526f73696500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d55aed6a285552b8eea608b429d85b4dc655283ea9eab1228082aef03aeac6cdae6f54490cd08d1e": "0x00000000000000000000000000000000000e486f6e6579636f6d6220322e3000001b4064726970736c6f776d6f74696f6e3a6d61747269782e6f72671e64726970736c6f776d6f74696f6e4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d574ca61fe1791bf8286f065125f13ef660e4862d9c37ba16bf863ebb5190027c011da51d818d020": "0x00000000000000000000000000000000000a4c61204261737572611d74726173682067617262616765206e6f6e73656e7365207472697065000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d577f5c3d9252401dcda723fe1d35644330dd76fb23e8a054ea173de8662658abd8c01b92215496c": "0x00000000000000000000000000000000000c43727970746f70617468200f4865726d616e6e2054726f67657213436861696e6578706c61696e65642e636f6d0011667269736972406b75666e65742e61740000104074726f6765725f6865726d616e6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d58baa61c0bbca6b0294d53df32ffcce69720bff43ef091c4bb98746625ccd872c83020b6e60b92b": "0x0000000000000000000000000000000000094b534d5f6b696e67094b534d5f6b696e67000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d5a0db274f5df4e104d8d6a7936466d0f9d111e89f97ba11695c0525bb136b68d9924299df236638": "0x04010000000100f0373a0002000000000000000000000000000000000000000000000000000011506f6c6b61646f74204dc3a97869636f11506f6c6b61646f74204dc3a97869636f0000187465616d40706f6c6b61646f746d657869636f2e636f6d00001140506f6c6b61646f744d657869636f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d5b36f8aabe01a6052dac5497bbdd42583d07aa46102790d54aacdcbfac8877189e3b609117a2915": "0x040000000002000000000000000000000000000000000453656200001b4073656261737469616e3a776562332e666f756e646174696f6e1a73656261737469616e40776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d5ce1fd9020fbeba60b791f8467410a5ce2e880cc222933ad50705664917bc9d190a52596b987121": "0x040000000002000000000000000000000000000000001146494c494752414e2d5354414b494e4700001a40746f6d61732e7374616b696e673a6d61747269782e6f72671e746f6d61732e616e646572736f6e2e3230303440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d5dc001e58cc1a2dc0e9999cf8e2137f6aa333a591dd91aae131fc563931ab47986d637283c7ed29": "0x00000000000000000000000000000000000f566976656b2773204b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d5e66d23eb784c1150fa056fe8636d5041e3a460e63839603087bf789ce60514f00bb2473b728e4b": "0x000000000000000000000000000000000014506f6c6b61646f74202d2050432047616d65720000001973657267696f2e6f746176696f4069636c6f75642e636f6d00000f4061706f6c6c6f74686562756c6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d609065d758b7e8b9c8427ec1489648401391189a706384709fb9e657de816f41564e5b2cc9dcd3d": "0x000000000000000000000000000000000021536565722050726f6772616d204e4654204172746973742053686f776361736501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d60ed63674d67c971018f7a7cfcea5146f42a9f7514fd5873e7c0d523e8a244bc0662bd1d98e7a59": "0x0000000000000000000000000000000000096d666572686f646c096d666572686f646c00000000000a406d666572686f646c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d618b703260a53b98a5c48370385dbc1ceaddee2196bd1ea5e5617d5d6b8149a17d6dd4adaad8667": "0x000000000000000000000000000000000009666172756b30353813c3b66d657220666172756b206172736c616e00001a666172756b6172736c616e353840686f746d61696c2e636f6d000010406f666172756b6172736c616e3538000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6397f35e3bd3d7aa4da8ad5b663d506866eb429c70a606e73d6b78aaf04279691ae408213e6e206": "0x00000000000000000000000000000000000774736f6d697300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d65a76a86282a40a861cb62f476c70b7b610b759887b412fe5ccaf41056e76cb9702b6683309e329": "0x000000000000000000000000000000000008547269756d706800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6672f8dabe56cfafc605754e335954ecf919857633f415d774d4d12712e213cceca16852f12d34d": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6924a2febf0176cec55dae9d39f6758a5c07537eb7c64be8bb7417347bff0473ada40639784e33e": "0x040100000002000000000000000000000000000000001053756e7368696e654175746f732d5300001f4073756e7368696e656175746f736e6f6465733a6d61747269782e6f72671c73756e7368696e656175746f73696e666f40676d61696c2e636f6d0000114053756e7368696e655f4175746f735f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d696aaec0094a128f47313bfedaddff9c793fb87f947bc9444658705a5a1060cc6314f5a1986a90c": "0x00000000000000000000000000000000000a4b61636b766f67656c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d69a25a402c5611e0c803a3771c8a186638032d9b7a49c853dd6277eaf7a2360dce82c0ec79a5755": "0x0000000000000000000000000000000000064e6f6a61580017687474703a2f2f6e6f6a61782e74696c64612e77732f00156e6f6a6178737765657440676d61696c2e636f6d000008406e6f6a615f78000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6cf502341600d556c519d42e162875d1d3c3c77e651f508aa6b0acb837c742d2708946f5927af2c": "0x0000000000000000000000000000000000085a45524f2e494f001068747470733a2f2f7a65726f2e696f000b6871407a65726f2e696f00000b407a65726f646f74696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6e8d01b506d9006a41e9f37a05aaac44e5eb8370e4bbffc6e80041574668571e5eaef0483ff7b09": "0x040000000002000000000000000000000000000000000b42617274616c616d65770000174062617274616c616d65773a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6f4a0256fc9f716e0edb40f22c7d63c19a54e07562c062b1eb09447d51f5cf6ab734ada60793a44": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d6fb5b84c25006bdc63c43b6438923bccf2d45e4c2f40cdd0487f6fa2642850b7a01df18dd27825f": "0x000000000000000000000000000000000004706f79024100000000000b40706f797369616e3033000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d70a505217b108b4ac17e441d94f220689361662feeadf1c5c14876375a72a392dd67f276e538706": "0x0000000000000000000000000000000000086269676d66657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d722c1e7fc34a853ec007f25ffe88b5e993645de184a0c7c32050eb68b8f47f05e9fa06844ac0f40": "0x0000000000000000000000000000000000174665656c20746865204c69666520596f75204c697665001e68747470733a2f2f74686174676f6f646f6c6665656c696e2e636f6d2f001b74686174676f6f646f6c6665656c696e40676d61696c2e636f6d0000114054686174476f6f646f6c4665656c6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d73fd3a82863eee47ee233c6f97eaf8689fe85222c2e2b701c2e654d4c8dacb45fcc574f6f438e26": "0x0000000000000000000000000000000000095368726f6f6d697a01117777772e7368726f6f6d697a2e636f6d01127368726f6f6d697a6e667440706d2e6d6500000d407368726f6f6d697a6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7553e6d8d0f99e5f66b0ab84c0ad724138f81ce24ed1fa17897d6e75a6356c4115cf44d09e19e48": "0x00000000000000000000000000000000000776766172646906566164696d1b68747470733a2f2f7777772e67726963656e6b6f762e636f6d2f0016766164696d6b61746f323540676d61696c2e636f6d0000094076766172726469000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7685dfbd65585fb86bdd82d59404ffe1d6120c6358c14c1bef69a013fa91771c2594f6fa310187e": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000761726b7061721141726b61646979205061726f6e79616e1a68747470733a2f2f6769746875622e636f6d2f61726b7061720000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d78969895bcedfdf5a3a1533b0a9025b41803b18e26fdbc2d218a87b27b1c31a1fae6d8098b3e457": "0x00000000000000000000000000000000000a72616a61746e616e6f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d78ad17ef6e9b32a3c1defc518e6b625f5a9efd940404a1672285b33a1dcbb88b50209b76b79a74c": "0x0000000000000000000000000000000000065069616e6f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d78b6631bad4877c52d49f4667f10ded3c5d8ada0c31d7f397ae650a30cd8ad7663b8f3bd7bfc355": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d78c16b89566f655563544356fb79169a553ad9bd500e2cc88159f56ece7c1fb8015872c68b0e522": "0x000000000000000000000000000000000011536572686969204d697368757374696e00000011666e6174756b40676d61696c2e636f6d00000840666e6174756b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7a964305986fe6726b41bc4436bb3f47662366696bd1233bde29446c80949e3b92a435146462436": "0x00000000000000000000000000000000000a4b756d6163636869200000000000000e404b756d61636368695f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7ae9fa2edfac512d4da8f91c6a4e472fbebceb3a995c6b3e6de9c452f9d72b57a56b28be0f0b323": "0x000000000000000000000000000000000006486f72736100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7b596e66afccd2bd89ea70e822e338b7519379e4a4685595da674fd167b7bd12dbfd10c9bc2b50e": "0x00000000000000000000000000000000000d44415245444556494c337837000000134372797970746f7040676d61696c2e636f6d00000e4064617265646576696c337837000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7dd8684dd09ce27e8799eea1483bb11f30100b2a239f6fbb5098c5723dcd0d6bb4987abcf443642": "0x00000000000000000000000000000000000550756e6b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7e6c03d3b7013c492818e6a3df21899a1f1f3f2d3573e4c978bc23c05317715e288434396eeb155": "0x000000000000000000000000000000000006656452756d0365642168747470733a2f2f7777772e696e7374616772616d2e636f6d2f65643872756d001165643872756d40676d61696c2e636f6d0000084065643872756d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7ef9a5ad88206463e968701c6259a89d5d0f6c7fba46ad0694cc8c66f4b21d4e174744376039402": "0x0000000000000000000000000000000000107472616e747579656e626e30333034107472616e747579656e626e3033303401010100000c40676f6f676c6562657374000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7efccf788fb1a6528d50241999da5b300f01f3004a67a25a11854608f1f437ab86ed2e115243a43": "0x00000000000000000000000000000000000a4b7261746973746f7300196b72617469737430732e756e6976657273616c2e7061676500184b72617469737430736e66747340676d61696c2e636f6d00000b406b7261746973743073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d807711226d31b907054f0231a7bb2c4d8e1b64b4b2a77e7216e5d225552d00235201b1889dc0e5d": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f34310f62696e616e63655f6b736d5f3431000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d809a68f462b1287c285c81a263217572329f43c38dcee6f67b0cd9f25bae69e895080f546f6ba31": "0x0000000000000000000000000000000000076a6178646f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8120c83cf91181312e6a9ab0eee280b366c26e0d43e7826406e7c9c2058ba0f8f31efede72c8653": "0x00000000000000000000000000000000000c626f6f6b77617272696f721f5468652043726561746f72206f66204c6962726172792047656e657369731368747470733a2f2f6c696267656e2e66756e0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d82897aac9ed9c653a68259c764c7a1aca790853256861dfb65ea084c82d10d40f8eb1dffe45e77b": "0x00000000000000000000000000000000000c7375706572737072697465000000187a6d616b696e616f6b73616e6140676d61696c2e636f6d00000f4073757065727370726974653134000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d84deb4759f2e2e9f6a7fa830da55dde09b411ff877ed0ee8fd1ceb2009067ab5bc0ffdc54af4065": "0x0400000000020000000000000000000000000000000006416e6b616e00001140616e6b616e3a7061726974792e696f10616e6b616e407061726974792e696f000008405f616e6b346e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d851abfc5265e96b5015c74ff78d632ca10ecfc0d0fa9fa2009cb4e644d73f6518260f5cb9c34633": "0x00000000000000000000000000000000000947723379686f6f64010b343434657665722e6361010100000d40626c617369616e77616c6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d86d654f0eadeda8ee73cfdef6c4ba205b9b7afadb214de4510b3fdd98d5b7284e09b350e277cf2c": "0x00000000000000000000000000000000000b6672616e6b7977696c6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d87333d9765befa4e643e4515fa656d6d830c088ec251ab76ba6cebd85be7e7d6362eafff654e222": "0x040000000002000000000000000000000000000000000e534f4e59412d5354414b494e4700001840706572656368656e6b6f733a6d61747269782e6f726716706572656368656e6b6f7340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d87f50ab0b5f9643ec5909db1fe8581fbe80eaf39b4577c12a99d5abc87131bc3d4363f623412f42": "0x04000000000200000000000000000000000000000000097363686d6961747a000000167363686d69747a4064632d7363686d69747a2e6465000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d88c6fec2fd9c900b8687aa6d3e0c8659930f6d8f8066260b6633445304d2a3e657a6edc2e42a849": "0x0000000000000000000000000000000000055468656f00157777772e7468656f6a616d696c6c65722e636f6d000000000e407468656f6a616d696c6c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d894f8bb10a8b63f0a06fa6798320860c09dd8b4880aef12921f0d1c03b90d5426aa94a8192ada3f": "0x040000000002000000000000000000000000000000000b4b616f7320496e204241000000166a6f736562656c6f73736940676d61696c2e636f6d00000e40706570656172617563616e6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8a98d8378f930af20836789ec1d218962edb199c7d65158e0edbe4e5ce0db190f6993b64d4aec42": "0x000000000000000000000000000000000006494f594f49011e68747470733a2f2f74727973686f7774696d652e636f6d2f494f594f49010100000c40696f796f69696f616f69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8aa498f3b53b82dc203ae26c4e67f3dfd9c338f9f5f605abe950945d6077c23db6345041818e73b": "0x000000000000000000000000000000000009417572656c697573104d617263757320417572656c69757300001c417572656c6975735f4e46544070726f746f6e6d61696c2e636f6d00000e40417572656c6975735f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8c344e11655410c54fda5a0e241e5497283afebd81b53f6a0235abf62a9bd39594be3f42d291e7f": "0x0400000000020000000000000000000000000000000008537461747574650000001b73746174757465636f72704070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8cb784790741db174dcae90cfd7a3fc9a75e4cc21bd550113b44888ffbf67741c8081c6d121d306": "0x0000000000000000000000000000000000094d69746368336c6c0000000000000d406d69746368336c6c5f5f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8cc1e377a948511bed8e57427b9ba0d58dfeec1e37715621b7216c6953afbfdcfe181c2f6a2ca6e": "0x0000000000000000000000000000000000094372616967657273001a687474703a2f2f6c696e6b74722e65652f6372616967657273001863727970746f6172746e66747340676d61696c2e636f6d000010404372616967536d69746841727431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8cf92a45f6a096b5401c2b936283c6674f9f30be30276a706373c0bd7b7a8dd511e1ceaf4ce1932": "0x00000000000000000000000000000000000c6b7573616d615f6b65726d0dd09ad0b5d180d0bcd0b8d18201010100000d406b7573616d615f6b65726d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d8fccba6b760676a5a98b9e09c1d2e5a120a1be952593d0d542ceb6f6843133f6d64c674b736ae55": "0x00000000000000000000000000000000000c4b7573616d61736872656500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d906663357299afc882e4951811038cfeb6e891c2c574e88d2d950aaf23d6cea7b030e17ab9c6569": "0x04000000000200000000000000000000000000000000094c6974656e747279194c6974656e74727920466f756e646174696f6e204c74642e1a68747470733a2f2f7777772e6c6974656e7472792e636f6d2f164068656177656e3131303a6d61747269782e6f726712696e666f406c6974656e7472792e636f6d00000a406c6974656e747279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d942aa586baec2e388c16bc644b9877b22f0fc11c18bf143398267feb48c3ac9cc110440e9a5d873": "0x00000000000000000000000000000000000953657661546f7267074d616b73696d010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d946b6c106a956cc7cfa423244c9a3bf66c12432dd93d3806d184e01b58e3eb75b4b19b26bf61a75": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d94bcf5481a16dedec03e526f073255828e91779339158fc05b68430ebf66df109820b79c1da4053": "0x00000000000000000000000000000000001d5370656e63657220486172726973207c20426173696e204c6f6769780f5370656e63657220486172726973001540746967657274776f3a6d61747269782e6f7267197370656e636572626840626173696e6c6f6769782e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d954df8fd662305d365572e4f9d2762cc1c4312399485b3b3bbfe113fe2b5a12a73f9ffb5b9e694b": "0x0000000000000000000000000000000000066d696c6f7300000000000011404d696c6f73436f7374616e74696e69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d97b21772959b4b83870abfd18505f673c1808b61dd0d7067a810a9719c2ddee18f9b879752f4c50": "0x040000000002000000000000000000000000000000000a53746173526f766572000016406b61346f6b313333313a6d61747269782e6f72671873746173726f7665723133333140676d61696c2e636f6d000000001373746173726f76657231333331233632363300", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d994ff06d05e1d5898989f74514aeaf57d4f41069770242a83d619c9ae5d46cc05b85136edd53776": "0x0400000000020000000000000000000000000000000010426c6f636b636861696e2053696465000000196172636869656772616e6437373740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9984fac3c81ec12248ba6a719705efdd003caab9383ce61c9bba7e7bd914a96be918a4ab12d7251": "0x0000000000000000000000000000000000087479726f6e657a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9aa60f59932d95d362c1f2bbb4871a52be7e6f8354082c4d83f54fd249689fc820be7e5c672cc69": "0x040100000002000000000000000000000000000000000943484c4c2e4f4e450d4b726973746572204178656c1568747470733a2f2f7777772e63686c6c2e6f6e6517406368696c6c66696c74723a6d61747269782e6f726714696e666f406368696c6c66696c74722e636f6d00000c406368696c6c66696c7472000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9aacd1a800a357c2822e6207970510d1c0d65af57522c8832c810f86d512a09f960efd78f570110": "0x00000000000000000000000000000000000a506f6c6b61546f747301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9c21406bc86d487b46a62619c41606297ea55f07d4c2ff4e3abec149e1f9fe241cf6ea0b12c7a15": "0x04010000000100fc8d0e8000000000000000000000000000000000000000000000000000000018475245474f52592054484520494c4c554d494e41544f52064c554d2d411668747470733a2f2f7777772e6c756d2d612e636f6d1540677265676f72795f3a6d61747269782e6f72670f696e666f406c756d2d612e636f6d00001040464c41545f455f415f525f545f48000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9ce7cfdde49af449a9495310a1c0626605d804f4fff2446ca5a6dad3d2372ded3b1a049ee71df6d": "0x00000000000000000000000000000000000b546865204c2046756e64000000000000104054686547616c6c65727931313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9d39ccedf4c2000b463dd5343005043ca12d524c7dd5d64ca6dfc3ad830665130a214da689d5078": "0x040000000002000000000000000000000000000000000b4d616462757374617a7a0000000e616c696461646140626b2e7275000011406976616e736d69726e6f7670697273000d2e6976616e736d69726e6f7600", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9e7b18acf37afc5109ac2869eb1def6cc0654c320d9aeda6a800ae69b1d90efe0ad42850616e614": "0x000000000000000000000000000000000009536c6f77726973650000000000000a40736c6f775f646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9f5cf21929f1a4c4acd55e7e637540708f860361c1ec0c092cf8169b300d9a4bdeb58faa8a52053": "0x0000000000000000000000000000000000184269726473206f66204368616f73206f6666696369616c1d4e6f7420616666696c69617465642077697468204368616f7344414f00000000000d406368616f735f6269726473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d9f5e42a995ae306029b3f206024f24646fac96836b670bb999eac5b44eda65ab262ccc0a4a6b542": "0x00000000000000000000000000000000000962656d74696b7275000000000000104062656d74696b72755f6d69746368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da1658728cb5fb3c82299cce0c148ac684639df678476effcae36c4eb8cf15592c511512a857e745": "0x040000000002000000000000000000000000000000000d44696f6e79737573f09f8d87001a68747470733a2f2f64696f6e797375732e6e6574776f726b2f1f4064696f6e797375732e76616c696461746f723a6d61747269782e6f72671468694064696f6e797375732e6e6574776f726b00000f4044696f6e7973757356616c6964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da1bc1fea1f074aac68a07f4359b73788575a33635beb03280ef3c52062d5bd01f825e2f463e0b4c": "0x00000000000000000000000000000000000e41786f4b656c2053747564696f001e687474703a2f2f61786f6b656c73747564696f2e74696c64612e77732f001761786f6b656c73747564696f40676d61696c2e636f6d00000f4061786f6b656c5f73747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da23f4f6f4d9e6bc96140a201be6f41e63c5b3bf6b02f67da3f232c6715397302494f894f964ac78": "0x040500000002000000000000000000000000000000001156696e6365436f72736963615f4b534d1856696e63656e74204469204769616d626174746973746100001076696e6365407061726974792e696f0000114056696e63656e7444694769616d6231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da40d28d53abbfcf16f9415c34da11ca5a35f3f18627af4ef312d90777ed086ea20e364b11656921": "0x00000000000000000000000000000000000647454e47450667656e676500124067656e67653a6d61747269782e6f72671667656e67656b7573616d6140676d61696c2e636f6d00000d4067656e67656b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da4eb90d88caf07f5c2341c52e242c57f00d78b9f40cb486714dee3e10bcaefba283e1e4df0e5f75": "0x00000000000000000000000000000000000f4465736b746f702d4b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da569c826c2fd86b76739ac0320c03658b64366855bd6ab037488fb23fa0d183f53b989106e25a2d": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da7ade542996fb4cb6631de2987e1fa759f6aef3e72550a528749c4c52cf38710602bfbac9af7305": "0x0000000000000000000000000000000000064d2d455343174d696775656c20416e67656c20457363616d696c6c6100001773657669796f6e31303740686f746d61696c2e636f6d00000e4044657361726f6c6c61646f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714da9b32cffd9fd809beef167bab8457606e5de5733ed8762eb7d0aea76041e7cdc691a21b95e67013": "0x00000000000000000000000000000000000654696e6e6905524d524b00000000000f4054696e6e693839313936333138000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714daa1ed579e87685ab8f0171b9d40e58e80585aa9997bab2ae23d35557b5442824ad73deba484e36d": "0x000000000000000000000000000000000009597567656e65383900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dac410871d142aa90a53d0ced11a23bb33da1a2fa77b236ad1de8272b61bef478771f5bdd344fc06": "0x00000000000000000000000000000000000e43797068657220526561646572000000186379706865722e72656164657240676d61696c2e636f6d00000f406379706865725f726561646572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dae3f8d26516ccd80224ef86df87db7c4c36488f6f2c49f554c73fcf4a1572b0b1dcd79155784740": "0x00000000000000000000000000000000000e456c656e655f5473756b696b6f002168747470733a2f2f7777772e696e7374616772616d2e636f6d2f456c656e655f000000000b405473756b696b6f456c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714daef22360126f077784ee8a444a606185328b11e83357bfa6541dde1e05b95e69879b1b716f7a247": "0x0000000000000000000000000000000000095375626461696c79001468747470733a2f2f7375626461696c792e696f000000000d407375626461696c795f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714daf69a211b7a8ea508a23d4b915d29be5d2aa20f36649e004c6ee8df393064edad697934281bd51f": "0x040000000002000000000000000000000000000000000a6c75636173796f6461000016406c75636173796f64613a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dafe1c73fef256963e7af6741991062099fd8cf649f36396d77271db62ee03370c1e53ff12cb2642": "0x0400000000020000000000000000000000000000000005454b415400001440655f6b5f615f743a6d61747269782e6f7267146b7573616d612d65314070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db13904a8fd920d916f2af47aa45d69386e441ad73b7ec1ba5065bdd787f7ab7b2d8eb428c5b6967": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db2524c5144787d7780dfaafebd37476b57e181c3636209591f2df438004ae02ef2d759092832870": "0x0000000000000000000000000000000000094561727468415254115061766c6f20504f5a485944414945560000137061756c646a656440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db2d56e31fe5a23ba827364a1e01162f7f1647ff0fc967a83f1ef1d8c8da59414d312de7514c1678": "0x04040000000100902f50090000000000000000000000000000000000000000000000000000000965746853706c69740000000000000a406e7468657269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db3176a845829b906e0417d9e62b75535a2c606b13a74bdde967684d6971d58cd0cad8986e3b3044": "0x0000000000000000000000000000000000075374616b6558001668747470733a2f2f7777772e7374616b65782e6368000f696e666f407374616b65782e6368000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db4738c957436cf21e9c00f9c0788391f63681ed1addd7984e37aa04a96cb887beac70eda9b4766d": "0x00000000000000000000000000000000000c43727970746f44616464790000000000000d4043727970746f4461446431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db51125ce2e8c4560c2017a4f115c013d899b494c955a7ec4cc9786a3997f1823baacc213896a35a": "0x000000000000000000000000000000000011506172616c6c656c2046696e616e6365000c706172616c6c656c2e6669000000001f68747470733a2f2f747769747465722e636f6d2f506172616c6c656c4669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db564ac3abd62540844152eccf08725bea8ce898d6fc5362ff2d0bc9dfc21ed15fd138438d160622": "0x08000000000100902f50090000000000000000000000010000000200000000000000000000000000000000164b7573616d61204865746176616c69646174696f6e002068747470733a2f2f7777772e6865746176616c69646174696f6e2e636f6d2f1540686574616972696f3a6d61747269782e6f72671a4865746169726f6931384070726f746f6e6d61696c2e636f6d00000b404865746169726f6934000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db70f2601c34332880a135db57d4d35273d9a4f661d3dad8f153a1b5bad478f9b0e5223657aabc0b": "0x040000000002000000000000000000000000000000000d574f4c465f5354414b494e470000184070657465726b6576696e733a6d61747269782e6f72671b70657465726b6576696e732e3139393940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714db89725fce7ce8f3bc61b0519cbf119fe5dd6b22fdab9032f2af003c27b432e081cca41eb8621c3c": "0x0000000000000000000000000000000000154e4654204162737472616374205061696e74657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dbc1bb2de0590492cca2a0719fad006090aad6536ca8b7d8c527589be01b0012564dbdd36d9a4923": "0x04000000000200000000000000000000000000000000066c6f626973000012406c6f6269733a6d61747269782e6f72670e6c756973406f6269732e646576000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dbcec1429555e3577a5c2500b0c12120ca4683d8b1046a98d324b1cc45461c2bf69ee7e2f4708207": "0x00000000000000000000000000000000000b6a6f736870656c6b6579000f6a6f736870656c6b65792e636f6d000000000c406a6f736870656c6b6579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dbf0bac829c264486eea07ae188cf16042168843c5c29299196e610dfda7d9efd3f0421119629a61": "0x00000000000000000000000000000000000d56616c6565765f52696e61740d56616c6565762052696e61740000127672722e69646f40676d61696c2e636f6d00000e4052696e617456616c65657637000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc22c730a7ef5a54488b87e574eee2f9b8e7810eb3567edffc303c4f9c76946da200ce429b444d59": "0x040000000002000000000000000000000000000000000a4d617843726970746f000000166d617863726970746f6f6b40676d61696c2e636f6d00000c406d61785f63726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc5cbe2cf41cf8f57a66844d9bd974ceeab7c9da2b3870bf98bb2179a0d385d644c5f73593aa7f16": "0x00000000000000000000000000000000001b5a57485f46616d696c795f54727573746c6573735f5472757374000000157a61636b77696c64654069636c6f75642e636f6d00000d407a61636b68616e6466616d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc6abb1030271996440465c2ff462a9545455781afd16c1d7f650935bbb34f696ebe205c14baa307": "0x00000000000000000000000000000000000c417373657420546f6b656e0e4b727970746f204c6174696e61127777772e6173736574746f6b656e2e696f0013696e666f406173736574746f6b656e2e696f00000c406173736574746f6b656e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc70be881faf5789f2de250cbcc6a3881f004a862ae661a9794596c3ebdeb829a131989617f49e76": "0x00000000000000000000000000000000000f4973616163204368616f7344414f00000014616d656e6c6f39406f75746c6f6f6b2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc78925c32b0b66c0aba8ac93a0d8898810acf42a8b311fa20407dc181383901c240b041b34bf015": "0x000000000000000000000000000000000011506f6c6b61646f7442616c65617265730000001b706f6c6b61646f7462616c656172657340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc795a6b3289958b5678de8caf6f90c813fe5addb356e8154ea5e52463886d566cc8deaa0907e761": "0x00000000000000000000000000000000001543616f74696320506978656c2053747564696f73124a756e65204361726c204d616c61706974147777772e63616f746963706978656c2e636f6d0018636f6e746163744063616f746963706978656c2e636f6d00000d4043616f746963506978656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc90c8e009d95f3e24d573f4df9151235e457956765e6446cf33077033bbca48d8d5c6c9a1d7fd33": "0x000000000000000000000000000000000010524d524b20312e30204d696e746572011168747470733a2f2f726d726b2e6170700111636f6e7461637440726d726b2e61707000000940726d726b617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dc97a320776a16d2f495309d22f770f6e7335dce5ba63efbe4cf7b429a83f4b7761f1c7f45a8d86a": "0x000000000000000000000000000000000009416c20446967697409416c20446967697400000000000a40416c5f44696a6974000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dcacdfdedda85ff952e73898bf4601f9c9a7fa052de0cc313b159dd368d458f4cb0341eedcd6d818": "0x040100000002000000000000000000000000000000000f436f696e6261736520436c6f75640e436f696e6261736520496e632e1f68747470733a2f2f7777772e636f696e626173652e636f6d2f636c6f7564001b636c6f75642d737570706f727440636f696e626173652e636f6d00000f40436f696e62617365436c6f7564000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dcbb9839570e5bf3e6587e304800d0184b470738807816bc1eb4b2a045521c2cb60bb15952866236": "0x0401000000020000000000000000000000000000000005566956690000001c766976697472616e313131314070726f746f6e6d61696c2e636f6d00000e40766976697472616e31313131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dcd3c1c3ae6b80e00c082ad8b544e64abc3af5764db1b455bf32231202ba50e5d0fad1794df7c905": "0x0000000000000000000000000000000000074b534d20453200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dcd8cda22151133450ac31b94e7738d9d7a0cf56f4333a3344218e1ae2dd80a6e0b676fee8049305": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dcdc014dbdae7ca15446b847834ce2b1208193849f7e824c3796b03fc99bd11222a01047e4e33823": "0x0000000000000000000000000000000000075441524f3039105048414e2051554f432043554f4e4700001871756f6363756f6e673039383440676d61696c2e636f6d00000f4071756f6363756f6e6730393834000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd1a53046ed0d2c60ec568f29d8aa8acbe44da52d65d455d583494cfc2f0f5ce14e463f0b9e5a559": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd1ffac41df06f48cc41c23d8c527a9a9899831a5500fd27c799b5cd404f1757fcc7506e4a86cb6d": "0x040100000002000000000000000000000000000000000f6d617474656f6361736f6e61746f104d617474656f204361736f6e61746f1a68747470733a2f2f6769746875622e636f6d2f30784361736f1b406d617474656f6361736f6e61746f3a6d61747269782e6f72671e6d617474656f6361736f6e61746f4070726f746f6e6d61696c2e636f6d0000084030784361736f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd3470a836ea9a4008c15279d0e5f0a7dd1171cbc78cbdf7fa5899b48955e7cfe05629cff078b40a": "0x000000000000000000000000000000000006446f6e416e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd3ebffa43946729c8c5e44031d85024e4bce12bfa0652da14d359159b1a8727acaf716a6b677e62": "0x0000000000000000000000000000000000084d656e646f7a610000000000001140496e666c75656e6333537068657265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd5ac43b991d5bfdf68fd95ffc9cc02f15e28ce9df041da32f3b564e249fb4a8caa1c5135b1fad4d": "0x040000000002000000000000000000000000000000000549676779001e6c696e6b6564696e2e636f6d2f696e2f69676e6173692d616c6265726f001869676e6173692e616c6265726f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd87ceda2aeb7b22302ee7cf59c56eaea2db6946c671da40489f9259e33eaffc7cd2cacec048a915": "0x0000000000000000000000000000000000096b6163637570313200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dd96490c9cce24c2deeba6321bbb28a052a289d857b882b77b9bb36b3f5d8f6b9d6bab2a8e173b38": "0x0000000000000000000000000000000000084f646f7672656e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dda1f8e340e37b261c39ef78e57f239200072aa865312f87edfcb4d4133c6ccc0a7e33f5c799e201": "0x040000000002000000000000000000000000000000000c546974616e204e6f64657300001740746974616e6e6f6465733a6d61747269782e6f726714696e666f40746974616e6e6f6465732e6e6574000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ddd3fac950db81638ae535ed048c6144428c430959118e0a34ff1150662b13143fcd1dc9a31a4773": "0x000000000000000000000000000000000005414d313600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ddebe5e9c243fb0a8cd03b329ea85dc19992ffdee21b7fb481915cf496571a4c3d6ef6a998077e42": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de0cc3ec4dab1c451e9b8842daafe40d555921fb6b47e66eb9907b10587a20add8f3676451b2e913": "0x00000000000000000000000000000000000a42756c6261436f696e000000196c7569736d61797374657231323340676d61696c2e636f6d00000e4042756c626173617572696f37000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de10278d56e138a554624f504797213920029ad9a9e11f06218c5f20ca160d66fda311650ce84e2e": "0x0000000000000000000000000000000000074e6574686e79074e6574686e79000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de11e082d85cbef160f94710848d9dce161724f257a240494c901728bdf2fa51c138fc5580ee3134": "0x00000000000000000000000000000000000e4e69776167616261204a6f61620e4e69776167616261204a6f616200001b6e697761676162616a6f61623130303040676d61696c2e636f6d00000f404e697761676162614a6f616232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de14b81ebe1d9b57fe4f532d7c92cf5241deddb7cc69437c1e14dd7a485a66e558b6e1277c130f32": "0x04010000000200000000000000000000000000000000106e6f74617261737062657272797069104e4f544152415350424552525950490015406b736368657965723a6d61747269782e6f72671f6e6f746172617370626572727970694070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de17584cd268e75b0277ce02b2ac78ceeb9ae4fa0a595005489bf3f5f77898415e32a3e9504a5314": "0x040000000002000000000000000000000000000000001e436861696e68756220616e6420546578617320426c6f636b636861696e00001440737269766973683a6d61747269782e6f7267186d654073726972616d7669736877616e6174682e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de3cf3ad0cf1a2ef6c2c6040c18e9e1c7787a3205eddc2b25866a7bb9f4b37d08fb99a303b1aaa76": "0x000000000000000000000000000000000008446f6c7068696e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de3f92404566ce2002d9033615be834251d1be3c49ef6824c62c23cf6c63670d6b525f113f7ec913": "0x0000000000000000000000000000000000054449434f00086469636f2e696f000b6869406469636f2e696f00002168747470733a2f2f747769747465722e636f6d2f4449434f3033323739373034000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de4c51814f3dc0aaaa8c84c6ba3df3fb3e74c82f7c4d6821f3182367db869a24a695c6c79b9cfa06": "0x000000000000000000000000000000000006526f62696e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de5c954dd6e8db73648bc880ddbc0f57d62d59f061c800d012e1a7592043d167fc0cc2c3a9da211d": "0x00000000000000000000000000000000000b4c65652042616e6e65720b4c65652042616e6e65721c68747470733a2f2f696e6372656469626c6563726f632e636f6d2f1b4049433a7777772e696e6372656469626c6563726f632e636f6d19696e6372656469626c6563726f6340676d61696c2e636f6d0000104043726f63496e6372656469626c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de635c0c26aa1285ced5f8289b742dd10e1346513b73e55878f5c758bcffee3b7b3aa2d591ac8f67": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de6f7157368189985cb1053f8515e1f6085856998ac902f61b60ae84eff323ea3fa5570e9856082d": "0x0000000000000000000000000000000000094c656f2053756d6f010114406c656f73756d6f3a6d61747269782e6f726701000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714de9c4d94174cd2477a74b06ace59a364d8c066e99d6019a3817505a1c8956316d65ad161e4a6f737": "0x0000000000000000000000000000000000066e6577203400000015424e6164657a646131304079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dea25247eaaa9075fe395dbcd412fb61e933d36cda92b15ccfcdc46c73d697cb59b0590a44e50c30": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f32390f42696e616e63655f6b736d5f3239000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dea8918004244b5bae0ce04d8021516cbf0a10c00c4e721319c1e91c729402b232942f9e2c152320": "0x040000000002000000000000000000000000000000000653544156520000001561646f6d69786931326140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714decae94c7ca0c861584d715bcb7a2d3b6a3120891dba91b19b12df42cd50f1c76103e2581d5b4274": "0x040000000002000000000000000000000000000000000b4f6c6976657220e29aa100001d406f6c697665722e74616c652d79617a64693a7061726974792e696f126f6c697665724074617374792e6c696d6f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ded9112c2a84a8aa64f39f9d8db7d1f258b28769521e66ca79b2c1d7d0d001c1f5be2c7370948209": "0x0000000000000000000000000000000000084169724c6f76650000000000000b406169726c6f76655f33000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dedbc2ce55177a93544ddc80d8569f43d39aa1e46f3d1a9a1aedc6d645d7aacde0184ef69ee9de76": "0x0000000000000000000000000000000000086a696e6e79383500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714deef5a3a1ff7e51fc0f9ad73d248c215a9d3c09543dc4f739068837ff478226cf0e5bf6c32071c76": "0x04040000000200000000000000000000000000000000097a68616e6773616e000015406a756e6975736c693a6d61747269782e6f7267146a756e697573406c6974656e7472792e636f6d000010406a756e6975733939333233323139000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714deefb32e6fa3ca98ea6ac7bc02091c06ee39e01af4e3aad2d0bd738e65b8874e522e7cde04762a23": "0x0000000000000000000000000000000000176162726168616d20504f4c4b4120415353454d424c59104142524148414d204d55474953484100001c6162726168616d6d75676973686134303140676d61696c2e636f6d000008404162757a7441000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df06261193a58ff6b0a8c24ac3491a353ac33a297990382a17a4f06945b7e8488024aad838e3be1f": "0x04040000000200000000000000000000000000000000084e696b6c617573000000156665692e6c6975406c6974656e7472792e636f6d0000094066657977756465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df39159abba55c6a2a221984248f769c6ee496bfc2c813cf000d2c2e10a7e19a67a4f4264a1b204a": "0x00000000000000000000000000000000000f42696e616e63655f6b736d5f33310f42696e616e63655f6b736d5f3331000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df3ef2b86fcb50a608b7835785fff5f3ce266a55391bfa52c22fa622a1e48cb29490118a8f55e657": "0x0000000000000000000000000000000000096e61696c615f5f6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df448953262dc4272a7dc6c670411c7f086514b9bb46732ed1e6a2045669bc883bfe540979366a70": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df50361da6149e1c9ec43214602db413abd2dd38bf27fc7fc76be1715f3a2a53e0c15f0be434a323": "0x040000000002000000000000000000000000000000000768696c75786500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df6216cf6db2390b967253bc4d2a74802f60bab1ee14e013e29df6605aad937e3bf3af3d06f01036": "0x04000000000200000000000000000000000000000000073154524942450000001931747269626572657075626c696340676d61696c2e636f6d00000b40317472696265646162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df658b757ba3a7aa702baf94343fc34fc6b80b225c14758484c91816726a7b3951bc0ce1daae9f53": "0x000000000000000000000000000000000005696e6b21001168747470733a2f2f7573652e696e6b2f000000000a40696e6b5f6c616e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df81a03ab44db94de209cc11caff247c55ac63eea5e65246dfca0d3fa13caf596422e617add11c6a": "0x000000000000000000000000000000000014506f6c6b61646f742077616c6c6574202d203200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df83b335782ebc49a02ec4c0ee5ece6ebb979e895f5f677cc5af9c792057d4a16845ac03d866380e": "0x000000000000000000000000000000000007766963746f7207766963746f72000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714df9611452ac38ef494947b0c3d8d505f78a6945db572e9c264debb16f4bf269cb5d45570ce90e325": "0x0000000000000000000000000000000000084368617a626f740101010100000a406368617a626f745f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfc59388da763570a87d5cc741b2db1901f13828456972aee17a7fd298dd4f58d4cbd4764d205c74": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfc6a79ef6d03ce998b1bc55dfaaac7c42b022a3389ac81fde184e7cf7e4bfb6f1762efacc9dcd0e": "0x00000000000000000000000000000000000e526f636b585f4b7573616d6132001668747470733a2f2f7777772e726f636b782e636f6d0012737570706f727440726f636b782e636f6d00001040726f636b785f6f6666696369616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfcec3c491888b3ac25812ad6fd4ccdb20b9e39ae8869b92f24bcb112c27a1f8870cf73e3af40d01": "0x0000000000000000000000000000000000044d4f54044d4f54000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfd89ee5d28bdb06ee6f9eb0e537bdeea4b952e9232516a5fbb9c8fb3d49522da2dac4fec6b4d952": "0x000000000000000000000000000000000009537461686c646f740000000000000b40537461686c5f646f74000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfda9759c850e63fcad4349f82754f223d99182a3f9de949c41ff94e672f7f548e7f4e66c04b5c1b": "0x040000000002000000000000000000000000000000000a537465616b43686566000017407374616b652d636865663a6d61747269782e6f72671868656c6c6f40737465616b636865662e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfdd2a5f61982fba4297a93d2faba768a0be3c2a69bee7a17d73264b9adebae51e28e7b37463f91d": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000064e3444524f000000156e3464726f4070726f746f6e6d61696c2e636f6d000007404e3444524f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfe1e40570dd88f27c1178a97d52454f0c0b621adf94ed9ae7f5bcadd73d78918cd5f2e369afd539": "0x00000000000000000000000000000000000454696d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dff9d344c62cc1a2a89a9920a98f3591ccc0a1a4bc827a0adfba37b75fcc108ae3c7191bb9a32750": "0x040000000002000000000000000000000000000000000a50756c73656d6973730000001b64756661756c7472617175696c64697340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dffd6f88a42d7fac960e13bfebea36ecf357ec2e813c2c06cbe61c8b789f5e06250d51244ec65f2c": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e01262497050cc2b2e75870b38698bb3f2bd133e571bb0207310369eb624f12e27b640997c9fd079": "0x000000000000000000000000000000000005524b523200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e021d1dc17893ea928b07966a96b6a1985a177e15d42d894b3fb7792127b6fe90c2fd282eb4c897d": "0x00000000000000000000000000000000001a416c666f6e736f204b7573616d6120496e766573746d656e7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e02cfa2f68a3d5d68c634afce5c235c94eb221a35c3f8cde8f45b961d713780f16dc561e98537e7a": "0x0000000000000000000000000000000000046e667404506174000000000010405061747269636b53616d61313830000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e030fba8f6a1ab9562268ef984602bd656ee3f4ffd59ee4f91fb1b8dacc81561165acf09cb04b437": "0x0000000000000000000000000000000000114e6f205269736b202d204e6f2046756e00000000000010404d6178696d654164656c76696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0557f0ae534aab028991ea1e64fe9abfa42ca2c940b83440041f53c1eacebcaaf946800df88bd65": "0x0000000000000000000000000000000000026d01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e056f1b2e24fa5d8887a4b3bf904dff1bd2b9db7d434a8293190a442e264f019255c799cc8755f10": "0x0000000000000000000000000000000000074d616d61544c01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e06d0f11fae617ffc00c1b295efcdc9a094f31f425d1728677ea4c978ba553d30a9df39737a6ec07": "0x00000000000000000000000000000000000d4869676843686956696577730e436872697320436f6c6f6d6265000011636f6c6f6d626540776973632e656475000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e082b4d27c3e325290028c5f7ac635cc45299d9de9e04681d2d935461bb79e83faf9fe9021407001": "0x00000000000000000000000000000000000a466f7220706561636500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e09f03562c3730f22cd74deae018fa587decf7492a527329f06e44e9e9725c6e7c48dbf6fe3a0c61": "0x00000000000000000000000000000000001c4b656570696e672055702057697468205468652043727970746f731c4b656570696e672055702057697468205468652043727970746f731768747470733a2f2f6269742e6c792f334f686d6847410000000010404b656570696e6743727970746f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0a7bda9cabb2697382c2b16eff91187f088ea8902a92fd101c647fcf8fad4995dcda013f5674146": "0x00000000000000000000000000000000000a4e38746f72696f757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0b7b989a9a7b3882a26e8ab44149c0eca39f384f5461ac94d9db482f7048bcf01fa03ac974e9f74": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0bcb14a63a8f407f082e865cb1640b9d304e0112f2a853fefab59cb646742a87b6efddba380bc51": "0x00000000000000000000000000000000000e446f7473616d612050756e6b730e446f7473616d612050756e6b7300000000000e40646f7473616d6170756e6b73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0c1c0b1ba68c50b38442c5d5813e8982e7d0e48b0902a2fcd7dca14bcbcb2018b3be02ddd0baf2b": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f33330f62696e616e63655f6b736d5f3333000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0d88f101c60b968860b9c3afa9056b5861ea3252c32d4ceee039d5a328210b2f106e2362564c327": "0x0000000000000000000000000000000000174368616f7344414f2042616e6e6572204d696e746572000d6368616f7364616f2e6f7267000000000a404368616f7344414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0e206491404b059c229d8ccc5e5650d17760ce2b7c42bdae5f6afc6e8bab249ec77f3f779ee5a65": "0x040000000002000000000000000000000000000000000b4e6f64616d61746963730f4e6f64616d6174696373204c74641768747470733a2f2f6e6f64616d61746963732e636f6d14406162633a6e6f64616d61746963732e636f6d13616263406e6f64616d61746963732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e0f9f6d0a22b7f4d7c101b5a4517817aa0e05d07291dc0f020daf435432ce8ef6996fa8fdf722a58": "0x00000000000000000000000000000000000a4d61747420437a617001117777772e6d617474637a61702e636f6d010100000a406d617474637a6170000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e10f7130f3342868be48e86fb92b88b2cd58af2e0f83ce19054a1710f3285ec16cfa21c533070038": "0x0000000000000000000000000000000000076861727065720768617270657200000000000f406a6572656d696168736f6c7431000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e14b7899b9364c96f4ee3ef446661d9952ca201eb16aed93217c14c48970106092ab7e3f2b4ae713": "0x00000000000000000000000000000000001048616e77656e207c204c69746d75730000001468616e77656e406c6974656e7472792e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e14f996a74ee6952fc76f7807f64bd43133d613e69b76210fd9613946365c01aece14d487d07c71d": "0x0000000000000000000000000000000000054265653700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e17e6feedc6d6c3e024f853befcdb3963b6c6405cd765edfdb6323afdc79c0a842154ba7e8bd7e4a": "0x040000000002000000000000000000000000000000000844656c616e65790000174064656c616e65795f73633a6d61747269782e6f7267136c6f70736c69746540676d61696c2e636f6d000011405363727567677344656c3639353636000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e18ec3dbed3906928c2dee8f9acfbd0ace6ba1c804e4f592e39e4c9c895646d1cf376179a4de7d73": "0x0000000000000000000000000000000000086963656265726700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e192bdc41ba8b8537a4ea4898b3670047a9a245b16814151fe047e7f4317274b2322bc16bfc86777": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1b9d02d9a1f50ab16da5bff34fefd1880608641996167d42ddf2832ad360eaaf26bd480f8b11510": "0x00000000000000000000000000000000000c597572694e6f6e6475616c0d597572692050657475736b6f001840797572696e6f6e6475616c3a6d61747269782e6f7267167975726970657475736b6f40676d61696c2e636f6d00000d405975726970657475736b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1c590c2d461a2919affd71d6553897322cbc27d841267cbd0f4f61d5b2e1b55f1ccc4dee3dbbf29": "0x00000000000000000000000000000000000e676c6175626572626e756e65731a476c617562657220426172626172726f737361204e756e65732068747470733a2f2f6c696e6b74722e65652f676c6175626572626e756e65731a40676c6175626572626e756e65733a6d61747269782e6f72671a676c6175626572626e756e657340686f746d61696c2e636f6d00000f40676c6175626572626e756e6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1cc7e9a208fec062a60ef494b4278138c41a5abfaf31a98703d16cb817c121bffd6fe29922a717e": "0x0000000000000000000000000000000000075a6f6f6579730000000000000c40706978656c7472697070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1d72d8b8fd19c1e180e0bbab137521c05b4d905878159e631e8d58f8f98eb54bcde45355a64a42d": "0x0000000000000000000000000000000000054e4f4e4f0000000000000a404e6f6e6f5f646761000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1e4563d8107381d90bc0687ec4207718cf796657debc704ddcd040fb7bfaf024a0112085e3bf44c": "0x00000000000000000000000000000000000f4f7374726f696e76657374696e6700000000000010404f7374726f496e76657374696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1e83d6e28cd24a1cc5fb20e015e196772a14adb90f25ad646b55261cf41ba556058b2cf05e1d14d": "0x00000000000000000000000000000000000b617065586368696d707a001d68747470733a2f2f6c696e6b74722e65652f617065586368696d707a0015746f75636840617065786368696d707a2e636f6d00000c40617065586368696d707a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1ea5606e60d1e1b6ec662611fe307a35f5071d69b7e38993e7ff1b0c887eb742ad5d4a5161fd10a": "0x00000000000000000000000000000000000b466c756666795f666f780956616c657269612000000000000e40466c756666795f465f6f5f78000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e1edcfad4e61061fce792e53c1b7b7375ed58cfe1a68a88fc0dde4bd604942f99a5e93ff3b249d2c": "0x00000000000000000000000000000000001048696b617269204e616b616d75726f000000000000104048696b6172694e616b616d75726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2082f50f907e5d5a48539457aa2e54048493ccaf980be18253d8cabd6eecd295e6b62e6a357352f": "0x0400000000020000000000000000000000000000000009616c66616b696e6900001540616c66616b696e693a6d61747269782e6f72670000000a40616c66616b696e69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e21241c1f77eea219c34bbbde6bff80d45a0e9f3500e7aebd52d558fcd919b2e0d788dd8728a047a": "0x000000000000000000000000000000000010416e61656c6c65204c54444049425000001740616e61656c6c656c74643a6d61747269782e6f726715616e61656c6c656c746440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e21499c80ca854b48c82bbbbb9667ffba6391a9562295f4138dc0d28c4a062c98c71892a3e149e33": "0x0000000000000000000000000000000000054d617279124d617279204f6d612d57696c6c69616d7300001c6d6172796f6d6177696c6c69616d7340686f746d61696c2e636f6d000010406d61727977696c6c69616d735f6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e233542478d579cace65b4f9996573027bb9ed1f267033177462f9019642f1fa0b14a0ce41994525": "0x04000000000200000000000000000000000000000000084e4f434f314b53000017406e6f636f63727970746f3a6d61747269782e6f7267156e6f636f63727970746f40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e267ed189b260f34e860a0f82dfd893ebf69b3ca5867e58dde45e4c03acc88dcf1881c05a1cbb624": "0x000000000000000000000000000000000007627269616e3100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e26aa6ab4f40124e083f39607241c8ebb62919ab2ed816cb6b20c7d0abad78a92570030d2f96c63c": "0x040000000002000000000000000000000000000000001443727970746f204a61636b2053706172726f7700001e406a61636b73706172726f7763727970746f3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e29cc92a3efbdcb4fade8b2ef9730e55caad79c952c433082849c133e8f4303c959124f881cff002": "0x00000000000000000000000000000000000c6172676f6c616273202d7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2b5c6849bd31d1a68a7a410afcdad03bb86018eb32bb188ce81f4a7bbac85f9a161511b4939252a": "0x00000000000000000000000000000000000a6368696c6477696c6408616e61746f6c79000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2d6e1cbb0d68059803a44e8667a858bf0cb69c031e7623d560e962c6bfd9b1d28438d6ef6a20e5a": "0x000000000000000000000000000000000010506f7274656c61204361706974616c10506f7274656c61204361706974616c01011a706f7274656c612e6361706974616c40676d61696c2e636f6d00001140506f7274656c615f4361706974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2dbccbe79b6bc23a0c9c8a74436d2554b9a0249994899e527008da53b2e33dd45b51d07d0d3125e": "0x0000000000000000000000000000000000146172676f6c6162732d636f6e74726f6c6c657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2e24cb03e478499c2f8c1243fbad7e55982b37dc983137e4b9df19f5b31b5b35c5809d81cc4d03b": "0x00000000000000000000000000000000000e42494e414e43455f4b534d5f390e42494e414e43455f4b534d5f39000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2ee33ee9eb984f7467d94f60ca2fec8bdfc843926088df5ad274feb4a8c2cd0465ca8cb78f54c72": "0x04020000000200000000000000000000000000000000075472616e7358075472616e73581268747470733a2f2f7472616e73782e696f13407472616e73783a6d61747269782e6f72671173696c766572407472616e73782e696f00000a405472616e73583131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3090a8f14b0a8a7e8fc78d54db8818125e186950a295ac7db278b9c83b6c04416ccf38869451405": "0x00000000000000000000000000000000000b44616e69656c20426172001768747470733a2f2f7777772e6269746677642e636f6d154073706c61736865733a6d61747269782e6f72671264616e69656c406269746677642e78797a00000c4064616e69656c74626172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e31041f839b1c98afe111b571b0ba64cb8365c7e9bba1e412d6fd57634a54bd1996314689e061a68": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e31e32af7d282fd42cf0838b05fb182718de859525fa1e6d53d557e5fcf631ee9ff44c619810d43b": "0x0800000000020100000003000000000000000000000000000000000843686576646f72001868747470733a2f2f7777772e63686576646f722e636f6d144063686576646f723a6d61747269782e6f72671263686576646f7240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3246305c87cacb27c660ea631e3433e76cda4223da22d0f40ff51d0790f9531c6dc017f04526454": "0x00000000000000000000000000000000000c4755494c4c49544f4c4d4f000000166775696c6c69746f6c6d6f40676d61696c2e636f6d00000f406775696c6c69746f6c6d6f6473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e32b208e65130e522045da46c7766eb3f515007cbcfa48187fd157189adcde4b0a36f5069661c147": "0x00000000000000000000000000000000000a4f6c61736b61417274074f6c61736b6100000000000b404f6c61736b61417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3450541d8d8d0681af27d40bf7e664781d62d3e0953bf49a7b6accab06d48acbea4c0497a285135": "0x040000000002000000000000000000000000000000000d426172616e2042617964656e0000001662617964656e5f62314064656e69736f6e2e656475000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e35b67b937cc75caa81dfbac142664eb6f7ff61c5c0b2c8a180059b27ccb68ccc6b9c152be120b70": "0x040000000002000000000000000000000000000000000c6669616c6b612e6c697665001468747470733a2f2f6669616c6b612e6c6976650012706f6c6b61406669616c6b612e6c69766500000c406669616c6b61706f6f6c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e36e578a8e8879d6882cb987c0812a6223eccca2b949a700f23956c0fd0e078998aa202fbb3dd258": "0x0000000000000000000000000000000000084261746177696c094d6f68616d6d6564000013796565656573383840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e38a55733df8b59a8afadb56a14267be2968192955ea0946c4c7654bf57edf48b8e2a0026ebb5c16": "0x00000000000000000000000000000000000e476f72676f6e7475615f4e46540000000000000f40476f72676f6e7475615f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e39df08f4aede84f78bd7b1645db34388b2de98519122d04ce82685b60b092e4a1a6b79495b06435": "0x0000000000000000000000000000000000086d7766696c686f1b4d6f697365732057656c746d616e2041627265752046696c686f0000126d7766696c686f40676d61696c2e636f6d00000a406d7766696c686f32000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3a4e80562b259ac10b09f2da2f405ee165a9288afdf2a8d28f77abedc0c71c2322d1e7bbf824573": "0x00000000000000000000000000000000000d446d69747279566973696f6e07446d69747279000017766973696f6e646d6974727940676d61696c2e636f6d00000f40646d697472795f766973696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3a998fba5b8bbd73c747e495e89089d355e243e1d3818a46c83423d4d230f6fbb516ca1f9a69498": "0x0000000000000000000000000000000000104b5553414d415f54524541535552591847656e736869726f20627920457175696c69627269756d2068747470733a2f2f67656e736869726f2e657175696c69627269756d2e696f214070657465725f7374723a6d61747269782e6f72674070657465725f7374723a1770657465722e7340657175696c69627269756d2e696f00000e4047656e736869726f44654669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3aace461a41787e00dd250306b8d5d95cfcf010f9197aa6a23ac456c4dfa242648b45f3d7d73062": "0x00000000000000000000000000000000000d466f756e646174696f6e2e5100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3b37bd998e2d5ae02e8b488ad53f796a30d332f94f9b86da98c5b4045e09dbec4b520787f2cc568": "0x00000000000000000000000000000000000b4b7573416d617a696e670b4b7573416d617a696e670000156b7573616d617a696e6740676d61696c2e636f6d00000c406b7573616d617a696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3cc564421272ae1661e75c54ec564a0e3af9c0a50860fa942d9d1b02d73712fbf855ddef81f4b1f": "0x00000000000000000000000000000000000f5761737465206f6620796f75746809536f756c20726f741d46616d6f7573204368696e657365205061696e74657273402e636f6d0111536f756c726f74406d6565742e636f6d00000a404d7578696e617969000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3e27ff656075247d2553b686fdb9fcb522543211a26d6e2ec15fbe051b49ebd03c7ea920ab03a79": "0x00000000000000000000000000000000000b77617465726d656c6f6e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3e9a46b476478204c4769cc1bf4774f19c7433e31a5b8cb686944cdd758e193d264410d4918b120": "0x0400000000020000000000000000000000000000000009506172616d69746f00001540706172616d69746f3a6d61747269782e6f726715737570706f727440706172616d69746f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e3ee646b3e2aebc288214b102388d1c4506c188c7ed7e7d306c03c5bc6e3fa5e4e16b84ceb86ca7d": "0x0000000000000000000000000000000000066c6f756b61000000126c756b6f6c6172696340756e696e2e687200000d406c756b616b6170746f6c31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e415276d670b78fbbc8581a5550ab573ee71a5eb5424ffcf3669a47d5b165fbae9979c2232eafd35": "0x00000000000000000000000000000000000a4f7468657257524c440f4161726f6e205370616e676c6572000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4153a7e275b66f81c35024ca6ebe0f04f37160246226252f758640bc7fbdfd7d1862d1cc0709706": "0x04000000000200000000000000000000000000000000094e656f506f77657200000000000011404e656f506f7765724469676974616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4173fbb2e6bce95ea7e253f4ef614f3461f1b20259ff57dc1ed75397f9028c4446a3c49348d9610": "0x00000000000000000000000000000000000762616e64616900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e41ae28131a0427194b43554ce1f4d12431ecd9e98b526c8a2365c73c4df302762afe817f2014725": "0x04040000000200000000000000000000000000000000057074716100000011676f6431373540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e424960c1224933864e05e73625f3f0991e3062733ad8480c5589a710a24beacbaa555f1c4a7f064": "0x0400000000020000000000000000000000000000000014f09f8db750726f6f664f6654727565f09f8dbe000014407665727374616b3a6d61747269782e6f72671870726f6f662e6f662e7472756540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e43bc3dbea2aea278cec9d853f1e271b254904cbaad9b96cf5674111df2712e106782b6d03ad4a02": "0x000000000000000000000000000000000004496b650000000000000a40496b654275696a73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e45b9c4b5333e7a93e814767c06c6f8cfbe0c531c5bc2545ec897f41427faeed5f2a796107c98425": "0x0000000000000000000000000000000000064f7369656c064f7369656c00001a6f7369656c2e6d6d6d6f72616c657340676d61696c2e636f6d00000f404f7369656c3035333933323130000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e46a0a1f27bec44a52b901aa3d7b55a32518b419e7759d281a620269621b460dc2f44c1d8d49ec3c": "0x040000000002000000000000000000000000000000000d4d4943484953414d412049490000001a6d69636861656c2e7361726e69747a40676d61696c2e636f6d00000e406d696368697361726e69747a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e47308a662ac61d8ec748cd857304d85365e8189c61bd414d5553f1aa4190b6743f528b30dc43939": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4862976694931a99c188166a98813c80bd47da8c69317282ba30fda0052e8f26c9afd4226793553": "0x0000000000000000000000000000000000074a6f736569370b4a4f5345204d4154454f1a68747470733a2f2f7777772e6b6170617a6b6179612e636f6d16406b6170617a6b6179613a6d61747269782e636f6d146b6170617a6b61796140676d61696c2e636f6d00000b406b6170617a6b617961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e48e1e2716de291fb003e858a649acbfde98acf1d9e7863397984405fc8e0ff9d91fa4c9025afc27": "0x04010000000200000000000000000000000000000000184b41474f4d45204b7573616d612076616c696461746f72000014406b616d696c73613a6d61747269782e6f72670b6b40716472766d2e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e497fbc93f6011c0ce1120d245e6912eab85477f9a806728f4bf82ee50ccb4f8750ae14feb7d9c7e": "0x0000000000000000000000000000000000084d6f6f6e4b6f6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4a7b18b604b590ebe4b9973a7f6a5586a38fa295ec8e64d4026aa878c840630a7ccfa7f3914d162": "0x040000000002000000000000000000000000000000000b476f626c696e53616d6100001740676f626c696e73616d613a6d61747269782e6f726719676f626c696e73616d616e6f646540676d61696c2e636f6d00001040676f626c696e73616d616e6f6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4a9fa782e599e6e54bbe132da515c57b551b15452d06341ce9212859c8a0d8d5eba38b9f82f486f": "0x0000000000000000000000000000000000114576726c6f6f74204f6666696369616c00107777772e6576726c6f6f742e636f6d00116c757575406576726c6f6f742e636f6d000009404556524c303054000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4adb7a829a6d528623f9120f5e76a9988d6273e32e15a6a3db3ff0bbc551c081bf8716a6f152d22": "0x0000000000000000000000000000000000000000001544414f6e32456172746840676d61696c2e636f6d00000d4044414f6e546f4561727468000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4b32bdcfe8a21ed50b428a44aee6d7d7971bc278208f295b647bd1cd44985423c3cf405adc2e336": "0x00000000000000000000000000000000000b6d616c696b656c626179001c68747470733a2f2f7777772e6d616c696b656c6261792e636f6d2f0013686579406d616c696b656c6261792e636f6d00000c406d616c696b656c626179000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4b5facde9bf411dee16a0a68c6bb00ee88ee56a12ad67e778bbee540f868ead35fb6851fc522c0e": "0x040000000002000000000000000000000000000000000959414f20476d6268000000176c756b6162616c6173686f7640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4cea58d581e6c8f707c9246c1c227f1495885cb2f4c59297248ec5abeff2d0f68495075a16bc17a": "0x04000000000200000000000000000000000000000000034147001668747470733a2f2f76616c696461746f722e61672f154061677831303030303a6d61747269782e6f72671368656c6c6f4076616c696461746f722e61670000084041477831306b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4d0c3afd0945f3b8eebe1699e80aa195f76826c2c9da998095018f6d60a0446b6074736a68b3922": "0x00000000000000000000000000000000000c50756d706173617572757300000000000010407069636b61736175727573303037000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4f24b48776a5907d860c42aad31e29765a88620672b42628634a6901e9a2e327b3b77de463a4051": "0x00000000000000000000000000000000000a53545238204641433300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e4f801fde83ab27b86d96411e256368ca351706e72275f29a0190becaf81dacd4983d5f17e41442e": "0x00000000000000000000000000000000000b4261727279204f6e797800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e51a8e774114148a1cb8c4e3b0331a1d7db9a12dad422096a3b2ea8634aba36a00947686d818077a": "0x0000000000000000000000000000000000095376656e67616c69010115407376656e67616c693a6d61747269782e6f72671963727970746f747261707065727a40676d61696c2e636f6d00000f40756e636c657376656e67616c69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5226b3101e1a2cf16ea73eab943eeb2bbf8c6c5e5ac7bd92004c3c395f2db8e095b8c4afc063324": "0x04010000000200000000000000000000000000000000094465436f6d6d6173094465436f6d6d61731568747470733a2f2f6465636f6d6d61732e696f2f000d6d4033636f6d6d61732e696f00000a406465636f6d6d6173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e54b0dce3847be9f2a9aefeadfe561f9c27106bf951d4d362b26fff6beff8b7949881071c973ee63": "0x000000000000000000000000000000000008497a204172747303497a1a7777772e696e7374616772616d2e636f6d2f697a64726177730019697a7a61636f6d6d697373696f6e40676d61696c2e636f6d00000940697a6172747373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e560702c07b98769501c6522acab8faebe0aeb74bc5cfb6e0c0062134ce4139b2b4d29e690306942": "0x00000000000000000000000000000000000e4b7573616d615f77616c6c657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e57b6fff5aa31fc5dc73e84c4d039277ae7819cf959a0092683ea8e6e7e9d2447c918d8aa89d681e": "0x0401000000020000000000000000000000000000000009456c2050696e746f09456c2050696e746f1768747470733a2f2f63616e6172796e6573742e696f2f0015656c70696e746f6d616e40676d61696c2e636f6d00001040416c6550696e745f43727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5838dc3419931bafcee617f4c62eba023c5dd5bd4b3c4168e6c5cfdf504b50d611c0550fd078557": "0x000000000000000000000000000000000013456c656d656e7473206f66204b7573616d6113456c656d656e7473206f66204b7573616d612068747470733a2f2f7777772e656c656d656e74736b7573616d612e636f6d2f0015566f6c74756d2e6e667440676d61696c2e636f6d00001040456c656d656e74734b7573616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5c3e4a6b7f9ce9d1a3064ba1947c88f8d8e8d68296a5504fd3c1f3261509b4ce40b92b1b75c7174": "0x040000000002000000000000000000000000000000000a54657261204368616400000010676d40626c646e6f6465732e6f7267000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5c7849de4c2d8485cccaa999b535cd15c18bb2d22db70e4d7e8c83bb85bcbd3efbbd71f29c5d401": "0x00000000000000000000000000000000001257656c746879204d6f6c65732044657673002168747470733a2f2f6d656469756d2e636f6d2f4077656c7468796d6f6c65732f000000000d4057656c7468794d6f6c6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5d8672abc761749fad2d3a08e033ef653430391e3b208f9e17119de384eab78084c1dd817893439": "0x00000000000000000000000000000000000b416c616264756c6c616800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5e12c84a1884bd50a6ef463d858cf46d27ad2129b04f078a6b009eb588f9d651e399bce59fff579": "0x0000000000000000000000000000000000054a494c4c00127777772e6a696c6c73656e66742e636f6d000000000b404a696c6c53656e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5e77e17df143c51388c3c690f7ce15672f086b6a5e3ad7263b36986392cd5c8a70ee62f11554553": "0x000000000000000000000000000000000021547269636b79204e46542052657365617263682644657374726f792044657074001868747470733a2f2f747269636b792d6e66742e6172742f000000000d40547269636b795f4e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5ec7a33cbbb8d9e04f3da939fa351c562c7e06e1e3716976b5e14230e83a45995cbad9086f49e17": "0x040000000002000000000000000000000000000000000a506f6c6b61476174650a506f6c6b61676174651668747470733a2f2f706f6c6b61676174652e78797a1640706f6c6b61676174653a6d61747269782e6f726716706f6c6b6167617465406f75746c6f6f6b2e636f6d00000b40706f6c6b6167617465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5efd10bd264dbe62c0adc4df234352b61fd60a32c2890fc64c2c0a3de5e33ee1c5bc9d8f581642d": "0x0400000000020000000000000000000000000000000017f09fa7b12053656974616e20426c6f636b20f09fa7b10000184073656974616e626c6f636b3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5f35c89aa222ad08a0b27e25e4d62869f8aaf9e23c69e9b494b1fc617d0ebeb4c8afdcf1fd1aa59": "0x00000000000000000000000000000000001246757475726520426c6f636b636861696e000000166768726973746f7636343340676d61696c2e636f6d00000e4046757475726542636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5f95c682343769f3070122f5a708702492ef47c9113a8896a9d4bd33a24a071cead7303e1158f26": "0x00000000000000000000000000000000000f4069696c696e67776f7274683232194a6f686e205269636861726420496c6c696e67776f72746800001e696c6c696e67776f7274682e7269636861726440676d61696c2e636f6d00000f40696c6c696e67776f7274683232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e5f9a2fa2a6ae21fc86f4ad4a9c9032c14426b27d2b899a9813ade10664beb503c3076f78a87ca09": "0x00000000000000000000000000000000001b576f6c66207cf09f97bb4261736563616d70205374616b696e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e60d3fee20a9683954802ea0b430910788de53c221bf8c0f1a349719284af18c1ea1f2807c4fec44": "0x0000000000000000000000000000000000104149207769746820612042727573680000001761697769746861627275736840676d61696c2e636f6d00000e40414977697468614272757368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e61845ff24d5cc1e342f12106e62dc91fd042c6ea03f570502e69314d5cdf9128c3ca1deab6d904c": "0x000000000000000000000000000000000011596f75646c6544414f204d696e7465720a596f75646c6544414f1a696e76617263682e6e6574776f726b2f796f75646c6564616f000000000b40596f75646c6544414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e61c50b0b7f382f3fa8f1542a5136431ffaf6e46fd95cf784931de839ea17d154a4eee41308adb5b": "0x0000000000000000000000000000000000066c696c6c6f066c6564696f00000000000c406e6f5f757333725f6964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e61e63d1b5d2c29a1c90f53e61c20041e1a3df81248b4a6bfa420ec7cd5ad1dc37050bd50253be56": "0x00000000000000000000000000000000000f426c6f636b6174686f6e2044414f0f426c6f636b6174686f6e2044414f0f426c6f636b6174686f6e2e78797a0016626c6f636b6174686f6e406269746677642e78797a00001040426c6f636b6174686f6e5f44414f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e62a1248b05d3350b0a503c9745bfe83420884d860baa41869bec8a251e640d5769134e92119343c": "0x040100000002000000000000000000000000000000000d4c756e617220417669617279001368747470733a2f2f6269726463752e6c742f17406c756e61722d6563686f3a6d61747269782e6f72671c6c756e61725f6176696172794070726f746f6e6d61696c2e636f6d00000d404c756e6172417669617279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e62a64b055ddf8da2c8781410fcdb4a98b0d87447f73e46c2c5a285cbe3338e73cf213f4fa48851b": "0x040000000002000000000000000000000000000000000a6d6172697361727a65000016406d6172697361727a653a6d61747269782e6f726714666c79706574726f764079616e6465782e727500000b40666c79706574726f76000a6d6172697361727a6500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6344678166f5ea4ce632205bea89e6a30ed4e150402ba7997fa946739dbff2d8bda1fbb73f6d461": "0x00000000000000000000000000000000001a4d41494e54454e414e43452043555241544f522050524f585900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e640a57f005246e16cc99fecae54278eb06aab56467bb644500ac7301cb1b9dd2f7b3bf8014cb40d": "0x0000000000000000000000000000000000065061626c6f067061626c6f00000000000940626974636f696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6571ba184d1dd340e24ef1865f800083d91176db91ceb22bc12386f4ad085843c7c2b1d2e457f61": "0x000000000000000000000000000000000006506f7070790000000000001040506f7070794f6e5468654d6f6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6641b78daaaa70c127d0bf5a272c4fce4b744027090fd032cd8dd569c52b8301727192d6df42f78": "0x0400000000020000000000000000000000000000000010f09f9a80616c6b6f393839f09f8c9b00001440616c6b6f3938393a6d61747269782e6f726712616c6b6f39383940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e669931fb1d70de1e63bad33d41d23e049d4f9efea39e4f44426b3f82104800ef6a9f29fbaa18667": "0x00000000000000000000000000000000000547616265184761627269656c20466163636f206465204172727564611368747470733a2f2f67616265732e73697465194061727275646167617465733a6d6f7a696c6c612e6f726716617272756461676174657340676d61696c2e636f6d00000c4054696e6b657247616265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e67690be6715ac6dd24fb92b0c4972591887fd6bd35c641d80c2f6341c8ed8231afb779e4e26ea4b": "0x0000000000000000000000000000000000204d495353494f4e20434f4e54524f4c207c20434f4d4d554e4954594e46203500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e682263d2b1ef24bbc2d28f57741ea9f160b1dfa892f5ec7d27794a10faf0eaf864e3cec1f935c6b": "0x040000000002000000000000000000000000000000000747726f6d7a790000134067726f6d7a793a6d61747269782e6f72671367726f6d7a79313540676d61696c2e636f6d00000000085f67726f6d7a7900", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6a2e00133e91fa9b60df42b347f1fef9ff33a82e6cf842ee1cf51547ddb4ef66da57194e7b8ba4b": "0x08000000000100902f50090000000000000000000000010000000200000000000000000000000000000000094465436f6d6d61731533436f6d6d617320546563686e6f6c6f676965731568747470733a2f2f6465636f6d6d61732e696f2f1640696f736966313937373a6d61747269782e6f726716732e7368616d616e6f764033636f6d6d61732e696f00000a406465636f6d6d6173000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6a4ed08608c10747cd59ba5ff4fb96195e2ccb9eaccd78bff982e0f15db7e942d72d1b957a2fc0a": "0x00000000000000000000000000000000000774657566656c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6a7928211b426f8dc4cec4724b20afc1dc35f89679f2163a184c121c8dd74e00ee15114b471fb3b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6a7b17e0dc24fffb6c276d432f4efd1f1d1dac4ffe8b237884c3eff170579883e24752c4179f30b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6b52eb564f74eb652620328072469a6ddfdefbe41728a7de41dc26c6287529f220e562bc5030e63": "0x00000000000000000000000000000000000d456c656b74726f76656e696b00000015737472656c6f6b37353940676d61696c2e636f6d00000a40737472656c5f6f6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6bd40c93fa096fd767cba4f8c9944d922ec038b8e49798ded82982594176648e88846bab4dfb116": "0x0000000000000000000000000000000000084d65727269636b0101010100000c404d65727269636b323439000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6be2ef10957c7f700cc6d75d48ed09a1a77df6336e1de6610bd6cb012617f5adc7a0a0088589d60": "0x040000000002000000000000000000000000000000000b4c6f72656e61204b534d000014406c6f72656e61663a6d61747269782e6f7267166c6661627269733139373440676d61696c2e636f6d00000a40626c6f636b79615f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6bf80afef0f87a4e8c096adce479e487ffbb318c037b5a6e6d3743f89f83c5f32aee60590fb325a": "0x040000000002000000000000000000000000000000000a47656f7267695f6967000000126a69673737303940676d61696c2e636f6d00000b406a696763727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6c2c15d71b57c80a8cc040d5d391967b6c50b54d81dbc18acf06fd13a704decc7df6f464679051b": "0x0401000000020000000000000000000000000000000008456c656e6f646500001740656c656e74726f6e69783a6d61747269782e6f72671b656c656e33393874726f6e6978626f7840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6e4f10f4a2d38dbb6511f13375482ec7f64612a9b23a6f9d0922d052b8ff65756e97640607d2476": "0x040000000002000000000000000000000000000000000a4e654e6120f09f8cbb000016406e616d6574616b656e3a6d61747269782e6f7267196d796d696e647365746f6e796f7540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6ea262a4e57686c7c95ac8365f9f4fc5f0979c438adaaa4766871c3080ab274904837315cdc8b26": "0x000000000000000000000000000000000008417274204c61620644617679640000156172746c61626e66747340676d61696c2e636f6d00000d404172744c61625f4e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6ffdcce232e42d1f047d33d085908d48fd886c98b56792757c6dcc79df7549921a456c1500ad75c": "0x0000000000000000000000000000000000094e6f67617264657210416c69204361676c617220557a756e01010100000c404c6f626973696c696369000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e76389c26b279edcfcc3adb5fd50be07e63c0711e10bf94a5e81e3049f58b4a1c0f78b7c63436a3e": "0x00000000000000000000000000000000000c446f776e736964655075740c446f776e73696465507574010101000008404e4b59323235000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e7720d47146ee75b84ea64de1c450d5e719041fc2fe8cfb61bfbb8eb42790de3ff6f7bcf41ae432c": "0x00000000000000000000000000000000000a5f476f676f676f676f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e77aa7455b2fe961fe4c363ca5fbd7818a873e807261aff6288a5c83f9464cbfa0fa0f280a9a7a31": "0x040000000002000000000000000000000000000000000761726b6177610000001461726b61776136303640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e78e73a25356ee263028097756f2e6b331a1ab76fd0abe787b6a1e60d0174c9dfe44c4adae5bff42": "0x00000000000000000000000000000000001031706f73697469766576696265733100000017637572746973657472697070407961686f6f2e636f6d00000d4032676f6f64766962657331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e792229345a703fc4ec57d4ea0756ce490ae612b7566f87fd99d946fbb0acf030c3642807189ad04": "0x000000000000000000000000000000000014456d6d617320284164616d204173676172642900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e7a7f99c4fdd18b6aa45f39ba0061f8a7e5d4df583d003a9f11c89f09c6e0650be230552dbde8d65": "0x00000000000000000000000000000000000942657274696e686f144a6fc3a36f20466964616c676f2053696c76610000186a6f616f6166666273696c766140676d61696c2e636f6d00000e407075746f62657274696e686f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e7a9bfdf07bafce9e604df3ebc0fe5cf21a4b4be4c8f0b28a1c458b455316215b41da6f136f7910c": "0x00000000000000000000000000000000000b746f726f647261676f6e01010117746176726f736472616b6f6e40676d61696c2e636f6d00000c40746f726f647261676f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e7aeab5136b2e1a4182cf6a4edda25060a732818ecd359268b7cfe3c9ed503cd5a76fb4dfd8a1c5e": "0x00000000000000000000000000000000000f696f667468656265686f646c657205494f54422168747470733a2f2f6c696e6b74722e65652f696f667468656265686f646c6572000000001040696f667468656265686f646c6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e7cb8e1a29da70a064f4c7e6a5f3f25b4d063e5461bf3882569aad883b6db400695ccfd7c6e6ef22": "0x00000000000000000000000000000000000c5843417374726f6e6175740744616b6f74611968747470733a2f2f696e76617263682e6e6574776f726b2f1940696e766172636869746563743a6d61747269782e6f72671764616b6f746140696e76617263682e6e6574776f726b00000d405843417374726f6e617574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e7cfb082496967f7ec22eb74dea33d78388ca084d35bb754ab5256d4d606d83818f639d0c63dd541": "0x040000000002000000000000000000000000000000001145617420596f75722043727970746f7300000019656174796f757263727970746f7340676d61696c2e636f6d00001040656174796f757263727970746f73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e806de170873b7f5bc955504a40c50ded178a8082516a78a68f503348c16b106fb2a1aa2c594743e": "0x04010000000200000000000000000000000000000000074d616179616e0e4d616179616e204b65736865741468747470733a2f2f6d616179616e6b2e636f6d14406d616179616e6b3a6d61747269782e6f7267136d616179616e406d616179616e6b2e636f6d00000e406d616179616e6b6573686574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e8132b78f5a4f887e6c77cda38a3c7f46fa96464dccc96f4d36f31ba1f4487c06dc83b5c8e45ad04": "0x00000000000000000000000000000000000f4b727970746f686f617264696e670000001364616d6f6d616e6740676d61696c2e636f6d00000d404b696e674461736f727461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e816cc3d6733171beecf668b36de6a7e53932f2a13c6e7a76ba18de1293eec95f2ab73259ccc9461": "0x04040000000200000000000000000000000000000000076c756967686f000000136c756967686f393540676d61696c2e636f6d000009404c756967686f31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e82fc91783bf46accadffbe2995ae2867e82d0509dd5b7e3f392bcc1c3f72d5c7c22b6992cea506c": "0x00000000000000000000000000000000000a506978656c20417274054e465473010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e842dd34520b9eb24cc814dbc865ac0e41bf2d9c39177665f32cadb7d01093e2ad40cdca1d40b53f": "0x000000000000000000000000000000000015427564647920486f757365206f66204368616f730000000000000e404d6161743734333936343630000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e84a92dfe79fe371cc16be5e77dbadcc7038bd9d447475d68dc4a9af67e3ecb92ca374c7cff9365f": "0x0000000000000000000000000000000000064d6172696e00096d6172312e646576000e6d61723164657640706d2e6d65000009406d617231646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e85d0bcdbe07f1da309409e68f563d9e9160bc30f7418cbe5735e3e2dc9922db1826807029b8ba5e": "0x0000000000000000000000000000000000104d61785f43727970746f7a696c6c61044d6178001c406d61785f63727970746f7a696c6c613a6d61747269782e6f72671963727970746f7a696c6c616d617840676d61696c2e636f6d0000104043727970746f7a696c6c615f6d670009406d61785468656f00", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e866dbe58dd02dc15480a8c33e4f8c5fe4fc96bf837793ce57e7e01fc24f3e49380c1da287dd0942": "0x000000000000000000000000000000000011506f6c6b61646f74205065727369616e0e4661726465656e20486171756500001968617175656661726465656e353040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e86ac2d54fd84df0f4914e62f037cdb798c40ea01fd56e555b77635e0e9b7175b98bc9514021756c": "0x04040000000200000000000000000000000000000000094461726b737461720000001c6461726b73746172313938324070726f746f6e6d61696c2e636f6d0000114044466f726b6c6573736e6174696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e8937a43ac980f1586f33a7ca64a28019e30c3d51516a96b2b2ac8686a25b6bed4d8755dc865d317": "0x000000000000000000000000000000000007726f6737333313526f676572696f204420466167756e646573000011726f6737333340676d61696c2e636f6d00000940726f6737333331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e8b0540980af6a340eecdc6635148c341055535da240f7acccb21659afb5aee9f9948c99359f3439": "0x00000000000000000000000000000000000d53616e63686f2050616e73610a416c656b73616e64720000177361766368696b2e776f726b40676d61696c2e636f6d0000104063727970746f617065735f6b736d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e8ea76be2017f4a28655c4ccb0364b450b7d2061b3c8dc099342216338374f2480b91cdb49c1033a": "0x040000000002000000000000000000000000000000000a6f67756e6b7563616e000000146f67756e6b7563616e40676d61696c2e636f6d00000b406f67756e6b7563616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e8eb9b60e1513484462331eafa624d8d83071075364f17bd15016b013864863fff94db04a29deb56": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000a4d4943484953414d410000001a6d69636861656c2e7361726e69747a40676d61696c2e636f6d00000e406d696368697361726e69747a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e8f8b7184f9a04c0ca72d01b6c36c383e4ba984681b7b467dafefec8f44dab1ed507ae6ab2704c30": "0x00000000000000000000000000000000000a307854617973616d610000000000000b4030785461796c6f725f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e905397499085a5cd08b2f1e5fe95f103948c86163819e4cc144ab447ba4018277b63592ab942b29": "0x0000000000000000000000000000000000076e69636e616301136e69637363726561746976656c61622e6361011a6e69637363726561746976656c616240676d61696c2e636f6d000011406e69637363726561746976656c6162000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e907703340da1e8f2e0b113a373a48400516429c6d481bc521ae1784536e67ad6208da18d4d0df19": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f32300f42494e414e43455f4b534d5f3230000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e93245b557944f937e6a72893ffcd787d41621e01d10074d0d1425d910ed402a489111173fec4113": "0x00000000000000000000000000000000000e4173686c6579204475507265650e4173686c657920447550726565187777772e7468656173686c65796475707265652e636f6d011b6173686c6579407468656173686c65796475707265652e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9422a057a1bb64b70c74263021641934d8ead99b5f41c35cef39e6381314c3b0818941196cebb35": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f343900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e944e964592233816e6a5f27e6e082241bacc990628ee760ceaee069a8a67c753d8018f040f31703": "0x00000000000000000000000000000000000b526f6c6d696e61746f7208526f6c616e646f010119726f6c616e646f676c7a3139383340676d61696c2e636f6d00000c40526f6c6d696e61746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e94531e277a1ad52dcb38c186bf97625f108b4832981d966ebed50d939349d4437a6f538d40d5676": "0x040000000002000000000000000000000000000000000f57696c64436f7573696e2e636f6d0000184077696c64636f7573696e673a6d61747269782e6f72671c77696c6c692e7365726b6b754070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e94ce4f5193d45cf523700038ad442ddbadaa480e8faa91c55e9c0c4af0e2f76fa05c0a69065bb72": "0x00000000000000000000000000000000000d426f777365722053746178780000000000000d40426f777365725374617878000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9521ce485bf220366a4d150e1799ed9ffa721e7e95397c4484db801fb7f26fbc4f27e1d158ef839": "0x0401000000020000000000000000000000000000000004545831000014406f6c6567616e5f3a6d61747269782e6f7267116163656f6c6d4079616e6465782e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e95a2208b7916b225ce252657fba00b03c44e644c81a7c49f72fa99ec13aad281507b60c599bb82b": "0x040400000002000000000000000000000000000000000a6b61796c6132303231000014406b617977616e673a6d61747269782e6f7267136b61796c61406c6974656e7472792e636f6d00000e406b61796c6177616e676e6f77000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e964b9924326e5859a226ee3bd37742f15c3dc4d267c60397718524d88a1fcab129877e2933c675c": "0x040000000002000000000000000000000000000000000d4d616e74726920436c6f7564000018406d616e7472696e6f6465733a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e965b8ae173f1e967eaf727c21c8d3283dc379bd1241c2ac3ac744966bf2412ae8d7979a87894550": "0x00000000000000000000000000000000000d426f726e20696e204d657461001e7777772e696e7374616772616d2e636f6d2f626f726e696e6d6574612f0015626f726e696e6d65746140676d61696c2e636f6d00000c40626f726e696e6d657461000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9705190c69f75e984a135c14c92b678df586c20c8e3ca3511043f0dc8bfd88017d0bb97bfcff63a": "0x040000000002000000000000000000000000000000000a476f6c44204a615773000000136a61756d6540676f6c646a6177732e636f6d00000c40476f6c5f445f4a617773000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e98578a74df70c3f7ef355626ce3b4bc8af2d9db491ff132f0127fbee6133a00ed09ff161fc2f70c": "0x040100000002000000000000000000000000000000000f4a61656c20522e2042616b617269001868747470733a2f2f6a61656c7262616b6172692e636f6d00166a61656c7262616b61726940676d61696c2e636f6d00000d406a61656c7262616b617269000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e991a1b779e8a17838ae9a751c06cfc8b4bfb06f4d0b8d88df80fc88317415ad6f1b9bb6ca114941": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e99a82a5baf61a80de039a1751705e01c71d2be0ba56442f016e7cfbd1f71e9fdf4d0dc0ededf87c": "0x00000000000000000000000000000000000e45766572647265616d536f66741145766572647265616d536f66742053411e68747470733a2f2f7777772e65766572647265616d736f66742e636f6d0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e99e99015b0c69cb32da9fa3f73d7e9b211d6808b7bd15d9daa8a7372b48c13322a7371190793f0a": "0x00000000000000000000000000000000000b4b442053696d706c65780000000000000b4068756d626c656c656f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9a6cafc1c447d4fc2a82d0740d343bbcf853665019f2afe81ddeb884f76dbb5c74533610f72a732": "0x04000000000200000000000000000000000000000000114c65707265636861756ee29898efb88f00001c40706f6c6b616c65707265636861756e3a6d61747269782e6f72671b69726973686c65707265636861756e4079616e6465782e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9a810681c9b059d2a343a2b14c98d087a4cea739c23d62d9db79ed4933881d78a3ac20bab83766f": "0x000000000000000000000000000000000008506564726f203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9a8697c66e5c9b7b8e39e87c0fec96f7d012d31a4c27b44bfb504ab359662112e4270e380c84341": "0x00000000000000000000000000000000000f647a6d697472792d6c61686f64610f447a6d69747279204c61686f64612068747470733a2f2f7777772e636f6d706f7361626c652e66696e616e63652f1b40647a6d697472792d6c61686f64613a6d61747269782e6f72671b647a6d6974727940636f6d706f7361626c652e66696e616e636500000f40436f6d706f7361626c6546696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9a938ca9a4abd3102b2b0de562a79b5ad9c666c3f9e7752955f3b2c2b4a17c71125b2668ea9ce5a": "0x0400000000020000000000000000000000000000000007676c692e616c00001240676c69616c3a6d61747269782e6f72670e6b7573616d6140676c692e616c00000a40676c696f63797465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9a948cc19db68dda45d1343d565c182e0e1cd3da2d6c0b1ab5b17a77ca165457d9620db19439a64": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9b38311201d0c95cc79494a220a3cbaeb376cb092a438dffe13a31923d884592f34bfb0c4a8a447": "0x00000000000000000000000000000000000c576f6e64657277696c64730d4a6572656d792042616b657210776f6e64657277696c64732e636f6d0020776f6e64657277696c6473406a6572656d7962616b6572617274732e636f6d00000a404a6572627a576565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9b876e9759b44dcc4d56916477150c0fe18c59b3fc21ed58a435a7fbf27c391353a1a4bbf90d305": "0x00000000000000000000000000000000000552616b750552616b7500000000000840307872616b75000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9c3058e8b7da671be86d32d322797f67dd5d386d29d8285cb32504a767956fc58ed8f04ff703c4a": "0x04000000000200000000000000000000000000000000057475677900001440747567797475723a6d61747269782e6f7267107475677940616d666f72632e636f6d0000094074756779747572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e9e499f3604f59e52c7807a22744a056fbecff1ecfbe7eba8b1936dde4dc054417c5cf2562bc2b0d": "0x0000000000000000000000000000000000154f6f2d626c612d6465652d6f622d626c612d646105f09f94a500001a6e656d6573697364656675656e746540676d61696c2e636f6d00000d406b696e676d6f6f73616d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea141d97c8b7bff6a84f5ec52d8e52699f686e95df25a2350fc0b43df597617b09e8f0a5e45be779": "0x0000000000000000000000000000000000064a6573757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea37edebb810a51f664657582db1ee9d6b05c183b0bf9d05794c88b96fd98ffabf1e03524a079f07": "0x00000000000000000000000000000000000c5068616e7461736d616765001e7777772e696e7374616772616d2e636f6d2f7068616e7461736d6167650000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea3dd7f24f32b641be7ed37a86e99b9c1197ff8fa3a5e4b6403b540196f6cd09af2fbc43ea9a5773": "0x0401000000020000000000000000000000000000000011776562336974616c792020203b2d29290a776562336974616c791f68747470733a2f2f776562336974616c792e706f6c6b61646f742e70726f0017776562336974616c7940706f6c6b61646f742e70726f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea41c7234ed3632dc50f089e43c19f3f4ce606cd994bbecc50bf8dc53e970c0c1c592304f651966f": "0x040000000002000000000000000000000000000000000f466f726b6c6573734e6174696f6e0000001868656c6c6f40666f726b6c6573736e6174696f6e2e696f00001040466f726b6c6573734e6174696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea5174161abd84b3180e530fef04fbbe11194fb02ee20db23f2c6f1d5ab928cca1e1c6b4c1d9812b": "0x0000000000000000000000000000000000086d796b736d363900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea659cd23e1b406c58efadc57a1952fc5829948986e5b86e2b7873ee16510800628e8bfd0344ac5a": "0x040000000002000000000000000000000000000000000d444f545f4b534d5f504f4f4c0000001577696c6c6f6e6c79323340676d61696c2e636f6d00000c4057696c6c79536f6e3233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea6e9e7ff4584b959e5ba1a3731a16d3b5c632a184389a6e63f53fd33bc1f099f8973549b2e45818": "0x000000000000000000000000000000000009537469636b69657309537469636b69657300000000000e40537469636b696573524d524b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea707eb9aaeed5b71ecccf5102c89a45733719ed85e43885b5354623e6e90ccc488ba2773a6d737a": "0x000000000000000000000000000000000007425453756c6c114272616e646f6e2053756c6c6976616e010117627473756c6c6976616e393140676d61696c2e636f6d00000e40627473756c6c6976616e3931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea93374d7f1324e97e131d8f9ad19a2ca2dde965022455099c4e35f369fab9a66717bb32dc5b821c": "0x00000000000000000000000000000000000a5a454e5449454e54530b5a454e5449454e5453201f68747470733a2f2f747769747465722e636f6d2f5a5a656e7469656e747300145a454e5449454e545340474d41494c2e434f4d00000c405a5a656e7469656e7473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea98afdd050adf1030b7a3a137092d0c4a8f82cec3a75dedd955c4f0547467e659c07dacbf787f7b": "0x00000000000000000000000000000000000644584d4f4e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ea99648ce61b6d52d86dba437fa4388bc312e57328e808cb1d37cd49143b90c338714703867edd7a": "0x0400000000020000000000000000000000000000000015f09f8d8041524953544f5048414e4553f09f8d80135079746861676f726173204361706974616c1f68747470733a2f2f7079746861676f7261732d6361706974616c2e6e65741b407079746861676f7261732e632e693a6d61747269782e6f7267207079746861676f7261732e6361706974616c40747574616e6f74612e636f6d00000e405079746861676f7261734349000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eaa1427619fd84d8aefc61195d8e3f213b241816aace9f79fa086f868616c9892555158be75bc252": "0x0402000000020000000000000000000000000000000007537562426f78094b6576696e53756e1b68747470733a2f2f6769746875622e636f6d2f7375622d626f7814406b6576696e636e3a6d61747269782e6f7267126e6f346c6f6e6740676d61696c2e636f6d00000b406b616968756173756e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eac64c1f4e558ab7d60c75740987ee89dac9107fb640ad94539c0aa174a045bfd788ba367246c00f": "0x00000000000000000000000000000000000d4d756c6c65722042415349430e446d7974726f204d656c6e796b0000196d64622e63727970746f3230323140676d61696c2e636f6d00000f40446d79747279694d656c6e796b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eacb05ddd012a5e58ed26dda286bde16d2dd807510bd269c8cebd598bbc85a528a87ce2a86123123": "0x00000000000000000000000000000000000c435f70657373656c6c696e0a63726973746869616e00001d63726973746869616e2e706573656c6c696e40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ead73865098b4e268cbdf5f8b94b1e3e50d5258a934f3f005ce2ab97c47af0fae918b1135e29b67c": "0x040000000002000000000000000000000000000000001452656b7420537472656574204361706974616c0000174072656b747374726565743a6d61747269782e6f72671872656b747374726565746361706974616c40706d2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eada65ead440e226c0e28f6cce9440f36b1e0218286e2d618d3a96c63321eeafc17aaeaa627bbf5d": "0x0000000000000000000000000000000000115468654375744c6f737353747564696f115468654375744c6f737353747564696f155468654375744c6f737353747564696f2e636f6d001b7468656375746c6f737373747564696f40676d61696c2e636f6d00000f404375744c6f737353747564696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eb447064e6bf7505cec975ab53753aa239ab05d83392a564b6b26fcde4b1e07b1e5a692d011e3428": "0x040100000002000000000000000000000000000000000f4d696775656c204d617271756573001d68747470733a2f2f74696e7975726c2e636f6d2f7963626f3479786315406d722e62726f776e3a6d61747269782e6f72671b6d696775656c2e6d617271756573373040676d61696c2e636f6d000011404d696775656c4d6172717565733730000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eb7cf6adf6bf0eeb8a69eee1f91f7a4c18dd0f200bf9dab5149f0b5131d144024fd8d91fce375860": "0x0000000000000000000000000000000000164d79427572676572427261696ef09f8d94f09fa7a0001b68747470733a2f2f6d79627572676572627261696e2e636f6d2f00186d79627572676572627261696e40676d61696c2e636f6d00000f404d79427572676572427261696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eb8a84fc1f2672fdf6eed613aedc88afa977c2982319ee6fbaf9aec7f8a285ce88f08c0dc84d4b0a": "0x0404000000020000000000000000000000000000000009717571757a6f6e6500001540717571757a6f6e653a6d61747269782e6f7267116c656f406c6974656e7472792e636f6d00000a40717571757a6f6e65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eba9e3af1be4519454d7eca7197b7feb6cc79725fcf5b873f1495add94c771682584d7d254163713": "0x00000000000000000000000000000000000a476c6f62616c45524e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ebb9d8077a7da3fe98672c4edf6d578c3151aa2e8d55431cc874360eff95c4592d917fb09a6b6316": "0x040000000002000000000000000000000000000000000a4d61676963205461620000001564656e7665727437383440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ebc3901876e1bb583cdf41f721ca5269ae0eeb4343cb60721fd8cbac7022328cf959d7c3e728d969": "0x00000000000000000000000000000000000547656172184765617220546563686e6f6c6f676965732c20496e632e1a68747470733a2f2f7777772e676561722d746563682e696f2f001368656c6c6f40676561722d746563682e696f00000c40676561725f7465636873000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ebcbc6c0c66547df8c4c81f382ae2c201eed4b0b519f352aa9c0c8593122418b30ac9760844de2fa": "0x0400000000020000000000000000000000000000000009436f6c6f73737573001a68747470733a2f2f636f6c6f737375732e6469676974616c2f1d40636f6c6f737375732e6469676974616c3a6d61747269782e6f726716696e666f40636f6c6f737375732e6469676974616c00000f40436f6c6f737375734974616c79000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ebe794990a349ea52ee8bb0f7ce771455d55e6bb0908b243c0c4805e6733c0ebbd91bea2ff5a4526": "0x00000000000000000000000000000000000b6a75636163656a75646f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ebee8c2dc7e37890e84b20a21cd1f35835bb85d8e27d3b6d02bf08300998555443ec4cd3206ec37a": "0x0000000000000000000000000000000000114a757374696e65204372757a204172740d4a757374696e65204372757a010115726a6e65706f6372757a40676d61696c2e636f6d000010406a757374696e656372757a617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ebfc2e29a73f2803cc1ba006a1715e894b621a36169165cb72343b1c6ad4ba2230d394be4033a645": "0x00000000000000000000000000000000000e7765616c6c64697361677265650000000000000f407765616c6c6469736167726565000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ec33a2010bbc1c6a108079cf7fc4da7010feec2a6d3435947ca526d185fffa4c13b816eb9d38a107": "0x04040000000100902f5009000000000000000000000000000000000000000000000000000000046d656c000000126d656c7a406c6974656e7472792e636f6d00000b406d656c5f7a686f7531000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ec3c3e9502045f3b68c1fc61924efb992b4e4c2c7a21d528dca21d3073fd304f536fd99a5cf1794a": "0x00000000000000000000000000000000000bf09f9088e2808de2ac9b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ec423cda65dba1eeb21a6e8672731908c93ced8be633bb99e8535a8af267463d92a2dd37b6999e4d": "0x000000000000000000000000000000000011f09fa5b04d414d4143495441f09fa5b000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ec514a5caaf1ccf5be28e6585d6eba8b92193cdbeaa65fbb64f3b22a2f3043481f088e875f8fb816": "0x0000000000000000000000000000000000086265656a616579094f6c616b756e6c6500001262656562616e7140676d61696c2e636f6d00000d4067616d656f666761696e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ec9971789d54b940607b422f959ab305856c1621be625a1776d2ffddfac9a03446da3052d7cd3a58": "0x0400000000020000000000000000000000000000000009434f5645524c4554000013406164653030373a6d61747269782e6f72671461646576617261747540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eca845b41c8481b56a54690cc83eb7ead60699dddf84173f229fc713de735bc849b0b5d0164d971b": "0x000000000000000000000000000000000006676b686e3000000000000009403078676f6b755f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ecb301dad8fcf04b9e1f6008fd792e78fa56b6ae00b4f8b73b98d260ad04b38623d1a3423ada0957": "0x0400000000020000000000000000000000000000000004616e790000000000000a40616e796441707073000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ecc10f82c1c9c473fe7ecf56bcdfd2f5c5570574eb8971fdc5b2ff7d929767b730066666a1493177": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eccde6810f3e4a3bbae434c3ce18cf1d398e23149fcc31fd5997284a7812839ca3bd6b477f449565": "0x040100000002000000000000000000000000000000000b4a6f736570685f4144561b6a6f736570682073616e6368657a2076616c646562656e69746f1768747470733a2f2f6269742e6c792f334d614f675741001b6a6f736570682e73616e6368657a2e7640676d61696c2e636f6d00000d406a6f736570686873763231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ecd56384808aea349692fa834a36faff24619a5a9559ce35082ea5247cfb0657e8ce2fe5fcce2d3e": "0x000000000000000000000000000000000007534b554c4c5a0000000000000c40534b554c4c5a5f585858000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ece0cbfbc8b2ac0fb69dfe53765f807ba212f4c0f8c5f2c557143761c734f58ab36f1a584d77592f": "0x0400000000020000000000000000000000000000000019f09f939c20486f6c7920436f6e73656e73757320f09f939c000015406d6f67696f6d616e3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ecf2bd08370f7bd96c1c4ce21343d4de9268561b0872178a5f017362e2632e6d4019b17e73fd9a5b": "0x04010000000200000000000000000000000000000000134d2d5665727365204152542053747564696f064e696b546f18687474703a2f2f7777772e72617269746574732e636f6d001a646d2e646f6c676f6c65742e62697440676d61696c2e636f6d000011405579326c384547644677514d4c474a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ecfb9de5210ebb4164f5867915d7d9c1a1f95f772891efe46ada7f2c25a7124c55c7d08bcada7250": "0x00000000000000000000000000000000000a536576656e2041727400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed170e36fed4d7829c7c545141ea2dd84fe5ef7d567ea450f59967e7afa68e5f1ff7f7c46db19627": "0x04010000000200000000000000000000000000000000085032502e4f5247085032502e4f52471068747470733a2f2f7032702e6f7267000f6c657473676f407032702e6f726700000e4050325076616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed2422d97d69412f3848140170bdea2ed343c6cde80ba53793d9158f57f7160e5f5d78b1ac2ae124": "0x00000000000000000000000000000000000c4d61657878696d697a65720000000000000e405f6d61657878696d697a6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed256f19624cd5e520bdacc287bbcbea07e8fad8f43e5dcb222c425acd92d88da92131542f706827": "0x000000000000000000000000000000000006534b41455201010113736b6165726e667440676d61696c2e636f6d00000b40736b6165725f6e6674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed28496342047e2cd2a250fe4fd3437ab1adf1aaecfa369933dd022c08ca5c5718a4843cf7fbfe32": "0x0000000000000000000000000000000000076b7573616d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed2ea848bf9923e24a53c0383caec5273b6cd82cd4c343130767c2550df0fec0c5c7c76db58ded61": "0x00000000000000000000000000000000000d466f756e646174696f6e2e5a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed3dc3fca3bb7956b608ce37459ac5d38405203ab8b429207b21fe8aac7ee28aa964da0ae12fc970": "0x0000000000000000000000000000000000116b616d616c61696d6d6163756c617465124b616d616c6120496d6d6163756c61746500001b6b616d616c61696d6d6163756c61746540676d61696c2e636f6d00000d404b616d616c61496d6d6163000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed614c0e929782758c5359d2bdc1550dc83587f9fca8a411099eab04cc37f8d3480c0bc2daca9f4c": "0x00000000000000000000000000000000000f426c6173c3a920426f6e6f626f730000001b626c617365626f6e6f626f2e6b6e667440676d61696c2e636f6d00001140426c617365426f6e6f626f734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed61cc174562abef5a9635e41381688cc05f8f2a2abc1d3a020f4f6726998721f201a3e3fe061336": "0x00000000000000000000000000000000000e4b5553414d41205748414c45530e4b5553414d41205748414c455300000000000e406b7573616d617768616c6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed782455066cea4ee6f56f064baa721a0d8d32e52c80ddcb1f3ec711b3535f6ab6ee30510b88824c": "0x0000000000000000000000000000000000064162616e64000f68747470733a2f2f612e62616e640000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ed9f378fe91a8125c4de4f9f5568e51e59a99d289673364dea82a180b4cff619e121c1ebf4e42735": "0x00000000000000000000000000000000000b43727970746f436f6f7000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714edb9597552dee00bf6e36d6ffac19bf2cde9b8a6189939d02019b614729f72aa3fb4e95c5460b95c": "0x00000000000000000000000000000000000b505249534f4e455253200a574f524c445749444500001b707269736f6e657273776f726c6440686f746d61696c2e636f6d00001140707269736f6e6572735f776f726c64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714edbd8e7a024325c3c0b08670875a44574a20f29df8e415a84e87548aee41a90dca4de6dace851c06": "0x0000000000000000000000000000000000057065726c000000137065726c6c676c6740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714edcb62732d88d5a1983ac92a9005b595553a62a3522499a38af23ae77e0c71f3b617abf004147e5b": "0x00000000000000000000000000000000000f5041524954592054495020424f5400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714edd6a8685a4d3345b2bc481201f051dc46499103c6d0947c70967af1dcfacc2b34f5a1065256303b": "0x00000000000000000000000000000000000f416e64726561732053746f636b200f416e64726561732053746f636b202068747470733a2f2f7777772e6269662e64652f616e647265617373746f636b0011706f737440726f6c6c737465722e646500001040416e647265617353746f636b3135000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eddc9e78603ad40bc8ef2ec23b4f86d82dce53a0569f1f1f1cac8b7eac2a36aae89ab1312720d51f": "0x04050000000200000000000000000000000000000000046d616b00000013746f406d6f7264616d61782e6f6e6c696e650000096d6f7264616d6178000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714edf0122a60d52d7dbc5054d8ce14774d438c9376642f6410f0ec0f9b02c20247923889ec58250227": "0x0000000000000000000000000000000000044f62690000000000000e404469676974616c706c75746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee0ce2c47daf1aaa5268f1c62243ca2f0e0ca3c43ac74c89c4d4f2aaf3135d5922b38679523b5704": "0x00000000000000000000000000000000000a4675747572654c656f0000000000000b404675747572654c656f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee0e3a74bdfdeb1c92346d7a04f8c10608fff8e59d18ad02f32d018f562d61d58f7b4ed9d42b9602": "0x0000000000000000000000000000000000084b616c6541727400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee2bc658fa0d1fc5fa8edfccb16e4748eadc9c5ec4e84fa3f9cd096b78dc8b6fa28b06e0b4945c31": "0x000000000000000000000000000000000013524d524b61626c65204372656174757265730000000000000e40524d524b61626c654e465473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee37cb203df4b717dae56db2d898e18d0a96a0db1732e27d6c8d2a448649348b3d7b2b7a8b819e00": "0x00000000000000000000000000000000000459534101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee577071e47d1ba7b8a40f17f9fc62194fe1b12c10e8a2bfb5efc7057b119f4ca3b05ba96eb7da6b": "0x040000000002000000000000000000000000000000000b7374656c6c61726a6574000017407374656c6c61726a65743a6d61747269782e6f72671762696c6c69626f6e7337373740676d61696c2e636f6d00000d405a616b68416c656b736579000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee7dbc12bc9252112ebd1171c5fcf0d3387bce6cbb7119410ca169b272b310775b1816de710d046c": "0x00000000000000000000000000000000000a444b2053747564696f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee8578075072e96cde26e94d5a74a70872172314f92fb0fd0d1c9fe186c38b594ad50e6079ca1218": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee877a7a3953392aecdb6dcb19a0a30a0007a4cc863d9a3079801900d0e26493a9712f3a595c276c": "0x040000000002000000000000000000000000000000000d424245574f4e44455246554c00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee89fee2b887b471a8274537b1ed72b005b2ae6e3c0e14273235d9c5556ade786172d842a2059e3d": "0x040000000002000000000000000000000000000000000a50726f66696747656e0000164070726f66697467656e3a6d61747269782e6f72671564696d61676f6c796f7540676d61696c2e636f6d00000e405a616c613131373634333039000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee9086e3eb095e4cd80e7cac81873a2f2b98cbe3f9a22fb2c640721759559dc7c074f558f274450e": "0x0000000000000000000000000000000000084269677a696e6501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee977649867b775e26f6ba0b2c596d1a471444945c9fdbdfe25e3f8862096f8f6de11d87da1a7111": "0x00000000000000000000000000000000000f546865205068756e6b79204f6e650000001a7468657068756e6b79314070726f746f6e6d61696c2e636f6d00000c407468657068756e6b7931000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ee9be5f0b44a2889287e6f010e50f642775dab59f39ee4de313fe6325181ca603824399cf4d42c08": "0x04000000000200000000000000000000000000000000074d65726c696e000000166d65726c696e6e6f6465734070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eeb1fc610455dcdf22e0d42710f5fd45705ee39dadbc4a849457777499de8e0b28099344dc31dc53": "0x000000000000000000000000000000000005446f677a0000001763687670786a787264766e406f75746c6f6f6b2e667200000d406d786e65796a787264766e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x040000000002000000000000000000000000000000000d506f6c6b61646f747465727300001440706d656e73696b3a6d61747269782e6f72671c706f6c6b61646f74746572734070726f746f6e6d61696c2e636f6d00000f40506f6c6b61646f747465727331000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eec1d763f95c70cb16eaf9666bd95a04bc6ed619c30a4809a43fd7265e414284c11b27b8c666fd23": "0x04000000000200000000000000000000000000000000084b686173746f72000014406b686173746f723a6d61747269782e6f7267127374616b65406b686173746f722e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eeca900939080fcf9e4e11a50a1089b5e3c69cc838363d16616d94d9efb701ff2f53c08da7fd8062": "0x00000000000000000000000000000000000c46726f7374587472656d6500000000000010406c756361735f6b6f6666656d616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eed3ee9b432687319609bc709020ebb74d5976e8a8632dddb6575b2faf53c0fc541578a0f67ec933": "0x0000000000000000000000000000000000104b7573616d612050726f706f73616c21476c6f20446576656c6f706d656e7420466f756e646174696f6e2c20496e632e1b68747470733a2f2f7777772e676c6f646f6c6c61722e6f72672f00136a65666640676c6f646f6c6c61722e6f726700000b40676c6f646f6c6c6172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eed7b5cd81ad90b934bc724bcd5c1a70cf8b27cee684404418666711f575d681780171cb7a1b6238": "0x040000000002000000000000000000000000000000000a66696e616c6269747300001240617269666b3a6d61747269782e6f726717696e666f4066696e616c626974732e6e6574776f726b000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714eedb21dd29e41c9e08862e05b832f2754899119b7a1c9ae77b3a70f67950ba318a4381a78eaa3b57": "0x0000000000000000000000000000000000095361736861646f6b0000000000000d405361736861646f6b4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef04f719a88861a1b08e12e3ae9711ae774eb42da22da000579ed96da9412dcf15c934e7072c287e": "0x00000000000000000000000000000000000b54776565747962697264000002400240000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef0a650cbf57826cbe5a0623e6c466eb58b6768fa79f2844a7c3bbec1fbb686efb86159d2884aa10": "0x00000000000000000000000000000000000c476f676f205975626172690000000000001040476f676f5975626172695f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef1664294ee5e16e2e266f5e99f682a4439635c39dd3a9a0d8b35131cd0191ae0874b84c472b9e54": "0x00000000000000000000000000000000000f4d6f74696f6e2041707065746974001f68747470733a2f2f7777772e6d6f74696f6e617070657469742e636f6d2f000000000f40417070657469744d6f74696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef171686ae87d77572062f1b364867349593e0708e8b30cdc6f7bde5604d422bfae96ffcd2122d07": "0x00000000000000000000000000000000000830785369676d6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef2cb41d52259dc702d45a8cec8dc7ffa0ea3341fece5555c72125cfcb5f1664526b3b67bacee47b": "0x000000000000000000000000000000000008612e6b6976657201010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef545c0b52a14ce5fc8da8cd554b5256f00c5e43f8a30b62f77e2d9b34730eb823e819e141c029b1": "0x0400000000020000000000000000000000000000000015546865204b7573204b534d2044656c656761746500000016686579407468656b7573616d617269616e2e78797a00000f405468654b7573616d617269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef58128d4ea34ecdcee02f04a44b248f0b7d6cf65d98e1cf6206e73af3e3bd66b2f9a3a9aafc573a": "0x00000000000000000000000000000000000b417263686976657273650b41726368697665727365137777772e617263686976657273652e61727400186172636869766572736538383840676d61696c2e636f6d00000f4061726368697665727365383838000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef6f4d8caafffa157a4a576c540eec2cc92a7b102e14205d349e8cb1fad5c68ba8eaba619031b820": "0x0000000000000000000000000000000000106b72616b61746f612d7061796f757400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef7c516a16dc564edcb79cfb39e4a600a5f4782e73f48a4810604e9271ab8e26fb588f0ef4c6472f": "0x000000000000000000000000000000000010546572726120496e636f676e69746100187465727261696e63756b2e62616e6463616d702e636f6d001b7465727261696e636f676e697461756b40676d61696c2e636f6d00000c407465727261696e63756b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ef8e518f1522f7a6266cdd851a163dbc01f5c86d9c37b330e1a7bc66adef3ebbc6d59e2c1e61007e": "0x08000000000100902f5009000000000000000000000001000000020000000000000000000000000000000011475241424249545920e29ca8f09f9087001568747470733a2f2f67726162626974792e6e6574154067726162626974793a6d61747269782e6f72671368656c6c6f4067726162626974792e6e657400000d4067726162626974796e6574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714efed57a5e9a3be1756825262aeddf95b1791f9553de6d166e7d00f337e6db4e9434714bc1164ea01": "0x00000000000000000000000000000000000a446f7473616d614d580000000000000b40446f7473616d614d78000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f01934f45473693bdc53fda731682da4b15562fd4fe5007eb94dc36215862ca3c59cbb2a13ce6941": "0x00000000000000000000000000000000000f536f756e644f6653696c656e636501010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f03497ce90d500570e687e3b4f19439aaa16f96132712ef6b7da695e0fb0844ebd9d0e8b901b8b6a": "0x0400000000020000000000000000000000000000000004303430000000143034306e657430343040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f035a0d786dbcf44868cd54faea1a0e45836635b2bf658733436ec69c5567d651be592392cbb69dc": "0x040200000002000000000000000000000000000000000d5374616b6572205370616365001568747470733a2f2f7374616b65722e73706163651740676e6f737369656e6c693a6d61747269782e6f72671368656c6c6f407374616b65722e7370616365000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f048620c32a1d7b6f420fff29f5ae4603668ff450ac4cbb0e7159abd5f5c094c552414a235452940": "0x00000000000000000000000000000000000b616d70657273616e64690a4150204d7572726179000016616d70657273616e64694069636c6f75642e636f6d00000e4077656973656e6865696d3372000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f04f158721b89173b8ab024c586021c3755f9a592871796b7cf47213b9cf94534dc45e86e5e10e55": "0x00000000000000000000000000000000000a6475636b77696c646500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f04f805bb261ed68c0c8a73a690ab59186f16852e70a2406e1690d7d6f18419d0599f6a77a67ff64": "0x00000000000000000000000000000000000d4475627374617264204b534d001568747470733a2f2f64756273746172642e636f6d001c4578706563744368616f734b534d4064756273746172642e636f6d00000a406475627374617264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f04fc71c9051dc296467fd4e7038b925c2422357380d8cc0c5f17d272f639af8fcfd1f1156de7040": "0x04010000000200000000000000000000000000000000087265616c6761720d706f6c6b61646f742e70726f1568747470733a2f2f706f6c6b61646f742e70726f14407265616c6761723a6d61747269782e6f72671368656c6c6f40706f6c6b61646f742e70726f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f0548bed301be4ead497f54d401fe4c1ef4db2cba6f186f4404256684bf2a521ee1a996f8ed41717": "0x00000000000000000000000000000000000b43727970746f5f4d616d0c5265616c204d6f7468657200001843727970746f5f4d616d6d6d7940676d61696c2e636f6d0000104043727970746f5f6d616d756c7961000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f055b74881490c4efee7b1c489dd25c0a0e860ddf45d685ae6f7dc9b2653833fad6f6df61dc52313": "0x00000000000000000000000000000000000a506f6c6b61746f646400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f092b7bcded3683bf06c3b60a5829f2e3712cbd93b0e13ff0c3501636335339563df022ab1a7f16c": "0x00000000000000000000000000000000000941565645204152540000000000000a40617676655f617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f09bc0b626451c722aa5ba3cdeeff59135a45ca06af01181ad0015f5faf0161a5a9b9c50af228526": "0x00000000000000000000000000000000000e524d524b206f6666696369616c01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f0a0c6f78c3f1dec12210b384d6a6efb1d26a87c58d54edf034e8808df223c74b87ad9d798204b3c": "0x0000000000000000000000000000000000074b6f6f63757500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f0a750638d9b7c707658c8264ec0bd92d2493d772b1a6cc1fb7c338f08bafa4338b82e25a6543208": "0x04010000000200000000000000000000000000000000076b6c65766572001268747470733a2f2f6b6c657665722e696f0013666565646261636b406b6c657665722e696f00000b406b6c657665725f696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f0db9ccb0fefbacde2016ad920a3b5d87e07a224e968ab74fe1e802a77c02010a7bd84a9e1cc853c": "0x00000000000000000000000000000000000b6e6b6f6e756b6f763834000000146e676f72656c6b6f7640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f0ee0b687c5103e11ea2e788aba3561f0b05ba66ceb0aa5b95d9bdef6217e73e2685d744ab28dd64": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f0ee90ce47dd48389a46e76d7d1df5103771b0336b07765a168d2c4a123d08960b3577b39d6e204e": "0x0000000000000000000000000000000000075061706572730a5061706572732041471268747470733a2f2f7061706572732e63680012636f6e74616374407061706572732e636800000b40706170657273446576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1018912203e086b3aa5bd02bbd345acea759dceec1e03e25dc20c3d42fa2518ce315721407fa371": "0x00000000000000000000000000000000000c4b7573616d6f6f6e4e46540e4d616e75656c204f6c6d65646f0000166b7573616d6f6f6e6e667440676d61696c2e636f6d00000d404b7573616d6f6f6e4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1173e4bb4bde3d2f4681dada28e955e70d77fb8ccc3286d5028f0c415be18f6068cd97d921b5824": "0x000000000000000000000000000000000008414b524f20445605416b726f1968747470733a2f2f6c696e6b74722e65652f616b726f64760011616b726f647640676d61696c2e636f6d00000940416b726f5f4456000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f11f6c8614e661cdd26b6521fa6c7f27940601187600f400efb32375537a401099a582b9c65e0e76": "0x00000000000000000000000000000000000456757300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1352327dc3be8a0948223bb2e7bcc8a55be248add34b625c1c0826c58fe037fa5c8e4591440dc59": "0x0400000000020000000000000000000000000000000007456e7a6f726f00001540726f6d616e7631383a6d61747269782e6f726715656e7a6f726f2e64657640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f141bc71dafe807f7cd5f5ff9b7eefb11b8b32c1bb1e1fc63c08019d81124b3aa85f24ae8c779a31": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000e546865486f646c4661746865720f41726d616e646f2043617374726f00001861726d616e646f63617374727040676d61696c2e636f6d00000f40746833686f646c666174686572000e746865686f646c66617468657200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f15d5a7f73cec4735a5de862f77220d0aafd75335f986fbc18bb788aa8c4a5b61cc6b46f38a6dd58": "0x0000000000000000000000000000000000094d69636f6c656f6e0000000000000a404d4943304c45304e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1697a69799d08e44211b834beac4f35ff92e0dcbb0167f6ae7a0c43b186727d581d3f69f10fea34": "0x0404000000020000000000000000000000000000000021414d414c4c594e20e29ca8e29ca8f09f928ef09f928ef09f928ee29ca8e29ca800001440616d616c6c796e3a6d61747269782e6f72670e616d616c6c796e40706d2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1719675644622b35432349797f86c76049b09f36fe855c53d5bb87271a3186300feee6d2c040f3e": "0x000000000000000000000000000000000011576562336761696c206f66506865656200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f192451ba2e9b123969f7c9e5a153c9d9965ae28a973fdd9ebc270fe431e04396c711e12c6dc2356": "0x00000000000000000000000000000000000b4d59424553544c4946450e4a6f73696168204b6f747a75721568747470733a2f2f6d657461726f636b2e61707000184a6f736961686b6f747a75723140676d61696c2e636f6d00000f406a6f736961686b6f747a757231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1945f40d5dd3f64e2d9b07342518d0e97bc74b6c54b1773db3081792d43ca2b54bf89b80e899562": "0x00000000000000000000000000000000000d4e4654616d61676f746368690d4e4654616d61676f746368691868747470733a2f2f6e6674616d61676f746368692e696f010100000e406e6674616d61676f74636869000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1a63d104e9537d648851bbd377e2584fdfe42e8b048d1537b53bb3d64a1a8eacbfb3dae3032ef79": "0x000000000000000000000000000000000008444f545f4f4e4508646f74206f6e651468747470733a2f2f7777772e646f742e6f6e65000e746f75636840646f742e6f6e65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1aadb00106d1ec596417843ffb52469298959fef42e9153cc81531f708603e74562202f81dfcc0d": "0x00000000000000000000000000000000000a44616573756d6e6f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1bcbe1d2866fe7bd01ee8b63206f50cc22749524193d58b84608aa3d895d839e42600fba1167261": "0x000000000000000000000000000000000012e0b98c4e657720436f6e74726f6c6c657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1d230b68b13fba664c4ce41b56c68a03cf22a7bb36fcd1a1b8678a37e3ac1dcbe8b354a526bc144": "0x00000000000000000000000000000000000f427566662041726d7320436c7562002168747470733a2f2f747769747465722e636f6d2f4275666641726d73436c756200176275666661726d73636c756240676d61696c2e636f6d00000e404275666641726d73436c7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1ea586879f7ec76f5a68515207a31aaa74c335955fe0e59af6323355169fd925e6fe9c60cba58ba": "0x00000000000000000000000000000000000a4e65777420f09fa68e0000000000000e404d7973746963616c4e657774000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1eba20e6d2d881a24558de70c92fafb84da6fc766eab8323bd9329ab7f2d868417418fd32fdd737": "0x00000000000000000000000000000000000e536172697361204b6f6a696d610e536172697361204b6f6a696d61157777772e7361726973616b6f6a696d612e636f6d00167361726973612e6468303440676d61696c2e636f6d00000e405361726973614b6f6a696d61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1fc8f4f6212716380c6961c797a97f52859c85012b39dc1403ea0ef2cde3a48a3ba52a10570f77a": "0x000000000000000000000000000000000005566c616405566c6164000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1fd5669b551e9dca43b2797bd4dd454d7fb0870a2a4edd62b39eea0801f6baaf09b05c8634b5a25": "0x04000000000200000000000000000000000000000000074c4547454e4400001a406c6567656e64373334313231363a6d61747269782e6f7267156b7572746f736973407961686c6f6d692e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f2148a94f5867abb148a35cad2b2fe9cf6ffe0baf5f4f2f4ef894263baefead0e797a1e3e6d0a07f": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f215e5ad123be565c25d2c8739671f166c3885215a4ce4d6c458d6881aa62a47bc31561b9c6bfe3a": "0x00000000000000000000000000000000000b4e6164696e655f282a2900000000000011404e6164696e654d6f6c6c656e686131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f22fdb49d209542deec7098fe8a74adfd10b30379b411db2b7cef5389c589c6b68e41ca87a28b45a": "0x0000000000000000000000000000000000086b72697875733100000018316b7269787573314070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f23d10c93f96a6ea7a2f3dc66d99575366f71c0de336ae877563eaa12c52abcc227bd8e990679443": "0x0000000000000000000000000000000000054c655469074c657261205400001056767431393836406d61696c2e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f23f862ecfa6f61f9cd77599356c6f5f72c36e612c088e526b92fe762a6a175b387df98ea737fb2f": "0x04000000000200000000000000000000000000000000144a6f726d756e67616e64204c616273f09f908d00000000000010404a6f726d756e67616e644c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f24d4d1adb36534d96f7daa1a00790f8b168d3db7f0175e5f8dfd3430dc7edb4c5b807bce2b9d93a": "0x0401000000020000000000000000000000000000000016e29caa20646f747374616b65722e70726f20e29caa001668747470733a2f2f646f747374616b65722e70726f1640646f747374616b65723a6d61747269782e6f726713696e666f40646f747374616b65722e70726f00000e40646f747374616b657270726f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f25ef82af77881fe240cc50e90684f175ebef583b904fbc0b9aef4b38aaafd53e6436ad3e70ba366": "0x040000000002000000000000000000000000000000000c477265656e20436c6f756400001840677265656e2d636c6f75643a6d61747269782e6f72671f677265656e2d636c6f75642d6b7573616d61406f75746c6f6f6b2e636f6d00000f40477265656e436c6f75644b534d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f268c9b97db7d42c36cd0bf4fb6d819171d9932d99299cc655a5debfb04d20aa5ae23649372e4f0f": "0x00000000000000000000000000000000000b43726970746f696f74610101010100000d404a6f736570526963617264000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f281211dddf4de4c9804585392c70a2327e2f8047f73e66dfefaaf9e9ec544d7694b053774e4d014": "0x0000000000000000000000000000000000144d7920736d616c6c20636f6c6c656374696f6e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f2852cbaf60c5e38269fa27098d88ecb1640185c91860fb62d92ae9a6ab7713c79485bae49862b39": "0x040000000002000000000000000000000000000000000b45584e4553532e434f4d0000134065786e6573733a6d61747269782e6f72671576616c696461746f724065786e6573732e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f2974ec4b5ddb395262da7eeb6f3e8342c04cbbf83f9cbc933d86aa980b53480a9e283668b73903f": "0x0000000000000000000000000000000000044c656f0d4b726973204d6f786e6573732168747470733a2f2f73696e67756c61722e6170702f636f6c6c656374696f6e7300196b7269732d6d6f786e65737340686f746d61696c2e636f6d00000c404c617a795f4c696f6e7a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f2b06e2ea680db3c12d9c0035dd422388e6d346f61df3d9f3667f8ab761c8c57120dd61917976e10": "0x04000000000100902f50090000000000000000000000000000000000000000000000000000000f4e757220736f20616d2072616e64000018406e7572736f616d72616e643a6d61747269782e6f7267166e7572736f616d72616e6440676d61696c2e636f6d00000d404e7572736f616d72616e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f2cd0e6538047668a88e885b627a179f8a843e0765c142ef41b0d6a9c7b0f178fb1c208a1631ab0f": "0x0000000000000000000000000000000000096465636f6d383838066465636f6d1868747470733a2f2f6465636f6d3838382e7370616365200010383838406465636f6d2e737061636500000a406465636f6d383838000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3199d5f1f3efb1568883556ebca8ab4e219f9b9b122deac5f8a041091b7272e68209638c290a757": "0x00000000000000000000000000000000000c56697274756f7a5f41727407417274796f6d00001662626b6472617274796f6d40676d61696c2e636f6d00000d4056697274756f7a5f417274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f31ecd1e7a1b8236862fdfefe655dc35f3ac0b586e274ea252d32e5ad1e189c0b750facc56ed5f2a": "0x04010000000200000000000000000000000000000000104c6f79616c2056616c696461746f7200001c406c6f79616c2e76616c696461746f723a6d61747269782e6f72671a6c6f79616c2e76616c696461746f7240676d61696c2e636f6d000010404c6f79616c56616c696461746f72000f6c6f79616c76616c696461746f7200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f32bbb6fec42f4b03e89cc7fecc4ad46cd7ba606522a8d1679863da498718cf9acdafbde8cfe4b78": "0x00000000000000000000000000000000000b4441524b464f5245535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f35a7cac67fba21d5aafb1f14904ee2cef477907d825f744a980129c6ff4c0a8a0fdb6279b5ae42a": "0x0400000000020000000000000000000000000000000018f09faa9e612073206820f09fa799e2808de29982efb88f00001c40626c6f636b636861696e637572696f3a6d61747269782e6f72670b314039373130342e646500001140626c6f636b636861696e637572696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f37856c39e7d3aecf6729fb77338a94fd452c6455ced46c78844e967c3d3c7f45e176c38fafcd252": "0x040000000002000000000000000000000000000000000e56616c69646174696f6e44414f00001040786e693a6d61747269782e6f72671b756e6f7264657265645f73657440747574616e6f74612e636f6d00000540786e69000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f37d13738f231aef9448479aee4be9b14df6c206964e8c9a41d990876f3fd02e189c81c7b59bd718": "0x000000000000000000000000000000000011446561642043616e61727920436c7562000000196465616463616e617279636c756240676d61696c2e636f6d000010406465616463616e617279636c7562000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3912249e16d7dcd3c5db0048c1bec2061c55ac6337fd40b995f0c0632c65d2985e607c34564f84d": "0x000000000000000000000000000000000006616d7572690b4f6d61722048616d69641b68747470733a2f2f7777772e6f6d61722d68616d69642e636f6d00146f6d6172406f6d61722d68616d69642e636f6d00000e406472616d75726968616d6964000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3b9e4d61581e2eca44ec60e8eb57e646921f1be1696bb0070169f1b55e6d976ea780ad4ceeaf32f": "0x00000000000000000000000000000000000b436f6e74726f6c6c65720000001464686172723931383840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3bdf92c808f3f22c68d6466972eb0ea83776198b4d770f8ec90104edf41d423329d403f541b5c1b": "0x000000000000000000000000000000000013547269636b79204e4654206f726967696e7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3e3959f84b063bcd6c29a7c39cee45b0e045a94081bc188ef73be2be086d66aefd850fc7eeacc45": "0x040100000002000000000000000000000000000000000ff09f9a804f6e46696e616c6974790f4f6e46696e616c6974792e4c74641668747470733a2f2f6f6e66696e616c6974792e696f124069616e68653a6d61747269782e6f7267156b7573616d61406f6e66696e616c6974792e696f00000c404f6e46696e616c697479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3e86d44b0be98b4a485954cd0953248bfb4b47acf3124fe37bea4dd7436eb7286de6fec053b3437": "0x0000000000000000000000000000000000075a6169626f6e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3e912dce83414234c68f2680db04620157c7367e987bc1b502cc6e1512174de56e7839d05b16456": "0x0000000000000000000000000000000000114572726f6c204a6f686e736f6e204a7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3f6fc5915e7ebb79c5ccc281c8aadc84dde78cd7904bd5abd05211edb1aff353d9b0ec1455d380e": "0x0000000000000000000000000000000000074865726d697400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3f9a9fea1c2bb71688f2dd2918739ffc90f280131b7d8bbfeaf9f0e2bacfe952a88bfa3bc168045": "0x040100000002000000000000000000000000000000001052414449554d424c4f434b2e434f4d001868747470733a2f2f72616469756d626c6f636b2e636f6d0015696e666f4072616469756d626c6f636b2e636f6d00000d4072616469756d626c6f636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3fe45df61eadb158e5dd2b0d1bbcb01196506ec753353b2698fa64d77e039c66bc43c747b375d0e": "0x00000000000000000000000000000000000862696e616e636500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f419f736dbf31d4544c2fd9d2cc17606f93644a75086320a77c729a97553d33b8c602b7304d82d08": "0x00000000000000000000000000000000000778616d65797a01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f42b57bfe87de580d6aa438803d5e6ab28efa5ef6f3b3dd1fc1442497fbdafad37851a62c1788c2d": "0x00000000000000000000000000000000000d5265626563636120417274730000001e726562656363612e6b7573616d612e6172747340676d61696c2e636f6d00000e40726562656363615f61727473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4336ef56b1e116e966f06ede01dd4af9033cfce763ed647dad15ada85991dfa54ade147757b8346": "0x000000000000000000000000000000000005526f727900000015726f72796d6f7279393640676d61696c2e636f6d00000c40526f72795f4879706572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f43f187b68ff5147b29d3aa12cda294b6d5ea963d35f23e9afbc188aff49262c4903bb7b4dc04b1d": "0x00000000000000000000000000000000000f436c696d6174726f6e4143496e6313636c696d6174726f6e6163696e632e6574680000206a616d65732e6a68696c6c2e636c696d6174726f6e40676d61696c2e636f6d00001040436c696d6174726f6e6163696e63000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f43f3b59a11d04ec6c2f2e246faf3c84c8486e43f7fa54578fa011764f1d2183b174faa2ed89942c": "0x00000000000000000000000000000000000a6d6570686978746165000000146d657068697874616540676d61696c2e636f6d00000b406d6570686978746165000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f44c2f7410140cf19cbb16f064606fa2237ef9793e8c54e76e09934c0aa3616de195c3417ff47060": "0x040100000002000000000000000000000000000000000e4d584320466f756e6461746f6e154d584320466f756e646174696f6e2067476d62481468747470733a2f2f7777772e6d78632e6f7267000e68656c6c6f406d78632e6f726700000f404d5843666f756e646174696f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f45a1473eff966f38a1d68ff42661bb61ea1ba4d2818bd14bad9016823dd95ee0bd80d5cdc40a347": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f46797ab2e78531968922cb9e2094b7ae881da08890d1659e2c82d08878e45e7be83006aa6fefe35": "0x00000000000000000000000000000000000e5375624172742044657369676e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f46951568dd99491466e8b633811f506b9d27c30141d4f5f03f41545aa8a3acd20a65f92599eaf1e": "0x0000000000000000000000000000000000124e6f6e46756e6769626c655472616465720000000000000c406e5f665f747261646572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f49c731c93e855d8e442aaad715153a1515d843b05b774fd7a3b52cfc011cd718975b44ad239d831": "0x000000000000000000000000000000000010416e61656c6c65204c5444404b534d001c68747470733a2f2f616e61656c6c656c74642e636f6d70616e792f001961646d696e40616e61656c6c656c74642e636f6d70616e79000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4b9a6863cc46670889af0630394f4684620003c6fbdb2bde3b1493ee257851e2c894c0f9b1fc13c": "0x000000000000000000000000000000000003565a1356696b746f72696961205a656d74736f7661000013766963747a61727440676d61696c2e636f6d00000f4056696b746f726969615a617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4cb3aeb24cf84a9e2815c08a727372ac028bf267fa8631226ccad9b689bb5b787b274c0828e1c51": "0x00000000000000000000000000000000000d733066746d616368696e6520011b68747470733a2f2f73686974636f696e7072617869732e636f6d1840733066746d616368696e653a6d61747269782e6f726701000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4d588a2f12c5abea6f3f09fac7be035067d4b4e8e18a47ab28a7bf50e3dcb90679e8ed631582645": "0x00000000000000000000000000000000000e5b4b5553414d415d207465737400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4e09fff907e51dbba44ab1fc1acb0b1ff28165e08489416f665a4af1770ac45ab67642613d4a218": "0x04000000000200000000000000000000000000000000174d6f6e696e205374616b696e67207c204b7573616d61000017406d6172635f6d6f6e696e3a6d61747269782e6f7267186d6f6e696e2e7374616b696e67407961686f6f2e636f6d00000e404d6f6e696e5374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4ec2259201f165d10b51b925938bb414ec70b4a5b8179dde0028f4e00620e177839361f70bbd960": "0x000000000000000000000000000000000009506f6c6b61646f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f4f074392c48cb8b90c8b22b263271d5e7a8baf7ad89a918fa15a5ea58c33b0e03fdebae9f60db45": "0x04000000000200000000000000000000000000000000195769657a7a656c204b7573616d612056616c696461746f72104164616d20576965727a6269636b690000127769657a7a656c40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5052ba88cc9b0139609cdb14cf0b415f012433cfe2714ae591a0c0bdb443eecf99be67a6251da31": "0x00000000000000000000000000000000000673657268690000001f70616c616d6172656e6b6f73657268696937373840676d61696c2e636f6d00000e405350616c616d6172656e6b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f52104c468be8e69409e451afd449239c0bf71d2064b64ccb6fa40b7d64b31e070e867c298397563": "0x00000000000000000000000000000000000f416c65784973426567696e6e65720000001b616c657869735f72616d6f733936406f75746c6f6f6b2e636f6d00001040416c65784973426567696e6e6572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5260a005d5a4f8b1aeffe4adfad627470d78b75ceeff90aed88685b9ab436611cf8b8aff4316264": "0x04000000000200000000000000000000000000000000074141726f6e6e000000176f786561706f7865616e6b6140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f52b0b669e3be3189a649e148cdfacb89a0ed6ef6d1af70b4712cd09f0b079aee5fdebab7842584c": "0x00000000000000000000000000000000000c52756262657220466973680746656966616e00000000000d4061647269616e6573746131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f52dc65059840ede54d622206cdde1774f9ca2b05a09bb2679c97c6a2d7ad8a20d7fea2c7391d044": "0x00000000000000000000000000000000000c43727970746f5f70756d7000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f53a76b36f1f22087847a2bb5db0c9e65070fe05ce4e2a168a7a0e38c4e7238621c344445f1ba65f": "0x000000000000000000000000000000000005544f41410000000000000d40636861726c696562656e6a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f53d71829fabd2650c495817a6cd5cad36fa03114765a3e1189c1e8b11777d39f9c2ac1a18217505": "0x00000000000000000000000000000000000a416e67656c33356d6d10416e67656c20526f6472696775657a000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5488f1caf19f51ce69c23c5c6777d19d549efe56078bfd2f73f749f119c8ccf09023dfa6593347a": "0x0000000000000000000000000000000000074e7541725f7401010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f55e346ed30a7e9fda296bb99c7df724f33539a3110c456b9a082e121734470a4cbd40703e519442": "0x0000000000000000000000000000000000094d41432d4e465473000000126d61636e66747340676d61696c2e636f6d00000b405f6d61636e6674735f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5695ae6155ce7ab243612f0fc6c935d9ee0cbe21c453a83f58a9427054ccdc74966890ca57ca719": "0x0401000000020000000000000000000000000000000008416e74726f6d6500001440616e74726f6d653a6d61747269782e6f726714616e74726f6d65333740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f56a3670b6cb3944bcabe2b0f21456b5d75d8987f79197e4df729c9283edc8f1b2f5558950f88860": "0x0400000000020000000000000000000000000000000009736f72612d6f707300001a40736f72616d697473752d6f70733a6d61747269782e6f726714626f7440736f72616d697473752e636f2e6a70000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f56ab696ef80d1eec8f5635f081f1f774194a841f163cdc3ad27b3935bf1a928a9869627a0abe054": "0x0000000000000000000000000000000000124b72697374696e612044617679646f7661124b72697374696e612044617679646f766100001c64617679646f76612e6b72697374796e6140676d61696c2e636f6d00000b406b7269735f64617679000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f59d68b847bcb2beacab23f327e732756f5d76a43cd32830d5d8a9a489cd9c5c6a8554a3374da056": "0x040000000002000000000000000000000000000000001cf09fa6bef09fa4962049766f72794e6f646520f09fa496f09fa6be00001c4077686974655f736e6f77666c616b653a6d61747269782e6f72671769766f72792e626c616e63614070726f746f6e2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5a9403264d182764011221fbb00463b80a86f5b7e3ad507717724ff91c47cba6521d7f34983f527": "0x00000000000000000000000000000000000d4b7573616d6157616c6c65740000001467726567323730303140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5b6095599969b9da657fdb5080af7783a0eb74870fa95b2e0e4dc78445f4b4dffeb3ab18856e30b": "0x00000000000000000000000000000000000d424f55424f554b524154494100000017626f75626f756b726174696140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5c03f3c88350579aeb0e7400e227d10778810032a5c677766796398d0dfcec5d7cf210458f22142": "0x040000000002000000000000000000000000000000000746617468657200001440706170616b736d3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5d0cc94e99850e8c2421666570ec7f9a5c94ef30c2c6443bd857faabcdeec6a96ef4280ef41f61c": "0x040100000001006c57c10b0100000000000000000000000000000000000000000000000000000c686173687761726c6f636b074a6f73687561001840686173687761726c6f636b3a6d61747269782e6f72671a6269747362656e6465724070726f746f6e6d61696c2e636f6d00000d40686173687761726c6f636b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5e19c61928389eae882a0e173cddff84f834ad020772bfafa4022d9c9a823f54982e9b4d3fec745": "0x00000000000000000000000000000000000f4956414e2052204d4154482023330000000000000b406d6174685f6976616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f5e44fd2e0ba9c81b88ac257042778fa648722b1500402f740f908e58d0bc8e19439a352e55dc613": "0x0000000000000000000000000000000000104d69737465725f436f6c65204b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f601fb05d6c070e4da8564ba0f7e717dd8d61025823ef756b474d6a3f3e8099da01ce16b53d85154": "0x00000000000000000000000000000000000747656f726765000000136d7574613631353040676d61696c2e636f6d00000d40475768616c65636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6035b451942851ca231fc973b2ec593bcb98a447e9c221a999cdfd05cf2dbdcaffea0bf42cb0f02": "0x00000000000000000000000000000000000c46696368204d6f72736c7906416e746f6e010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f60bbbed7d37752ebab59eee6a380bd486faf8abbb17790b47ab67cc2706ffeead8fc51f5949ae8b": "0x040000000002000000000000000000000000000000000f50726f6f66204f66204368616f730000194070726f6f666f666368616f733a6d61747269782e6f726721676f7665726e616e6365696e63656e746976697a657240676d61696c2e636f6d00000f40476f76506172745265774b534d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f61803895bb4ef9200d6a5e519858100b8f989048a9d6a202d0c588ff72f76fc9a18a4adadcab168": "0x000000000000000000000000000000000006476f627a790000001a6d6f68616d6564686166697a39313940676d61696c2e636f6d000011404d6f68616d65643135323833343535000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f618fd21cfdd00cb0e8b58178acdc19d47b6b00140772db705f55e6d3a4881bfd3232b4de456103d": "0x040000000002000000000000000000000000000000000c536f666969615f56616c3200001740736f666969612e6b6f6e3a6d61747269782e6f7267136b736f6e696e393540676d61696c2e636f6d00000b40536f666969614b6f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f634b03876b8ef79806aaca020076fa26a81169d70fb62d932a440ab3c0ab77033285e572ad2b912": "0x00000000000000000000000000000000000b52454e454c494e3136380000001270636c696e3732407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6553f1969b75460800f8a9142fa2145a9dfd55f63917f1d56c61b019b92acc1e53669d281765a7d": "0x00000000000000000000000000000000000a59756d692041727473001b68747470733a2f2f6c696e6b74722e65652f59756d6941727473000000000d4059756d69417274734e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f66ebdaccf9fa53084b56b03893a12010b087eec53365d5b7d9b47b0b3bf17a012bfe096012f600f": "0x04000000000200000000000000000000000000000000074d6561646f77000000166e61746976612e7665746140676d61696c2e636f6d00000f40416e647265697461507261646f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f687f2305ea5dc3060ac960bd310b75e387525446daef1ceb98f322d3e5300ad8910568f6aef9d3f": "0x00000000000000000000000000000000000b7a6d6368656e2e6b736d011968747470733a2f2f6c696e6b74722e65652f7a6d6368656e01157a6d6368656e3133313440676d61696c2e636f6d000009407a6d6368656e33000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6b2883a4b0925a1f64c77c5a1bb3a45db136d8e36bd9fa3fcf0e060313b404650e59c97b7ac9030": "0x00000000000000000000000000000000000b416e676f2050616e676f0b416e676f2050616e676f000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6b5e0cd02d4b92f3a125886cdd1eddb5f8dc3fc266062e6066ea77566f7694efd93a97ba57a7e31": "0x0000000000000000000000000000000000056b72726e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6c04fa3dd4fac8ccaa7ea76d94fbb4715ca996b63214e8fa86bdd293fd5fc7b8fe9de231010e21b": "0x000000000000000000000000000000000010536f6c656d6e20537472616e67657210537472616e67657220536f6c656d6e00000000001040737472616e676572736f6c656d6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6d034c52a0fc194d6ac28ef62f212e4a5888fa5e72b1515a32233dfb118a9ea5de97558b1a53d65": "0x0000000000000000000000000000000000064b43435f3100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6d774e91f506eba46e2c2e77afa347eb36b101757c3d004b088a324405c097fa561a750249cc44e": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6e0d6bfbf124fd8c6d5a9d80d5559e34b6c16cea7f4da7d399aceeb54530bee71fcff718ee5a82c": "0x0000000000000000000000000000000000064561646c6500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6e15252920b51ae5004bd06b509a6d463ef831486a0fa49b185bcb3f96e06020ae63615b284a81a": "0x040000000002000000000000000000000000000000000c526f647269676f3730303000001840726f647269676f373030303a6d61747269782e6f72671a726f647269676f373030302e6b736d40676d61696c2e636f6d00000e40526f647269676f5f374f4f4f0011526f647269676f37303030233533343200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6e75d18b8b8218f6a73a035c39a045fd93aa3e85b7b91fb4a77d8072149182f8d42362fea9bf85a": "0x0000000000000000000000000000000000124f647973736579204d756c74692d7369670b4f6479737365792042561568747470733a2f2f6f6479737365792e6f72672f0011696e666f406f6479737365792e6f7267000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f6fb66dae8fa6226a8d08e114a7bfeda36a14cb3db7b8085d867eb4e0f33eb3f2e0a50f821abd80f": "0x00000000000000000000000000000000000a506f6c6b616672616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f71158c0f51bb8fd5247e73b8ad3c36bb4e01c93a9bd6a6048afce1e2a45863ea5fe99778b530b61": "0x04000000000200000000000000000000000000000000094e5244204c6162730000000000000a404e52445f4c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f718691c7d2fecde924f9a8e5439d381aee00bd507a3d52321be607c5935bb0d6c9bfb2227875b5c": "0x0000000000000000000000000000000000094241545641554c54094241545641554c540000184261747661756c744070726f746f6e6d61696c2e636f6d00000b404261747661756c745f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7199ad6b299d282d2d6d338d9b6d82049dba9d8a4e20feb2515bd7aeeb997247a02e56e8d3b1469": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f71b1777c4c6a13546b4eca928ede3e8075d86e25581d46adf3eff915646eab110d13e2fbd947b5e": "0x0800000000020100000002000000000000000000000000000000000e7765623376616c696461746f72074e696b6974611c68747470733a2f2f7765623376616c696461746f722e696e666f2f1a407765623376616c696461746f723a6d61747269782e6f72671477656233346576657240676d61696c2e636f6d00000b40776562333465766572000a77656233346576657200", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f71c3bfdec4acbf06eb5904c5ae1d15ef5b700f4c30b87cfda092fe7e01b94f5ce7951b8b368a224": "0x04000000000100902f500900000000000000000000000000000000000000000000000000000005746e63680000001674696e636863727970746f40676d61696c2e636f6d00000b4064656d6954696e6368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f721344dcd79f9f76869fc679ec3b5cf08e4c2ea215ad2b3ab2fedf7263d019c4181e0f2e8e6071c": "0x0000000000000000000000000000000000114465657065726e6175742e73706163650c4a6f686e20426c616973651968747470733a2f2f6465657065726e6175742e737061636500166a6f686e406465657065726e6175742e737061636500000c406465657065726e617574000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7213bfc0e550eb660ba08bf2bacea0f40dcf6b9f8f253ca8267cb45f6db39acf5c71c5c1d1b3521": "0x0000000000000000000000000000000000056461336100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f72498dd00ff440c3c06757449eba15d09a779c6cbc249eb6fcd0dcf994ad9f3e4d6bf2b60ea8c74": "0x00000000000000000000000000000000001043696e636f2064652050686565626f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f726e9532024780186f20c19f0c0238685e4802c2f7880579b4426a1724d0ad0a6daa88bfcbca026": "0x00000000000000000000000000000000000452614611526174696f6e616c204173204675636b2168747470733a2f2f6c696e6b74722e65652f726174696f6e616c61736675636b0101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f72fe494f8b2c13b50bc2d20f1106991d73e7e17202dd22c951c13552caefa2fe973490017f0015c": "0x0000000000000000000000000000000000074b2053756c7a010101010000084073756c7a5f6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7395a35358c5c73b03a577ca487cc73addcdcbd6b006aee80991427d8cdf2b732e4cda58bb06a23": "0x0000000000000000000000000000000000094f736361726c74630f4c65756e672054737a204368756e00001b6f736361722e6368756e2e6c65756e6740676d61696c2e636f6d00000a406f6f636974656f6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f755c066638838c208ec81d6f3942d5955364977664f27b91f34f3b365ee0ef1ca87facc9bc1f900": "0x04000000000200000000000000000000000000000000056c616461000015406c6164612d6b6d763a6d61747269782e6f7267136c6164612d6b6d764079616e6465782e727500000b404c61646173756e6573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f75e019010e9d2891019993ccaf1f9dbd14e41793ebbc5dc0c3f301cb8323d75678deda1087d7e38": "0x000000000000000000000000000000000007594f4755525400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f762150cda5f8ed7ce6075c29ed1bf04552862e9068cd112761eca24d335514dbf43abd811512242": "0x0000000000000000000000000000000000184d6f6d656e74756d204e465420436f6c6c656374696f6e0c4d6f6d656e74756d58595a1668747470733a2f2f6d6f6d656e74756d2e78797a2f000000000d404d6f6d656e74756d58595a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f763d946684c55c7027342f61bb5ae7fd9a78ab16b23d56dc3bff26ce92fe6cb787cdd4c9abe7635": "0x0000000000000000000000000000000000064d6f7a7a6900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7722cb2c8ef11377e78e4019711d39804f121a2c2e719158dec8f848e329d23af4f4df886b0ef59": "0x0000000000000000000000000000000000104775657272696c6c61204b61726d61002168747470733a2f2f7777772e696e7374616772616d2e636f6d2f677565727269001554656b756368656f6e6740676d61696c2e636f6d00000b404775657272696c614b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7815b3b02445bee22e79717d0fefeab58a93b118b1da271ef308419ad31b7c88048b202a72a7f7c": "0x0000000000000000000000000000000000124c75646976696e652050726164696e6573124c75646976696e652050726164696e6573010101000011404c75646976696e6550726164696e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7b9882bb36b0080f043bee4b4c5a1387805a345d2ec765bbaf1368701292efa42c39592c8c74b4a": "0x00000000000000000000000000000000000c47656c6174614472696e6b00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7d620f3759f37d922a83d766632d6c6b371f5936014822d228c16699a1d2770c465f04abc05d71f": "0x00000000000000000000000000000000000d64696e6f6e757473696e686f01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f7dee93d06f89424c8b27ef9420148d8711a555ecaf50fdcf0705f1af8fe4cb525f43fbeb2393125": "0x000000000000000000000000000000000004e99d9601010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f803929b514c8374d44e8557e2484832376bb918ca7fb5743eb5befc52d4f2a3b9b54f21818f2d7c": "0x04010000000200000000000000000000000000000000064672656479001568747470733a2f2f64657266726564792e636f6d154064657266726564793a6d61747269782e6f72670000000b404465725f4672656479000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f820b2f799e04c2e4ea5deb79975c49738ccfc00e2d53dda38c7bda5b9794643c071b3be46eb1629": "0x00000000000000000000000000000000000953757065726d616e01010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f82d8b99311e7212a46c027c5b401f01d8d9bf548ab323785f6db26575c5fc9290434da5fef93960": "0x0400000000020000000000000000000000000000000011f09f918b203739616e766920f09f8d80000013403739616e76693a6d61747269782e6f7267133739616e6476696b40676d61696c2e636f6d000008403739616e7669000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f836b36502f1031656f85acf479b193128bb0482a4f01191b48b10c4a2a13458d97da7bbb383f77b": "0x00000000000000000000000000000000001d56616c696461747269756d20742e6d652f76616c696461747269756d1d56616c696461747269756d20742e6d652f76616c696461747269756d0000157661696461747269756d40676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f846335f6916b0d70e5f9a5620405b32b9cf67bf7124b4e772a34e87abeab4ccc4e14389f1ce305f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f846d171247e3f0f4aa63d199318cd993574507d7970c1cc69018124a96892f52a900debf38df908": "0x0000000000000000000000000000000000076b6173626f79184b617372612042617261646172616e20416e6172616b690000146b617369626f79363940676d61696c2e636f6d00000a406b617369626f7965000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f85213a2ee7ef9df68f838c7f70002288722303bd1482bf8a2f2973ff548d3517ed8ef3a8c6cac37": "0x0000000000000000000000000000000000076c6673613739000000166c66736137394070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f85b684a0310e669c4ce6a3336cbace999a6052c4dbc755fdb2d263490ec0fc2a8c3fe8e23376469": "0x00000000000000000000000000000000000e4b7573616d612057616c6c657400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f87b103429943affbc6f62a54d698249c4049a8ff3a7af9b5f28325adb33e1ef5d2ce402f954c65d": "0x0000000000000000000000000000000000204368616f7344414f206175746f6e6f6d6f757320766f74696e67207465737400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f87da1ee1c7abb802e0094a721c36e0ebceafaa1cc2fbd8d4e82f2bb1c85001ce8172ad6b5011d0b": "0x0000000000000000000000000000000000035056035056000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f88f79bc67c8710cb6bc64fe84080c7fbb6c6dea980960f0cfc716695b2821bf7a28a356bc19070e": "0x00000000000000000000000000000000000773757265736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f891e0d61d95d2f9ecc96f0e735d4677e64728f5300b27c97c3413ba01e7a60dd29cb89123990a66": "0x040000000002000000000000000000000000000000000b44722e52616e766965720000001564722e72616e7669657240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f89ce40ac4f74c35cebfc6751f43de44d7aacff9d0e48240227560e071b4b2547edde36ae3c3ee59": "0x0000000000000000000000000000000000077469726f6c61077469726f6c61000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f8b08ec665a49b5a566edc7dbb221131cb2aea38025779d4f4638c769b16c1b0cfb060fc613f2d6b": "0x00000000000000000000000000000000000f546f736b612053617475726e6120034169000017746f736b6173617475726e6140676d61696c2e636f6d00000a405453617475726e61000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f8bcf5162393bea6c2f706cbfd0708a2fa387748388e4851012bb69b2e965d2dd933e452ddc36464": "0x00000000000000000000000000000000000f42494e414e43455f4b534d5f343800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f8ef4c38a66ac4223cf3f47f611c9dd952bd9007a85b0d84383f91e2f25edd0f13d6be20b5805110": "0x040000000002000000000000000000000000000000000a67747374616b696e67000000166761757468387a4067747374616b696e672e636f6d00000a40475374616b696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f8f2d058aa94f837b8356d7f4f32035fdf5b8188e4d1a5cb1639c580c48a29a1590bbcbc2df0597f": "0x040000000002000000000000000000000000000000000641424741520000124061626761723a6d61747269782e6f726716616267617262617273656740676d61696c2e636f6d00001040416476697a6f7254727573746564000b476172696b233537313500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f8f844a5b45ed4e5461490934113768b8b0bdc60810250ab77fc9c0fe05f69a05d8262fdc7a39656": "0x00000000000000000000000000000000000b4672616d6553746f6e65001768747470733a2f2f6672616d6573746f6e652e6e65740000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9047b8f088890cbc687ff86c75c1a2506c4aa4cea67f68276b6348e3f497bb845b42a3aef585025": "0x000000000000000000000000000000000009464b31203139333100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f93edb11f07d9b7c4e721644ba20842c4c89f36b89af12e53a513a43841728eae5ac5efccaa01f32": "0x00000000000000000000000000000000000b53696d706c6573656e640101010100000c4073316d706c6573656e64000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9423de3a5fdd2d8c8c87c93d349b6e30b0b00906c966e623b5a48b4a12803434c45dfdfd171f951": "0x00000000000000000000000000000000000552697a6b1469647269737369206a616e6174692072697a6b01011772697a6b2e6964726973736940676d61696c2e636f6d00000d404964726973736952697a6b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f945bddd0ac8d6e44a3258cc6d8bc991479bc724a77d8d74491a5e8cb3ceba66cedcd180b3290e07": "0x00000000000000000000000000000000000d44616e676572204d6f75736500000017546966664c7563617330303740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f94e92ce97ad9912aeffde5a4dc7117e4cdde2d3fb3d2afc7b2f710d5d66c55c5d1d7c5873598706": "0x040000000002000000000000000000000000000000000c4d6f6f6e4d697373696f6e0000001973616e67616c6c69676c656e6e6140676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f952ae0f2dbd6fee08a876a9d0c017b4a35ec9a60da69cdf10e25dcbcf6e32398e911c8471576f36": "0x0000000000000000000000000000000000104b7573616d612057616c6c6574203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9540eba239b8a7078b5f7e8f099b66d62370d55e7423b65e5b813df52679626adec7b4b00de9565": "0x04010000000200000000000000000000000000000000075061726974791950617269747920546563686e6f6c6f67696573204c74642e1268747470733a2f2f7061726974792e696f001061646d696e407061726974792e696f00000c4050617269747954656368000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9588f41f8fb002552b993b5f03c0eb34858fd978eaba71182fd619307ab26a2fb31b3f34d098272": "0x040000000002000000000000000000000000000000000c6d7968616c657469736865000000126b6f76696440696e7465726e65742e7275000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f96da090b9f585b1e68da6ba34b144a0ca598bfe9796b4308e750f5f76972296528b97a3d97e0e67": "0x00000000000000000000000000000000000565646976000000146564697640676172626167652e6d61726b657400000840656469765f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9cdf9022f4cbf316e209998f669dba74194912c3e64d33dea4101e1e589b38abbdbbad88e93cc53": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9d69d01e9632c5372ee5c9dcec858fe96783766b2c1894e26b95b52318652b7672b2c496a579b75": "0x04010000000200000000000000000000000000000000114d756d6d696573205472656173757265001d68747470733a2f2f6d756d6d69657374726561737572652e636f6d2f001a6d756d6d696573747265617375726540676d61696c2e636f6d000011404d756d6d6965735472656173757265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9e4321423bc80888ef7167c4d50be846c6a03591e13005fa68ef858d87321bb79428b121e105a11": "0x00000000000000000000000000000000000d53455247494e484f464f474f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f9ecb241324aeafbe63d1474c5ae8edc07f6b09e4efaa777640c6b1b1cfaab3cd797aecaa932010a": "0x00000000000000000000000000000000000730784d61723101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa0bfc4dac243ee0f42b7fead1bb8eec5d895fb3d3bd145e85f0b6d5c8bb3d7edb4a6fa9dda2c021": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa21d4617f82911d045dcf490090bbd75f4ab97f5984fc4792d122368c6a73cfb3d11873dd9e274d": "0x04000000000200000000000000000000000000000000064f7262697400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa3f4bf18db4aa46bac3d54468165a2b6b4cc010beaedcd71ee772dabc384bc9a54d6eca6e14a20b": "0x000000000000000000000000000000000020524d524b2047656e6573697320436f6c6c656374696f6e20466f726765727901010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa43aa10b719e7a44a1f6aa44b0456c45ffe2e1314c991430734a090f57910425f9a5e9b6573ce3e": "0x000000000000000000000000000000000004414c5800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa45a2d24a1b7d89a46615035c62da7a1906c838ac55e2ef1f38b679b9d5d6ab7c3633fd75280f43": "0x00000000000000000000000000000000000e42494e414e43455f4b534d5f370e42494e414e43455f4b534d5f37000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa48706896c81ac3544e034f612acb28ccbf0822adf1140335fa6e8bdccfac51a3bc7da22ebf7c58": "0x0000000000000000000000000000000000084461766579444301010101000011406461766579646f657363727970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa4f3e525e10f673faeffbbb88ab949b51abcacd45d7f9addf608a6e6ddc3d4b39147454e1a23a16": "0x040100000002000000000000000000000000000000001356414c494441544f5252554e4e455250524f000000177367696f7661636368696e6940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa5550e0264faee9fa17408ad767e6d32032b8a73d670d87a8f2a339803d404d1430ceca36911865": "0x00000000000000000000000000000000000c676f6c64656e726174696f0000000000000d40396f6c64656e726174696f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa56ae54f7bf8c8ed62b129a1d30afe9a2fd69a871f50355d01f0a5e9b7fd160f3a0d4e74a0d0a35": "0x0000000000000000000000000000000000084d564420525654084d5644205256540000146d7664727674626f7840676d61696c2e636f6d000009406d76645f727674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa6a08c0d89c75d8801250e96cc2a1d70ef029adf57956e6a7100669076e8ccc14425142f4d7370a": "0x000000000000000000000000000000000008436f6c6f7375730000000000000e40616c7661726f64657265636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa894c90df0929a924454eab2e4e832c9d71afe1dd6345a7d889fab3430d8ad971888610af053317": "0x00000000000000000000000000000000000d506972617465205368656570001a68747470733a2f2f7069726174657368656570696e672e697400197069726174657368656570696e6740676d61696c2e636f6d000011407069726174655f7368656570696e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fa9ac24df5ce07f888ce8ce9cd622ac98233ffcca795bd69097012a6bf409054c1ec522850fb3523": "0x040000000002000000000000000000000000000000000c43727970746f436172746f000000000000104063727970746f636172746f78797a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714faa55b79d5b983962aad2d511e0a2ade151b1e3442675156b71aea1f049ce004311cf33c9d70c474": "0x040000000002000000000000000000000000000000000a53656261737469616e00001c4073656261737469616e63726970746f3a6d61747269782e6f72671b73656261737469616e63727970746f3840676d61696c2e636f6d0000114053656261737469616e43726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714faa9d42c4d30ce42e6d147ba2586400cf6696e4d7f4491f51cfd88f9ff1b25aafba296851e6dbe5a": "0x0000000000000000000000000000000000134e657572616c204361742057617220494920134e657572616c2043617420576172204949200000186e657572616c6361747761723240676d61696c2e636f6d00000f404e657572616c43617457617232000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb0aed06762dab03eed2052b53fd2a9cffaa55f84d4abf8a6143956ad77cf0579a70bac39da5cc50": "0x0000000000000000000000000000000000074269484f444c001668747470733a2f2f6269686f646c2e636f6d2f232f0013737570706f7274406269686f646c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb0bfb045f7bf9b02c5a307190f900bfce402cda80d3e30768767064591707a00a4a3111d3fbbf21": "0x04000000000100902f5009000000000000000000000000000000000000000000000000000000064f7264756d0a4f7264756d204c54441c68747470733a2f2f6769746875622e636f6d2f4f7264756d4c544400156f7264756d4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb0c0bcedbed5db3f689caeaa9e3abd42396b7fdd5bfc75162325cfd5dd65a1eb247a64a1bfa123d": "0x000000000000000000000000000000000010446f7473616d6120416d617a6f6e7300000018646f7473616d616d617a6f6e7340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb1e196ecaf7c6ef54ec6a7bfcee3ac00ab63b98e084f1a1c4d0e82ff63c31387aee91c9a721a81e": "0x04000000000200000000000000000000000000000000114e656a6c6570c5a1c3ad20766f6c6261000000157065746b6f6d65726b6f40676d61696c2e636f6d0000000017407065746b6f6d65726b6f3a6d61747269782e6f726700", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb20a4393f027fd3301da7198667c2c959b5f7d81068d819d90e8dfe3c4ead4a89d84d8691c07350": "0x000000000000000000000000000000000007594a534e50490f4b6f756a69205461646f6b6f726f17687474703a2f2f7777772e3131343531342e636f6d2f0101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb2b8dee530cc653344c0541f063ddc8dcf4709789b93099da7e145f794116906f511061ca6de158": "0x000000000000000000000000000000000011432d4c20426c6f636b636861696e20200a432d4c20696e632e2000000000000e40436c426c6f636b636861696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb5b92a4cfa1db0b6c2856a7a778cecf99534917e33c2665c67734a7d666093b6b9c785a3428ec61": "0x00000000000000000000000000000000000f556e69517565204176615461727301010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb5bc1ff496d8054008d8404893c7b4b80f397605cc96e61fec3c89676c8c2794a2a7d281d678b1a": "0x0400000000020000000000000000000000000000000012f09f8f942048454c494b4f4e20f09f8f940000144068656c696b6f6e3a6d61747269782e6f726710696e666f4068656c696b6f6e2e696f00000d4068656c696b6f6e6c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb81b24c2a962fd37a94eb167216d8c9dee6fc9b56b440f01cd6c3a982a52ee041148f324421e524": "0x00000000000000000000000000000000000b546f726f2056657264690000001b726176696b68616e726176693230323040676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb84ec0986da67466055556b55210cc9d0f33bbc68d7c31bb5e28e1a639e1d6599aeffd7e49b6749": "0x040000000002000000000000000000000000000000000b4c6174656e744865726f0000001a6c6174656e746865726f4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fb91afe505259de7eeb02ffe6617932e5f2dd74bc81031fd5bec0272c7b3db1c7c28f511cac7a669": "0x04000000000200000000000000000000000000000000134a47412d2d48794846642d2d2d7741416d5800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fba64a5013aca5aeec056e28b5688b561339537ddcdf78522c50761995f97825b3cccabd1075cf2a": "0x0000000000000000000000000000000000084d696b6861696c084d696b6861696c010116656d70747931393836727540676d61696c2e636f6d000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbac4c060b088b92aeedb1738fb7133da240213ab0f0916eb7abaf4140693b7a3f54311732bdda33": "0x00000000000000000000000000000000000a477561726469616e7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbb58baf12373ea22a1fd6ec0eb5124ebd1a70b26d283cfd92c289a451099cf91d255b1d76492829": "0x0000000000000000000000000000000000054c6f76650d6d792073746f7279206f6620000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbb8612e16c166c53292b66610bfa155fa87e60a020cf1fbaa438270fee288cd37655c91b0e20d3f": "0x00000000000000000000000000000000000d6d65746165726f6372616674054f67616e157777772e6d65746165726f63726166742e636f6d00176d65746165726f637261667440676d61696c2e636f6d00000e406d65746165726f6372616674000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbbd751cf18b124e066c470486d44ccf316779b680487ebee03495f93504cae4ab095a8e84a14877": "0x00000000000000000000000000000000000a54656464792044414f0a54656464792044414f00000000000d40546564647944414f4e4654000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbc426fc6e0869cd6e440a8acabf4208776f36b78891e8374e587dddd3b9cd6b67c59bb5b5b21a22": "0x00000000000000000000000000000000000c5374616c69616e6f5f323200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbc638e525d98b707a8d3cae2a718a52464bbdee0cc9f4356e79eea7df10450852f53653fb1db029": "0x0000000000000000000000000000000000054e696c7300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbc6c8362eaa2f7cc8f449273529d94798e1b40063ab062e12c6274d3ebae93b22c221cd090acb23": "0x040000000002000000000000000000000000000000000c536d696c655f7374616b6500001840736d696c655f7374616b653a6d61747269782e6f7267197a616c75736b69766173696c697940676d61696c2e636f6d000011404161726e6149726f6e733339303734000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbcfcd76d1d892611ed66ffc1202460d3e4ef69ba4f0108332bf2c1129e03e027a8d9d8f43f76561": "0x00000000000000000000000000000000001031506f73697469766576696265733100000017637572746973657472697070407961686f6f2e636f6d0000114031706f736974697665766962657332000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbe3fad5beebd421de43fe93757a22e2588359fe423a4b1a9158369e27c839e63d7f7e1b4f1eac3d": "0x040000000002000000000000000000000000000000000a30784a6f7461456c650000001230786a6f74616c40676d61696c2e636f6d00000b4030784a6f7461456c65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbeac673cf6ad96d86d0ca1a8d914606cd02075f08d7761ebd332ad86366ad394b204b574e7eb531": "0x0000000000000000000000000000000000084368616f73313900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fbffcfa5ca1c52b612ea0b1170fd52e15cead3cd728c55be445052ce3a9d0430c8f93d80e0f27a7a": "0x00000000000000000000000000000000000d706572696c69616e204b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc2c019dd594548ff8547fde2d99534f00b548363ea18c47f8e72003b1097417f4d337080a94890b": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc350fd2d1e9b3546e069c9fdc08c7b545f21e2fa2d4d95d0ab995dab99975acb4a717c0004b6d1d": "0x00000000000000000000000000000000000a486f6c6c792e4254430000000000000f40686f6c6c796a6565785f627463000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc4000681dcc4060901fb59036fcb6811c92f7f8c0b4cfe288393f849c31ebf18e34c48886486227": "0x00000000000000000000000000000000000f56616c657269796152656973657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc597e338ba1693cc06ba3aa6dd4ef5128ca5b3122b6d7eb5414c205056cf542e593e2d63adbaf2b": "0x00000000000000000000000000000000000e43727970746f20506172726f74010101010000104043727970746f506172726f745f5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc6a73dec7fa79b18c8305ff8478e6309325ebbfb81e8c1883d39e65d2ef84f88e4a428615c49277": "0x08000000000100902f50090000000000000000000000010000000200000000000000000000000000000000085032502e4f5247085032502e4f52471068747470733a2f2f7032702e6f7267000f6c657473676f407032702e6f726700000e4050325076616c696461746f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc6efad6664e87cc02d16cb5729728b5237dcf6335c1a49a844fc8f86e63f6dd27cb9c1803df911c": "0x0000000000000000000000000000000000094c616d615f4b534d00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc74e5b9fe588bd5bce565fbba1e8cc8cf794c368b755e0a57354b70d9a262b2a14b4c4363f6fc04": "0x00000000000000000000000000000000000b446f742057616c6c65740e5a68656e6973204162656e6f760000136b3233706978656c40676d61696c2e636f6d00000a406b3233706978656c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc77c115641dccf2908fafa24788c23e2db2a4947d62813364fe3a4e6548a36b6cd7cfcaca30ca43": "0x0000000000000000000000000000000000134a524d522d424320436f6d70617269736f6e154a756c69616e20522e204d2e205269636874657221687474703a2f2f626c6f636b636861696e2d636f6d70617269736f6e2e636f6d13406a726d7239323a6d61747269782e6f7267216a756c69616e40626c6f636b636861696e2d636f6d70617269736f6e2e636f6d00000b405363616c6557656233000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc7f2ed947ce60905842026fdfe358c9320e35012deeedc83c1e19d2b677eba10a1fad0d93c82b66": "0x0400000000020000000000000000000000000000000005414e474c00001840616e676c2d63727970746f3a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fca0f500e560ebb8aa2560b48e6acb448d5957b30400dacc88967f8ff0519c095a4628f7d001060c": "0x000000000000000000000000000000000017437270746f666f6c6c6f776572202d204b7573616d6100000018637270746f666f6c6c6f77657240676d61696c2e636f6d00000b40447572616e64696e73000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fcbacdb7dda02f70504baa1f30e0267703f471e94de948bd9f09caaf3c3a2f4c2dad3685a79ee000": "0x0401000000020000000000000000000000000000000006616e76656c0e416e64726569204f6368696576001240616e76656c3a6d61747269782e6f726717616e647265792e76656c646540676d61696c2e636f6d00000d40416e6472657956656c6465000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fcd27506d243061f2edf0fd8948ea642f135b314b1358c77ec6d0a4af83220b6ea18136e5ce36277": "0x04000000000200000000000000000000000000000000124368726973404f414b204e6574776f726b0000000f6368726973406f616b2e7465636800000d4063687269736c6932303436000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fce5be1f766dfb1672b5848541435240ecc09392bdea68c4fc6f7bc06ea7389a09e02a6b22052164": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd015b120265976186deb657c4754c485fad608accb98e195349f1d6f7b3e21fc0de1b49605f221a": "0x040000000002000000000000000000000000000000000641727347470000124061727367673a6d61747269782e6f72671562756c646f73696b706c40676d61696c2e636f6d00000a4062756c646f73696b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd033442619da284ec5da3e8919335b965130fb9109eb55f02fc78db8e592ddb8db101dce2b1235c": "0x00000000000000000000000000000000001157616c747a696e67204368696d657261000000000000114057616c747a696e674368696d657261000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd13d95520bea732966b58639403c4a3e5ad93300a158d65f9b6a8dd1d4e053f7058fc19d1f5ca2b": "0x04000000000200000000000000000000000000000000116269726473626972746866617468657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd265413bf0cff23c261b264bdd11a41bd20702fb3119fffc00f49d035d4efc219cdb217448ec353": "0x0000000000000000000000000000000000010220010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd3e18c07f5fba3b662df7fc799864be8c99d11723b4ebdb4837ab3287a4668b1bd6d83f904cfb7f": "0x0400000000020000000000000000000000000000000011576f6c6645646765204361706974616c0000001768656c6c6f40776f6c66656467652e6361706974616c00000a406d6f68616b616772000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd47ebcc2ca5e8d37e4f4ebe251bb6361e0ddcaecfbad3da3bf473b678c7684af7792a7cf83a226d": "0x00000000000000000000000000000000001250617472697a6961207c20414e414d495800000016646270617474792e64657640676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd49aaf383f13bb11ede7818a2f7f044a9dfa0755940d7f1468aee6f3df19695d4d74f77a8198a7a": "0x00000000000000000000000000000000000f4d64656e626f736368706f6c6b6100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd6097824962e44cc095ca14303d34ff5b0b2e5846e62c65bc4bd81244d41c97b82b4ea2a05e7d6b": "0x040100000002000000000000000000000000000000000c527562656e20546f7069610c527562656e20546f7069611b68747470733a2f2f7777772e727562656e746f7069612e636f6d0014696e666f40727562656e746f7069612e636f6d00000d40727562656e746f70696131000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd70211d1db8fd913a94d7f01d2e2a30b20bf318bbd88a3e8897769a26eacbbbb3383e3cbaab1321": "0x00000000000000000000000000000000000d706974636f696e2e61737472064d6172636f00001d6d6775696d61726165732e6461726f63686140676d61696c2e636f6d00000a40706974636f696e5f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd8ab13040828c7114896a045cb7bbcf45c0894fd388e23cc67d0697363530cae5cba9d5d28cc51e": "0x00000000000000000000000000000000000744616d69656e07446d7974726f00001964616d69656e2e746f726e2e373840676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd8ca3f2d503cae5fa514f3f70cf1b8b3ff34cb7e783e3d8c38077409bb2dfc877b396a98703ae7e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fdb56e406bbd33003c1db08dfc6786bee3b0e1b4aaf51e80b6f2ec9badbe3da87d30ad7605a2bd16": "0x04000000000200000000000000000000000000000000104b7573616d6120476f204c756e617200001a4063727970746f676f6c756e61723a6d61747269782e6f7267196e6f74696669636174696f6e7340676f6c756e61722e696f00000f4043727970746f476f4c756e6172000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fdb8522cbdc728de58832b4a605c2e5200f88606aef263a82573ef1f8421ae19ac8f786661d77631": "0x040000000002000000000000000000000000000000001356696b746f726969615f44656e69736f766100001f4076696b746f726969612e64656e69736f76613a6d61747269782e6f72671368686f75722e647040676d61696c2e636f6d0000094048686f75724470000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fdbb17eb6b8c97966c335d86444f3189027cd53244265047e52a96b4621fdaeeb9bc128577898676": "0x0401000000020000000000000000000000000000000009414c4c4e4f4445530e416c6c6e6f64657320496e632e1968747470733a2f2f7777772e616c6c6e6f6465732e636f6d0015737570706f727440616c6c6e6f6465732e636f6d00000a40616c6c6e6f646573000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fddd722142c641e0666dc61de797e22de1ec2a15c79cc4d725fe3aeeed8f47ee6fc466644d1d3c21": "0x00000000000000000000000000000000000667667364610564667361000018677561696775616968616f303240676d61696c2e636f6d00000f40677561696775616968616f3032000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fde28b6d3debc5d194ffa8f3ea040d3a0b39415d39710fcbb26534f05aba21f800cce0d95e3ab72b": "0x000000000000000000000000000000000009435245574d45525a00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fde7c0ce043a7c2de43473b2f1519b0970617b33670e00057d3379294c118fbac13505d5be3cd307": "0x000000000000000000000000000000000012524d524b205265776172642053746173680a524d524b205465616d1168747470733a2f2f726d726b2e617070000f68656c6c6f40726d726b2e61707000000940726d726b617070000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fdee11c887534b61c8c8ab85b285f3b6e7927b775058a6e359e7bdab7e514d4450eb10199b1e2f59": "0x000000000000000000000000000000000009706f6c6b61646f7400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fdfdaed8db3ace0e7607dd168d84f61f878d7cd383e62e55e6e5cd1e34870ac8e6f1c294f6db5133": "0x0000000000000000000000000000000000054261626100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe01bd1d10220f3e48caaec6c160b794721459c9d63038ea108a42f712993126256c6199f5358a15": "0x00000000000000000000000000000000000f62696e616e63655f6b736d5f33380f62696e616e63655f6b736d5f3338000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe0e61bb6b0e225d68170716ab7c6735dd0a1012045d9ea33891b5f6596cf97eb217d0962d86a518": "0x04010000000200000000000000000000000000000000076f6c616e6f640d44616e69656c204f6c616e6f1a68747470733a2f2f6769746875622e636f6d2f6f6c616e6f6418406f6c616e6f643a766972746f2e636f6d6d756e6974791264616e69656c40766972746f2e7465616d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe0feebd17524d7b067b047f02b57d4c77caf508cfa3944d8dbf8cbc0a829ee797ae5d6fbed6047f": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe13e8d69b79bd114ce421370cf0257d869618ec25c324ed4c6c7f65289297a3c134332c212e350b": "0x04010000000200000000000000000000000000000000174d617276696e207c205068616c61204e6574776f726b001668747470733a2f2f7068616c612e6e6574776f726b17406d617276696e746f6e673a6d61747269782e6f7267156d617276696e407068616c612e6e6574776f726b00000d406d617276696e5f746f6e67000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe162307295d89a332b6c05262048d5163640a9186784b80d74f6b6a8e1d72e31ed157a683c47103": "0x040000000002000000000000000000000000000000000e47726565656e204b7573616d6100001440677265656e30783a6d61747269782e6f726714677265656e3078406d61696c626f782e6f726700000c4047726565656e49744973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe17f42c36004fd896505b10e2945a156440b36b640f87c7f88566ff332a9bd30caca8266a83126a": "0x00000000000000000000000000000000001e3520666f7220546865204b7573202853706f6e736f7220456e747279290000000000000f405468654b7573616d617269616e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe1c0833ec392131b0d633f222e86340e41e28d35e643dfb99d9bb411f46de3ade8d52601fc7d349": "0x0400000000020000000000000000000000000000000012426173617261625f56616c696461746f7200001a4079657668656e626173617261623a6d61747269782e6f72671a657667656e69792e6261736172616240676d61696c2e636f6d000011406768366d786a78384f437754776373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe2795bc5fbd003faedfec0ea8f603e5915da43d878d9aeca5066170b32b4ea1e6d770603c38ef27": "0x0000000000000000000000000000000000066972796e610000001c70616c616d6172656e6b6f6972796e616940676d61696c2e636f6d000011404972796e6150616c616d6172656e31000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe3b1c73aae091b8a4c6cfc20e8d5395e20291d6339f9c9e7f8df2bd4a5484010ba21089fed5db3d": "0x0000000000000000000000000000000000104261737461726420467269656e6473002168747470733a2f2f6c696e6b74722e65652f42617374617264467269656e6473001c62617374617264667269656e64736e667440676d61696c2e636f6d0000104042617374617264467269656e6473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe4d46576752d75cce9903fecc2415a9ce35e5a39384b5005c1c1be3dbde661f3790fa6ef3d2d00d": "0x0000000000000000000000000000000000084772616e696141074c7975626f762168747470733a2f2f656469746f722e7769782e636f6d2f776562736974652f6200156772616e69616131313340676d61696c2e636f6d00000f404772616e6961414e6674617274000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe6c02a3d52a3ec7cc8b278ce627c23466aa5cb78b29ebddc340592d76013e1b36c5928a655b2c2d": "0x00000000000000000000000000000000000a4e657572616c41727405416c65780000167374735f6a6f6b657240686f746d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fe77fb272c40cb3db6b5592052813d13946ba4cbe6b2a28b44e6bd1e4c858e0c27beff6fbd288115": "0x00000000000000000000000000000000000e506f6e74656d204b7573616d610f506f6e74656d204e6574776f726b1768747470733a2f2f706f6e74656d2e6e6574776f726b000000000f40706f6e74656d6e6574776f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714feb09bd923dd400cca437639da37528d8edc0bb6b31966fdc0263218f4bd60c6f2cc37e963090371": "0x04000000000200000000000000000000000000000000064d6172733200000018746f7468656d6172733230323240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fec276262411f83c54f248466e58cb2d3f15705e84d9cb4b5bc4cf4305e227c91b9754b1f3d2350a": "0x040100000002000000000000000000000000000000000a436f736d6f74726f6e0000001d636f736d6f74726f6e76616c696461746f7240676d61696c2e636f6d00000c40436f736d6f74726f6e56000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fec4b60935b1627f3ecdb909643a31da23e3dec041ef8920632ec16fc5157297084eda7515badf68": "0x040000000002000000000000000000000000000000000f54617274616e205374616b696e6700001640616b68616e61746f6e3a6d61747269782e6f72671368656c6c6f40676f74617274616e2e636f6d00000b40616b68616e61746f6e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fee0771ebef0f5076e208dee4a11c78082248fdff110afc5decb7af87c23a482042b462e463ece3e": "0x00000000000000000000000000000000000000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fef0ad65a6e85d2fde8ba07168793b94e1f519c5a9485051c0cb161a10396fa38a5595887391da7f": "0x04010000000200000000000000000000000000000000054a61636b0e48752d4368656e672c204c65650016406a61636b37373132313a6d61747269782e6f7267146a61636b373731323140676d61696c2e636f6d00000b406a61636b3737313231000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fef1a8c1f1bd721354cbb4f2c8af1be474301d9c9dabc20015aa5779c5885e77010252388b2b7c52": "0x000000000000000000000000000000000000000000000000104049736b616e6465725f636973636f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fefd9747bbaa6bd3dcfb89b5a15f3ed2e569b3ee58578a17ec547d42012d96c554b0154100793763": "0x0000000000000000000000000000000000134b7570706c657320636f6c6c656374696f6e0c477265656e204170706c65010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff27f362e41c7ee9487d7703ee644d9a9b59ad29aa7f27405851496306f69678965f1d18d1478740": "0x04000000000200000000000000000000000000000000086c75636b797665000014406c75636b7976653a6d61747269782e6f7267166c75636b7976656e6f646540676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff295740e7cd48bec0fbef55637049c7352c1ef13f5db86359684ee1dfc32f76ce66c56776580b3a": "0x00000000000000000000000000000000000d524d524b204c6567656e64730000000000000d40726d726b6c6567656e6473000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff433a59c94c606d1c7c5bda689e0f7fff1f0012cd9c92d3ffdb3150b7585ca8e45d936a8c982674": "0x00000000000000000000000000000000000d46616c6361726975735f4b6f0756696b746f722168747470733a2f2f7777772e696e7374616772616d2e636f6d2f66616c636172164066616c6361726975733a6d61747269782e6f726714736172616e7461373240676d61696c2e636f6d00000e4046616c6361726975735f4b6f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff58ab16118773668c1f986613ba74c810f3a640551d9a1d0831d4430eb9da2246019323f23ee244": "0x0000000000000000000000000000000000046a6163046a61630000196a61636f706f6d616e4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff6779e6b83193fd281ba40c7b713abdb2ea8a124dec72cfd63d40bcc59b69550a0bf71c9a0d118f": "0x00000000000000000000000000000000000f476162652773204f6d6e6973696700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff85748c4b4f90b8548b99326157f4a2e39916a7ea20553d6964876bd6b583108f36e8941bcef951": "0x00000000000000000000000000000000000101010101000001000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ffb949961e1fd85deea39739cf422a6c6b2f350d2efb92428b71b408ef76b64165c32fedb7d32f16": "0x00000000000000000000000000000000000a4d616c6f6d62726573000000146d616c6f6d6272657340676d61696c2e636f6d00000f40545f4d616c6f6d627265735f54000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ffb95c1195a068daa023764a372deb88243537045ff9b3144219b315385c1d8e8de6761542410d61": "0x00000000000000000000000000000000000b617065586368696d707a001d68747470733a2f2f6c696e6b74722e65652f617065586368696d707a0015746f75636840617065786368696d707a2e636f6d00000c40617065586368696d707a000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ffc544aa04d3feb9a69484f2b10ec2f1dea19394423d576f91c6b5ab2315b389f4e108bcf0aa2840": "0x040000000002000000000000000000000000000000000a4661626920f09f90920000000000000d4066616269616e676f6d7066000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ffee713c9a5ac32ea6a111bb9d56b51fd2648f68629b4e87f7b92915a16967f6d1a5777dfcbfc714": "0x040100000002000000000000000000000000000000000a487970657263756265001c68747470733a2f2f7777772e6879706572637562652e766964656f00166a6f657269406879706572637562652e766964656f000000000000" }, "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/cumulus/polkadot-parachain/src/chain_spec/people.rs b/cumulus/polkadot-parachain/src/chain_spec/people.rs index 1408ef0aff6..db8756e6881 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/people.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/people.rs @@ -60,8 +60,9 @@ impl PeopleRuntimeType { pub fn load_config(&self) -> Result, String> { match self { - PeopleRuntimeType::Kusama => - todo!("Update chain-spec: ../../chain-specs/people-kusama.json - https://github.com/paritytech/polkadot-sdk/pull/3961#issuecomment-2037438431"), + PeopleRuntimeType::Kusama => Ok(Box::new(GenericChainSpec::from_json_bytes( + &include_bytes!("../../chain-specs/people-kusama.json")[..], + )?)), PeopleRuntimeType::Polkadot => todo!("Generate chain-spec: ../../chain-specs/people-polkadot.json"), PeopleRuntimeType::Rococo => Ok(Box::new(GenericChainSpec::from_json_bytes( diff --git a/prdoc/pr_4394.prdoc b/prdoc/pr_4394.prdoc new file mode 100644 index 00000000000..16409236c94 --- /dev/null +++ b/prdoc/pr_4394.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add Kusama People Chain genesis chainspec + +doc: + - audience: Node Operator + description: | + Adds the Kusama People Chain chain spec with the genesis head data and add to + `polkadot-parachain`. + +crates: + - name: polkadot-parachain-bin + bump: minor -- GitLab From 1c8595adb89b7b6ac443e9a1caf0b20a6e1231a5 Mon Sep 17 00:00:00 2001 From: Evgeny Snitko Date: Tue, 7 May 2024 19:14:53 +0400 Subject: [PATCH 055/170] Code coverage preparations (#4387) Added manual jobs for code coverage (triggered via `codecov-start` job): - **codecov-start** - initialize Codecov report for commit/pr - **test-linux-stable-codecov** - perform `nextest run` and upload coverage data parts - **codecov-finish** - finalize uploading of data parts and generate Codecov report Coverage requires code to be built with `-C instrument-coverage` which causes build errors (e .g. ```error[E0275]: overflow evaluating the requirement `::KeyOwnerProof == _\` ```, seems like related to [2641](https://github.com/paritytech/polkadot-sdk/issues/2641)) and unstable tests behavior ([example](https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6004731)). This is where we'll nee the developers assistance closing [[polkadot-sdk] Add code coverage #902](https://github.com/paritytech/ci_cd/issues/902) --- .github/codecov.yml | 9 ++++ .gitlab/pipeline/test.yml | 107 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 .github/codecov.yml diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 00000000000..ceceb9e6365 --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,9 @@ +coverage: + precision: 2 + round: down + range: "1...100" + status: + project: + default: + target: 1.0 + threshold: 2.0 \ No newline at end of file diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index c17a3ce35ea..796e4d65310 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -5,6 +5,113 @@ - job: job-starter artifacts: false +# +# +# +.codecov-check: + script: + - > + if command -v codecovcli -h >/dev/null 2>&1; then + codecovcli --version; + else + echo "downloading codecovcli"; + curl -s -o codecovcli https://cli.codecov.io/latest/linux/codecov; + chmod +x codecovcli; + mv codecovcli /usr/local/bin/codecovcli; + fi + # + - codecovcli --version + +# +# +# +codecov-start: + stage: test + when: manual + allow_failure: false + extends: + - .kubernetes-env + - .common-refs + - .pipeline-stopper-artifacts + - .run-immediately + script: + - !reference [.codecov-check, script] + - > + if [ "$CI_COMMIT_REF_NAME" != "master" ]; then + codecovcli -v create-commit -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --fail-on-error --pr ${CI_COMMIT_REF_NAME} --git-service github; + codecovcli -v create-report -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --fail-on-error --pr ${CI_COMMIT_REF_NAME} --git-service github; + else + codecovcli -v create-commit -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --fail-on-error --git-service github; + codecovcli -v create-report -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --fail-on-error --git-service github; + fi + +# +# +# +codecov-finish: + stage: test + extends: + - .kubernetes-env + - .common-refs + - .pipeline-stopper-artifacts + needs: + - test-linux-stable-codecov + script: + - !reference [.codecov-check, script] + - codecovcli -v create-report-results -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --git-service github + - codecovcli -v get-report-results -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --git-service github + - codecovcli -v send-notifications -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --git-service github + +# +# +# +test-linux-stable-codecov: + stage: test + needs: + - codecov-start + extends: + - .docker-env + - .common-refs + - .pipeline-stopper-artifacts + variables: + CI_IMAGE: europe-docker.pkg.dev/parity-build/ci-images/ci-unified:bullseye-1.77.0 + RUST_TOOLCHAIN: stable + RUSTFLAGS: "-Cdebug-assertions=y -Cinstrument-coverage" + LLVM_PROFILE_FILE: "target/coverage/cargo-test-${CI_NODE_INDEX}-%p-%m.profraw" + CARGO_INCREMENTAL: 0 + FORKLIFT_BYPASS: "true" + parallel: 2 + script: + # tools + - !reference [.codecov-check, script] + - rustup component add llvm-tools-preview + - mkdir -p target/coverage/result/ + # Place real test call here + - > + time cargo nextest run -p polkadot \ + --locked \ + --release \ + --no-fail-fast \ + --partition count:${CI_NODE_INDEX}/${CI_NODE_TOTAL} + # generate and upload reports + - > + grcov \ + target/coverage/ \ + --binary-path ./target/release/ \ + -s . \ + -t lcov \ + --branch \ + -o target/coverage/result/report-${CI_NODE_INDEX}.lcov + - ls -l target/coverage/result/ + - > + if [ "$CI_COMMIT_REF_NAME" != "master" ]; then + codecovcli -v do-upload -f target/coverage/result/report-${CI_NODE_INDEX}.lcov --disable-search -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --fail-on-error --pr ${CI_COMMIT_REF_NAME} --git-service github; + else + codecovcli -v do-upload -f target/coverage/result/report-${CI_NODE_INDEX}.lcov --disable-search -t ${CODECOV_TOKEN} -r paritytech/polkadot-sdk --commit-sha ${CI_COMMIT_SHA} --fail-on-error --git-service github; + fi + + # + test-linux-stable: stage: test extends: -- GitLab From b6dcd1b65436a6f7c087ad659617a9caf29a233a Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov Date: Tue, 7 May 2024 22:18:09 +0300 Subject: [PATCH 056/170] Update prdoc for 2226 (#4401) Mention that offenders are no longer chilled and suggest node operators and nominators to monitor their nodes/nominees closely. --------- Co-authored-by: Maciej --- prdoc/pr_2226.prdoc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/prdoc/pr_2226.prdoc b/prdoc/pr_2226.prdoc index f03540a50f6..9047dca4455 100644 --- a/prdoc/pr_2226.prdoc +++ b/prdoc/pr_2226.prdoc @@ -4,7 +4,8 @@ doc: - audience: Node Operator description: | On each committed offence (no matter slashable or not) the offending validator will be - disabled for a whole era. + disabled for a whole era. Offenders are no longer chilled so the node operator should monitor + the behavior of their validators and act swiftly if they are raising disputes. - audience: Runtime Dev description: | The disabling strategy in staking pallet is no longer hardcoded but abstracted away via @@ -14,7 +15,13 @@ doc: will be used on Kusama and Polkadot. In nutshell `UpToLimitDisablingStrategy` disables offenders up to the configured threshold. Offending validators are not disabled for offences in previous eras. The threshold is controlled via `DISABLING_LIMIT_FACTOR` (a generic - parameter of `UpToLimitDisablingStrategy`). + parameter of `UpToLimitDisablingStrategy`). Also offending validators are no longer chilled + after an offence is committed. This change is made to protect the network in case of honest nodes being slashed. + - audience: RuntimeUser + description: | + Nominators should be aware that the validators are no longer chilled if they commit an offence. + This means that token holders should be extra careful, monitor closely the behavior of their + nominees and take measures if they commit an offence. migrations: db: [] -- GitLab From b9ef00f4ca7e7e5367380fece13edc35aee616e1 Mon Sep 17 00:00:00 2001 From: Derek Colley Date: Tue, 7 May 2024 22:07:12 +0100 Subject: [PATCH 057/170] metaspan boot nodes for coretime-[westend, kusama] (#4234) --- cumulus/parachains/chain-specs/coretime-kusama.json | 6 ++++-- cumulus/parachains/chain-specs/coretime-westend.json | 1 + polkadot/node/service/chain-specs/kusama.json | 6 +++--- polkadot/node/service/chain-specs/polkadot.json | 6 +++--- polkadot/node/service/chain-specs/westend.json | 6 +++--- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/cumulus/parachains/chain-specs/coretime-kusama.json b/cumulus/parachains/chain-specs/coretime-kusama.json index ebb79e03f04..c22daf54db2 100644 --- a/cumulus/parachains/chain-specs/coretime-kusama.json +++ b/cumulus/parachains/chain-specs/coretime-kusama.json @@ -6,7 +6,9 @@ "/dns/kusama-coretime-connect-a-0.polkadot.io/tcp/30334/p2p/12D3KooWR7Biy6nPgQFhk2eYP62pAkcFA6he9RUFURTDh7ewTjpo", "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/30334/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX", "/dns/kusama-coretime-connect-a-0.polkadot.io/tcp/443/wss/p2p/12D3KooWR7Biy6nPgQFhk2eYP62pAkcFA6he9RUFURTDh7ewTjpo", - "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX" + "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX", + "/dns/boot.metaspan.io/tcp/33024/p2p/12D3KooWPmwMhG54ixDv2b3sCfYEJ1DWDrjaduBCBwqFFdqvVsmS", + "/dns/boot.metaspan.io/tcp/33026/wss/p2p/12D3KooWPmwMhG54ixDv2b3sCfYEJ1DWDrjaduBCBwqFFdqvVsmS" ], "telemetryEndpoints": null, "protocolId": null, @@ -89,4 +91,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/cumulus/parachains/chain-specs/coretime-westend.json b/cumulus/parachains/chain-specs/coretime-westend.json index 85e129e6848..ab2e97fdbf4 100644 --- a/cumulus/parachains/chain-specs/coretime-westend.json +++ b/cumulus/parachains/chain-specs/coretime-westend.json @@ -10,6 +10,7 @@ "/dns/westend-coretime-collator-node-0.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWP93Dzk8T7GWxyWw9jhLcz8Pksokk3R9vL2eEH337bNkT", "/dns/westend-coretime-collator-node-1.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH", "/dns/boot.metaspan.io/tcp/33019/p2p/12D3KooWCa1uNnEZqiqJY9jkKNQxwSLGPeZ5MjWHhjQMGwga9JMM", + "/dns/boot.metaspan.io/tcp/33020/wss/p2p/12D3KooWCa1uNnEZqiqJY9jkKNQxwSLGPeZ5MjWHhjQMGwga9JMM", "/dns/boot-node.helikon.io/tcp/9420/p2p/12D3KooWFBPartM873MNm1AmVK3etUz34cAE9A9rwPztPno2epQ3", "/dns/boot-node.helikon.io/tcp/9422/wss/p2p/12D3KooWFBPartM873MNm1AmVK3etUz34cAE9A9rwPztPno2epQ3", "/dns/coretime-westend-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWHewSFwJueRprNZNfkncdjud9DrGzvP1qfmgPd7VK66gw", diff --git a/polkadot/node/service/chain-specs/kusama.json b/polkadot/node/service/chain-specs/kusama.json index 490b39ee696..aa5a199cfee 100644 --- a/polkadot/node/service/chain-specs/kusama.json +++ b/polkadot/node/service/chain-specs/kusama.json @@ -20,9 +20,9 @@ "/dns/kusama.bootnodes.polkadotters.com/tcp/30313/wss/p2p/12D3KooWHB5rTeNkQdXNJ9ynvGz8Lpnmsctt7Tvp7mrYv6bcwbPG", "/dns/boot-cr.gatotech.network/tcp/33200/p2p/12D3KooWRNZXf99BfzQDE1C8YhuBbuy7Sj18UEf7FNpD8egbURYD", "/dns/boot-cr.gatotech.network/tcp/35200/wss/p2p/12D3KooWRNZXf99BfzQDE1C8YhuBbuy7Sj18UEf7FNpD8egbURYD", - "/dns/boot-kusama.metaspan.io/tcp/23012/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", - "/dns/boot-kusama.metaspan.io/tcp/23015/ws/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", - "/dns/boot-kusama.metaspan.io/tcp/23016/wss/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", + "/dns/boot.metaspan.io/tcp/23012/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", + "/dns/boot.metaspan.io/tcp/23015/ws/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", + "/dns/boot.metaspan.io/tcp/23016/wss/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", "/dns/kusama-bootnode.turboflakes.io/tcp/30305/p2p/12D3KooWR6cMhCYRhbJdqYZfzWZT6bcck3unpRLk8GBQGmHBgPwu", "/dns/kusama-bootnode.turboflakes.io/tcp/30405/wss/p2p/12D3KooWR6cMhCYRhbJdqYZfzWZT6bcck3unpRLk8GBQGmHBgPwu", "/dns/kusama-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWLswepVYVdCNduvWRTyNTaDMXEBcmvJdZ9Bhw3u2Jhad2", diff --git a/polkadot/node/service/chain-specs/polkadot.json b/polkadot/node/service/chain-specs/polkadot.json index 03570543707..bf0599f0bdc 100644 --- a/polkadot/node/service/chain-specs/polkadot.json +++ b/polkadot/node/service/chain-specs/polkadot.json @@ -21,9 +21,9 @@ "/dns/polkadot.bootnodes.polkadotters.com/tcp/30316/wss/p2p/12D3KooWPAVUgBaBk6n8SztLrMk8ESByncbAfRKUdxY1nygb9zG3", "/dns/boot-cr.gatotech.network/tcp/33100/p2p/12D3KooWK4E16jKk9nRhvC4RfrDVgcZzExg8Q3Q2G7ABUUitks1w", "/dns/boot-cr.gatotech.network/tcp/35100/wss/p2p/12D3KooWK4E16jKk9nRhvC4RfrDVgcZzExg8Q3Q2G7ABUUitks1w", - "/dns/boot-polkadot.metaspan.io/tcp/13012/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", - "/dns/boot-polkadot.metaspan.io/tcp/13015/ws/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", - "/dns/boot-polkadot.metaspan.io/tcp/13016/wss/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", + "/dns/boot.metaspan.io/tcp/13012/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", + "/dns/boot.metaspan.io/tcp/13015/ws/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", + "/dns/boot.metaspan.io/tcp/13016/wss/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", "/dns/polkadot-bootnode.turboflakes.io/tcp/30300/p2p/12D3KooWHJBMZgt7ymAdTRtadPcGXpJw79vBGe8z53r9JMkZW7Ha", "/dns/polkadot-bootnode.turboflakes.io/tcp/30400/wss/p2p/12D3KooWHJBMZgt7ymAdTRtadPcGXpJw79vBGe8z53r9JMkZW7Ha", "/dns/polkadot-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWFFqjBKoSdQniRpw1Y8W6kkV7takWv1DU2ZMkaA81PYVq", diff --git a/polkadot/node/service/chain-specs/westend.json b/polkadot/node/service/chain-specs/westend.json index 775f3e72ac7..9dfc715df46 100644 --- a/polkadot/node/service/chain-specs/westend.json +++ b/polkadot/node/service/chain-specs/westend.json @@ -18,9 +18,9 @@ "/dns/westend.bootnodes.polkadotters.com/tcp/30310/wss/p2p/12D3KooWHPHb64jXMtSRJDrYFATWeLnvChL8NtWVttY67DCH1eC5", "/dns/boot-cr.gatotech.network/tcp/33300/p2p/12D3KooWQGR1vUhoy6mvQorFp3bZFn6NNezhQZ6NWnVV7tpFgoPd", "/dns/boot-cr.gatotech.network/tcp/35300/wss/p2p/12D3KooWQGR1vUhoy6mvQorFp3bZFn6NNezhQZ6NWnVV7tpFgoPd", - "/dns/boot-westend.metaspan.io/tcp/33012/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", - "/dns/boot-westend.metaspan.io/tcp/33015/ws/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", - "/dns/boot-westend.metaspan.io/tcp/33016/wss/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", + "/dns/boot.metaspan.io/tcp/33012/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", + "/dns/boot.metaspan.io/tcp/33015/ws/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", + "/dns/boot.metaspan.io/tcp/33016/wss/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", "/dns/westend-bootnode.turboflakes.io/tcp/30310/p2p/12D3KooWJvPDCZmReU46ghpCMJCPVUvUCav4WQdKtXQhZgJdH6tZ", "/dns/westend-bootnode.turboflakes.io/tcp/30410/wss/p2p/12D3KooWJvPDCZmReU46ghpCMJCPVUvUCav4WQdKtXQhZgJdH6tZ", "/dns/westend-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWJifoDhCL3swAKt7MWhFb7wLRFD9oG33AL3nAathmU24x", -- GitLab From c91c13b9c1d6eaf12d89dbf088c1e16b25261822 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 7 May 2024 23:50:32 +0200 Subject: [PATCH 058/170] Generate XCM weights for coretimes (#4396) Addressing comment: https://github.com/paritytech/polkadot-sdk/pull/3455#issuecomment-2094829076 --------- Co-authored-by: command-bot <> --- .../coretime-rococo/src/weights/pallet_xcm.rs | 112 ++++++++------ .../xcm/pallet_xcm_benchmarks_fungible.rs | 62 ++++---- .../xcm/pallet_xcm_benchmarks_generic.rs | 138 +++++++++--------- .../src/weights/pallet_xcm.rs | 112 ++++++++------ .../xcm/pallet_xcm_benchmarks_fungible.rs | 60 ++++---- .../xcm/pallet_xcm_benchmarks_generic.rs | 136 +++++++++-------- 6 files changed, 324 insertions(+), 296 deletions(-) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs index c5d315467c1..7fb492173da 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-02-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 35_051_000 picoseconds. - Weight::from_parts(35_200_000, 0) + // Minimum execution time: 19_121_000 picoseconds. + Weight::from_parts(19_582_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -84,21 +84,41 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 56_235_000 picoseconds. - Weight::from_parts(58_178_000, 0) + // Minimum execution time: 61_722_000 picoseconds. + Weight::from_parts(63_616_000, 0) .saturating_add(Weight::from_parts(0, 3571)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) + /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `377` + // Estimated: `3842` + // Minimum execution time: 97_823_000 picoseconds. + Weight::from_parts(102_022_000, 0) + .saturating_add(Weight::from_parts(0, 3842)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: `Benchmark::Override` (r:0 w:0) /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -110,14 +130,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) + // Minimum execution time: 8_397_000 picoseconds. + Weight::from_parts(8_773_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) @@ -126,8 +144,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_226_000 picoseconds. - Weight::from_parts(6_403_000, 0) + // Minimum execution time: 5_806_000 picoseconds. + Weight::from_parts(6_106_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,8 +155,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_020_000 picoseconds. - Weight::from_parts(2_100_000, 0) + // Minimum execution time: 1_802_000 picoseconds. + Weight::from_parts(1_939_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -162,8 +180,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 24_387_000 picoseconds. - Weight::from_parts(24_814_000, 0) + // Minimum execution time: 24_300_000 picoseconds. + Weight::from_parts(25_359_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -186,8 +204,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `292` // Estimated: `3757` - // Minimum execution time: 27_039_000 picoseconds. - Weight::from_parts(27_693_000, 0) + // Minimum execution time: 27_579_000 picoseconds. + Weight::from_parts(28_414_000, 0) .saturating_add(Weight::from_parts(0, 3757)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -198,8 +216,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_920_000 picoseconds. - Weight::from_parts(2_082_000, 0) + // Minimum execution time: 1_762_000 picoseconds. + Weight::from_parts(1_884_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -209,8 +227,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `89` // Estimated: `13454` - // Minimum execution time: 17_141_000 picoseconds. - Weight::from_parts(17_500_000, 0) + // Minimum execution time: 16_512_000 picoseconds. + Weight::from_parts(16_818_000, 0) .saturating_add(Weight::from_parts(0, 13454)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -221,8 +239,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `93` // Estimated: `13458` - // Minimum execution time: 17_074_000 picoseconds. - Weight::from_parts(17_431_000, 0) + // Minimum execution time: 16_368_000 picoseconds. + Weight::from_parts(16_887_000, 0) .saturating_add(Weight::from_parts(0, 13458)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -233,8 +251,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `15946` - // Minimum execution time: 19_139_000 picoseconds. - Weight::from_parts(19_474_000, 0) + // Minimum execution time: 17_661_000 picoseconds. + Weight::from_parts(17_963_000, 0) .saturating_add(Weight::from_parts(0, 15946)) .saturating_add(T::DbWeight::get().reads(6)) } @@ -254,8 +272,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `6082` - // Minimum execution time: 24_346_000 picoseconds. - Weight::from_parts(25_318_000, 0) + // Minimum execution time: 24_498_000 picoseconds. + Weight::from_parts(25_339_000, 0) .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -266,8 +284,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `11026` - // Minimum execution time: 11_777_000 picoseconds. - Weight::from_parts(12_051_000, 0) + // Minimum execution time: 10_675_000 picoseconds. + Weight::from_parts(11_106_000, 0) .saturating_add(Weight::from_parts(0, 11026)) .saturating_add(T::DbWeight::get().reads(4)) } @@ -277,8 +295,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `100` // Estimated: `13465` - // Minimum execution time: 17_538_000 picoseconds. - Weight::from_parts(17_832_000, 0) + // Minimum execution time: 16_520_000 picoseconds. + Weight::from_parts(16_915_000, 0) .saturating_add(Weight::from_parts(0, 13465)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -299,8 +317,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `13507` - // Minimum execution time: 33_623_000 picoseconds. - Weight::from_parts(34_186_000, 0) + // Minimum execution time: 32_851_000 picoseconds. + Weight::from_parts(33_772_000, 0) .saturating_add(Weight::from_parts(0, 13507)) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) @@ -313,8 +331,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1517` - // Minimum execution time: 3_363_000 picoseconds. - Weight::from_parts(3_511_000, 0) + // Minimum execution time: 3_373_000 picoseconds. + Weight::from_parts(3_534_000, 0) .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -325,8 +343,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7669` // Estimated: `11134` - // Minimum execution time: 23_969_000 picoseconds. - Weight::from_parts(24_347_000, 0) + // Minimum execution time: 26_027_000 picoseconds. + Weight::from_parts(26_467_000, 0) .saturating_add(Weight::from_parts(0, 11134)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -337,8 +355,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 34_071_000 picoseconds. - Weight::from_parts(35_031_000, 0) + // Minimum execution time: 35_692_000 picoseconds. + Weight::from_parts(36_136_000, 0) .saturating_add(Weight::from_parts(0, 3555)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index ec71a87b5a7..7ff1cce2e07 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -16,29 +16,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-rococo-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./cumulus/templates/xcm-bench-template.hbs -// --chain=coretime-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::fungible +// --chain=coretime-rococo-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -56,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 19_199_000 picoseconds. - Weight::from_parts(19_784_000, 3593) + // Minimum execution time: 26_642_000 picoseconds. + Weight::from_parts(27_583_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -67,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 42_601_000 picoseconds. - Weight::from_parts(43_296_000, 6196) + // Minimum execution time: 35_124_000 picoseconds. + Weight::from_parts(36_510_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `207` // Estimated: `6196` - // Minimum execution time: 62_463_000 picoseconds. - Weight::from_parts(64_142_000, 6196) + // Minimum execution time: 55_950_000 picoseconds. + Weight::from_parts(57_207_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -120,8 +118,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 31_417_000 picoseconds. - Weight::from_parts(32_153_000, 3571) + // Minimum execution time: 23_747_000 picoseconds. + Weight::from_parts(24_424_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -129,8 +127,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_235_000 picoseconds. - Weight::from_parts(3_331_000, 0) + // Minimum execution time: 1_853_000 picoseconds. + Weight::from_parts(1_998_000, 0) } // Storage: `System::Account` (r:1 w:1) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -138,13 +136,11 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 17_701_000 picoseconds. - Weight::from_parts(18_219_000, 3593) + // Minimum execution time: 19_164_000 picoseconds. + Weight::from_parts(19_643_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) @@ -153,6 +149,8 @@ impl WeightInfo { // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) @@ -161,8 +159,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3593` - // Minimum execution time: 41_748_000 picoseconds. - Weight::from_parts(42_401_000, 3593) + // Minimum execution time: 48_708_000 picoseconds. + Weight::from_parts(49_610_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -182,8 +180,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 27_455_000 picoseconds. - Weight::from_parts(27_976_000, 3571) + // Minimum execution time: 20_586_000 picoseconds. + Weight::from_parts(21_147_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 719e7543e88..16412eb49a5 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -16,29 +16,27 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-rococo-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./cumulus/templates/xcm-bench-template.hbs -// --chain=coretime-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::generic +// --chain=coretime-rococo-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -66,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 35_477_000 picoseconds. - Weight::from_parts(36_129_000, 3571) + // Minimum execution time: 23_760_000 picoseconds. + Weight::from_parts(24_411_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -75,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_243_000 picoseconds. - Weight::from_parts(2_329_000, 0) + // Minimum execution time: 522_000 picoseconds. + Weight::from_parts(546_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -84,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 8_112_000 picoseconds. - Weight::from_parts(8_275_000, 3497) + // Minimum execution time: 5_830_000 picoseconds. + Weight::from_parts(6_069_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_960_000 picoseconds. - Weight::from_parts(9_253_000, 0) + // Minimum execution time: 5_508_000 picoseconds. + Weight::from_parts(5_801_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_332_000 picoseconds. - Weight::from_parts(2_438_000, 0) + // Minimum execution time: 1_130_000 picoseconds. + Weight::from_parts(1_239_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_054_000 picoseconds. - Weight::from_parts(2_119_000, 0) + // Minimum execution time: 541_000 picoseconds. + Weight::from_parts(567_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_061_000 picoseconds. - Weight::from_parts(2_133_000, 0) + // Minimum execution time: 560_000 picoseconds. + Weight::from_parts(591_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_054_000 picoseconds. - Weight::from_parts(2_128_000, 0) + // Minimum execution time: 505_000 picoseconds. + Weight::from_parts(547_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_791_000 picoseconds. - Weight::from_parts(2_903_000, 0) + // Minimum execution time: 538_000 picoseconds. + Weight::from_parts(565_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_088_000 picoseconds. - Weight::from_parts(2_153_000, 0) + // Minimum execution time: 514_000 picoseconds. + Weight::from_parts(541_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -153,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 27_721_000 picoseconds. - Weight::from_parts(28_602_000, 3571) + // Minimum execution time: 20_920_000 picoseconds. + Weight::from_parts(21_437_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -164,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 11_468_000 picoseconds. - Weight::from_parts(11_866_000, 3555) + // Minimum execution time: 8_549_000 picoseconds. + Weight::from_parts(8_821_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -173,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_125_000 picoseconds. - Weight::from_parts(2_167_000, 0) + // Minimum execution time: 525_000 picoseconds. + Weight::from_parts(544_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -192,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 22_422_000 picoseconds. - Weight::from_parts(22_924_000, 3539) + // Minimum execution time: 19_645_000 picoseconds. + Weight::from_parts(20_104_000, 3539) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -203,44 +201,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_880_000 picoseconds. - Weight::from_parts(4_050_000, 0) + // Minimum execution time: 2_232_000 picoseconds. + Weight::from_parts(2_334_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_432_000 picoseconds. - Weight::from_parts(3_536_000, 0) + // Minimum execution time: 883_000 picoseconds. + Weight::from_parts(945_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_213_000 picoseconds. - Weight::from_parts(2_286_000, 0) + // Minimum execution time: 600_000 picoseconds. + Weight::from_parts(645_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_155_000 picoseconds. - Weight::from_parts(2_239_000, 0) + // Minimum execution time: 527_000 picoseconds. + Weight::from_parts(552_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_093_000 picoseconds. - Weight::from_parts(2_139_000, 0) + // Minimum execution time: 527_000 picoseconds. + Weight::from_parts(550_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_345_000 picoseconds. - Weight::from_parts(2_378_000, 0) + // Minimum execution time: 657_000 picoseconds. + Weight::from_parts(703_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -258,8 +256,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 31_543_000 picoseconds. - Weight::from_parts(32_075_000, 3571) + // Minimum execution time: 24_999_000 picoseconds. + Weight::from_parts(25_671_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -267,8 +265,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_416_000 picoseconds. - Weight::from_parts(4_613_000, 0) + // Minimum execution time: 3_159_000 picoseconds. + Weight::from_parts(3_296_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -286,8 +284,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 28_050_000 picoseconds. - Weight::from_parts(28_755_000, 3571) + // Minimum execution time: 21_052_000 picoseconds. + Weight::from_parts(22_153_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -295,35 +293,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_073_000 picoseconds. - Weight::from_parts(2_181_000, 0) + // Minimum execution time: 547_000 picoseconds. + Weight::from_parts(584_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_049_000 picoseconds. - Weight::from_parts(2_137_000, 0) + // Minimum execution time: 506_000 picoseconds. + Weight::from_parts(551_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_082_000 picoseconds. - Weight::from_parts(2_144_000, 0) + // Minimum execution time: 508_000 picoseconds. + Weight::from_parts(527_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_043_000 picoseconds. - Weight::from_parts(2_151_000, 0) + // Minimum execution time: 527_000 picoseconds. + Weight::from_parts(558_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_197_000 picoseconds. - Weight::from_parts(2_293_000, 0) + // Minimum execution time: 514_000 picoseconds. + Weight::from_parts(553_000, 0) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs index 0082db3099d..fa588e982f0 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-02-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -62,8 +62,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 18_410_000 picoseconds. - Weight::from_parts(18_657_000, 0) + // Minimum execution time: 18_707_000 picoseconds. + Weight::from_parts(19_391_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -84,21 +84,41 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 56_616_000 picoseconds. - Weight::from_parts(57_751_000, 0) + // Minimum execution time: 61_874_000 picoseconds. + Weight::from_parts(63_862_000, 0) .saturating_add(Weight::from_parts(0, 3571)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) + /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `377` + // Estimated: `3842` + // Minimum execution time: 98_657_000 picoseconds. + Weight::from_parts(101_260_000, 0) + .saturating_add(Weight::from_parts(0, 3842)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: `Benchmark::Override` (r:0 w:0) /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -110,14 +130,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) + // Minimum execution time: 8_455_000 picoseconds. + Weight::from_parts(8_842_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) @@ -126,8 +144,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_014_000 picoseconds. - Weight::from_parts(6_412_000, 0) + // Minimum execution time: 5_850_000 picoseconds. + Weight::from_parts(6_044_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -137,8 +155,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_844_000 picoseconds. - Weight::from_parts(1_957_000, 0) + // Minimum execution time: 1_754_000 picoseconds. + Weight::from_parts(1_832_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -162,8 +180,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 24_067_000 picoseconds. - Weight::from_parts(24_553_000, 0) + // Minimum execution time: 24_886_000 picoseconds. + Weight::from_parts(25_403_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -186,8 +204,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `292` // Estimated: `3757` - // Minimum execution time: 27_023_000 picoseconds. - Weight::from_parts(27_620_000, 0) + // Minimum execution time: 28_114_000 picoseconds. + Weight::from_parts(28_414_000, 0) .saturating_add(Weight::from_parts(0, 3757)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -198,8 +216,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_866_000 picoseconds. - Weight::from_parts(1_984_000, 0) + // Minimum execution time: 1_713_000 picoseconds. + Weight::from_parts(1_810_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -209,8 +227,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `89` // Estimated: `13454` - // Minimum execution time: 16_425_000 picoseconds. - Weight::from_parts(16_680_000, 0) + // Minimum execution time: 15_910_000 picoseconds. + Weight::from_parts(16_256_000, 0) .saturating_add(Weight::from_parts(0, 13454)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -221,8 +239,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `93` // Estimated: `13458` - // Minimum execution time: 16_171_000 picoseconds. - Weight::from_parts(16_564_000, 0) + // Minimum execution time: 15_801_000 picoseconds. + Weight::from_parts(16_298_000, 0) .saturating_add(Weight::from_parts(0, 13458)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -233,8 +251,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `15946` - // Minimum execution time: 17_785_000 picoseconds. - Weight::from_parts(18_123_000, 0) + // Minimum execution time: 17_976_000 picoseconds. + Weight::from_parts(18_390_000, 0) .saturating_add(Weight::from_parts(0, 15946)) .saturating_add(T::DbWeight::get().reads(6)) } @@ -254,8 +272,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `6082` - // Minimum execution time: 23_903_000 picoseconds. - Weight::from_parts(24_769_000, 0) + // Minimum execution time: 24_723_000 picoseconds. + Weight::from_parts(25_531_000, 0) .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -266,8 +284,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `11026` - // Minimum execution time: 10_617_000 picoseconds. - Weight::from_parts(10_843_000, 0) + // Minimum execution time: 10_954_000 picoseconds. + Weight::from_parts(11_199_000, 0) .saturating_add(Weight::from_parts(0, 11026)) .saturating_add(T::DbWeight::get().reads(4)) } @@ -277,8 +295,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `100` // Estimated: `13465` - // Minimum execution time: 16_656_000 picoseconds. - Weight::from_parts(17_106_000, 0) + // Minimum execution time: 16_561_000 picoseconds. + Weight::from_parts(16_908_000, 0) .saturating_add(Weight::from_parts(0, 13465)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -299,8 +317,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `13507` - // Minimum execution time: 31_721_000 picoseconds. - Weight::from_parts(32_547_000, 0) + // Minimum execution time: 33_279_000 picoseconds. + Weight::from_parts(33_869_000, 0) .saturating_add(Weight::from_parts(0, 13507)) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) @@ -313,8 +331,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1517` - // Minimum execution time: 3_439_000 picoseconds. - Weight::from_parts(3_619_000, 0) + // Minimum execution time: 3_405_000 picoseconds. + Weight::from_parts(3_489_000, 0) .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -325,8 +343,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7669` // Estimated: `11134` - // Minimum execution time: 24_657_000 picoseconds. - Weight::from_parts(24_971_000, 0) + // Minimum execution time: 24_387_000 picoseconds. + Weight::from_parts(25_143_000, 0) .saturating_add(Weight::from_parts(0, 11134)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -337,8 +355,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 34_028_000 picoseconds. - Weight::from_parts(34_697_000, 0) + // Minimum execution time: 35_229_000 picoseconds. + Weight::from_parts(36_035_000, 0) .saturating_add(Weight::from_parts(0, 3555)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 6f5a52de98c..8e1461c4a99 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,28 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./cumulus/templates/xcm-bench-template.hbs -// --chain=coretime-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::fungible +// --chain=coretime-westend-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -56,8 +54,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 19_401_000 picoseconds. - Weight::from_parts(19_768_000, 3593) + // Minimum execution time: 26_842_000 picoseconds. + Weight::from_parts(27_606_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -67,8 +65,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 42_452_000 picoseconds. - Weight::from_parts(43_126_000, 6196) + // Minimum execution time: 35_076_000 picoseconds. + Weight::from_parts(36_109_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -90,8 +88,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `207` // Estimated: `6196` - // Minimum execution time: 58_090_000 picoseconds. - Weight::from_parts(59_502_000, 6196) + // Minimum execution time: 56_951_000 picoseconds. + Weight::from_parts(58_286_000, 6196) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -120,8 +118,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 23_569_000 picoseconds. - Weight::from_parts(24_598_000, 3571) + // Minimum execution time: 23_796_000 picoseconds. + Weight::from_parts(24_692_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -129,8 +127,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_546_000 picoseconds. - Weight::from_parts(2_674_000, 0) + // Minimum execution time: 1_990_000 picoseconds. + Weight::from_parts(2_142_000, 0) } // Storage: `System::Account` (r:1 w:1) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -138,11 +136,13 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 16_889_000 picoseconds. - Weight::from_parts(17_350_000, 3593) + // Minimum execution time: 19_572_000 picoseconds. + Weight::from_parts(20_017_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -151,8 +151,6 @@ impl WeightInfo { // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `System::Account` (r:1 w:1) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) @@ -161,8 +159,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3593` - // Minimum execution time: 43_964_000 picoseconds. - Weight::from_parts(45_293_000, 3593) + // Minimum execution time: 49_336_000 picoseconds. + Weight::from_parts(50_507_000, 3593) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -182,8 +180,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 20_704_000 picoseconds. - Weight::from_parts(21_266_000, 3571) + // Minimum execution time: 21_230_000 picoseconds. + Weight::from_parts(21_870_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 74254814bca..9657fa55c1f 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,28 +17,26 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --template=./cumulus/templates/xcm-bench-template.hbs -// --chain=coretime-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::generic +// --chain=coretime-westend-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -66,8 +64,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 22_424_000 picoseconds. - Weight::from_parts(23_208_000, 3571) + // Minimum execution time: 23_688_000 picoseconds. + Weight::from_parts(24_845_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -75,8 +73,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_194_000 picoseconds. - Weight::from_parts(1_306_000, 0) + // Minimum execution time: 569_000 picoseconds. + Weight::from_parts(619_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -84,58 +82,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 6_359_000 picoseconds. - Weight::from_parts(6_585_000, 3497) + // Minimum execution time: 5_851_000 picoseconds. + Weight::from_parts(6_061_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_297_000 picoseconds. - Weight::from_parts(6_661_000, 0) + // Minimum execution time: 5_770_000 picoseconds. + Weight::from_parts(5_916_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_778_000 picoseconds. - Weight::from_parts(1_923_000, 0) + // Minimum execution time: 1_155_000 picoseconds. + Weight::from_parts(1_270_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_212_000 picoseconds. - Weight::from_parts(1_314_000, 0) + // Minimum execution time: 558_000 picoseconds. + Weight::from_parts(628_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_165_000 picoseconds. - Weight::from_parts(1_247_000, 0) + // Minimum execution time: 603_000 picoseconds. + Weight::from_parts(630_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_173_000 picoseconds. - Weight::from_parts(1_275_000, 0) + // Minimum execution time: 533_000 picoseconds. + Weight::from_parts(563_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_247_000 picoseconds. - Weight::from_parts(1_332_000, 0) + // Minimum execution time: 597_000 picoseconds. + Weight::from_parts(644_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_170_000 picoseconds. - Weight::from_parts(1_237_000, 0) + // Minimum execution time: 536_000 picoseconds. + Weight::from_parts(588_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -153,8 +151,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 19_872_000 picoseconds. - Weight::from_parts(20_453_000, 3571) + // Minimum execution time: 21_146_000 picoseconds. + Weight::from_parts(21_771_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -164,8 +162,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 9_105_000 picoseconds. - Weight::from_parts(9_365_000, 3555) + // Minimum execution time: 8_446_000 picoseconds. + Weight::from_parts(8_660_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -173,8 +171,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_228_000 picoseconds. - Weight::from_parts(1_293_000, 0) + // Minimum execution time: 561_000 picoseconds. + Weight::from_parts(594_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -192,8 +190,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 19_535_000 picoseconds. - Weight::from_parts(20_139_000, 3539) + // Minimum execution time: 19_953_000 picoseconds. + Weight::from_parts(20_608_000, 3539) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -203,44 +201,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_158_000 picoseconds. - Weight::from_parts(3_275_000, 0) + // Minimum execution time: 2_290_000 picoseconds. + Weight::from_parts(2_370_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_539_000 picoseconds. - Weight::from_parts(1_607_000, 0) + // Minimum execution time: 943_000 picoseconds. + Weight::from_parts(987_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_317_000 picoseconds. - Weight::from_parts(1_427_000, 0) + // Minimum execution time: 635_000 picoseconds. + Weight::from_parts(699_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_176_000 picoseconds. - Weight::from_parts(1_250_000, 0) + // Minimum execution time: 553_000 picoseconds. + Weight::from_parts(609_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_202_000 picoseconds. - Weight::from_parts(1_279_000, 0) + // Minimum execution time: 547_000 picoseconds. + Weight::from_parts(581_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_411_000 picoseconds. - Weight::from_parts(1_463_000, 0) + // Minimum execution time: 700_000 picoseconds. + Weight::from_parts(757_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -258,8 +256,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 22_991_000 picoseconds. - Weight::from_parts(23_820_000, 3571) + // Minimum execution time: 24_953_000 picoseconds. + Weight::from_parts(25_516_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -267,8 +265,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_534_000 picoseconds. - Weight::from_parts(3_708_000, 0) + // Minimum execution time: 2_746_000 picoseconds. + Weight::from_parts(2_944_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -286,8 +284,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 20_025_000 picoseconds. - Weight::from_parts(20_463_000, 3571) + // Minimum execution time: 21_325_000 picoseconds. + Weight::from_parts(21_942_000, 3571) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -295,35 +293,35 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_213_000 picoseconds. - Weight::from_parts(1_290_000, 0) + // Minimum execution time: 600_000 picoseconds. + Weight::from_parts(631_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_207_000 picoseconds. - Weight::from_parts(1_265_000, 0) + // Minimum execution time: 534_000 picoseconds. + Weight::from_parts(566_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_195_000 picoseconds. - Weight::from_parts(1_231_000, 0) + // Minimum execution time: 540_000 picoseconds. + Weight::from_parts(565_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_182_000 picoseconds. - Weight::from_parts(1_265_000, 0) + // Minimum execution time: 542_000 picoseconds. + Weight::from_parts(581_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_165_000 picoseconds. - Weight::from_parts(1_252_000, 0) + // Minimum execution time: 568_000 picoseconds. + Weight::from_parts(597_000, 0) } } -- GitLab From 7213e363c042cf80ecb2503d1bbdef56d06f63a5 Mon Sep 17 00:00:00 2001 From: Francisco Aguirre Date: Wed, 8 May 2024 09:29:40 +0200 Subject: [PATCH 059/170] XcmDryRunApi - Dry-running extrinsics to get their XCM effects (#3872) # Context Estimating fees for XCM execution and sending has been an area with bad UX. The addition of the [XcmPaymentApi](https://github.com/paritytech/polkadot-sdk/pull/3607) exposed the necessary components to be able to estimate XCM fees correctly, however, that was not the full story. The `XcmPaymentApi` works for estimating fees only if you know the specific XCM you want to execute or send. This is necessary but most UIs want to estimate the fees for extrinsics, they don't necessarily know the XCM program that's executed by them. # Main addition A new runtime API is introduced, the `XcmDryRunApi`, that given an extrinsic, or an XCM program, returns its effects: - Execution result - Local XCM (in the case of an extrinsic) - Forwarded XCMs - List of events This API can be used on its own for dry-running purposes, for double-checking or testing, but it mainly shines when used in conjunction with the `XcmPaymentApi`. UIs can use these two APIs to estimate transfers. # How it works New tests are added to exemplify how to incorporate both APIs. There's a mock test just to make sure everything works under `xcm-fee-payment-runtime-api`. There's a real-world test using Westend and AssetHubWestend under `cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs`. Added both a test for a simple teleport between chains and a reserve transfer asset between two parachains going through a reserve. The steps to follow: - Use `XcmDryRunApi::dry_run_extrinsic` to get local XCM program and forwarded messages - For each forwarded message - Use `XcmPaymentApi::query_delivery_fee` LOCALLY to get the delivery fees - Use `XcmPaymentApi::query_xcm_weight` ON THE DESTINATION to get the remote execution weight - (optional) Use `XcmPaymentApi::query_acceptable_payment_assets` ON THE DESTINATION to know on which assets the execution fees can be paid - Use `XcmPaymentApi::query_weight_to_asset_fee` ON THE DESTINATION to convert weight to the actual remote execution fees - Use `XcmDryRunApi::dry_run_xcm` ON THE DESTINATION to know if a new message will be forwarded, if so, continue # Dear reviewer The changes in this PR are grouped as follows, and in order of importance: - Addition of new runtime API - Definition, mock and simple tests: polkadot/xcm/xcm-fee-payment-runtime-api/* - Implemented on Westend, Asset Hub Westend and Penpal, will implement on every runtime in a following PR - Addition of a new config item to the XCM executor for recording xcms about to be executed - Definition: polkadot/xcm/xcm-executor/* - Implementation: polkadot/xcm/pallet-xcm/* - had to update all runtime xcm_config.rs files with `type XcmRecorder = XcmPallet;` - Addition of a new trait for inspecting the messages in queues - Definition: polkadot/xcm/xcm-builder/src/routing.rs - Implemented it on all routers: - ChildParachainRouter: polkadot/runtime/common/src/xcm_sender.rs - ParentAsUmp: cumulus/primitives/utility/src/lib.rs (piggybacked on implementation in cumulus/pallets/parachain-system/src/lib.rs) - XcmpQueue: cumulus/pallets/xcmp-queue/src/lib.rs - Bridge: bridges/modules/xcm-bridge-hub-router/src/lib.rs - More complicated and useful tests: - cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs ## Next steps With this PR, Westend, AssetHubWestend, Rococo and AssetHubRococo have the new API. UIs can test on these runtimes to create better experiences around cross-chain operations. Next: - Add XcmDryRunApi to all system parachains - Integrate xcm fee estimation in all emulated tests - Get this on the fellowship runtimes --------- Co-authored-by: Adrian Catangiu --- Cargo.lock | 33 ++ .../modules/xcm-bridge-hub-router/src/lib.rs | 43 +- .../modules/xcm-bridge-hub-router/src/mock.rs | 47 +- cumulus/pallets/parachain-system/Cargo.toml | 3 + cumulus/pallets/parachain-system/src/lib.rs | 16 +- cumulus/pallets/xcmp-queue/Cargo.toml | 5 +- cumulus/pallets/xcmp-queue/src/lib.rs | 35 +- cumulus/pallets/xcmp-queue/src/mock.rs | 1 + cumulus/pallets/xcmp-queue/src/tests.rs | 40 ++ .../emulated/chains/relays/westend/Cargo.toml | 2 + .../tests/assets/asset-hub-westend/Cargo.toml | 6 + .../assets/asset-hub-westend/src/tests/mod.rs | 1 + .../src/tests/xcm_fee_estimation.rs | 370 ++++++++++++ .../assets/asset-hub-rococo/Cargo.toml | 1 + .../assets/asset-hub-rococo/src/lib.rs | 71 ++- .../assets/asset-hub-rococo/src/xcm_config.rs | 1 + .../assets/asset-hub-westend/Cargo.toml | 1 + .../assets/asset-hub-westend/src/lib.rs | 157 ++++-- .../asset-hub-westend/src/xcm_config.rs | 1 + .../bridge-hub-rococo/src/xcm_config.rs | 1 + .../bridge-hub-westend/src/xcm_config.rs | 1 + .../collectives-westend/src/xcm_config.rs | 1 + .../contracts-rococo/src/xcm_config.rs | 1 + .../coretime-rococo/src/xcm_config.rs | 1 + .../coretime-westend/src/xcm_config.rs | 1 + .../glutton/glutton-westend/src/xcm_config.rs | 1 + .../people/people-rococo/src/xcm_config.rs | 1 + .../people/people-westend/src/xcm_config.rs | 1 + .../runtimes/starters/shell/src/xcm_config.rs | 1 + .../runtimes/testing/penpal/Cargo.toml | 3 + .../runtimes/testing/penpal/src/lib.rs | 107 +++- .../runtimes/testing/penpal/src/xcm_config.rs | 1 + .../testing/rococo-parachain/src/lib.rs | 1 + cumulus/primitives/utility/src/lib.rs | 12 +- polkadot/node/service/Cargo.toml | 1 + polkadot/node/service/src/fake_runtime_api.rs | 20 +- polkadot/runtime/common/src/xcm_sender.rs | 21 +- polkadot/runtime/parachains/src/dmp.rs | 2 +- polkadot/runtime/rococo/Cargo.toml | 1 + polkadot/runtime/rococo/src/lib.rs | 67 ++- polkadot/runtime/rococo/src/xcm_config.rs | 1 + .../runtime/test-runtime/src/xcm_config.rs | 1 + polkadot/runtime/westend/Cargo.toml | 1 + polkadot/runtime/westend/src/lib.rs | 67 ++- polkadot/runtime/westend/src/xcm_config.rs | 1 + .../src/fungible/mock.rs | 1 + .../pallet-xcm-benchmarks/src/generic/mock.rs | 1 + polkadot/xcm/pallet-xcm/Cargo.toml | 1 + polkadot/xcm/pallet-xcm/src/lib.rs | 61 +- polkadot/xcm/pallet-xcm/src/mock.rs | 1 + polkadot/xcm/pallet-xcm/src/tests/mod.rs | 36 +- polkadot/xcm/xcm-builder/src/lib.rs | 4 +- polkadot/xcm/xcm-builder/src/routing.rs | 27 +- polkadot/xcm/xcm-builder/src/tests/mock.rs | 1 + .../xcm/xcm-builder/src/tests/pay/mock.rs | 1 + .../xcm/xcm-builder/src/universal_exports.rs | 9 + polkadot/xcm/xcm-builder/tests/mock/mod.rs | 1 + polkadot/xcm/xcm-executor/src/config.rs | 6 +- polkadot/xcm/xcm-executor/src/lib.rs | 9 + polkadot/xcm/xcm-executor/src/traits/mod.rs | 2 + .../xcm/xcm-executor/src/traits/record_xcm.rs | 46 ++ .../xcm-fee-payment-runtime-api/Cargo.toml | 31 ++ .../src/dry_run.rs | 83 +++ .../xcm-fee-payment-runtime-api/src/fees.rs | 97 ++++ .../xcm-fee-payment-runtime-api/src/lib.rs | 93 +--- .../tests/fee_estimation.rs | 370 ++++++++++++ .../xcm-fee-payment-runtime-api/tests/mock.rs | 525 ++++++++++++++++++ .../example/src/parachain/xcm_config/mod.rs | 1 + .../example/src/relay_chain/xcm_config/mod.rs | 1 + .../xcm/xcm-simulator/fuzzer/src/parachain.rs | 1 + .../xcm-simulator/fuzzer/src/relay_chain.rs | 1 + prdoc/pr_3872.prdoc | 86 +++ .../contracts/mock-network/src/parachain.rs | 1 + .../contracts/mock-network/src/relay_chain.rs | 1 + .../runtime/src/configs/xcm_config.rs | 1 + 75 files changed, 2477 insertions(+), 173 deletions(-) create mode 100644 cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs create mode 100644 polkadot/xcm/xcm-executor/src/traits/record_xcm.rs create mode 100644 polkadot/xcm/xcm-fee-payment-runtime-api/src/dry_run.rs create mode 100644 polkadot/xcm/xcm-fee-payment-runtime-api/src/fees.rs create mode 100644 polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs create mode 100644 polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs create mode 100644 prdoc/pr_3872.prdoc diff --git a/Cargo.lock b/Cargo.lock index 8a7ba656af1..0dda623c14a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -896,21 +896,27 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", "frame-support", + "frame-system", "pallet-asset-conversion", + "pallet-asset-tx-payment", "pallet-assets", "pallet-balances", "pallet-message-queue", + "pallet-transaction-payment", "pallet-treasury", "pallet-xcm", "parachains-common", "parity-scale-codec", "penpal-runtime", "polkadot-runtime-common", + "sp-core", + "sp-keyring", "sp-runtime", "staging-xcm", "staging-xcm-executor", "westend-runtime", "westend-system-emulated-network", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -3930,6 +3936,7 @@ dependencies = [ "sp-trie", "sp-version", "staging-xcm", + "staging-xcm-builder", "trie-db", "trie-standardmap", ] @@ -5122,6 +5129,19 @@ dependencies = [ "regex", ] +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "env_logger" version = "0.10.1" @@ -12145,6 +12165,7 @@ dependencies = [ "staging-xcm-builder", "staging-xcm-executor", "substrate-wasm-builder", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -22651,8 +22672,10 @@ dependencies = [ "sp-consensus-beefy", "sp-core", "sp-runtime", + "staging-xcm", "westend-runtime", "westend-runtime-constants", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -23292,14 +23315,24 @@ dependencies = [ name = "xcm-fee-payment-runtime-api" version = "0.1.0" dependencies = [ + "env_logger 0.9.3", + "frame-executive", "frame-support", + "frame-system", + "log", + "pallet-assets", + "pallet-balances", + "pallet-xcm", "parity-scale-codec", "scale-info", "sp-api", + "sp-io", "sp-runtime", "sp-std 14.0.0", "sp-weights", "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] diff --git a/bridges/modules/xcm-bridge-hub-router/src/lib.rs b/bridges/modules/xcm-bridge-hub-router/src/lib.rs index ece72ac8494..60739460346 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/lib.rs @@ -37,8 +37,9 @@ use codec::Encode; use frame_support::traits::Get; use sp_core::H256; use sp_runtime::{FixedPointNumber, FixedU128, Saturating}; +use sp_std::vec::Vec; use xcm::prelude::*; -use xcm_builder::{ExporterFor, SovereignPaidRemoteExporter}; +use xcm_builder::{ExporterFor, InspectMessageQueues, SovereignPaidRemoteExporter}; pub use pallet::*; pub use weights::WeightInfo; @@ -95,7 +96,7 @@ pub mod pallet { /// Origin of the sibling bridge hub that is allowed to report bridge status. type BridgeHubOrigin: EnsureOrigin; /// Actual message sender (`HRMP` or `DMP`) to the sibling bridge hub location. - type ToBridgeHubSender: SendXcm; + type ToBridgeHubSender: SendXcm + InspectMessageQueues; /// Underlying channel with the sibling bridge hub. It must match the channel, used /// by the `Self::ToBridgeHubSender`. type WithBridgeHubChannel: XcmChannelStatusProvider; @@ -396,6 +397,12 @@ impl, I: 'static> SendXcm for Pallet { } } +impl, I: 'static> InspectMessageQueues for Pallet { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + ViaBridgeHubExporter::::get_messages() + } +} + #[cfg(test)] mod tests { use super::*; @@ -635,4 +642,36 @@ mod tests { ); }); } + + #[test] + fn get_messages_works() { + run_test(|| { + assert_ok!(send_xcm::( + (Parent, Parent, GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)).into(), + vec![ClearOrigin].into() + )); + assert_eq!( + XcmBridgeHubRouter::get_messages(), + vec![( + VersionedLocation::V4((Parent, Parachain(1002)).into()), + vec![VersionedXcm::V4( + Xcm::builder() + .withdraw_asset((Parent, 1_002_000)) + .buy_execution((Parent, 1_002_000), Unlimited) + .set_appendix( + Xcm::builder_unsafe() + .deposit_asset(AllCounted(1), (Parent, Parachain(1000))) + .build() + ) + .export_message( + Kusama, + Parachain(1000), + Xcm::builder_unsafe().clear_origin().build() + ) + .build() + )], + ),], + ); + }); + } } diff --git a/bridges/modules/xcm-bridge-hub-router/src/mock.rs b/bridges/modules/xcm-bridge-hub-router/src/mock.rs index 20c86d1da9a..3e2c1bb369c 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/mock.rs @@ -19,14 +19,16 @@ use crate as pallet_xcm_bridge_hub_router; use bp_xcm_bridge_hub_router::XcmChannelStatusProvider; +use codec::Encode; use frame_support::{ construct_runtime, derive_impl, parameter_types, traits::{Contains, Equals}, }; use frame_system::EnsureRoot; use sp_runtime::{traits::ConstU128, BuildStorage}; +use sp_std::cell::RefCell; use xcm::prelude::*; -use xcm_builder::{NetworkExportTable, NetworkExportTableItem}; +use xcm_builder::{InspectMessageQueues, NetworkExportTable, NetworkExportTableItem}; pub type AccountId = u64; type Block = frame_system::mocking::MockBlock; @@ -102,23 +104,46 @@ pub struct TestToBridgeHubSender; impl TestToBridgeHubSender { pub fn is_message_sent() -> bool { - frame_support::storage::unhashed::get_or_default(b"TestToBridgeHubSender.Sent") + !Self::get_messages().is_empty() } } +thread_local! { + pub static SENT_XCM: RefCell)>> = RefCell::new(Vec::new()); +} + impl SendXcm for TestToBridgeHubSender { - type Ticket = (); + type Ticket = (Location, Xcm<()>); fn validate( - _destination: &mut Option, - _message: &mut Option>, + destination: &mut Option, + message: &mut Option>, ) -> SendResult { - Ok(((), (BridgeFeeAsset::get(), HRMP_FEE).into())) + let pair = (destination.take().unwrap(), message.take().unwrap()); + Ok((pair, (BridgeFeeAsset::get(), HRMP_FEE).into())) } - fn deliver(_ticket: Self::Ticket) -> Result { - frame_support::storage::unhashed::put(b"TestToBridgeHubSender.Sent", &true); - Ok([0u8; 32]) + fn deliver(pair: Self::Ticket) -> Result { + let hash = fake_message_hash(&pair.1); + SENT_XCM.with(|q| q.borrow_mut().push(pair)); + Ok(hash) + } +} + +impl InspectMessageQueues for TestToBridgeHubSender { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + SENT_XCM.with(|q| { + (*q.borrow()) + .clone() + .iter() + .map(|(location, message)| { + ( + VersionedLocation::V4(location.clone()), + vec![VersionedXcm::V4(message.clone())], + ) + }) + .collect() + }) } } @@ -146,3 +171,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { pub fn run_test(test: impl FnOnce() -> T) -> T { new_test_ext().execute_with(test) } + +pub(crate) fn fake_message_hash(message: &Xcm) -> XcmHash { + message.using_encoded(sp_io::hashing::blake2_256) +} diff --git a/cumulus/pallets/parachain-system/Cargo.toml b/cumulus/pallets/parachain-system/Cargo.toml index cc2e8943caa..57e274db361 100644 --- a/cumulus/pallets/parachain-system/Cargo.toml +++ b/cumulus/pallets/parachain-system/Cargo.toml @@ -38,6 +38,7 @@ polkadot-parachain-primitives = { path = "../../../polkadot/parachain", default- polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", default-features = false } polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false, optional = true } xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } # Cumulus cumulus-pallet-parachain-system-proc-macro = { path = "proc-macro", default-features = false } @@ -95,6 +96,7 @@ std = [ "sp-tracing/std", "sp-trie/std", "trie-db/std", + "xcm-builder/std", "xcm/std", ] @@ -109,6 +111,7 @@ runtime-benchmarks = [ "polkadot-runtime-common/runtime-benchmarks", "polkadot-runtime-parachains/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index 54a1def5960..c8e7d1bb30f 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -55,7 +55,8 @@ use sp_runtime::{ BoundedSlice, FixedU128, RuntimeDebug, Saturating, }; use sp_std::{cmp, collections::btree_map::BTreeMap, prelude::*}; -use xcm::latest::XcmHash; +use xcm::{latest::XcmHash, VersionedLocation, VersionedXcm}; +use xcm_builder::InspectMessageQueues; mod benchmarking; pub mod migration; @@ -1608,6 +1609,19 @@ impl UpwardMessageSender for Pallet { } } +impl InspectMessageQueues for Pallet { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + use xcm::prelude::*; + + let messages: Vec> = PendingUpwardMessages::::get() + .iter() + .map(|encoded_message| VersionedXcm::<()>::decode(&mut &encoded_message[..]).unwrap()) + .collect(); + + vec![(VersionedLocation::V4(Parent.into()), messages)] + } +} + #[cfg(feature = "runtime-benchmarks")] impl polkadot_runtime_common::xcm_sender::EnsureForParachain for Pallet { fn ensure(para_id: ParaId) { diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml index ab196c6d3ec..e3530ef7bf0 100644 --- a/cumulus/pallets/xcmp-queue/Cargo.toml +++ b/cumulus/pallets/xcmp-queue/Cargo.toml @@ -28,6 +28,7 @@ polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-f polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", default-features = false } xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } # Cumulus cumulus-primitives-core = { path = "../../primitives/core", default-features = false } @@ -46,9 +47,6 @@ sp-core = { path = "../../../substrate/primitives/core" } pallet-balances = { path = "../../../substrate/frame/balances" } frame-support = { path = "../../../substrate/frame/support", features = ["experimental"] } -# Polkadot -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder" } - # Cumulus cumulus-pallet-parachain-system = { path = "../parachain-system", features = ["parameterized-consensus-hook"] } @@ -71,6 +69,7 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-std/std", + "xcm-builder/std", "xcm-executor/std", "xcm/std", ] diff --git a/cumulus/pallets/xcmp-queue/src/lib.rs b/cumulus/pallets/xcmp-queue/src/lib.rs index 7de2fd80942..cc785b66150 100644 --- a/cumulus/pallets/xcmp-queue/src/lib.rs +++ b/cumulus/pallets/xcmp-queue/src/lib.rs @@ -70,7 +70,8 @@ use scale_info::TypeInfo; use sp_core::MAX_POSSIBLE_ALLOCATION; use sp_runtime::{FixedU128, RuntimeDebug, Saturating}; use sp_std::prelude::*; -use xcm::{latest::prelude::*, VersionedXcm, WrapVersion, MAX_XCM_DECODE_DEPTH}; +use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm, WrapVersion, MAX_XCM_DECODE_DEPTH}; +use xcm_builder::InspectMessageQueues; use xcm_executor::traits::ConvertOrigin; pub use pallet::*; @@ -947,6 +948,38 @@ impl SendXcm for Pallet { } } +impl InspectMessageQueues for Pallet { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + use xcm::prelude::*; + + OutboundXcmpMessages::::iter() + .map(|(para_id, _, messages)| { + let mut data = &messages[..]; + let decoded_format = + XcmpMessageFormat::decode_with_depth_limit(MAX_XCM_DECODE_DEPTH, &mut data) + .unwrap(); + if decoded_format != XcmpMessageFormat::ConcatenatedVersionedXcm { + panic!("Unexpected format.") + } + let mut decoded_messages = Vec::new(); + while !data.is_empty() { + let decoded_message = VersionedXcm::<()>::decode_with_depth_limit( + MAX_XCM_DECODE_DEPTH, + &mut data, + ) + .unwrap(); + decoded_messages.push(decoded_message); + } + + ( + VersionedLocation::V4((Parent, Parachain(para_id.into())).into()), + decoded_messages, + ) + }) + .collect() + } +} + impl FeeTracker for Pallet { type Id = ParaId; diff --git a/cumulus/pallets/xcmp-queue/src/mock.rs b/cumulus/pallets/xcmp-queue/src/mock.rs index 9d9a723cf8b..e258576aa3f 100644 --- a/cumulus/pallets/xcmp-queue/src/mock.rs +++ b/cumulus/pallets/xcmp-queue/src/mock.rs @@ -178,6 +178,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } pub type XcmRouter = ( diff --git a/cumulus/pallets/xcmp-queue/src/tests.rs b/cumulus/pallets/xcmp-queue/src/tests.rs index 0b41095828f..f48e9eec3ac 100644 --- a/cumulus/pallets/xcmp-queue/src/tests.rs +++ b/cumulus/pallets/xcmp-queue/src/tests.rs @@ -844,3 +844,43 @@ fn verify_fee_factor_increase_and_decrease() { assert!(DeliveryFeeFactor::::get(sibling_para_id) < FixedU128::from_float(1.63)); }); } + +#[test] +fn get_messages_works() { + new_test_ext().execute_with(|| { + use xcm_builder::InspectMessageQueues; + let sibling_para_id = ParaId::from(2001); + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests(sibling_para_id); + let destination: Location = (Parent, Parachain(sibling_para_id.into())).into(); + let other_sibling_para_id = ParaId::from(2002); + let other_destination: Location = (Parent, Parachain(other_sibling_para_id.into())).into(); + let message = Xcm(vec![ClearOrigin]); + assert_ok!(send_xcm::(destination.clone(), message.clone())); + assert_ok!(send_xcm::(destination.clone(), message.clone())); + assert_ok!(send_xcm::(destination.clone(), message.clone())); + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests(other_sibling_para_id); + assert_ok!(send_xcm::(other_destination.clone(), message.clone())); + assert_ok!(send_xcm::(other_destination.clone(), message)); + let queued_messages = XcmpQueue::get_messages(); + assert_eq!( + queued_messages, + vec![ + ( + VersionedLocation::V4(other_destination), + vec![ + VersionedXcm::V4(Xcm(vec![ClearOrigin])), + VersionedXcm::V4(Xcm(vec![ClearOrigin])), + ], + ), + ( + VersionedLocation::V4(destination), + vec![ + VersionedXcm::V4(Xcm(vec![ClearOrigin])), + VersionedXcm::V4(Xcm(vec![ClearOrigin])), + VersionedXcm::V4(Xcm(vec![ClearOrigin])), + ], + ), + ], + ); + }); +} diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index 20aedb50e6a..e4688a1c9f0 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -25,6 +25,8 @@ pallet-staking = { path = "../../../../../../../substrate/frame/staking", defaul polkadot-primitives = { path = "../../../../../../../polkadot/primitives", default-features = false } westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants", default-features = false } westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } +xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } # Cumulus parachains-common = { path = "../../../../../common" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml index 00f4308324a..0a2b0f6d45e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml @@ -16,18 +16,24 @@ assert_matches = "1.5.0" # Substrate sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } +sp-keyring = { path = "../../../../../../../substrate/primitives/keyring", default-features = false } +sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../../../substrate/frame/system", default-features = false } pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } pallet-treasury = { path = "../../../../../../../substrate/frame/treasury", default-features = false } pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } +pallet-transaction-payment = { path = "../../../../../../../substrate/frame/transaction-payment", default-features = false } +pallet-asset-tx-payment = { path = "../../../../../../../substrate/frame/transaction-payment/asset-tx-payment", default-features = false } # Polkadot polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } # Cumulus diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs index bf013697b4c..61eb70524fc 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs @@ -21,3 +21,4 @@ mod set_xcm_versions; mod swap; mod teleport; mod treasury; +mod xcm_fee_estimation; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs new file mode 100644 index 00000000000..aeec9b44dab --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs @@ -0,0 +1,370 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests to ensure correct XCM fee estimation for cross-chain asset transfers. + +use crate::imports::*; + +use sp_keyring::AccountKeyring::Alice; +use sp_runtime::{generic, MultiSignature}; +use xcm_fee_payment_runtime_api::{ + dry_run::runtime_decl_for_xcm_dry_run_api::XcmDryRunApiV1, + fees::runtime_decl_for_xcm_payment_api::XcmPaymentApiV1, +}; + +/// We are able to dry-run and estimate the fees for a teleport between relay and system para. +/// Scenario: Alice on Westend relay chain wants to teleport WND to Asset Hub. +/// We want to know the fees using the `XcmDryRunApi` and `XcmPaymentApi`. +#[test] +fn teleport_relay_system_para_works() { + let destination: Location = Parachain(1000).into(); // Asset Hub. + let beneficiary_id = AssetHubWestendReceiver::get(); + let beneficiary: Location = AccountId32 { id: beneficiary_id.clone().into(), network: None } // Test doesn't allow specifying a network here. + .into(); // Beneficiary in Asset Hub. + let teleport_amount = 1_000_000_000_000; // One WND (12 decimals). + let assets: Assets = vec![(Here, teleport_amount).into()].into(); + + // We get them from the Westend closure. + let mut delivery_fees_amount = 0; + let mut remote_message = VersionedXcm::V4(Xcm(Vec::new())); + ::new_ext().execute_with(|| { + type Runtime = ::Runtime; + type RuntimeCall = ::RuntimeCall; + + let call = RuntimeCall::XcmPallet(pallet_xcm::Call::transfer_assets { + dest: Box::new(VersionedLocation::V4(destination.clone())), + beneficiary: Box::new(VersionedLocation::V4(beneficiary)), + assets: Box::new(VersionedAssets::V4(assets)), + fee_asset_item: 0, + weight_limit: Unlimited, + }); + let sender = Alice; // Is the same as `WestendSender`. + let extrinsic = construct_extrinsic_westend(sender, call); + let result = Runtime::dry_run_extrinsic(extrinsic).unwrap(); + assert_eq!(result.forwarded_xcms.len(), 1); + let (destination_to_query, messages_to_query) = &result.forwarded_xcms[0]; + assert_eq!(messages_to_query.len(), 1); + remote_message = messages_to_query[0].clone(); + let delivery_fees = + Runtime::query_delivery_fees(destination_to_query.clone(), remote_message.clone()) + .unwrap(); + delivery_fees_amount = get_amount_from_versioned_assets(delivery_fees); + }); + + // This is set in the AssetHubWestend closure. + let mut remote_execution_fees = 0; + ::execute_with(|| { + type Runtime = ::Runtime; + + let weight = Runtime::query_xcm_weight(remote_message.clone()).unwrap(); + remote_execution_fees = + Runtime::query_weight_to_asset_fee(weight, VersionedAssetId::V4(Parent.into())) + .unwrap(); + }); + + let test_args = TestContext { + sender: WestendSender::get(), // Alice. + receiver: AssetHubWestendReceiver::get(), // Bob in Asset Hub. + args: TestArgs::new_relay(destination, beneficiary_id, teleport_amount), + }; + let mut test = RelayToSystemParaTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + assert_eq!(sender_balance_before, 1_000_000_000_000_000_000); + assert_eq!(receiver_balance_before, 4_096_000_000_000); + + test.set_dispatchable::(transfer_assets); + test.assert(); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + // We now know the exact fees. + assert_eq!( + sender_balance_after, + sender_balance_before - delivery_fees_amount - teleport_amount + ); + assert_eq!( + receiver_balance_after, + receiver_balance_before + teleport_amount - remote_execution_fees + ); +} + +/// We are able to dry-run and estimate the fees for a multi-hop XCM journey. +/// Scenario: Alice on PenpalA has some WND and wants to send them to PenpalB. +/// We want to know the fees using the `XcmDryRunApi` and `XcmPaymentApi`. +#[test] +fn multi_hop_works() { + let destination = PenpalA::sibling_location_of(PenpalB::para_id()); + let sender = PenpalASender::get(); + let amount_to_send = 1_000_000_000_000; // One WND (12 decimals). + let asset_owner = PenpalAssetOwner::get(); + let assets: Assets = (Parent, amount_to_send).into(); + let relay_native_asset_location = RelayLocation::get(); + let sender_as_seen_by_relay = Westend::child_location_of(PenpalA::para_id()); + let sov_of_sender_on_relay = Westend::sovereign_account_id_of(sender_as_seen_by_relay.clone()); + + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner.clone()), + relay_native_asset_location.clone(), + sender.clone(), + amount_to_send * 2, + ); + + // fund the Parachain Origin's SA on Relay Chain with the native tokens held in reserve + Westend::fund_accounts(vec![(sov_of_sender_on_relay.clone().into(), amount_to_send * 2)]); + + // Init values for Parachain Destination + let beneficiary_id = PenpalBReceiver::get(); + let beneficiary: Location = AccountId32 { + id: beneficiary_id.clone().into(), + network: None, // Test doesn't allow specifying a network here. + } + .into(); + + // We get them from the PenpalA closure. + let mut delivery_fees_amount = 0; + let mut remote_message = VersionedXcm::V4(Xcm(Vec::new())); + ::execute_with(|| { + type Runtime = ::Runtime; + type RuntimeCall = ::RuntimeCall; + + let call = RuntimeCall::PolkadotXcm(pallet_xcm::Call::transfer_assets { + dest: Box::new(VersionedLocation::V4(destination.clone())), + beneficiary: Box::new(VersionedLocation::V4(beneficiary)), + assets: Box::new(VersionedAssets::V4(assets.clone())), + fee_asset_item: 0, + weight_limit: Unlimited, + }); + let sender = Alice; // Same as `PenpalASender`. + let extrinsic = construct_extrinsic_penpal(sender, call); + let result = Runtime::dry_run_extrinsic(extrinsic).unwrap(); + assert_eq!(result.forwarded_xcms.len(), 1); + let (destination_to_query, messages_to_query) = &result.forwarded_xcms[0]; + assert_eq!(messages_to_query.len(), 1); + remote_message = messages_to_query[0].clone(); + let delivery_fees = + Runtime::query_delivery_fees(destination_to_query.clone(), remote_message.clone()) + .unwrap(); + delivery_fees_amount = get_amount_from_versioned_assets(delivery_fees); + }); + + // This is set in the Westend closure. + let mut intermediate_execution_fees = 0; + let mut intermediate_delivery_fees_amount = 0; + let mut intermediate_remote_message = VersionedXcm::V4(Xcm::<()>(Vec::new())); + ::execute_with(|| { + type Runtime = ::Runtime; + type RuntimeCall = ::RuntimeCall; + + // First we get the execution fees. + let weight = Runtime::query_xcm_weight(remote_message.clone()).unwrap(); + intermediate_execution_fees = + Runtime::query_weight_to_asset_fee(weight, VersionedAssetId::V4(Here.into())).unwrap(); + + // We have to do this to turn `VersionedXcm<()>` into `VersionedXcm`. + let xcm_program = + VersionedXcm::V4(Xcm::::from(remote_message.clone().try_into().unwrap())); + + // Now we get the delivery fees to the final destination. + let result = + Runtime::dry_run_xcm(sender_as_seen_by_relay.clone().into(), xcm_program).unwrap(); + let (destination_to_query, messages_to_query) = &result.forwarded_xcms[0]; + // There's actually two messages here. + // One created when the message we sent from PenpalA arrived and was executed. + // The second one when we dry-run the xcm. + // We could've gotten the message from the queue without having to dry-run, but + // offchain applications would have to dry-run, so we do it here as well. + intermediate_remote_message = messages_to_query[0].clone(); + let delivery_fees = Runtime::query_delivery_fees( + destination_to_query.clone(), + intermediate_remote_message.clone(), + ) + .unwrap(); + intermediate_delivery_fees_amount = get_amount_from_versioned_assets(delivery_fees); + }); + + // Get the final execution fees in the destination. + let mut final_execution_fees = 0; + ::execute_with(|| { + type Runtime = ::Runtime; + + let weight = Runtime::query_xcm_weight(intermediate_remote_message.clone()).unwrap(); + final_execution_fees = + Runtime::query_weight_to_asset_fee(weight, VersionedAssetId::V4(Parent.into())) + .unwrap(); + }); + + // Dry-running is done. + PenpalA::reset_ext(); + Westend::reset_ext(); + PenpalB::reset_ext(); + + // Fund accounts again. + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + relay_native_asset_location.clone(), + sender.clone(), + amount_to_send * 2, + ); + Westend::fund_accounts(vec![(sov_of_sender_on_relay.into(), amount_to_send * 2)]); + + // Actually run the extrinsic. + let test_args = TestContext { + sender: PenpalASender::get(), // Alice. + receiver: PenpalBReceiver::get(), // Bob in PenpalB. + args: TestArgs::new_para( + destination, + beneficiary_id.clone(), + amount_to_send, + assets, + None, + 0, + ), + }; + let mut test = ParaToParaThroughRelayTest::new(test_args); + + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.clone(), &sender) + }); + let receiver_assets_before = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.clone(), &beneficiary_id) + }); + + test.set_dispatchable::(transfer_assets_para_to_para); + test.assert(); + + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.clone(), &sender) + }); + let receiver_assets_after = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &beneficiary_id) + }); + + // We know the exact fees on every hop. + assert_eq!( + sender_assets_after, + sender_assets_before - amount_to_send - delivery_fees_amount /* This is charged directly + * from the sender's + * account. */ + ); + assert_eq!( + receiver_assets_after, + receiver_assets_before + amount_to_send - + intermediate_execution_fees - + intermediate_delivery_fees_amount - + final_execution_fees + ); +} + +fn get_amount_from_versioned_assets(assets: VersionedAssets) -> u128 { + let latest_assets: Assets = assets.try_into().unwrap(); + let Fungible(amount) = latest_assets.inner()[0].fun else { + unreachable!("asset is fungible"); + }; + amount +} + +fn transfer_assets(test: RelayToSystemParaTest) -> DispatchResult { + ::XcmPallet::transfer_assets( + test.signed_origin, + bx!(test.args.dest.into()), + bx!(test.args.beneficiary.into()), + bx!(test.args.assets.into()), + test.args.fee_asset_item, + test.args.weight_limit, + ) +} + +fn transfer_assets_para_to_para(test: ParaToParaThroughRelayTest) -> DispatchResult { + ::PolkadotXcm::transfer_assets( + test.signed_origin, + bx!(test.args.dest.into()), + bx!(test.args.beneficiary.into()), + bx!(test.args.assets.into()), + test.args.fee_asset_item, + test.args.weight_limit, + ) +} + +// Constructs the SignedExtra component of an extrinsic for the Westend runtime. +fn construct_extrinsic_westend( + sender: sp_keyring::AccountKeyring, + call: westend_runtime::RuntimeCall, +) -> westend_runtime::UncheckedExtrinsic { + type Runtime = ::Runtime; + let account_id = ::AccountId::from(sender.public()); + let tip = 0; + let extra: westend_runtime::SignedExtra = ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(sp_runtime::generic::Era::immortal()), + frame_system::CheckNonce::::from( + frame_system::Pallet::::account(&account_id).nonce, + ), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + ); + let raw_payload = westend_runtime::SignedPayload::new(call, extra).unwrap(); + let signature = raw_payload.using_encoded(|payload| sender.sign(payload)); + let (call, extra, _) = raw_payload.deconstruct(); + westend_runtime::UncheckedExtrinsic::new_signed( + call, + account_id.into(), + MultiSignature::Sr25519(signature), + extra, + ) +} + +// Constructs the SignedExtra component of an extrinsic for the Westend runtime. +fn construct_extrinsic_penpal( + sender: sp_keyring::AccountKeyring, + call: penpal_runtime::RuntimeCall, +) -> penpal_runtime::UncheckedExtrinsic { + type Runtime = ::Runtime; + let account_id = ::AccountId::from(sender.public()); + let tip = 0; + let extra: penpal_runtime::SignedExtra = ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(generic::Era::immortal()), + frame_system::CheckNonce::::from( + frame_system::Pallet::::account(&account_id).nonce, + ), + frame_system::CheckWeight::::new(), + pallet_asset_tx_payment::ChargeAssetTxPayment::::from(tip, None), + ); + type SignedPayload = + generic::SignedPayload; + let raw_payload = SignedPayload::new(call, extra).unwrap(); + let signature = raw_payload.using_encoded(|payload| sender.sign(payload)); + let (call, extra, _) = raw_payload.deconstruct(); + penpal_runtime::UncheckedExtrinsic::new_signed( + call, + account_id.into(), + MultiSignature::Sr25519(signature), + extra, + ) +} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 64abedbaac7..888193c5c6e 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -138,6 +138,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 383751578e5..f81a107fae0 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -100,7 +100,10 @@ use xcm::{ latest::prelude::{AssetId, BodyId}, IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm, }; -use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; +use xcm_fee_payment_runtime_api::{ + dry_run::{Error as XcmDryRunApiError, ExtrinsicDryRunEffects, XcmDryRunEffects}, + fees::Error as XcmPaymentApiError, +}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -1281,7 +1284,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable = vec![ // native token @@ -1320,6 +1323,70 @@ impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::dry_run::XcmDryRunApi for Runtime { + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm_executor::RecordXcm; + use xcm::prelude::*; + + pallet_xcm::Pallet::::set_record_xcm(true); + let result = Executive::apply_extrinsic(extrinsic).map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_extrinsic", + "Applying extrinsic failed with error {:?}", + error, + ); + XcmDryRunApiError::InvalidExtrinsic + })?; + let local_xcm = pallet_xcm::Pallet::::recorded_xcm(); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(ExtrinsicDryRunEffects { + local_xcm: local_xcm.map(VersionedXcm::<()>::V4), + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + + fn dry_run_xcm(origin_location: VersionedLocation, program: VersionedXcm) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm::prelude::*; + + let origin_location: Location = origin_location.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Location version conversion failed with error: {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let program: Xcm = program.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Xcm version conversion failed with error {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let mut hash = program.using_encoded(sp_core::hashing::blake2_256); + let result = xcm_executor::XcmExecutor::::prepare_and_execute( + origin_location, + program, + &mut hash, + Weight::MAX, // Max limit available for execution. + Weight::zero(), + ); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(XcmDryRunEffects { + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index a73c1cc33ea..664d2b9c9dd 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -424,6 +424,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 3ba53eb3f93..bacc9c1b7c2 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -135,6 +135,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e96ba3d962d..b5c3ed5053c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -85,17 +85,24 @@ pub use sp_runtime::BuildStorage; use assets_common::{foreign_creators::ForeignCreators, matching::FromSiblingParachain}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use xcm::{ + prelude::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}, + IntoVersion, +}; + +// We exclude `Assets` since it's the name of a pallet +use xcm::latest::prelude::AssetId; #[cfg(feature = "runtime-benchmarks")] use xcm::latest::prelude::{ Asset, Fungible, Here, InteriorLocation, Junction, Junction::*, Location, NetworkId, NonFungible, Parent, ParentThen, Response, XCM_VERSION, }; -use xcm::{ - latest::prelude::AssetId, IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, - VersionedXcm, + +use xcm_fee_payment_runtime_api::{ + dry_run::{Error as XcmDryRunApiError, ExtrinsicDryRunEffects, XcmDryRunEffects}, + fees::Error as XcmPaymentApiError, }; -use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -1311,6 +1318,109 @@ impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { + let acceptable = vec![ + // native token + VersionedAssetId::from(AssetId(xcm_config::WestendLocation::get())) + ]; + + Ok(acceptable + .into_iter() + .filter_map(|asset| asset.into_version(xcm_version).ok()) + .collect()) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + match asset.try_as::() { + Ok(asset_id) if asset_id.0 == xcm_config::WestendLocation::get() => { + // for native token + Ok(WeightToFee::weight_to_fee(&weight)) + }, + Ok(asset_id) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + Err(XcmPaymentApiError::AssetNotFound) + }, + Err(_) => { + log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + Err(XcmPaymentApiError::VersionedConversionFailed) + } + } + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_xcm_weight(message) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_delivery_fees(destination, message) + } + } + + impl xcm_fee_payment_runtime_api::dry_run::XcmDryRunApi for Runtime { + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm_executor::RecordXcm; + use xcm::prelude::*; + + pallet_xcm::Pallet::::set_record_xcm(true); + let result = Executive::apply_extrinsic(extrinsic).map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_extrinsic", + "Applying extrinsic failed with error {:?}", + error, + ); + XcmDryRunApiError::InvalidExtrinsic + })?; + let local_xcm = pallet_xcm::Pallet::::recorded_xcm(); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(ExtrinsicDryRunEffects { + local_xcm: local_xcm.map(VersionedXcm::<()>::V4), + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + + fn dry_run_xcm(origin_location: VersionedLocation, program: VersionedXcm) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm::prelude::*; + + let origin_location: Location = origin_location.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Location version conversion failed with error: {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let program: Xcm = program.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Xcm version conversion failed with error {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let mut hash = program.using_encoded(sp_core::hashing::blake2_256); + let result = xcm_executor::XcmExecutor::::prepare_and_execute( + origin_location, + program, + &mut hash, + Weight::MAX, // Max limit available for execution. + Weight::zero(), + ); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(XcmDryRunEffects { + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi for Runtime { @@ -1374,45 +1484,6 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { - fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { - let acceptable = vec![ - // native token - VersionedAssetId::from(AssetId(xcm_config::WestendLocation::get())) - ]; - - Ok(acceptable - .into_iter() - .filter_map(|asset| asset.into_version(xcm_version).ok()) - .collect()) - } - - fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { - match asset.try_as::() { - Ok(asset_id) if asset_id.0 == xcm_config::WestendLocation::get() => { - // for native token - Ok(WeightToFee::weight_to_fee(&weight)) - }, - Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); - Err(XcmPaymentApiError::AssetNotFound) - }, - Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); - Err(XcmPaymentApiError::VersionedConversionFailed) - } - } - } - - fn query_xcm_weight(message: VersionedXcm<()>) -> Result { - PolkadotXcm::query_xcm_weight(message) - } - - fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { - PolkadotXcm::query_delivery_fees(destination, message) - } - } - impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index d610bfd768c..35a42627ad7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -440,6 +440,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index bd1445bee22..a0d2e91dffd 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -239,6 +239,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } pub type PriceForParentDelivery = diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index f147cd9653f..c2ca8e47f2a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -206,6 +206,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } pub type PriceForParentDelivery = diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs index 84697c3e363..c68f230a16d 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs @@ -220,6 +220,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index ac15ac5b0f0..8c337101986 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -202,6 +202,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs index 9095b5b1caa..c16b40b8675 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs @@ -224,6 +224,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. Forms the basis for local origins diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs index defc57e2d7f..b12765870bf 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs @@ -232,6 +232,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. Forms the basis for local origins diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs index 9d438a41f8f..d1fb50c1ab0 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs @@ -91,6 +91,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs index 101d9a180e5..cca964fb244 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs @@ -230,6 +230,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. Forms the basis for local origins diff --git a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs index 0a903f91505..3926ddcf21e 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs @@ -238,6 +238,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Converts a local signed origin into an XCM location. Forms the basis for local origins diff --git a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs index 7f9de0f64b3..741b3bcd752 100644 --- a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs @@ -91,6 +91,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index 028aa002a91..4ebb95f26cf 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -64,6 +64,7 @@ polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", def xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } # Cumulus cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } @@ -134,6 +135,7 @@ std = [ "substrate-wasm-builder", "xcm-builder/std", "xcm-executor/std", + "xcm-fee-payment-runtime-api/std", "xcm/std", ] @@ -164,6 +166,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs index 89885d77378..582154fec6d 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs @@ -32,6 +32,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; +use codec::Encode; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -44,7 +45,7 @@ use frame_support::{ AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, Everything, TransformOrigin, }, weights::{ - constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, FeePolynomial, + constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, FeePolynomial, WeightToFee as _, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, }, PalletId, @@ -80,7 +81,14 @@ pub use sp_runtime::BuildStorage; use parachains_common::{AccountId, Signature}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; -use xcm::latest::prelude::{AssetId as AssetLocationId, BodyId}; +use xcm::{ + latest::prelude::{AssetId as AssetLocationId, BodyId}, + IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm, +}; +use xcm_fee_payment_runtime_api::{ + dry_run::{Error as XcmDryRunApiError, ExtrinsicDryRunEffects, XcmDryRunEffects}, + fees::Error as XcmPaymentApiError, +}; /// Balance of an account. pub type Balance = u128; @@ -835,6 +843,101 @@ impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { + if !matches!(xcm_version, 3 | 4) { + return Err(XcmPaymentApiError::UnhandledXcmVersion); + } + Ok([VersionedAssetId::V4(xcm_config::RelayLocation::get().into())] + .into_iter() + .filter_map(|asset| asset.into_version(xcm_version).ok()) + .collect()) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + let local_asset = VersionedAssetId::V4(xcm_config::RelayLocation::get().into()); + let asset = asset + .into_version(4) + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; + + if asset != local_asset { return Err(XcmPaymentApiError::AssetNotFound); } + + Ok(WeightToFee::weight_to_fee(&weight)) + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_xcm_weight(message) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + PolkadotXcm::query_delivery_fees(destination, message) + } + } + + impl xcm_fee_payment_runtime_api::dry_run::XcmDryRunApi for Runtime { + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm_executor::RecordXcm; + use xcm::prelude::*; + + pallet_xcm::Pallet::::set_record_xcm(true); + let result = Executive::apply_extrinsic(extrinsic).map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_extrinsic", + "Applying extrinsic failed with error {:?}", + error, + ); + XcmDryRunApiError::InvalidExtrinsic + })?; + let local_xcm = pallet_xcm::Pallet::::recorded_xcm(); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(ExtrinsicDryRunEffects { + local_xcm: local_xcm.map(VersionedXcm::<()>::V4), + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + + fn dry_run_xcm(origin_location: VersionedLocation, program: VersionedXcm) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm::prelude::*; + + let origin_location: Location = origin_location.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Location version conversion failed with error: {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let program: Xcm = program.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Xcm version conversion failed with error {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let mut hash = program.using_encoded(sp_core::hashing::blake2_256); + let result = xcm_executor::XcmExecutor::::prepare_and_execute( + origin_location, + program, + &mut hash, + Weight::MAX, // Max limit. + Weight::zero(), + ); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(XcmDryRunEffects { + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs index 711041f6d6e..08a2da260c5 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -362,6 +362,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Multiplier used for dedicated `TakeFirstAssetTrader` with `ForeignAssets` instance. diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index e762cec9093..f22e900ba9e 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -490,6 +490,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// Local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/cumulus/primitives/utility/src/lib.rs b/cumulus/primitives/utility/src/lib.rs index 54f40bd0109..64784eb36f8 100644 --- a/cumulus/primitives/utility/src/lib.rs +++ b/cumulus/primitives/utility/src/lib.rs @@ -34,8 +34,8 @@ use sp_runtime::{ SaturatedConversion, }; use sp_std::{marker::PhantomData, prelude::*}; -use xcm::{latest::prelude::*, WrapVersion}; -use xcm_builder::TakeRevenue; +use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm, WrapVersion}; +use xcm_builder::{InspectMessageQueues, TakeRevenue}; use xcm_executor::{ traits::{MatchesFungibles, TransactAsset, WeightTrader}, AssetsInHolding, @@ -93,6 +93,14 @@ where } } +impl InspectMessageQueues + for ParentAsUmp +{ + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + T::get_messages() + } +} + /// Contains information to handle refund/payment for xcm-execution #[derive(Clone, Eq, PartialEq, Debug)] struct AssetTraderRefunder { diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 9688ab55647..7c010778d50 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -206,6 +206,7 @@ runtime-benchmarks = [ "service/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "westend-runtime?/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ "frame-support/try-runtime", diff --git a/polkadot/node/service/src/fake_runtime_api.rs b/polkadot/node/service/src/fake_runtime_api.rs index 89613040dca..5c889552a6a 100644 --- a/polkadot/node/service/src/fake_runtime_api.rs +++ b/polkadot/node/service/src/fake_runtime_api.rs @@ -398,20 +398,30 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { - fn query_acceptable_payment_assets(_: xcm::Version) -> Result, xcm_fee_payment_runtime_api::Error> { + impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(_: xcm::Version) -> Result, xcm_fee_payment_runtime_api::fees::Error> { unimplemented!() } - fn query_weight_to_asset_fee(_: Weight, _: VersionedAssetId) -> Result { + fn query_weight_to_asset_fee(_: Weight, _: VersionedAssetId) -> Result { unimplemented!() } - fn query_xcm_weight(_: VersionedXcm<()>) -> Result { + fn query_xcm_weight(_: VersionedXcm<()>) -> Result { unimplemented!() } - fn query_delivery_fees(_: VersionedLocation, _: VersionedXcm<()>) -> Result { + fn query_delivery_fees(_: VersionedLocation, _: VersionedXcm<()>) -> Result { + unimplemented!() + } + } + + impl xcm_fee_payment_runtime_api::dry_run::XcmDryRunApi for Runtime { + fn dry_run_extrinsic(_: ::Extrinsic) -> Result, xcm_fee_payment_runtime_api::dry_run::Error> { + unimplemented!() + } + + fn dry_run_xcm(_: VersionedLocation, _: VersionedXcm<()>) -> Result, xcm_fee_payment_runtime_api::dry_run::Error> { unimplemented!() } } diff --git a/polkadot/runtime/common/src/xcm_sender.rs b/polkadot/runtime/common/src/xcm_sender.rs index a712d4381f7..cbec1a8ca10 100644 --- a/polkadot/runtime/common/src/xcm_sender.rs +++ b/polkadot/runtime/common/src/xcm_sender.rs @@ -18,7 +18,7 @@ use frame_support::traits::Get; use frame_system::pallet_prelude::BlockNumberFor; -use parity_scale_codec::Encode; +use parity_scale_codec::{Decode, Encode}; use primitives::Id as ParaId; use runtime_parachains::{ configuration::{self, HostConfiguration}, @@ -27,6 +27,7 @@ use runtime_parachains::{ use sp_runtime::FixedPointNumber; use sp_std::{marker::PhantomData, prelude::*}; use xcm::prelude::*; +use xcm_builder::InspectMessageQueues; use SendError::*; /// Simple value-bearing trait for determining/expressing the assets required to be paid for a @@ -138,6 +139,24 @@ where } } +impl InspectMessageQueues for ChildParachainRouter { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + dmp::DownwardMessageQueues::::iter() + .map(|(para_id, messages)| { + let decoded_messages: Vec> = messages + .iter() + .map(|downward_message| { + let message = VersionedXcm::<()>::decode(&mut &downward_message.msg[..]).unwrap(); + log::trace!(target: "xcm::DownwardMessageQueues::get_messages", "Message: {:?}, sent at: {:?}", message, downward_message.sent_at); + message + }) + .collect(); + (VersionedLocation::V4(Parachain(para_id.into()).into()), decoded_messages) + }) + .collect() + } +} + /// Implementation of `xcm_builder::EnsureDelivery` which helps to ensure delivery to the /// `ParaId` parachain (sibling or child). Deposits existential deposit for origin (if needed). /// Deposits estimated fee to the origin account (if needed). diff --git a/polkadot/runtime/parachains/src/dmp.rs b/polkadot/runtime/parachains/src/dmp.rs index 354b16cc3f0..df2f93e1942 100644 --- a/polkadot/runtime/parachains/src/dmp.rs +++ b/polkadot/runtime/parachains/src/dmp.rs @@ -119,7 +119,7 @@ pub mod pallet { /// The downward messages addressed for a certain para. #[pallet::storage] - pub(crate) type DownwardMessageQueues = StorageMap< + pub type DownwardMessageQueues = StorageMap< _, Twox64Concat, ParaId, diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index bbe19310f97..f4d8fb51b3f 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -268,6 +268,7 @@ runtime-benchmarks = [ "sp-staking/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ "frame-executive/try-runtime", diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 3b2cbc88dc3..22e6183e594 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -134,7 +134,10 @@ use governance::{ pallet_custom_origins, AuctionAdmin, Fellows, GeneralAdmin, LeaseAdmin, Treasurer, TreasurySpender, }; -use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; +use xcm_fee_payment_runtime_api::{ + dry_run::{Error as XcmDryRunApiError, ExtrinsicDryRunEffects, XcmDryRunEffects}, + fees::Error as XcmPaymentApiError, +}; #[cfg(test)] mod tests; @@ -1764,7 +1767,7 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable = vec![ // native token @@ -1803,6 +1806,66 @@ sp_api::impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::dry_run::XcmDryRunApi for Runtime { + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm_executor::RecordXcm; + pallet_xcm::Pallet::::set_record_xcm(true); + let result = Executive::apply_extrinsic(extrinsic).map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_extrinsic", + "Applying extrinsic failed with error {:?}", + error, + ); + XcmDryRunApiError::InvalidExtrinsic + })?; + let local_xcm = pallet_xcm::Pallet::::recorded_xcm(); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(ExtrinsicDryRunEffects { + local_xcm: local_xcm.map(VersionedXcm::<()>::V4), + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + + fn dry_run_xcm(origin_location: VersionedLocation, xcm: VersionedXcm) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + let origin_location: Location = origin_location.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Location version conversion failed with error: {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let xcm: Xcm = xcm.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Xcm version conversion failed with error {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let result = xcm_executor::XcmExecutor::::prepare_and_execute( + origin_location, + xcm, + &mut hash, + Weight::MAX, // Max limit available for execution. + Weight::zero(), + ); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(XcmDryRunEffects { + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + } + impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { OpaqueMetadata::new(Runtime::metadata().into()) diff --git a/polkadot/runtime/rococo/src/xcm_config.rs b/polkadot/runtime/rococo/src/xcm_config.rs index c7063bd7ad6..decbc795143 100644 --- a/polkadot/runtime/rococo/src/xcm_config.rs +++ b/polkadot/runtime/rococo/src/xcm_config.rs @@ -224,6 +224,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } parameter_types! { diff --git a/polkadot/runtime/test-runtime/src/xcm_config.rs b/polkadot/runtime/test-runtime/src/xcm_config.rs index 8411b79f252..fc3d0dc42a3 100644 --- a/polkadot/runtime/test-runtime/src/xcm_config.rs +++ b/polkadot/runtime/test-runtime/src/xcm_config.rs @@ -156,6 +156,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } impl pallet_xcm::Config for crate::Runtime { diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index d726adfb8e6..f02cae0e9d4 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -283,6 +283,7 @@ runtime-benchmarks = [ "sp-staking/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ "frame-election-provider-support/try-runtime", diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 8ae95e6e1a8..cae12ab49c0 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -108,7 +108,10 @@ use xcm::{ }; use xcm_builder::PayOverXcm; -use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; +use xcm_fee_payment_runtime_api::{ + dry_run::{Error as XcmDryRunApiError, ExtrinsicDryRunEffects, XcmDryRunEffects}, + fees::Error as XcmPaymentApiError, +}; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; @@ -2198,7 +2201,7 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable = vec![ // native token @@ -2237,6 +2240,66 @@ sp_api::impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::dry_run::XcmDryRunApi for Runtime { + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + use xcm_executor::RecordXcm; + pallet_xcm::Pallet::::set_record_xcm(true); + let result = Executive::apply_extrinsic(extrinsic).map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_extrinsic", + "Applying extrinsic failed with error {:?}", + error, + ); + XcmDryRunApiError::InvalidExtrinsic + })?; + let local_xcm = pallet_xcm::Pallet::::recorded_xcm(); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(ExtrinsicDryRunEffects { + local_xcm: local_xcm.map(VersionedXcm::<()>::V4), + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + + fn dry_run_xcm(origin_location: VersionedLocation, xcm: VersionedXcm) -> Result, XcmDryRunApiError> { + use xcm_builder::InspectMessageQueues; + let origin_location: Location = origin_location.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Location version conversion failed with error: {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let xcm: Xcm = xcm.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Xcm version conversion failed with error {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let result = xcm_executor::XcmExecutor::::prepare_and_execute( + origin_location, + xcm, + &mut hash, + Weight::MAX, // Max limit available for execution. + Weight::zero(), + ); + let forwarded_xcms = xcm_config::XcmRouter::get_messages(); + let events: Vec = System::read_events_no_consensus().map(|record| record.event.clone()).collect(); + Ok(XcmDryRunEffects { + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + } + impl pallet_nomination_pools_runtime_api::NominationPoolsApi< Block, AccountId, diff --git a/polkadot/runtime/westend/src/xcm_config.rs b/polkadot/runtime/westend/src/xcm_config.rs index f661c4b0e4f..c6c5fb9e72a 100644 --- a/polkadot/runtime/westend/src/xcm_config.rs +++ b/polkadot/runtime/westend/src/xcm_config.rs @@ -222,6 +222,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } parameter_types! { diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs index 7233b46d0cd..c0dfa91afc7 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs @@ -120,6 +120,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } impl crate::Config for Test { diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs index a9f4d37d7a5..f51d3409261 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs @@ -110,6 +110,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } parameter_types! { diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index 460597e6649..fc4d23426fb 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -69,6 +69,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", + "xcm-fee-payment-runtime-api/runtime-benchmarks", ] try-runtime = [ "frame-support/try-runtime", diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index af3b66121ea..37fc121ba21 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -61,7 +61,7 @@ use xcm_executor::{ }, AssetsInHolding, }; -use xcm_fee_payment_runtime_api::Error as FeePaymentError; +use xcm_fee_payment_runtime_api::fees::Error as XcmPaymentApiError; #[cfg(any(feature = "try-runtime", test))] use sp_runtime::TryRuntimeError; @@ -764,6 +764,25 @@ pub mod pallet { #[pallet::storage] pub(super) type XcmExecutionSuspended = StorageValue<_, bool, ValueQuery>; + /// Whether or not incoming XCMs (both executed locally and received) should be recorded. + /// Only one XCM program will be recorded at a time. + /// This is meant to be used in runtime APIs, and it's advised it stays false + /// for all other use cases, so as to not degrade regular performance. + /// + /// Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + /// implementation in the XCM executor configuration. + #[pallet::storage] + pub(crate) type ShouldRecordXcm = StorageValue<_, bool, ValueQuery>; + + /// If [`ShouldRecordXcm`] is set to true, then the last XCM program executed locally + /// will be stored here. + /// Runtime APIs can fetch the XCM that was executed by accessing this value. + /// + /// Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + /// implementation in the XCM executor configuration. + #[pallet::storage] + pub(crate) type RecordedXcm = StorageValue<_, Xcm<()>>; + #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] @@ -2413,35 +2432,37 @@ impl Pallet { AccountIdConversion::::into_account_truncating(&ID) } - pub fn query_xcm_weight(message: VersionedXcm<()>) -> Result { - let message = - Xcm::<()>::try_from(message).map_err(|_| FeePaymentError::VersionedConversionFailed)?; + pub fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + let message = Xcm::<()>::try_from(message) + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; T::Weigher::weight(&mut message.into()).map_err(|()| { log::error!(target: "xcm::pallet_xcm::query_xcm_weight", "Error when querying XCM weight"); - FeePaymentError::WeightNotComputable + XcmPaymentApiError::WeightNotComputable }) } pub fn query_delivery_fees( destination: VersionedLocation, message: VersionedXcm<()>, - ) -> Result { + ) -> Result { let result_version = destination.identify_version().max(message.identify_version()); - let destination = - destination.try_into().map_err(|_| FeePaymentError::VersionedConversionFailed)?; + let destination = destination + .try_into() + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; - let message = message.try_into().map_err(|_| FeePaymentError::VersionedConversionFailed)?; + let message = + message.try_into().map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; let (_, fees) = validate_send::(destination, message).map_err(|error| { log::error!(target: "xcm::pallet_xcm::query_delivery_fees", "Error when querying delivery fees: {:?}", error); - FeePaymentError::Unroutable + XcmPaymentApiError::Unroutable })?; VersionedAssets::from(fees) .into_version(result_version) - .map_err(|_| FeePaymentError::VersionedConversionFailed) + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed) } /// Create a new expectation of a query response with the querier being here. @@ -3105,6 +3126,24 @@ impl CheckSuspension for Pallet { } } +impl xcm_executor::traits::RecordXcm for Pallet { + fn should_record() -> bool { + ShouldRecordXcm::::get() + } + + fn set_record_xcm(enabled: bool) { + ShouldRecordXcm::::put(enabled); + } + + fn recorded_xcm() -> Option> { + RecordedXcm::::get() + } + + fn record(xcm: Xcm<()>) { + RecordedXcm::::put(xcm); + } +} + /// Ensure that the origin `o` represents an XCM (`Transact`) origin. /// /// Returns `Ok` with the location of the XCM sender or an `Err` otherwise. diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index 8e94803e843..b3b7529217f 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -531,6 +531,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/polkadot/xcm/pallet-xcm/src/tests/mod.rs b/polkadot/xcm/pallet-xcm/src/tests/mod.rs index 782c8bed478..02aeafd68e8 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/mod.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/mod.rs @@ -21,8 +21,8 @@ pub(crate) mod assets_transfer; use crate::{ mock::*, pallet::SupportedVersion, AssetTraps, Config, CurrentMigration, Error, ExecuteControllerWeightInfo, LatestVersionedLocation, Pallet, Queries, QueryStatus, - VersionDiscoveryQueue, VersionMigrationStage, VersionNotifiers, VersionNotifyTargets, - WeightInfo, + RecordedXcm, ShouldRecordXcm, VersionDiscoveryQueue, VersionMigrationStage, VersionNotifiers, + VersionNotifyTargets, WeightInfo, }; use frame_support::{ assert_err_ignore_postinfo, assert_noop, assert_ok, @@ -1245,3 +1245,35 @@ fn multistage_migration_works() { assert!(Pallet::::do_try_state().is_ok()); }) } + +#[test] +fn record_xcm_works() { + let balances = vec![(ALICE, INITIAL_BALANCE)]; + new_test_ext_with_balances(balances).execute_with(|| { + let message = Xcm::::builder() + .withdraw_asset((Here, SEND_AMOUNT)) + .buy_execution((Here, SEND_AMOUNT), Unlimited) + .deposit_asset(AllCounted(1), Junction::AccountId32 { network: None, id: BOB.into() }) + .build(); + // Test default values. + assert_eq!(ShouldRecordXcm::::get(), false); + assert_eq!(RecordedXcm::::get(), None); + + // By default the message won't be recorded. + assert_ok!(XcmPallet::execute( + RuntimeOrigin::signed(ALICE), + Box::new(VersionedXcm::from(message.clone())), + BaseXcmWeight::get() * 3, + )); + assert_eq!(RecordedXcm::::get(), None); + + // We explicitly set the record flag to true so we record the XCM. + ShouldRecordXcm::::put(true); + assert_ok!(XcmPallet::execute( + RuntimeOrigin::signed(ALICE), + Box::new(VersionedXcm::from(message.clone())), + BaseXcmWeight::get() * 3, + )); + assert_eq!(RecordedXcm::::get(), Some(message.into())); + }); +} diff --git a/polkadot/xcm/xcm-builder/src/lib.rs b/polkadot/xcm/xcm-builder/src/lib.rs index 1ba38d0db83..cc06c298a41 100644 --- a/polkadot/xcm/xcm-builder/src/lib.rs +++ b/polkadot/xcm/xcm-builder/src/lib.rs @@ -120,7 +120,9 @@ mod process_xcm_message; pub use process_xcm_message::ProcessXcmMessage; mod routing; -pub use routing::{EnsureDecodableXcm, EnsureDelivery, WithTopicSource, WithUniqueTopic}; +pub use routing::{ + EnsureDecodableXcm, EnsureDelivery, InspectMessageQueues, WithTopicSource, WithUniqueTopic, +}; mod transactional; pub use transactional::FrameTransactionalProcessor; diff --git a/polkadot/xcm/xcm-builder/src/routing.rs b/polkadot/xcm/xcm-builder/src/routing.rs index 921b9ac5922..5c284aaf147 100644 --- a/polkadot/xcm/xcm-builder/src/routing.rs +++ b/polkadot/xcm/xcm-builder/src/routing.rs @@ -18,7 +18,7 @@ use frame_system::unique; use parity_scale_codec::Encode; -use sp_std::{marker::PhantomData, result::Result}; +use sp_std::{marker::PhantomData, result::Result, vec::Vec}; use xcm::prelude::*; use xcm_executor::{traits::FeeReason, FeesMode}; @@ -60,6 +60,11 @@ impl SendXcm for WithUniqueTopic { Ok(unique_id) } } +impl InspectMessageQueues for WithUniqueTopic { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + Inner::get_messages() + } +} pub trait SourceTopic { fn source_topic(entropy: impl Encode) -> XcmHash; @@ -140,6 +145,26 @@ impl EnsureDelivery for Tuple { } } +/// Inspects messages in queues. +/// Meant to be used in runtime APIs, not in runtimes. +pub trait InspectMessageQueues { + /// Get queued messages and their destinations. + fn get_messages() -> Vec<(VersionedLocation, Vec>)>; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl InspectMessageQueues for Tuple { + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + let mut messages = Vec::new(); + + for_tuples!( #( + messages.append(&mut Tuple::get_messages()); + )* ); + + messages + } +} + /// A wrapper router that attempts to *encode* and *decode* passed XCM `message` to ensure that the /// receiving side will be able to decode, at least with the same XCM version. /// diff --git a/polkadot/xcm/xcm-builder/src/tests/mock.rs b/polkadot/xcm/xcm-builder/src/tests/mock.rs index 7532b97d97b..f45650ec540 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mock.rs @@ -748,6 +748,7 @@ impl Config for TestConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } pub fn fungible_multi_asset(location: Location, amount: u128) -> Asset { diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs index 019113a12b2..34b204b434d 100644 --- a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs @@ -221,6 +221,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } parameter_types! { diff --git a/polkadot/xcm/xcm-builder/src/universal_exports.rs b/polkadot/xcm/xcm-builder/src/universal_exports.rs index d0e3ef3032e..04ceb7e5168 100644 --- a/polkadot/xcm/xcm-builder/src/universal_exports.rs +++ b/polkadot/xcm/xcm-builder/src/universal_exports.rs @@ -16,6 +16,7 @@ //! Traits and utilities to help with origin mutation and bridging. +use crate::InspectMessageQueues; use frame_support::{ensure, traits::Get}; use parity_scale_codec::{Decode, Encode}; use sp_std::{convert::TryInto, marker::PhantomData, prelude::*}; @@ -335,6 +336,14 @@ impl InspectMessageQueues + for SovereignPaidRemoteExporter +{ + fn get_messages() -> Vec<(VersionedLocation, Vec>)> { + Router::get_messages() + } +} + pub trait DispatchBlob { /// Takes an incoming blob from over some point-to-point link (usually from some sort of /// inter-consensus bridge) and then does what needs to be done with it. Usually this means diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index 46ec23beebc..45bfba23556 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -209,6 +209,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/polkadot/xcm/xcm-executor/src/config.rs b/polkadot/xcm/xcm-executor/src/config.rs index b296d32ca2a..63b113bc250 100644 --- a/polkadot/xcm/xcm-executor/src/config.rs +++ b/polkadot/xcm/xcm-executor/src/config.rs @@ -17,8 +17,8 @@ use crate::traits::{ AssetExchange, AssetLock, CallDispatcher, ClaimAssets, ConvertOrigin, DropAssets, ExportXcm, FeeManager, HandleHrmpChannelAccepted, HandleHrmpChannelClosing, - HandleHrmpNewChannelOpenRequest, OnResponse, ProcessTransaction, ShouldExecute, TransactAsset, - VersionChangeNotifier, WeightBounds, WeightTrader, + HandleHrmpNewChannelOpenRequest, OnResponse, ProcessTransaction, RecordXcm, ShouldExecute, + TransactAsset, VersionChangeNotifier, WeightBounds, WeightTrader, }; use frame_support::{ dispatch::{GetDispatchInfo, Parameter, PostDispatchInfo}, @@ -122,4 +122,6 @@ pub trait Config { type HrmpChannelAcceptedHandler: HandleHrmpChannelAccepted; /// Allows optional logic execution for the `HrmpChannelClosing` XCM notification. type HrmpChannelClosingHandler: HandleHrmpChannelClosing; + /// Allows recording the last executed XCM (used by dry-run runtime APIs). + type XcmRecorder: RecordXcm; } diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index a7052328da0..e0b8a8a9c73 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -37,6 +37,8 @@ use traits::{ XcmAssetTransfers, }; +pub use traits::RecordXcm; + mod assets; pub use assets::AssetsInHolding; mod config; @@ -211,6 +213,13 @@ impl ExecuteXcm for XcmExecutor. + +//! Trait for recording XCMs and a dummy implementation. + +use xcm::latest::Xcm; + +/// Trait for recording XCMs. +pub trait RecordXcm { + /// Whether or not we should record incoming XCMs. + fn should_record() -> bool; + /// Enable or disable recording. + fn set_record_xcm(enabled: bool); + /// Get recorded XCM. + /// Returns `None` if no message was sent, or if recording was off. + fn recorded_xcm() -> Option>; + /// Record `xcm`. + fn record(xcm: Xcm<()>); +} + +impl RecordXcm for () { + fn should_record() -> bool { + false + } + + fn set_record_xcm(_: bool) {} + + fn recorded_xcm() -> Option> { + None + } + + fn record(_: Xcm<()>) {} +} diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml b/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml index 30c7c0bac14..cec76e7327e 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml @@ -26,15 +26,46 @@ sp-weights = { path = "../../../substrate/primitives/weights", default-features xcm = { package = "staging-xcm", path = "../", default-features = false } frame-support = { path = "../../../substrate/frame/support", default-features = false } +[dev-dependencies] +frame-system = { path = "../../../substrate/frame/system", default-features = false } +pallet-xcm = { path = "../pallet-xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../xcm-builder", default-features = false } +sp-io = { path = "../../../substrate/primitives/io", default-features = false } +pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } +pallet-assets = { path = "../../../substrate/frame/assets", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../xcm-executor", default-features = false } +frame-executive = { path = "../../../substrate/frame/executive", default-features = false } +log = { workspace = true } +env_logger = "0.9.0" + [features] default = ["std"] std = [ "codec/std", + "frame-executive/std", "frame-support/std", + "frame-system/std", + "log/std", + "pallet-assets/std", + "pallet-balances/std", + "pallet-xcm/std", "scale-info/std", "sp-api/std", + "sp-io/std", "sp-runtime/std", "sp-std/std", "sp-weights/std", + "xcm-builder/std", + "xcm-executor/std", "xcm/std", ] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-assets/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/dry_run.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/src/dry_run.rs new file mode 100644 index 00000000000..62a422d6efe --- /dev/null +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/src/dry_run.rs @@ -0,0 +1,83 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Runtime API definition for dry-running XCM-related extrinsics. +//! This API can be used to simulate XCMs and, for example, find the fees +//! that need to be paid. + +use codec::{Decode, Encode}; +use frame_support::pallet_prelude::{DispatchResult, TypeInfo}; +use sp_runtime::traits::Block as BlockT; +use sp_std::vec::Vec; +use xcm::prelude::*; + +/// Effects of dry-running an extrinsic. +#[derive(Encode, Decode, Debug, TypeInfo)] +pub struct ExtrinsicDryRunEffects { + /// The result of executing the extrinsic. + pub execution_result: DispatchResult, + /// The list of events fired by the extrinsic. + pub emitted_events: Vec, + /// The local XCM that was attempted to be executed, if any. + pub local_xcm: Option>, + /// The list of XCMs that were queued for sending. + pub forwarded_xcms: Vec<(VersionedLocation, Vec>)>, +} + +/// Effects of dry-running an XCM program. +#[derive(Encode, Decode, Debug, TypeInfo)] +pub struct XcmDryRunEffects { + /// The outcome of the XCM program execution. + pub execution_result: Outcome, + /// List of events fired by the XCM program execution. + pub emitted_events: Vec, + /// List of queued messages for sending. + pub forwarded_xcms: Vec<(VersionedLocation, Vec>)>, +} + +sp_api::decl_runtime_apis! { + /// API for dry-running extrinsics and XCM programs to get the programs that need to be passed to the fees API. + /// + /// All calls return a vector of tuples (location, xcm) where each "xcm" is executed in "location". + /// If there's local execution, the location will be "Here". + /// This vector can be used to calculate both execution and delivery fees. + /// + /// Extrinsics or XCMs might fail when executed, this doesn't mean the result of these calls will be an `Err`. + /// In those cases, there might still be a valid result, with the execution error inside it. + /// The only reasons why these calls might return an error are listed in the [`Error`] enum. + pub trait XcmDryRunApi { + /// Dry run extrinsic. + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, Error>; + + /// Dry run XCM program + fn dry_run_xcm(origin_location: VersionedLocation, xcm: VersionedXcm) -> Result, Error>; + } +} + +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] +pub enum Error { + /// An API call is unsupported. + #[codec(index = 0)] + Unimplemented, + + /// Converting a versioned data structure from one version to another failed. + #[codec(index = 1)] + VersionedConversionFailed, + + /// Extrinsic was invalid. + #[codec(index = 2)] + InvalidExtrinsic, +} diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/fees.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/src/fees.rs new file mode 100644 index 00000000000..572d4edf533 --- /dev/null +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/src/fees.rs @@ -0,0 +1,97 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Runtime API definition for getting XCM fees. + +use codec::{Decode, Encode}; +use frame_support::pallet_prelude::TypeInfo; +use sp_std::vec::Vec; +use sp_weights::Weight; +use xcm::{Version, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; + +sp_api::decl_runtime_apis! { + /// A trait of XCM payment API. + /// + /// API provides functionality for obtaining: + /// + /// * the weight required to execute an XCM message, + /// * a list of acceptable `AssetId`s for message execution payment, + /// * the cost of the weight in the specified acceptable `AssetId`. + /// * the fees for an XCM message delivery. + /// + /// To determine the execution weight of the calls required for + /// [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. + pub trait XcmPaymentApi { + /// Returns a list of acceptable payment assets. + /// + /// # Arguments + /// + /// * `xcm_version`: Version. + fn query_acceptable_payment_assets(xcm_version: Version) -> Result, Error>; + + /// Returns a weight needed to execute a XCM. + /// + /// # Arguments + /// + /// * `message`: `VersionedXcm`. + fn query_xcm_weight(message: VersionedXcm<()>) -> Result; + + /// Converts a weight into a fee for the specified `AssetId`. + /// + /// # Arguments + /// + /// * `weight`: convertible `Weight`. + /// * `asset`: `VersionedAssetId`. + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result; + + /// Get delivery fees for sending a specific `message` to a `destination`. + /// These always come in a specific asset, defined by the chain. + /// + /// # Arguments + /// * `message`: The message that'll be sent, necessary because most delivery fees are based on the + /// size of the message. + /// * `destination`: The destination to send the message to. Different destinations may use + /// different senders that charge different fees. + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result; + } +} + +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] +pub enum Error { + /// An API part is unsupported. + #[codec(index = 0)] + Unimplemented, + + /// Converting a versioned data structure from one version to another failed. + #[codec(index = 1)] + VersionedConversionFailed, + + /// XCM message weight calculation failed. + #[codec(index = 2)] + WeightNotComputable, + + /// XCM version not able to be handled. + #[codec(index = 3)] + UnhandledXcmVersion, + + /// The given asset is not handled as a fee asset. + #[codec(index = 4)] + AssetNotFound, + + /// Destination is known to be unroutable. + #[codec(index = 5)] + Unroutable, +} diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs index 50fd4692cb0..616ee4c2ecc 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs @@ -14,86 +14,19 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Runtime API definition for xcm transaction payment. +//! Runtime APIs for estimating xcm fee payment. +//! This crate offers two APIs, one for estimating fees, +//! which can be used for any type of message, and another one +//! for returning the specific messages used for transfers, a common +//! feature. +//! Users of these APIs should call the transfers API and pass the result to the +//! fees API. #![cfg_attr(not(feature = "std"), no_std)] -use codec::{Decode, Encode}; -use frame_support::pallet_prelude::TypeInfo; -use sp_std::vec::Vec; -use sp_weights::Weight; -use xcm::{Version, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; - -sp_api::decl_runtime_apis! { - /// A trait of XCM payment API. - /// - /// API provides functionality for obtaining: - /// - /// * the weight required to execute an XCM message, - /// * a list of acceptable `AssetId`s for message execution payment, - /// * the cost of the weight in the specified acceptable `AssetId`. - /// * the fees for an XCM message delivery. - /// - /// To determine the execution weight of the calls required for - /// [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. - pub trait XcmPaymentApi { - /// Returns a list of acceptable payment assets. - /// - /// # Arguments - /// - /// * `xcm_version`: desired XCM `Version` of `VersionedAssetId`. - fn query_acceptable_payment_assets(xcm_version: Version) -> Result, Error>; - - /// Returns a weight needed to execute a XCM. - /// - /// # Arguments - /// - /// * `message`: `VersionedXcm`. - fn query_xcm_weight(message: VersionedXcm<()>) -> Result; - - /// Converts a weight into a fee for the specified `AssetId`. - /// - /// # Arguments - /// - /// * `weight`: convertible `Weight`. - /// * `asset`: `VersionedAssetId`. - fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result; - - /// Get delivery fees for sending a specific `message` to a `destination`. - /// These always come in a specific asset, defined by the chain. - /// - /// # Arguments - /// * `message`: The message that'll be sent, necessary because most delivery fees are based on the - /// size of the message. - /// * `destination`: The destination to send the message to. Different destinations may use - /// different senders that charge different fees. - fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result; - } -} - -#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] -pub enum Error { - /// An API part is unsupported. - #[codec(index = 0)] - Unimplemented, - - /// Converting a versioned data structure from one version to another failed. - #[codec(index = 1)] - VersionedConversionFailed, - - /// XCM message weight calculation failed. - #[codec(index = 2)] - WeightNotComputable, - - /// XCM version not able to be handled. - #[codec(index = 3)] - UnhandledXcmVersion, - - /// The given asset is not handled as a fee asset. - #[codec(index = 4)] - AssetNotFound, - - /// Destination is known to be unroutable. - #[codec(index = 5)] - Unroutable, -} +/// Dry-run API. +/// Given an extrinsic or an XCM program, it returns the outcome of its execution. +pub mod dry_run; +/// Fee estimation API. +/// Given an XCM program, it will return the fees needed to execute it properly or send it. +pub mod fees; diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs new file mode 100644 index 00000000000..7a9bfa4a796 --- /dev/null +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs @@ -0,0 +1,370 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Tests for using both the XCM fee payment API and the dry-run API. + +use frame_support::{ + dispatch::DispatchInfo, + pallet_prelude::{DispatchClass, Pays}, +}; +use sp_api::ProvideRuntimeApi; +use sp_runtime::testing::H256; +use xcm::prelude::*; +use xcm_fee_payment_runtime_api::{dry_run::XcmDryRunApi, fees::XcmPaymentApi}; + +mod mock; +use mock::{ + extra, fake_message_hash, new_test_ext_with_balances, new_test_ext_with_balances_and_assets, + DeliveryFees, ExistentialDeposit, HereLocation, RuntimeCall, RuntimeEvent, TestClient, TestXt, +}; + +// Scenario: User `1` in the local chain (id 2000) wants to transfer assets to account `[0u8; 32]` +// on "AssetHub". He wants to make sure he has enough for fees, so before he calls the +// `transfer_asset` extrinsic to do the transfer, he decides to use the `XcmDryRunApi` and +// `XcmPaymentApi` runtime APIs to estimate fees. This uses a teleport because we're dealing with +// the native token of the chain, which is registered on "AssetHub". The fees are sent as a reserve +// asset transfer, since they're paid in the relay token. +// +// Teleport Parachain(2000) Token +// Reserve Asset Transfer Relay Token for fees +// Parachain(2000) -------------------------------------------> Parachain(1000) +#[test] +fn fee_estimation_for_teleport() { + let _ = env_logger::builder().is_test(true).try_init(); + let who = 1; // AccountId = u64. + let balances = vec![(who, 100 + DeliveryFees::get() + ExistentialDeposit::get())]; + let assets = vec![(1, who, 50)]; + new_test_ext_with_balances_and_assets(balances, assets).execute_with(|| { + let client = TestClient; + let runtime_api = client.runtime_api(); + let extrinsic = TestXt::new( + RuntimeCall::XcmPallet(pallet_xcm::Call::transfer_assets { + dest: Box::new(VersionedLocation::V4((Parent, Parachain(1000)).into())), + beneficiary: Box::new(VersionedLocation::V4( + AccountId32 { id: [0u8; 32], network: None }.into(), + )), + assets: Box::new(VersionedAssets::V4( + vec![(Here, 100u128).into(), (Parent, 20u128).into()].into(), + )), + fee_asset_item: 1, // Fees are paid with the RelayToken + weight_limit: Unlimited, + }), + Some((who, extra())), + ); + let dry_run_effects = + runtime_api.dry_run_extrinsic(H256::zero(), extrinsic).unwrap().unwrap(); + + assert_eq!( + dry_run_effects.local_xcm, + Some(VersionedXcm::V4( + Xcm::builder_unsafe() + .withdraw_asset((Parent, 20u128)) + .burn_asset((Parent, 20u128)) + .withdraw_asset((Here, 100u128)) + .burn_asset((Here, 100u128)) + .build() + )), + ); + let send_destination = Location::new(1, [Parachain(1000)]); + let send_message = Xcm::<()>::builder_unsafe() + .withdraw_asset((Parent, 20u128)) + .buy_execution((Parent, 20u128), Unlimited) + .receive_teleported_asset(((Parent, Parachain(2000)), 100u128)) + .clear_origin() + .deposit_asset(AllCounted(2), [0u8; 32]) + .build(); + assert_eq!( + dry_run_effects.forwarded_xcms, + vec![( + VersionedLocation::V4(send_destination.clone()), + vec![VersionedXcm::V4(send_message.clone())], + ),], + ); + + assert_eq!( + dry_run_effects.emitted_events, + vec![ + RuntimeEvent::System(frame_system::Event::NewAccount { + account: 8660274132218572653 // TODO: Why is this not `1`? + }), + RuntimeEvent::Balances(pallet_balances::Event::Endowed { + account: 8660274132218572653, + free_balance: 100 + }), + RuntimeEvent::Balances(pallet_balances::Event::Minted { + who: 8660274132218572653, + amount: 100 + }), + RuntimeEvent::AssetsPallet(pallet_assets::Event::Burned { + asset_id: 1, + owner: 1, + balance: 20 + }), + RuntimeEvent::Balances(pallet_balances::Event::Burned { who: 1, amount: 100 }), + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { + outcome: Outcome::Complete { used: Weight::from_parts(400, 40) }, + }), + RuntimeEvent::Balances(pallet_balances::Event::Burned { who: 1, amount: 20 }), + RuntimeEvent::XcmPallet(pallet_xcm::Event::FeesPaid { + paying: AccountIndex64 { index: 1, network: None }.into(), + fees: (Here, 20u128).into(), + }), + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { + origin: AccountIndex64 { index: 1, network: None }.into(), + destination: (Parent, Parachain(1000)).into(), + message: send_message.clone(), + message_id: fake_message_hash(&send_message), + }), + RuntimeEvent::System(frame_system::Event::ExtrinsicSuccess { + dispatch_info: DispatchInfo { + weight: Weight::from_parts(107074070, 0), /* Will break if weights get + * updated. */ + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + } + }), + ] + ); + + // Weighing the local program is not relevant for extrinsics that already + // take this weight into account. + // In this case, we really only care about delivery fees. + let local_xcm = dry_run_effects.local_xcm.unwrap(); + + // We get a double result since the actual call returns a result and the runtime api returns + // results. + let weight = + runtime_api.query_xcm_weight(H256::zero(), local_xcm.clone()).unwrap().unwrap(); + assert_eq!(weight, Weight::from_parts(400, 40)); + let execution_fees = runtime_api + .query_weight_to_asset_fee( + H256::zero(), + weight, + VersionedAssetId::V4(HereLocation::get().into()), + ) + .unwrap() + .unwrap(); + assert_eq!(execution_fees, 440); + + let mut forwarded_xcms_iter = dry_run_effects.forwarded_xcms.into_iter(); + + let (destination, remote_messages) = forwarded_xcms_iter.next().unwrap(); + let remote_message = &remote_messages[0]; + + let delivery_fees = runtime_api + .query_delivery_fees(H256::zero(), destination.clone(), remote_message.clone()) + .unwrap() + .unwrap(); + assert_eq!(delivery_fees, VersionedAssets::V4((Here, 20u128).into())); + + // This would have to be the runtime API of the destination, + // which we have the location for. + // If I had a mock runtime configured for "AssetHub" then I would use the + // runtime APIs from that. + let remote_execution_weight = runtime_api + .query_xcm_weight(H256::zero(), remote_message.clone()) + .unwrap() + .unwrap(); + let remote_execution_fees = runtime_api + .query_weight_to_asset_fee( + H256::zero(), + remote_execution_weight, + VersionedAssetId::V4(HereLocation::get().into()), + ) + .unwrap() + .unwrap(); + assert_eq!(remote_execution_fees, 550); + + // Now we know that locally we need to use `execution_fees` and + // `delivery_fees`. + // On the message we forward to the destination, we need to + // put `remote_execution_fees` in `BuyExecution`. + // For the `transfer_assets` extrinsic, it just means passing the correct amount + // of fees in the parameters. + }); +} + +// Same scenario as in `fee_estimation_for_teleport`, but the user in parachain 2000 wants +// to send relay tokens over to parachain 1000. +// +// Reserve Asset Transfer Relay Token +// Reserve Asset Transfer Relay Token for fees +// Parachain(2000) -------------------------------------------> Parachain(1000) +#[test] +fn dry_run_reserve_asset_transfer() { + let _ = env_logger::builder().is_test(true).try_init(); + let who = 1; // AccountId = u64. + // Native token used for fees. + let balances = vec![(who, DeliveryFees::get() + ExistentialDeposit::get())]; + // Relay token is the one we want to transfer. + let assets = vec![(1, who, 100)]; // id, account_id, balance. + new_test_ext_with_balances_and_assets(balances, assets).execute_with(|| { + let client = TestClient; + let runtime_api = client.runtime_api(); + let extrinsic = TestXt::new( + RuntimeCall::XcmPallet(pallet_xcm::Call::transfer_assets { + dest: Box::new(VersionedLocation::V4((Parent, Parachain(1000)).into())), + beneficiary: Box::new(VersionedLocation::V4( + AccountId32 { id: [0u8; 32], network: None }.into(), + )), + assets: Box::new(VersionedAssets::V4((Parent, 100u128).into())), + fee_asset_item: 0, + weight_limit: Unlimited, + }), + Some((who, extra())), + ); + let dry_run_effects = + runtime_api.dry_run_extrinsic(H256::zero(), extrinsic).unwrap().unwrap(); + + assert_eq!( + dry_run_effects.local_xcm, + Some(VersionedXcm::V4( + Xcm::builder_unsafe() + .withdraw_asset((Parent, 100u128)) + .burn_asset((Parent, 100u128)) + .build() + )), + ); + + // In this case, the transfer type is `DestinationReserve`, so the remote xcm just withdraws + // the assets. + let send_destination = Location::new(1, Parachain(1000)); + let send_message = Xcm::<()>::builder_unsafe() + .withdraw_asset((Parent, 100u128)) + .clear_origin() + .buy_execution((Parent, 100u128), Unlimited) + .deposit_asset(AllCounted(1), [0u8; 32]) + .build(); + assert_eq!( + dry_run_effects.forwarded_xcms, + vec![( + VersionedLocation::V4(send_destination.clone()), + vec![VersionedXcm::V4(send_message.clone())], + ),], + ); + + assert_eq!( + dry_run_effects.emitted_events, + vec![ + RuntimeEvent::AssetsPallet(pallet_assets::Event::Burned { + asset_id: 1, + owner: 1, + balance: 100 + }), + RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { + outcome: Outcome::Complete { used: Weight::from_parts(200, 20) } + }), + RuntimeEvent::Balances(pallet_balances::Event::Burned { who: 1, amount: 20 }), + RuntimeEvent::XcmPallet(pallet_xcm::Event::FeesPaid { + paying: AccountIndex64 { index: 1, network: None }.into(), + fees: (Here, 20u128).into() + }), + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { + origin: AccountIndex64 { index: 1, network: None }.into(), + destination: send_destination.clone(), + message: send_message.clone(), + message_id: fake_message_hash(&send_message), + }), + RuntimeEvent::System(frame_system::Event::ExtrinsicSuccess { + dispatch_info: DispatchInfo { + weight: Weight::from_parts(107074066, 0), /* Will break if weights get + * updated. */ + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + } + }), + ] + ); + }); +} + +#[test] +fn dry_run_xcm() { + let _ = env_logger::builder().is_test(true).try_init(); + let who = 1; // AccountId = u64. + let transfer_amount = 100u128; + // We need to build the XCM to weigh it and then build the real XCM that can pay for fees. + let inner_xcm = Xcm::<()>::builder_unsafe() + .buy_execution((Here, 1u128), Unlimited) // We'd need to query the destination chain for fees. + .deposit_asset(AllCounted(1), [0u8; 32]) + .build(); + let xcm_to_weigh = Xcm::::builder_unsafe() + .withdraw_asset((Here, transfer_amount)) + .clear_origin() + .buy_execution((Here, transfer_amount), Unlimited) + .deposit_reserve_asset(AllCounted(1), (Parent, Parachain(2100)), inner_xcm.clone()) + .build(); + let client = TestClient; + let runtime_api = client.runtime_api(); + let xcm_weight = runtime_api + .query_xcm_weight(H256::zero(), VersionedXcm::V4(xcm_to_weigh.clone().into())) + .unwrap() + .unwrap(); + let execution_fees = runtime_api + .query_weight_to_asset_fee(H256::zero(), xcm_weight, VersionedAssetId::V4(Here.into())) + .unwrap() + .unwrap(); + let xcm = Xcm::::builder_unsafe() + .withdraw_asset((Here, transfer_amount + execution_fees)) + .clear_origin() + .buy_execution((Here, execution_fees), Unlimited) + .deposit_reserve_asset(AllCounted(1), (Parent, Parachain(2100)), inner_xcm.clone()) + .build(); + let balances = vec![( + who, + transfer_amount + execution_fees + DeliveryFees::get() + ExistentialDeposit::get(), + )]; + new_test_ext_with_balances(balances).execute_with(|| { + let dry_run_effects = runtime_api + .dry_run_xcm( + H256::zero(), + VersionedLocation::V4(AccountIndex64 { index: 1, network: None }.into()), + VersionedXcm::V4(xcm), + ) + .unwrap() + .unwrap(); + assert_eq!( + dry_run_effects.forwarded_xcms, + vec![( + VersionedLocation::V4((Parent, Parachain(2100)).into()), + vec![VersionedXcm::V4( + Xcm::<()>::builder_unsafe() + .reserve_asset_deposited(( + (Parent, Parachain(2000)), + transfer_amount + execution_fees - DeliveryFees::get() + )) + .clear_origin() + .buy_execution((Here, 1u128), Unlimited) + .deposit_asset(AllCounted(1), [0u8; 32]) + .build() + )], + ),] + ); + + assert_eq!( + dry_run_effects.emitted_events, + vec![ + RuntimeEvent::Balances(pallet_balances::Event::Burned { who: 1, amount: 540 }), + RuntimeEvent::System(frame_system::Event::NewAccount { account: 2100 }), + RuntimeEvent::Balances(pallet_balances::Event::Endowed { + account: 2100, + free_balance: 520 + }), + RuntimeEvent::Balances(pallet_balances::Event::Minted { who: 2100, amount: 520 }), + ] + ); + }); +} diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs new file mode 100644 index 00000000000..d7b18d90a50 --- /dev/null +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs @@ -0,0 +1,525 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Mock runtime for tests. +//! Implements both runtime APIs for fee estimation and getting the messages for transfers. + +use codec::Encode; +use frame_support::{ + construct_runtime, derive_impl, parameter_types, + traits::{ + AsEnsureOriginWithArg, ConstU128, ConstU32, Contains, ContainsPair, Everything, Nothing, + OriginTrait, + }, + weights::WeightToFee as WeightToFeeT, +}; +use frame_system::{EnsureRoot, RawOrigin as SystemRawOrigin}; +use pallet_xcm::TestWeightInfo; +use sp_runtime::{ + traits::{Block as BlockT, Get, IdentityLookup, MaybeEquivalence, TryConvert}, + BuildStorage, SaturatedConversion, +}; +use sp_std::{cell::RefCell, marker::PhantomData}; +use xcm::{prelude::*, Version as XcmVersion}; +use xcm_builder::{ + AllowTopLevelPaidExecutionFrom, ConvertedConcreteId, EnsureXcmOrigin, FixedRateOfFungible, + FixedWeightBounds, FungibleAdapter, FungiblesAdapter, IsConcrete, MintLocation, NoChecking, + TakeWeightCredit, +}; +use xcm_executor::{ + traits::{ConvertLocation, JustTry}, + XcmExecutor, +}; + +use xcm_fee_payment_runtime_api::{ + dry_run::{Error as XcmDryRunApiError, ExtrinsicDryRunEffects, XcmDryRunApi, XcmDryRunEffects}, + fees::{Error as XcmPaymentApiError, XcmPaymentApi}, +}; + +construct_runtime! { + pub enum TestRuntime { + System: frame_system, + Balances: pallet_balances, + AssetsPallet: pallet_assets, + XcmPallet: pallet_xcm, + } +} + +pub type SignedExtra = ( + // frame_system::CheckEra, + // frame_system::CheckNonce, + frame_system::CheckWeight, +); +pub type TestXt = sp_runtime::testing::TestXt; +type Block = sp_runtime::testing::Block; +type Balance = u128; +type AssetIdForAssetsPallet = u32; +type AccountId = u64; + +pub fn extra() -> SignedExtra { + (frame_system::CheckWeight::new(),) +} + +type Executive = frame_executive::Executive< + TestRuntime, + Block, + frame_system::ChainContext, + TestRuntime, + AllPalletsWithSystem, + (), +>; + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; + type AccountId = AccountId; + type AccountData = pallet_balances::AccountData; + type Lookup = IdentityLookup; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for TestRuntime { + type AccountStore = System; + type Balance = Balance; + type ExistentialDeposit = ExistentialDeposit; +} + +#[derive_impl(pallet_assets::config_preludes::TestDefaultConfig)] +impl pallet_assets::Config for TestRuntime { + type AssetId = AssetIdForAssetsPallet; + type Balance = Balance; + type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = frame_system::EnsureRoot; + type Freezer = (); + type AssetDeposit = ConstU128<1>; + type AssetAccountDeposit = ConstU128<10>; + type MetadataDepositBase = ConstU128<1>; + type MetadataDepositPerByte = ConstU128<1>; + type ApprovalDeposit = ConstU128<1>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + +thread_local! { + pub static SENT_XCM: RefCell)>> = const { RefCell::new(Vec::new()) }; +} + +pub(crate) fn sent_xcm() -> Vec<(Location, Xcm<()>)> { + SENT_XCM.with(|q| (*q.borrow()).clone()) +} + +pub struct TestXcmSender; +impl SendXcm for TestXcmSender { + type Ticket = (Location, Xcm<()>); + fn validate( + dest: &mut Option, + msg: &mut Option>, + ) -> SendResult { + let ticket = (dest.take().unwrap(), msg.take().unwrap()); + let fees: Assets = (HereLocation::get(), DeliveryFees::get()).into(); + Ok((ticket, fees)) + } + fn deliver(ticket: Self::Ticket) -> Result { + let hash = fake_message_hash(&ticket.1); + SENT_XCM.with(|q| q.borrow_mut().push(ticket)); + Ok(hash) + } +} + +pub(crate) fn fake_message_hash(message: &Xcm) -> XcmHash { + message.using_encoded(sp_io::hashing::blake2_256) +} + +pub type XcmRouter = TestXcmSender; + +parameter_types! { + pub const DeliveryFees: u128 = 20; // Random value. + pub const ExistentialDeposit: u128 = 1; // Random value. + pub const BaseXcmWeight: Weight = Weight::from_parts(100, 10); // Random value. + pub const MaxInstructions: u32 = 100; + pub const NativeTokenPerSecondPerByte: (AssetId, u128, u128) = (AssetId(HereLocation::get()), 1, 1); + pub UniversalLocation: InteriorLocation = [GlobalConsensus(NetworkId::Westend), Parachain(2000)].into(); + pub static AdvertisedXcmVersion: XcmVersion = 4; + pub const HereLocation: Location = Location::here(); + pub const RelayLocation: Location = Location::parent(); + pub const MaxAssetsIntoHolding: u32 = 64; + pub CheckAccount: AccountId = XcmPallet::check_account(); + pub LocalCheckAccount: (AccountId, MintLocation) = (CheckAccount::get(), MintLocation::Local); + pub const AnyNetwork: Option = None; +} + +/// Simple `WeightToFee` implementation that adds the ref_time by the proof_size. +pub struct WeightToFee; +impl WeightToFeeT for WeightToFee { + type Balance = Balance; + fn weight_to_fee(weight: &Weight) -> Self::Balance { + Self::Balance::saturated_from(weight.ref_time()) + .saturating_add(Self::Balance::saturated_from(weight.proof_size())) + } +} + +type Weigher = FixedWeightBounds; + +/// Matches the pair (NativeToken, AssetHub). +/// This is used in the `IsTeleporter` configuration item, meaning we accept our native token +/// coming from AssetHub as a teleport. +pub struct NativeTokenToAssetHub; +impl ContainsPair for NativeTokenToAssetHub { + fn contains(asset: &Asset, origin: &Location) -> bool { + matches!(asset.id.0.unpack(), (0, [])) && matches!(origin.unpack(), (1, [Parachain(1000)])) + } +} + +/// Matches the pair (RelayToken, AssetHub). +/// This is used in the `IsReserve` configuration item, meaning we accept the relay token +/// coming from AssetHub as a reserve asset transfer. +pub struct RelayTokenToAssetHub; +impl ContainsPair for RelayTokenToAssetHub { + fn contains(asset: &Asset, origin: &Location) -> bool { + matches!(asset.id.0.unpack(), (1, [])) && matches!(origin.unpack(), (1, [Parachain(1000)])) + } +} + +/// Converts locations that are only the `AccountIndex64` junction into local u64 accounts. +pub struct AccountIndex64Aliases(PhantomData<(Network, AccountId)>); +impl>, AccountId: From> ConvertLocation + for AccountIndex64Aliases +{ + fn convert_location(location: &Location) -> Option { + let index = match location.unpack() { + (0, [AccountIndex64 { index, network: None }]) => index, + (0, [AccountIndex64 { index, network }]) if *network == Network::get() => index, + _ => return None, + }; + Some((*index).into()) + } +} + +/// Custom location converter to turn sibling chains into u64 accounts. +pub struct SiblingChainToIndex64; +impl ConvertLocation for SiblingChainToIndex64 { + fn convert_location(location: &Location) -> Option { + let index = match location.unpack() { + (1, [Parachain(id)]) => id, + _ => return None, + }; + Some((*index).into()) + } +} + +/// We alias local account locations to actual local accounts. +/// We also allow sovereign accounts for other sibling chains. +pub type LocationToAccountId = (AccountIndex64Aliases, SiblingChainToIndex64); + +pub type NativeTokenTransactor = FungibleAdapter< + // We use pallet-balances for handling this fungible asset. + Balances, + // The fungible asset handled by this transactor is the native token of the chain. + IsConcrete, + // How we convert locations to accounts. + LocationToAccountId, + // We need to specify the AccountId type. + AccountId, + // We mint the native tokens locally, so we track how many we've sent away via teleports. + LocalCheckAccount, +>; + +pub struct LocationToAssetIdForAssetsPallet; +impl MaybeEquivalence for LocationToAssetIdForAssetsPallet { + fn convert(location: &Location) -> Option { + match location.unpack() { + (1, []) => Some(1 as AssetIdForAssetsPallet), + _ => None, + } + } + + fn convert_back(id: &AssetIdForAssetsPallet) -> Option { + match id { + 1 => Some(Location::new(1, [])), + _ => None, + } + } +} + +/// AssetTransactor for handling the relay chain token. +pub type RelayTokenTransactor = FungiblesAdapter< + // We use pallet-assets for handling the relay token. + AssetsPallet, + // Matches the relay token. + ConvertedConcreteId, + // How we convert locations to accounts. + LocationToAccountId, + // We need to specify the AccountId type. + AccountId, + // We don't track teleports. + NoChecking, + (), +>; + +pub type AssetTransactors = (NativeTokenTransactor, RelayTokenTransactor); + +pub struct HereAndInnerLocations; +impl Contains for HereAndInnerLocations { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, []) | (0, _)) + } +} + +pub type Barrier = ( + TakeWeightCredit, // We need this for pallet-xcm's extrinsics to work. + AllowTopLevelPaidExecutionFrom, /* TODO: Technically, we should allow + * messages from "AssetHub". */ +); + +pub type Trader = FixedRateOfFungible; + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = (); + type IsReserve = RelayTokenToAssetHub; + type IsTeleporter = NativeTokenToAssetHub; + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = Weigher; + type Trader = Trader; + type ResponseHandler = (); + type AssetTrap = (); + type AssetLocker = (); + type AssetExchanger = (); + type AssetClaims = (); + type SubscriptionService = (); + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = (); + type CallDispatcher = RuntimeCall; + type SafeCallFilter = Nothing; + type Aliasers = Nothing; + type TransactionalProcessor = (); + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; +} + +/// Converts a signed origin of a u64 account into a location with only the `AccountIndex64` +/// junction. +pub struct SignedToAccountIndex64( + PhantomData<(RuntimeOrigin, AccountId)>, +); +impl> TryConvert + for SignedToAccountIndex64 +where + RuntimeOrigin::PalletsOrigin: From> + + TryInto, Error = RuntimeOrigin::PalletsOrigin>, +{ + fn try_convert(origin: RuntimeOrigin) -> Result { + origin.try_with_caller(|caller| match caller.try_into() { + Ok(SystemRawOrigin::Signed(who)) => + Ok(Junction::AccountIndex64 { network: None, index: who.into() }.into()), + Ok(other) => Err(other.into()), + Err(other) => Err(other), + }) + } +} + +pub type LocalOriginToLocation = SignedToAccountIndex64; + +impl pallet_xcm::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; // Put everything instead of something more restricted. + type XcmReserveTransferFilter = Everything; // Same. + type Weigher = Weigher; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = AdvertisedXcmVersion; + type AdminOrigin = EnsureRoot; + type TrustedLockers = (); + type SovereignAccountOf = (); + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type MaxLockers = ConstU32<0>; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); + type WeightInfo = TestWeightInfo; +} + +pub fn new_test_ext_with_balances(balances: Vec<(AccountId, Balance)>) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + + pallet_balances::GenesisConfig:: { balances } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext +} + +pub fn new_test_ext_with_balances_and_assets( + balances: Vec<(AccountId, Balance)>, + assets: Vec<(AssetIdForAssetsPallet, AccountId, Balance)>, +) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + + pallet_balances::GenesisConfig:: { balances } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_assets::GenesisConfig:: { + assets: vec![ + // id, owner, is_sufficient, min_balance. + // We don't actually need this to be sufficient, since we use the native assets in + // tests for the existential deposit. + (1, 0, true, 1), + ], + metadata: vec![ + // id, name, symbol, decimals. + (1, "Relay Token".into(), "RLY".into(), 12), + ], + accounts: assets, + } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext +} + +#[derive(Clone)] +pub(crate) struct TestClient; + +pub(crate) struct RuntimeApi { + _inner: TestClient, +} + +impl sp_api::ProvideRuntimeApi for TestClient { + type Api = RuntimeApi; + fn runtime_api(&self) -> sp_api::ApiRef { + RuntimeApi { _inner: self.clone() }.into() + } +} + +sp_api::mock_impl_runtime_apis! { + impl XcmPaymentApi for RuntimeApi { + fn query_acceptable_payment_assets(xcm_version: XcmVersion) -> Result, XcmPaymentApiError> { + if xcm_version != 4 { return Err(XcmPaymentApiError::UnhandledXcmVersion) }; + Ok(vec![VersionedAssetId::V4(HereLocation::get().into())]) + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + XcmPallet::query_xcm_weight(message) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + let local_asset = VersionedAssetId::V4(HereLocation::get().into()); + let asset = asset + .into_version(4) + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; + + if asset != local_asset { return Err(XcmPaymentApiError::AssetNotFound); } + + Ok(WeightToFee::weight_to_fee(&weight)) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + XcmPallet::query_delivery_fees(destination, message) + } + } + + impl XcmDryRunApi for RuntimeApi { + fn dry_run_extrinsic(extrinsic: ::Extrinsic) -> Result, XcmDryRunApiError> { + use xcm_executor::RecordXcm; + // We want to record the XCM that's executed, so we can return it. + pallet_xcm::Pallet::::set_record_xcm(true); + let result = Executive::apply_extrinsic(extrinsic).map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_extrinsic", + "Applying extrinsic failed with error {:?}", + error, + ); + XcmDryRunApiError::InvalidExtrinsic + })?; + // Nothing gets committed to storage in runtime APIs, so there's no harm in leaving the flag as true. + let local_xcm = pallet_xcm::Pallet::::recorded_xcm(); + let forwarded_xcms = sent_xcm() + .into_iter() + .map(|(location, message)| ( + VersionedLocation::V4(location), + vec![VersionedXcm::V4(message)], + )).collect(); + let events: Vec = System::events().iter().map(|record| record.event.clone()).collect(); + Ok(ExtrinsicDryRunEffects { + local_xcm: local_xcm.map(VersionedXcm::<()>::V4), + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + + fn dry_run_xcm(origin_location: VersionedLocation, xcm: VersionedXcm) -> Result, XcmDryRunApiError> { + let origin_location: Location = origin_location.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Location version conversion failed with error: {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let xcm: Xcm = xcm.try_into().map_err(|error| { + log::error!( + target: "xcm::XcmDryRunApi::dry_run_xcm", + "Xcm version conversion failed with error {:?}", + error, + ); + XcmDryRunApiError::VersionedConversionFailed + })?; + let mut hash = fake_message_hash(&xcm); + let result = XcmExecutor::::prepare_and_execute( + origin_location, + xcm, + &mut hash, + Weight::MAX, // Max limit available for execution. + Weight::zero(), + ); + let forwarded_xcms = sent_xcm() + .into_iter() + .map(|(location, message)| ( + VersionedLocation::V4(location), + vec![VersionedXcm::V4(message)], + )).collect(); + let events: Vec = System::events().iter().map(|record| record.event.clone()).collect(); + Ok(XcmDryRunEffects { + forwarded_xcms, + emitted_events: events, + execution_result: result, + }) + } + } +} diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs index 0ba02aab9bf..a6b55d1bd9b 100644 --- a/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/xcm_config/mod.rs @@ -60,4 +60,5 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs index a7a8bae5156..c5d5fa66732 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain/xcm_config/mod.rs @@ -59,4 +59,5 @@ impl Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs index d8d65fbf0ce..502bcca2d44 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs @@ -159,6 +159,7 @@ impl Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } #[frame_support::pallet] diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index cf3ca0de2bb..4740aee83d8 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -160,6 +160,7 @@ impl Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = (); } pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/prdoc/pr_3872.prdoc b/prdoc/pr_3872.prdoc new file mode 100644 index 00000000000..3a5be3d2bc7 --- /dev/null +++ b/prdoc/pr_3872.prdoc @@ -0,0 +1,86 @@ +title: XcmDryRunApi - Runtime API for dry-running extrinsics and XCM programs. + +doc: + - audience: Runtime Dev + description: | + This PR introduces a new runtime API, the XcmDryRunApi, that allows dry-running + extrinsics and XCM programs to get their execution effects. + These effects include: + - Local execution result, either pass or fail + - Emitted events + - Forwarded XCMs + - In the case of extrinsics, the XCM program that they execute + This API can be used on its own to test extrinsics or XCM programs, + or used alongside the XcmPaymentApi to estimate execution and delivery + fees. + + This PR also adds a new configuration item to XCM: XcmRecorder. + This can be set to either (), the xcm pallet, or some custom implementation. + If set to (), the dry run API will not return the local XCM program executed + by running an extrinsic. + After this PR, it is necessary to add the new configuration item to your xcm + configs. + - audience: Runtime User + description: | + This PR introduces a new runtime API, the XcmDryRunApi, that allows dry-running + extrinsics and XCM programs to get their execution effects. + These effects include: + - Local execution result, either pass or fail + - Emitted events + - Forwarded XCMs + - In the case of extrinsics, the XCM program that they execute + This API can be used on its own to test extrinsics or XCM programs, + or used alongside the XcmPaymentApi to estimate execution and delivery + fees. + +crates: + - name: xcm-fee-payment-runtime-api + bump: major + - name: pallet-xcm + bump: minor + - name: staging-xcm-executor + bump: minor + - name: staging-xcm-builder + bump: minor + - name: rococo-runtime + bump: minor + - name: westend-runtime + bump: minor + - name: pallet-xcm-benchmarks + bump: minor + - name: asset-hub-rococo-runtime + bump: minor + - name: asset-hub-westend-runtime + bump: minor + - name: bridge-hub-rococo-runtime + bump: minor + - name: bridge-hub-westend-runtime + bump: minor + - name: collectives-westend-runtime + bump: minor + - name: contracts-rococo-runtime + bump: minor + - name: coretime-rococo-runtime + bump: minor + - name: coretime-westend-runtime + bump: minor + - name: glutton-westend-runtime + bump: minor + - name: people-rococo-runtime + bump: minor + - name: people-westend-runtime + bump: minor + - name: shell-runtime + bump: minor + - name: penpal-runtime + bump: minor + - name: rococo-parachain-runtime + bump: minor + - name: polkadot-service + bump: minor + - name: polkadot-test-runtime + bump: minor + - name: parachain-template-runtime + bump: minor + - name: pallet-contracts-mock-network + bump: minor diff --git a/substrate/frame/contracts/mock-network/src/parachain.rs b/substrate/frame/contracts/mock-network/src/parachain.rs index 843efab1502..b46d7df6c2b 100644 --- a/substrate/frame/contracts/mock-network/src/parachain.rs +++ b/substrate/frame/contracts/mock-network/src/parachain.rs @@ -285,6 +285,7 @@ impl Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } impl mock_msg_queue::Config for Runtime { diff --git a/substrate/frame/contracts/mock-network/src/relay_chain.rs b/substrate/frame/contracts/mock-network/src/relay_chain.rs index d5e0ec9c83f..36a7de499ba 100644 --- a/substrate/frame/contracts/mock-network/src/relay_chain.rs +++ b/substrate/frame/contracts/mock-network/src/relay_chain.rs @@ -185,6 +185,7 @@ impl Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = XcmPallet; } pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/templates/parachain/runtime/src/configs/xcm_config.rs b/templates/parachain/runtime/src/configs/xcm_config.rs index c6b6e8da1b8..e162bcbf886 100644 --- a/templates/parachain/runtime/src/configs/xcm_config.rs +++ b/templates/parachain/runtime/src/configs/xcm_config.rs @@ -142,6 +142,7 @@ impl xcm_executor::Config for XcmConfig { type HrmpNewChannelOpenRequestHandler = (); type HrmpChannelAcceptedHandler = (); type HrmpChannelClosingHandler = (); + type XcmRecorder = PolkadotXcm; } /// No local origins on this chain are allowed to dispatch XCM sends/executions. -- GitLab From c3e57c1b3b9fdd768a57e91d353d57f6bbff7ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pa=C4=8Dandi?= <3002868+Dinonard@users.noreply.github.com> Date: Wed, 8 May 2024 09:38:11 +0200 Subject: [PATCH 060/170] [pallet-balances] `burn_allow_death` extrinsic (#3964) Adds an additional extrinsic call to the `pallet-balances` to _burn_ tokens. Depending on the `keep_alive` flag, the call might or might not reap the account. Required modification of the _fungible's_ `Mutate` trait, `burn_from` function to allow the `Preservation` argument. **TODO** - [x] run benchmarks & update weights - [x] make sure prdoc is required & properly formatted Related issue: https://github.com/paritytech/polkadot-sdk/issues/3943 --------- Co-authored-by: Oliver Tale-Yazdi Co-authored-by: command-bot <> --- .../src/weights/pallet_balances.rs | 60 ++++--- .../src/weights/pallet_balances.rs | 60 ++++--- .../src/weights/pallet_balances.rs | 60 ++++--- .../src/weights/pallet_balances.rs | 60 ++++--- .../src/weights/pallet_balances.rs | 60 ++++--- .../src/weights/pallet_balances.rs | 60 ++++--- .../src/weights/pallet_balances.rs | 76 +++++---- .../src/weights/pallet_balances.rs | 152 ++++++++++-------- .../src/weights/pallet_balances.rs | 152 ++++++++++-------- .../src/weights/pallet_balances_balances.rs | 62 ++++--- ...allet_balances_nis_counterpart_balances.rs | 70 +++++--- .../westend/src/weights/pallet_balances.rs | 62 ++++--- .../xcm/xcm-builder/src/fungible_adapter.rs | 10 +- .../xcm/xcm-builder/src/fungibles_adapter.rs | 11 +- prdoc/pr_3964.prdoc | 16 ++ .../frame/asset-conversion/ops/src/lib.rs | 3 + substrate/frame/asset-conversion/src/lib.rs | 9 +- substrate/frame/balances/src/benchmarking.rs | 38 +++++ substrate/frame/balances/src/lib.rs | 26 +++ .../balances/src/tests/currency_tests.rs | 2 +- .../balances/src/tests/dispatchable_tests.rs | 44 +++++ substrate/frame/balances/src/weights.rs | 126 +++++++++------ .../frame/nft-fractionalization/src/lib.rs | 4 +- substrate/frame/nis/src/lib.rs | 3 +- substrate/frame/nis/src/tests.rs | 8 +- .../conformance_tests/inspect_mutate.rs | 9 +- .../conformance_tests/regular/mutate.rs | 9 +- .../src/traits/tokens/fungible/item_of.rs | 10 +- .../src/traits/tokens/fungible/regular.rs | 17 +- .../src/traits/tokens/fungible/union_of.rs | 20 ++- .../src/traits/tokens/fungibles/regular.rs | 8 +- .../src/traits/tokens/fungibles/union_of.rs | 21 ++- 32 files changed, 876 insertions(+), 452 deletions(-) create mode 100644 prdoc/pr_3964.prdoc diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs index 299a801ebd5..35d7e1985c5 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_706_000 picoseconds. - Weight::from_parts(43_378_000, 0) + // Minimum execution time: 43_472_000 picoseconds. + Weight::from_parts(44_389_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 33_090_000 picoseconds. - Weight::from_parts(33_703_000, 0) + // Minimum execution time: 34_211_000 picoseconds. + Weight::from_parts(35_075_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 12_678_000 picoseconds. - Weight::from_parts(13_068_000, 0) + // Minimum execution time: 12_751_000 picoseconds. + Weight::from_parts(13_221_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 17_336_000 picoseconds. - Weight::from_parts(17_824_000, 0) + // Minimum execution time: 17_530_000 picoseconds. + Weight::from_parts(17_979_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 44_817_000 picoseconds. - Weight::from_parts(45_453_000, 0) + // Minimum execution time: 45_913_000 picoseconds. + Weight::from_parts(47_447_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_468_000 picoseconds. - Weight::from_parts(42_093_000, 0) + // Minimum execution time: 42_435_000 picoseconds. + Weight::from_parts(44_712_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_344_000 picoseconds. - Weight::from_parts(15_878_000, 0) + // Minimum execution time: 15_407_000 picoseconds. + Weight::from_parts(16_104_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 15_067_000 picoseconds. - Weight::from_parts(15_281_000, 0) + // Minimum execution time: 15_494_000 picoseconds. + Weight::from_parts(15_793_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 11_009 - .saturating_add(Weight::from_parts(13_050_024, 0).saturating_mul(u.into())) + // Standard Error: 11_778 + .saturating_add(Weight::from_parts(13_198_951, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_139_000 picoseconds. - Weight::from_parts(5_511_000, 0) + // Minimum execution time: 5_368_000 picoseconds. + Weight::from_parts(5_674_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 27_491_000 picoseconds. + Weight::from_parts(28_444_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_290_000 picoseconds. + Weight::from_parts(19_227_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs index 68aceca14c1..bb8ae8e5f97 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 43_122_000 picoseconds. - Weight::from_parts(43_640_000, 0) + // Minimum execution time: 45_289_000 picoseconds. + Weight::from_parts(46_764_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 33_636_000 picoseconds. - Weight::from_parts(34_571_000, 0) + // Minimum execution time: 35_052_000 picoseconds. + Weight::from_parts(36_494_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 12_101_000 picoseconds. - Weight::from_parts(12_511_000, 0) + // Minimum execution time: 12_361_000 picoseconds. + Weight::from_parts(12_668_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 17_077_000 picoseconds. - Weight::from_parts(17_362_000, 0) + // Minimum execution time: 17_253_000 picoseconds. + Weight::from_parts(17_733_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 44_352_000 picoseconds. - Weight::from_parts(45_045_000, 0) + // Minimum execution time: 45_674_000 picoseconds. + Weight::from_parts(47_981_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_836_000 picoseconds. - Weight::from_parts(43_201_000, 0) + // Minimum execution time: 45_021_000 picoseconds. + Weight::from_parts(46_292_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_413_000 picoseconds. - Weight::from_parts(14_743_000, 0) + // Minimum execution time: 15_071_000 picoseconds. + Weight::from_parts(15_406_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_542_000 picoseconds. - Weight::from_parts(14_731_000, 0) + // Minimum execution time: 14_779_000 picoseconds. + Weight::from_parts(15_129_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 11_213 - .saturating_add(Weight::from_parts(13_160_721, 0).saturating_mul(u.into())) + // Standard Error: 10_629 + .saturating_add(Weight::from_parts(13_558_995, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_208_000 picoseconds. - Weight::from_parts(5_619_000, 0) + // Minimum execution time: 5_274_000 picoseconds. + Weight::from_parts(5_727_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 28_088_000 picoseconds. + Weight::from_parts(28_980_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 19_002_000 picoseconds. + Weight::from_parts(19_480_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs index 861ccfc51fd..d67ae4dee92 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_696_000 picoseconds. - Weight::from_parts(42_201_000, 0) + // Minimum execution time: 41_898_000 picoseconds. + Weight::from_parts(42_690_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 32_855_000 picoseconds. - Weight::from_parts(33_554_000, 0) + // Minimum execution time: 32_745_000 picoseconds. + Weight::from_parts(33_686_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 12_977_000 picoseconds. - Weight::from_parts(13_473_000, 0) + // Minimum execution time: 13_352_000 picoseconds. + Weight::from_parts(13_808_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 17_617_000 picoseconds. - Weight::from_parts(18_234_000, 0) + // Minimum execution time: 18_248_000 picoseconds. + Weight::from_parts(18_763_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 43_174_000 picoseconds. - Weight::from_parts(43_685_000, 0) + // Minimum execution time: 43_626_000 picoseconds. + Weight::from_parts(45_333_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_125_000 picoseconds. - Weight::from_parts(41_636_000, 0) + // Minimum execution time: 41_702_000 picoseconds. + Weight::from_parts(43_366_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_749_000 picoseconds. - Weight::from_parts(16_163_000, 0) + // Minimum execution time: 15_944_000 picoseconds. + Weight::from_parts(16_512_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_238_000 picoseconds. - Weight::from_parts(14_469_000, 0) + // Minimum execution time: 14_351_000 picoseconds. + Weight::from_parts(14_568_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 11_818 - .saturating_add(Weight::from_parts(12_621_051, 0).saturating_mul(u.into())) + // Standard Error: 11_289 + .saturating_add(Weight::from_parts(13_163_759, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 4_904_000 picoseconds. - Weight::from_parts(5_459_000, 0) + // Minimum execution time: 5_174_000 picoseconds. + Weight::from_parts(5_490_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 26_681_000 picoseconds. + Weight::from_parts(27_705_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_105_000 picoseconds. + Weight::from_parts(19_246_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_balances.rs index 3afef6564bd..34ce487216f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_912_000 picoseconds. - Weight::from_parts(43_690_000, 0) + // Minimum execution time: 42_637_000 picoseconds. + Weight::from_parts(44_357_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 33_823_000 picoseconds. - Weight::from_parts(34_415_000, 0) + // Minimum execution time: 33_463_000 picoseconds. + Weight::from_parts(34_484_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 13_226_000 picoseconds. - Weight::from_parts(13_557_000, 0) + // Minimum execution time: 13_115_000 picoseconds. + Weight::from_parts(13_749_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 18_055_000 picoseconds. - Weight::from_parts(18_407_000, 0) + // Minimum execution time: 17_825_000 picoseconds. + Weight::from_parts(18_471_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 44_442_000 picoseconds. - Weight::from_parts(45_101_000, 0) + // Minimum execution time: 43_669_000 picoseconds. + Weight::from_parts(45_781_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_485_000 picoseconds. - Weight::from_parts(43_157_000, 0) + // Minimum execution time: 41_572_000 picoseconds. + Weight::from_parts(43_812_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_002_000 picoseconds. - Weight::from_parts(16_425_000, 0) + // Minimum execution time: 15_538_000 picoseconds. + Weight::from_parts(16_227_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_526_000 picoseconds. - Weight::from_parts(14_825_000, 0) + // Minimum execution time: 13_979_000 picoseconds. + Weight::from_parts(14_195_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_967 - .saturating_add(Weight::from_parts(13_376_293, 0).saturating_mul(u.into())) + // Standard Error: 11_039 + .saturating_add(Weight::from_parts(13_102_916, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_151_000 picoseconds. - Weight::from_parts(5_419_000, 0) + // Minimum execution time: 4_959_000 picoseconds. + Weight::from_parts(5_377_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 26_604_000 picoseconds. + Weight::from_parts(27_641_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_106_000 picoseconds. + Weight::from_parts(18_637_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_balances.rs index 602e7ca50c1..b100b0f2b1a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 45_085_000 picoseconds. - Weight::from_parts(45_772_000, 0) + // Minimum execution time: 46_316_000 picoseconds. + Weight::from_parts(46_965_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 35_447_000 picoseconds. - Weight::from_parts(36_143_000, 0) + // Minimum execution time: 36_337_000 picoseconds. + Weight::from_parts(36_803_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 12_314_000 picoseconds. - Weight::from_parts(12_679_000, 0) + // Minimum execution time: 12_331_000 picoseconds. + Weight::from_parts(12_774_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 17_455_000 picoseconds. - Weight::from_parts(17_902_000, 0) + // Minimum execution time: 17_532_000 picoseconds. + Weight::from_parts(17_948_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 46_785_000 picoseconds. - Weight::from_parts(47_436_000, 0) + // Minimum execution time: 47_251_000 picoseconds. + Weight::from_parts(48_164_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 43_948_000 picoseconds. - Weight::from_parts(44_680_000, 0) + // Minimum execution time: 45_319_000 picoseconds. + Weight::from_parts(46_094_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_267_000 picoseconds. - Weight::from_parts(15_499_000, 0) + // Minimum execution time: 15_263_000 picoseconds. + Weight::from_parts(15_632_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_817_000 picoseconds. - Weight::from_parts(15_287_000, 0) + // Minimum execution time: 15_106_000 picoseconds. + Weight::from_parts(15_353_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 11_738 - .saturating_add(Weight::from_parts(13_511_800, 0).saturating_mul(u.into())) + // Standard Error: 11_570 + .saturating_add(Weight::from_parts(13_765_985, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_382_000 picoseconds. - Weight::from_parts(5_768_000, 0) + // Minimum execution time: 5_277_000 picoseconds. + Weight::from_parts(5_560_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 28_810_000 picoseconds. + Weight::from_parts(29_155_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_957_000 picoseconds. + Weight::from_parts(19_292_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs index aac7e109366..a021d114784 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_557_000 picoseconds. - Weight::from_parts(42_618_000, 0) + // Minimum execution time: 43_792_000 picoseconds. + Weight::from_parts(44_475_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 33_046_000 picoseconds. - Weight::from_parts(33_550_000, 0) + // Minimum execution time: 34_144_000 picoseconds. + Weight::from_parts(34_887_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 11_804_000 picoseconds. - Weight::from_parts(12_007_000, 0) + // Minimum execution time: 11_864_000 picoseconds. + Weight::from_parts(12_253_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 16_261_000 picoseconds. - Weight::from_parts(16_655_000, 0) + // Minimum execution time: 16_448_000 picoseconds. + Weight::from_parts(17_008_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 42_967_000 picoseconds. - Weight::from_parts(43_870_000, 0) + // Minimum execution time: 44_353_000 picoseconds. + Weight::from_parts(45_131_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_022_000 picoseconds. - Weight::from_parts(41_475_000, 0) + // Minimum execution time: 42_899_000 picoseconds. + Weight::from_parts(43_749_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_339_000 picoseconds. - Weight::from_parts(14_641_000, 0) + // Minimum execution time: 14_308_000 picoseconds. + Weight::from_parts(15_020_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_241_000 picoseconds. - Weight::from_parts(14_463_000, 0) + // Minimum execution time: 14_369_000 picoseconds. + Weight::from_parts(14_525_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 12_290 - .saturating_add(Weight::from_parts(12_903_900, 0).saturating_mul(u.into())) + // Standard Error: 11_260 + .saturating_add(Weight::from_parts(13_056_576, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_116_000 picoseconds. - Weight::from_parts(5_345_000, 0) + // Minimum execution time: 5_198_000 picoseconds. + Weight::from_parts(5_430_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 27_335_000 picoseconds. + Weight::from_parts(28_146_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_390_000 picoseconds. + Weight::from_parts(18_893_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs index c4770a7c943..7024c58d97f 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs @@ -17,25 +17,23 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=coretime-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_balances +// --chain=coretime-westend-dev // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ @@ -56,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_773_000 picoseconds. - Weight::from_parts(43_292_000, 0) + // Minimum execution time: 44_250_000 picoseconds. + Weight::from_parts(45_303_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -68,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 34_023_000 picoseconds. - Weight::from_parts(34_513_000, 0) + // Minimum execution time: 34_451_000 picoseconds. + Weight::from_parts(35_413_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -80,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 11_685_000 picoseconds. - Weight::from_parts(12_103_000, 0) + // Minimum execution time: 11_886_000 picoseconds. + Weight::from_parts(12_158_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -92,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 16_233_000 picoseconds. - Weight::from_parts(16_706_000, 0) + // Minimum execution time: 16_457_000 picoseconds. + Weight::from_parts(16_940_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -104,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 43_909_000 picoseconds. - Weight::from_parts(44_683_000, 0) + // Minimum execution time: 45_416_000 picoseconds. + Weight::from_parts(46_173_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -116,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_081_000 picoseconds. - Weight::from_parts(42_553_000, 0) + // Minimum execution time: 43_502_000 picoseconds. + Weight::from_parts(44_060_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -128,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_413_000 picoseconds. - Weight::from_parts(14_827_000, 0) + // Minimum execution time: 14_790_000 picoseconds. + Weight::from_parts(15_451_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -141,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_189_000 picoseconds. - Weight::from_parts(14_587_000, 0) + // Minimum execution time: 14_582_000 picoseconds. + Weight::from_parts(14_797_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_909 - .saturating_add(Weight::from_parts(13_040_864, 0).saturating_mul(u.into())) + // Standard Error: 12_074 + .saturating_add(Weight::from_parts(13_220_968, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -156,9 +154,25 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_218_000 picoseconds. - Weight::from_parts(5_562_000, 0) + // Minimum execution time: 4_939_000 picoseconds. + Weight::from_parts(5_403_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 27_479_000 picoseconds. + Weight::from_parts(28_384_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_174_000 picoseconds. + Weight::from_parts(18_737_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } } diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs index 126d816afcd..4990e8c12d5 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs @@ -1,40 +1,41 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_balances` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=people-kusama-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_balances -// --extrinsic=* // --steps=50 // --repeat=20 -// --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_balances.rs +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_balances +// --chain=people-rococo-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-rococo/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,112 +48,131 @@ use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 63_775_000 picoseconds. - Weight::from_parts(64_181_000, 0) + // Minimum execution time: 42_847_000 picoseconds. + Weight::from_parts(44_471_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 47_986_000 picoseconds. - Weight::from_parts(48_308_000, 0) + // Minimum execution time: 33_076_000 picoseconds. + Weight::from_parts(35_052_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 18_083_000 picoseconds. - Weight::from_parts(18_380_000, 0) + // Minimum execution time: 13_422_000 picoseconds. + Weight::from_parts(13_682_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 26_341_000 picoseconds. - Weight::from_parts(26_703_000, 0) + // Minimum execution time: 18_360_000 picoseconds. + Weight::from_parts(18_721_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 66_227_000 picoseconds. - Weight::from_parts(67_321_000, 0) + // Minimum execution time: 44_647_000 picoseconds. + Weight::from_parts(46_142_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_all() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 59_472_000 picoseconds. - Weight::from_parts(60_842_000, 0) + // Minimum execution time: 41_807_000 picoseconds. + Weight::from_parts(44_490_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 21_497_000 picoseconds. - Weight::from_parts(21_684_000, 0) + // Minimum execution time: 16_032_000 picoseconds. + Weight::from_parts(16_694_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `System::Account` (r:999 w:999) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 14_593_000 picoseconds. + Weight::from_parts(14_767_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 11_218 + .saturating_add(Weight::from_parts(13_432_648, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } /// Storage: `Balances::InactiveIssuance` (r:1 w:0) /// Proof: `Balances::InactiveIssuance` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) fn force_adjust_total_issuance() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_132_000 picoseconds. - Weight::from_parts(5_467_000, 0) + // Minimum execution time: 5_044_000 picoseconds. + Weight::from_parts(5_368_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } - fn upgrade_accounts(u: u32, ) -> Weight { + fn burn_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 20_385_000 picoseconds. - Weight::from_parts(20_587_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_001 - .saturating_add(Weight::from_parts(16_801_557, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 26_868_000 picoseconds. + Weight::from_parts(27_921_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 17_988_000 picoseconds. + Weight::from_parts(18_962_000, 0) + .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs index 1a3df158a0d..2649c1557a2 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs @@ -1,40 +1,41 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_balances` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=people-polkadot-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_balances -// --extrinsic=* // --steps=50 // --repeat=20 -// --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_balances.rs +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_balances +// --chain=people-westend-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,112 +48,131 @@ use core::marker::PhantomData; /// Weight functions for `pallet_balances`. pub struct WeightInfo(PhantomData); impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_allow_death() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 59_580_000 picoseconds. - Weight::from_parts(60_317_000, 0) + // Minimum execution time: 42_705_000 picoseconds. + Weight::from_parts(43_367_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 45_490_000 picoseconds. - Weight::from_parts(45_910_000, 0) + // Minimum execution time: 33_334_000 picoseconds. + Weight::from_parts(34_183_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_set_balance_creating() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 17_353_000 picoseconds. - Weight::from_parts(17_676_000, 0) + // Minimum execution time: 13_036_000 picoseconds. + Weight::from_parts(13_392_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_set_balance_killing() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 25_017_000 picoseconds. - Weight::from_parts(25_542_000, 0) + // Minimum execution time: 17_734_000 picoseconds. + Weight::from_parts(18_504_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 61_161_000 picoseconds. - Weight::from_parts(61_665_000, 0) + // Minimum execution time: 44_343_000 picoseconds. + Weight::from_parts(44_783_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_all() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 55_422_000 picoseconds. - Weight::from_parts(55_880_000, 0) + // Minimum execution time: 41_562_000 picoseconds. + Weight::from_parts(42_397_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_unreserve() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 20_477_000 picoseconds. - Weight::from_parts(20_871_000, 0) + // Minimum execution time: 15_547_000 picoseconds. + Weight::from_parts(16_072_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `System::Account` (r:999 w:999) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 13_969_000 picoseconds. + Weight::from_parts(14_302_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 12_004 + .saturating_add(Weight::from_parts(12_993_439, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } /// Storage: `Balances::InactiveIssuance` (r:1 w:0) /// Proof: `Balances::InactiveIssuance` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) fn force_adjust_total_issuance() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 5_132_000 picoseconds. - Weight::from_parts(5_467_000, 0) + // Minimum execution time: 4_854_000 picoseconds. + Weight::from_parts(5_148_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } - fn upgrade_accounts(u: u32, ) -> Weight { + fn burn_allow_death() -> Weight { // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 19_501_000 picoseconds. - Weight::from_parts(19_726_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 9_495 - .saturating_add(Weight::from_parts(15_658_957, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 26_532_000 picoseconds. + Weight::from_parts(27_418_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_148_000 picoseconds. + Weight::from_parts(18_809_000, 0) + .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/polkadot/runtime/rococo/src/weights/pallet_balances_balances.rs b/polkadot/runtime/rococo/src/weights/pallet_balances_balances.rs index 1b0ae1eeece..d37bb9369c6 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_balances_balances.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_balances_balances.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_balances` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 44_127_000 picoseconds. - Weight::from_parts(45_099_000, 0) + // Minimum execution time: 44_771_000 picoseconds. + Weight::from_parts(45_635_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 34_265_000 picoseconds. - Weight::from_parts(35_083_000, 0) + // Minimum execution time: 34_225_000 picoseconds. + Weight::from_parts(35_622_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 12_189_000 picoseconds. - Weight::from_parts(12_655_000, 0) + // Minimum execution time: 12_443_000 picoseconds. + Weight::from_parts(12_944_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_910_000 picoseconds. - Weight::from_parts(17_474_000, 0) + // Minimum execution time: 17_189_000 picoseconds. + Weight::from_parts(17_922_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 45_212_000 picoseconds. - Weight::from_parts(46_320_000, 0) + // Minimum execution time: 45_925_000 picoseconds. + Weight::from_parts(47_021_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_500_000 picoseconds. - Weight::from_parts(43_991_000, 0) + // Minimum execution time: 43_775_000 picoseconds. + Weight::from_parts(44_955_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_197_000 picoseconds. - Weight::from_parts(15_749_000, 0) + // Minimum execution time: 15_358_000 picoseconds. + Weight::from_parts(15_958_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -140,11 +140,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (135 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_414_000 picoseconds. - Weight::from_parts(14_685_000, 0) + // Minimum execution time: 14_283_000 picoseconds. + Weight::from_parts(14_888_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 7_918 - .saturating_add(Weight::from_parts(13_095_420, 0).saturating_mul(u.into())) + // Standard Error: 8_164 + .saturating_add(Weight::from_parts(13_730_103, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -153,8 +153,24 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_239_000 picoseconds. - Weight::from_parts(5_617_000, 0) + // Minimum execution time: 5_167_000 picoseconds. + Weight::from_parts(5_505_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 27_587_000 picoseconds. + Weight::from_parts(28_493_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_023_000 picoseconds. + Weight::from_parts(18_694_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/polkadot/runtime/rococo/src/weights/pallet_balances_nis_counterpart_balances.rs b/polkadot/runtime/rococo/src/weights/pallet_balances_nis_counterpart_balances.rs index 6cca9b9320a..706653aeb76 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_balances_nis_counterpart_balances.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_balances_nis_counterpart_balances.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_balances` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -56,8 +56,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6164` - // Minimum execution time: 41_978_000 picoseconds. - Weight::from_parts(42_989_000, 0) + // Minimum execution time: 42_331_000 picoseconds. + Weight::from_parts(43_215_000, 0) .saturating_add(Weight::from_parts(0, 6164)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -70,8 +70,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6164` - // Minimum execution time: 32_250_000 picoseconds. - Weight::from_parts(33_074_000, 0) + // Minimum execution time: 32_674_000 picoseconds. + Weight::from_parts(33_564_000, 0) .saturating_add(Weight::from_parts(0, 6164)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -82,8 +82,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3577` - // Minimum execution time: 9_906_000 picoseconds. - Weight::from_parts(10_397_000, 0) + // Minimum execution time: 9_813_000 picoseconds. + Weight::from_parts(10_111_000, 0) .saturating_add(Weight::from_parts(0, 3577)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -96,8 +96,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3593` - // Minimum execution time: 16_298_000 picoseconds. - Weight::from_parts(17_115_000, 0) + // Minimum execution time: 16_467_000 picoseconds. + Weight::from_parts(17_088_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -110,8 +110,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `206` // Estimated: `6196` - // Minimum execution time: 43_283_000 picoseconds. - Weight::from_parts(44_033_000, 0) + // Minimum execution time: 43_846_000 picoseconds. + Weight::from_parts(45_059_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) @@ -124,8 +124,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6164` - // Minimum execution time: 40_564_000 picoseconds. - Weight::from_parts(41_597_000, 0) + // Minimum execution time: 41_260_000 picoseconds. + Weight::from_parts(42_367_000, 0) .saturating_add(Weight::from_parts(0, 6164)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -138,8 +138,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3593` - // Minimum execution time: 15_018_000 picoseconds. - Weight::from_parts(15_532_000, 0) + // Minimum execution time: 14_914_000 picoseconds. + Weight::from_parts(15_631_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -154,11 +154,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (256 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_470_000 picoseconds. - Weight::from_parts(14_828_000, 0) + // Minimum execution time: 14_630_000 picoseconds. + Weight::from_parts(14_924_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 15_515 - .saturating_add(Weight::from_parts(14_505_553, 0).saturating_mul(u.into())) + // Standard Error: 15_311 + .saturating_add(Weight::from_parts(14_920_201, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -167,8 +167,32 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_277_000 picoseconds. - Weight::from_parts(5_628_000, 0) + // Minimum execution time: 5_193_000 picoseconds. + Weight::from_parts(5_403_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `NisCounterpartBalances::Account` (r:1 w:1) + /// Proof: `NisCounterpartBalances::Account` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3577` + // Minimum execution time: 27_002_000 picoseconds. + Weight::from_parts(27_785_000, 0) + .saturating_add(Weight::from_parts(0, 3577)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `NisCounterpartBalances::Account` (r:1 w:1) + /// Proof: `NisCounterpartBalances::Account` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3577` + // Minimum execution time: 17_533_000 picoseconds. + Weight::from_parts(18_338_000, 0) + .saturating_add(Weight::from_parts(0, 3577)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/westend/src/weights/pallet_balances.rs b/polkadot/runtime/westend/src/weights/pallet_balances.rs index 25626e94020..5e91f31920c 100644 --- a/polkadot/runtime/westend/src/weights/pallet_balances.rs +++ b/polkadot/runtime/westend/src/weights/pallet_balances.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_balances` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 43_680_000 picoseconds. - Weight::from_parts(45_012_000, 0) + // Minimum execution time: 43_248_000 picoseconds. + Weight::from_parts(43_872_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +66,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 34_038_000 picoseconds. - Weight::from_parts(35_771_000, 0) + // Minimum execution time: 33_990_000 picoseconds. + Weight::from_parts(34_693_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +78,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 12_609_000 picoseconds. - Weight::from_parts(13_142_000, 0) + // Minimum execution time: 12_681_000 picoseconds. + Weight::from_parts(13_183_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 17_533_000 picoseconds. - Weight::from_parts(18_061_000, 0) + // Minimum execution time: 17_474_000 picoseconds. + Weight::from_parts(18_063_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 45_278_000 picoseconds. - Weight::from_parts(46_670_000, 0) + // Minimum execution time: 45_699_000 picoseconds. + Weight::from_parts(46_099_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +114,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 43_125_000 picoseconds. - Weight::from_parts(43_925_000, 0) + // Minimum execution time: 42_453_000 picoseconds. + Weight::from_parts(43_133_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +126,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 15_580_000 picoseconds. - Weight::from_parts(16_023_000, 0) + // Minimum execution time: 15_066_000 picoseconds. + Weight::from_parts(15_605_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +139,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 14_868_000 picoseconds. - Weight::from_parts(15_130_000, 0) + // Minimum execution time: 14_180_000 picoseconds. + Weight::from_parts(14_598_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 10_719 - .saturating_add(Weight::from_parts(13_394_926, 0).saturating_mul(u.into())) + // Standard Error: 13_221 + .saturating_add(Weight::from_parts(13_422_901, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -152,8 +152,24 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_174_000 picoseconds. - Weight::from_parts(5_457_000, 0) + // Minimum execution time: 5_130_000 picoseconds. + Weight::from_parts(5_257_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 27_328_000 picoseconds. + Weight::from_parts(27_785_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 17_797_000 picoseconds. + Weight::from_parts(18_103_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs index 21c828922b3..45a0e2bdca2 100644 --- a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs @@ -19,7 +19,11 @@ use super::MintLocation; use frame_support::traits::{ tokens::{ - fungible, Fortitude::Polite, Precision::Exact, Preservation::Preserve, Provenance::Minted, + fungible, + Fortitude::Polite, + Precision::Exact, + Preservation::{Expendable, Preserve}, + Provenance::Minted, }, Get, }; @@ -100,7 +104,7 @@ impl< } fn reduce_checked(checking_account: AccountId, amount: Fungible::Balance) { - let ok = Fungible::burn_from(&checking_account, amount, Exact, Polite).is_ok(); + let ok = Fungible::burn_from(&checking_account, amount, Expendable, Exact, Polite).is_ok(); debug_assert!(ok, "`can_reduce_checked` must have returned `true` immediately prior; qed"); } } @@ -210,7 +214,7 @@ impl< let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; let who = AccountIdConverter::convert_location(who) .ok_or(MatchError::AccountIdConversionFailed)?; - Fungible::burn_from(&who, amount, Exact, Polite) + Fungible::burn_from(&who, amount, Expendable, Exact, Polite) .map_err(|error| XcmError::FailedToTransactAsset(error.into()))?; Ok(what.clone().into()) } diff --git a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs index b4c418ebf1c..88bbf01d9e1 100644 --- a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs @@ -18,7 +18,11 @@ use frame_support::traits::{ tokens::{ - fungibles, Fortitude::Polite, Precision::Exact, Preservation::Preserve, Provenance::Minted, + fungibles, + Fortitude::Polite, + Precision::Exact, + Preservation::{Expendable, Preserve}, + Provenance::Minted, }, Contains, Get, }; @@ -176,7 +180,8 @@ impl< } fn reduce_checked(asset_id: Assets::AssetId, amount: Assets::Balance) { let checking_account = CheckingAccount::get(); - let ok = Assets::burn_from(asset_id, &checking_account, amount, Exact, Polite).is_ok(); + let ok = Assets::burn_from(asset_id, &checking_account, amount, Expendable, Exact, Polite) + .is_ok(); debug_assert!(ok, "`can_reduce_checked` must have returned `true` immediately prior; qed"); } } @@ -295,7 +300,7 @@ impl< let (asset_id, amount) = Matcher::matches_fungibles(what)?; let who = AccountIdConverter::convert_location(who) .ok_or(MatchError::AccountIdConversionFailed)?; - Assets::burn_from(asset_id, &who, amount, Exact, Polite) + Assets::burn_from(asset_id, &who, amount, Expendable, Exact, Polite) .map_err(|e| XcmError::FailedToTransactAsset(e.into()))?; Ok(what.clone().into()) } diff --git a/prdoc/pr_3964.prdoc b/prdoc/pr_3964.prdoc new file mode 100644 index 00000000000..adf0d95b36a --- /dev/null +++ b/prdoc/pr_3964.prdoc @@ -0,0 +1,16 @@ +title: Burn extrinsic call and `fn burn_from` `Preservation` argument + +doc: + - audience: Runtime Dev + description: | + pallet-balances extrinsic calls has been expanded with `burn` call. + An argument flag is allowed to specify whether the account should be kept alive or not. + This in turn required a change to the fungible's `pub trait Mutate` `burn_from` function which now + also accepts `Preservation` as an argument. + In order to keep the behavior same as before, developers should simply specify `Preservation::Expandable`. + +crates: + - name: frame-support + bump: major + - name: pallet-balances + bump: minor diff --git a/substrate/frame/asset-conversion/ops/src/lib.rs b/substrate/frame/asset-conversion/ops/src/lib.rs index 6cc7bfa2e99..a655a9cb445 100644 --- a/substrate/frame/asset-conversion/ops/src/lib.rs +++ b/substrate/frame/asset-conversion/ops/src/lib.rs @@ -248,6 +248,7 @@ pub mod pallet { T::DepositAsset::burn_from( &depositor, deposit + deposit_asset_ed, + Preservation::Expendable, Precision::Exact, Fortitude::Force, )?; @@ -260,6 +261,7 @@ pub mod pallet { T::DepositAsset::burn_from( &depositor, deposit + deposit_asset_ed, + Preservation::Expendable, Precision::Exact, Fortitude::Force, )?; @@ -272,6 +274,7 @@ pub mod pallet { T::DepositAsset::burn_from( &depositor, deposit + deposit_asset_ed, + Preservation::Expendable, Precision::Exact, Fortitude::Force, )?; diff --git a/substrate/frame/asset-conversion/src/lib.rs b/substrate/frame/asset-conversion/src/lib.rs index bb6e70a7fe9..62acb693efb 100644 --- a/substrate/frame/asset-conversion/src/lib.rs +++ b/substrate/frame/asset-conversion/src/lib.rs @@ -596,7 +596,14 @@ pub mod pallet { ); // burn the provided lp token amount that includes the fee - T::PoolAssets::burn_from(pool.lp_token.clone(), &sender, lp_token_burn, Exact, Polite)?; + T::PoolAssets::burn_from( + pool.lp_token.clone(), + &sender, + lp_token_burn, + Expendable, + Exact, + Polite, + )?; T::Assets::transfer(*asset1, &pool_account, &withdraw_to, amount1, Expendable)?; T::Assets::transfer(*asset2, &pool_account, &withdraw_to, amount2, Expendable)?; diff --git a/substrate/frame/balances/src/benchmarking.rs b/substrate/frame/balances/src/benchmarking.rs index 14f0ede5e0f..e4229f2d7f0 100644 --- a/substrate/frame/balances/src/benchmarking.rs +++ b/substrate/frame/balances/src/benchmarking.rs @@ -297,6 +297,44 @@ mod benchmarks { assert_eq!(Balances::::total_issuance(), ti + delta); } + /// Benchmark `burn` extrinsic with the worst possible condition - burn kills the account. + #[benchmark] + fn burn_allow_death() { + let existential_deposit = T::ExistentialDeposit::get(); + let caller = whitelisted_caller(); + + // Give some multiple of the existential deposit + let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); + let _ = as Currency<_>>::make_free_balance_be(&caller, balance); + + // Burn enough to kill the account. + let burn_amount = balance - existential_deposit + 1u32.into(); + + #[extrinsic_call] + burn(RawOrigin::Signed(caller.clone()), burn_amount, false); + + assert_eq!(Balances::::free_balance(&caller), Zero::zero()); + } + + // Benchmark `burn` extrinsic with the case where account is kept alive. + #[benchmark] + fn burn_keep_alive() { + let existential_deposit = T::ExistentialDeposit::get(); + let caller = whitelisted_caller(); + + // Give some multiple of the existential deposit + let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); + let _ = as Currency<_>>::make_free_balance_be(&caller, balance); + + // Burn minimum possible amount which should not kill the account. + let burn_amount = 1u32.into(); + + #[extrinsic_call] + burn(RawOrigin::Signed(caller.clone()), burn_amount, true); + + assert_eq!(Balances::::free_balance(&caller), balance - burn_amount); + } + impl_benchmark_test_suite! { Balances, crate::tests::ExtBuilder::default().build(), diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index bd811955d63..8d904d3d21b 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -767,6 +767,32 @@ pub mod pallet { Ok(()) } + + /// Burn the specified liquid free balance from the origin account. + /// + /// If the origin's account ends up below the existential deposit as a result + /// of the burn and `keep_alive` is false, the account will be reaped. + /// + /// Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + /// this `burn` operation will reduce total issuance by the amount _burned_. + #[pallet::call_index(10)] + #[pallet::weight(if *keep_alive {T::WeightInfo::burn_allow_death() } else {T::WeightInfo::burn_keep_alive()})] + pub fn burn( + origin: OriginFor, + #[pallet::compact] value: T::Balance, + keep_alive: bool, + ) -> DispatchResult { + let source = ensure_signed(origin)?; + let preservation = if keep_alive { Preserve } else { Expendable }; + >::burn_from( + &source, + value, + preservation, + Precision::Exact, + Polite, + )?; + Ok(()) + } } impl, I: 'static> Pallet { diff --git a/substrate/frame/balances/src/tests/currency_tests.rs b/substrate/frame/balances/src/tests/currency_tests.rs index 450b1a84aa8..9ad4aca6440 100644 --- a/substrate/frame/balances/src/tests/currency_tests.rs +++ b/substrate/frame/balances/src/tests/currency_tests.rs @@ -701,7 +701,7 @@ fn account_removal_on_free_too_low() { fn burn_must_work() { ExtBuilder::default().monied(true).build_and_execute_with(|| { let init_total_issuance = Balances::total_issuance(); - let imbalance = Balances::burn(10); + let imbalance = >::burn(10); assert_eq!(Balances::total_issuance(), init_total_issuance - 10); drop(imbalance); assert_eq!(Balances::total_issuance(), init_total_issuance); diff --git a/substrate/frame/balances/src/tests/dispatchable_tests.rs b/substrate/frame/balances/src/tests/dispatchable_tests.rs index 4be68f61693..4bc96f6b43d 100644 --- a/substrate/frame/balances/src/tests/dispatchable_tests.rs +++ b/substrate/frame/balances/src/tests/dispatchable_tests.rs @@ -335,3 +335,47 @@ fn force_adjust_total_issuance_rejects_more_than_inactive() { assert_eq!(Balances::active_issuance(), 10); }); } + +#[test] +fn burn_works() { + ExtBuilder::default().build().execute_with(|| { + // Prepare account with initial balance + let (account, init_balance) = (1, 37); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), account, init_balance)); + let init_issuance = Balances::total_issuance(); + let (keep_alive, allow_death) = (true, false); + + // 1. Cannot burn more than what's available + assert_noop!( + Balances::burn(Some(account).into(), init_balance + 1, allow_death), + TokenError::FundsUnavailable, + ); + + // 2. Burn some funds, without reaping the account + let burn_amount_1 = 1; + assert_ok!(Balances::burn(Some(account).into(), burn_amount_1, allow_death)); + System::assert_last_event(RuntimeEvent::Balances(Event::Burned { + who: account, + amount: burn_amount_1, + })); + assert_eq!(Balances::total_issuance(), init_issuance - burn_amount_1); + assert_eq!(Balances::total_balance(&account), init_balance - burn_amount_1); + + // 3. Cannot burn funds below existential deposit if `keep_alive` is `true` + let burn_amount_2 = + init_balance - burn_amount_1 - ::ExistentialDeposit::get() + 1; + assert_noop!( + Balances::burn(Some(account).into(), init_balance + 1, keep_alive), + TokenError::FundsUnavailable, + ); + + // 4. Burn some more funds, this time reaping the account + assert_ok!(Balances::burn(Some(account).into(), burn_amount_2, allow_death)); + System::assert_last_event(RuntimeEvent::Balances(Event::Burned { + who: account, + amount: burn_amount_2, + })); + assert_eq!(Balances::total_issuance(), init_issuance - burn_amount_1 - burn_amount_2); + assert!(Balances::total_balance(&account).is_zero()); + }); +} diff --git a/substrate/frame/balances/src/weights.rs b/substrate/frame/balances/src/weights.rs index f99fc451076..e82c97160ef 100644 --- a/substrate/frame/balances/src/weights.rs +++ b/substrate/frame/balances/src/weights.rs @@ -18,27 +18,25 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-unxyhko3-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate-node +// target/production/substrate-node // benchmark // pallet -// --chain=dev // --steps=50 // --repeat=20 -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --output=./substrate/frame/balances/src/weights.rs +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_balances +// --chain=dev // --header=./substrate/HEADER-APACHE2 +// --output=./substrate/frame/balances/src/weights.rs // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -60,6 +58,8 @@ pub trait WeightInfo { fn force_unreserve() -> Weight; fn upgrade_accounts(u: u32, ) -> Weight; fn force_adjust_total_issuance() -> Weight; + fn burn_allow_death() -> Weight; + fn burn_keep_alive() -> Weight; } /// Weights for `pallet_balances` using the Substrate node and recommended hardware. @@ -71,8 +71,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 50_062_000 picoseconds. - Weight::from_parts(51_214_000, 3593) + // Minimum execution time: 47_552_000 picoseconds. + Weight::from_parts(48_363_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -82,8 +82,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 39_700_000 picoseconds. - Weight::from_parts(40_754_000, 3593) + // Minimum execution time: 37_565_000 picoseconds. + Weight::from_parts(38_159_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -93,8 +93,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 14_939_000 picoseconds. - Weight::from_parts(15_302_000, 3593) + // Minimum execution time: 14_147_000 picoseconds. + Weight::from_parts(14_687_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -104,8 +104,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 20_516_000 picoseconds. - Weight::from_parts(21_179_000, 3593) + // Minimum execution time: 19_188_000 picoseconds. + Weight::from_parts(19_929_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -115,8 +115,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 51_281_000 picoseconds. - Weight::from_parts(52_145_000, 6196) + // Minimum execution time: 48_903_000 picoseconds. + Weight::from_parts(49_944_000, 6196) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -126,8 +126,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 48_988_000 picoseconds. - Weight::from_parts(49_935_000, 3593) + // Minimum execution time: 46_573_000 picoseconds. + Weight::from_parts(47_385_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -137,8 +137,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 17_594_000 picoseconds. - Weight::from_parts(18_232_000, 3593) + // Minimum execution time: 16_750_000 picoseconds. + Weight::from_parts(17_233_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -149,10 +149,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0 + u * (135 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 16_701_000 picoseconds. - Weight::from_parts(16_897_000, 990) - // Standard Error: 11_684 - .saturating_add(Weight::from_parts(14_375_201, 0).saturating_mul(u.into())) + // Minimum execution time: 16_333_000 picoseconds. + Weight::from_parts(16_588_000, 990) + // Standard Error: 12_254 + .saturating_add(Weight::from_parts(13_973_659, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -161,8 +161,22 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_692_000 picoseconds. - Weight::from_parts(7_140_000, 0) + // Minimum execution time: 6_265_000 picoseconds. + Weight::from_parts(6_594_000, 0) + } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 30_151_000 picoseconds. + Weight::from_parts(30_968_000, 0) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 20_055_000 picoseconds. + Weight::from_parts(20_711_000, 0) } } @@ -174,8 +188,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 50_062_000 picoseconds. - Weight::from_parts(51_214_000, 3593) + // Minimum execution time: 47_552_000 picoseconds. + Weight::from_parts(48_363_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -185,8 +199,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 39_700_000 picoseconds. - Weight::from_parts(40_754_000, 3593) + // Minimum execution time: 37_565_000 picoseconds. + Weight::from_parts(38_159_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -196,8 +210,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 14_939_000 picoseconds. - Weight::from_parts(15_302_000, 3593) + // Minimum execution time: 14_147_000 picoseconds. + Weight::from_parts(14_687_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -207,8 +221,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 20_516_000 picoseconds. - Weight::from_parts(21_179_000, 3593) + // Minimum execution time: 19_188_000 picoseconds. + Weight::from_parts(19_929_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -218,8 +232,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 51_281_000 picoseconds. - Weight::from_parts(52_145_000, 6196) + // Minimum execution time: 48_903_000 picoseconds. + Weight::from_parts(49_944_000, 6196) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -229,8 +243,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 48_988_000 picoseconds. - Weight::from_parts(49_935_000, 3593) + // Minimum execution time: 46_573_000 picoseconds. + Weight::from_parts(47_385_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -240,8 +254,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 17_594_000 picoseconds. - Weight::from_parts(18_232_000, 3593) + // Minimum execution time: 16_750_000 picoseconds. + Weight::from_parts(17_233_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -252,10 +266,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0 + u * (135 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 16_701_000 picoseconds. - Weight::from_parts(16_897_000, 990) - // Standard Error: 11_684 - .saturating_add(Weight::from_parts(14_375_201, 0).saturating_mul(u.into())) + // Minimum execution time: 16_333_000 picoseconds. + Weight::from_parts(16_588_000, 990) + // Standard Error: 12_254 + .saturating_add(Weight::from_parts(13_973_659, 0).saturating_mul(u.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -264,7 +278,21 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_692_000 picoseconds. - Weight::from_parts(7_140_000, 0) + // Minimum execution time: 6_265_000 picoseconds. + Weight::from_parts(6_594_000, 0) + } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 30_151_000 picoseconds. + Weight::from_parts(30_968_000, 0) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 20_055_000 picoseconds. + Weight::from_parts(20_711_000, 0) } } diff --git a/substrate/frame/nft-fractionalization/src/lib.rs b/substrate/frame/nft-fractionalization/src/lib.rs index e97d3802fd2..cb269f464c4 100644 --- a/substrate/frame/nft-fractionalization/src/lib.rs +++ b/substrate/frame/nft-fractionalization/src/lib.rs @@ -75,7 +75,7 @@ pub mod pallet { AssetId, Balance as AssetBalance, Fortitude::Polite, Precision::{BestEffort, Exact}, - Preservation::Preserve, + Preservation::{Expendable, Preserve}, }, }, BoundedVec, PalletId, @@ -374,7 +374,7 @@ pub mod pallet { account: &T::AccountId, amount: AssetBalanceOf, ) -> DispatchResult { - T::Assets::burn_from(asset_id.clone(), account, amount, Exact, Polite)?; + T::Assets::burn_from(asset_id.clone(), account, amount, Expendable, Exact, Polite)?; T::Assets::start_destroy(asset_id, None) } diff --git a/substrate/frame/nis/src/lib.rs b/substrate/frame/nis/src/lib.rs index 63287f6a180..f38755836fb 100644 --- a/substrate/frame/nis/src/lib.rs +++ b/substrate/frame/nis/src/lib.rs @@ -808,7 +808,7 @@ pub mod pallet { ensure!(summary.thawed <= throttle, Error::::Throttled); let cp_amount = T::CounterpartAmount::convert(receipt.proportion); - T::Counterpart::burn_from(&who, cp_amount, Exact, Polite)?; + T::Counterpart::burn_from(&who, cp_amount, Expendable, Exact, Polite)?; // Multiply the proportion it is by the total issued. let our_account = Self::account_id(); @@ -897,6 +897,7 @@ pub mod pallet { T::Counterpart::burn_from( &who, T::CounterpartAmount::convert(receipt.proportion), + Expendable, Exact, Polite, )?; diff --git a/substrate/frame/nis/src/tests.rs b/substrate/frame/nis/src/tests.rs index 01724999ae7..a17aaf42182 100644 --- a/substrate/frame/nis/src/tests.rs +++ b/substrate/frame/nis/src/tests.rs @@ -24,7 +24,7 @@ use frame_support::{ traits::{ fungible::{hold::Inspect as InspectHold, Inspect as FunInspect, Mutate as FunMutate}, nonfungible::{Inspect, Transfer}, - tokens::{Fortitude::Force, Precision::Exact}, + tokens::{Fortitude::Force, Precision::Exact, Preservation::Expendable}, }, }; use sp_arithmetic::Perquintill; @@ -646,9 +646,9 @@ fn thaw_when_issuance_lower_works() { enlarge(100, 1); // Everybody else's balances goes down by 25% - assert_ok!(Balances::burn_from(&2, 25, Exact, Force)); - assert_ok!(Balances::burn_from(&3, 25, Exact, Force)); - assert_ok!(Balances::burn_from(&4, 25, Exact, Force)); + assert_ok!(Balances::burn_from(&2, 25, Expendable, Exact, Force)); + assert_ok!(Balances::burn_from(&3, 25, Expendable, Exact, Force)); + assert_ok!(Balances::burn_from(&4, 25, Expendable, Exact, Force)); run_to_block(4); assert_ok!(Nis::thaw_private(signed(1), 0, None)); diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/inspect_mutate.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/inspect_mutate.rs index 732742cca9b..fb52eb7037d 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/inspect_mutate.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/inspect_mutate.rs @@ -166,9 +166,10 @@ where // Test: Burn an exact amount from the account let amount_to_burn = T::Balance::from(5); + let preservation = Preservation::Expendable; let precision = Precision::Exact; let force = Fortitude::Polite; - T::burn_from(&account, amount_to_burn, precision, force).unwrap(); + T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap(); // Verify: The balance and total issuance should be reduced by the burned amount assert_eq!(T::balance(&account), initial_balance - amount_to_burn); @@ -209,10 +210,11 @@ where // Test: Burn a best effort amount from the account that is greater than the reducible balance let amount_to_burn = reducible_balance + 5.into(); + let preservation = Preservation::Expendable; let precision = Precision::BestEffort; assert!(amount_to_burn > reducible_balance); assert!(amount_to_burn > T::balance(&account)); - T::burn_from(&account, amount_to_burn, precision, force).unwrap(); + T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap(); // Verify: The balance and total issuance should be reduced by the reducible_balance assert_eq!(T::balance(&account), initial_balance - reducible_balance); @@ -248,9 +250,10 @@ where // Verify: Burn an amount greater than the account's balance with Exact precision returns Err let amount_to_burn = initial_balance + 10.into(); + let preservation = Preservation::Expendable; let precision = Precision::Exact; let force = Fortitude::Polite; - T::burn_from(&account, amount_to_burn, precision, force).unwrap_err(); + T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap_err(); // Verify: The balance and total issuance should remain unchanged assert_eq!(T::balance(&account), initial_balance); diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs index 95b5256bb49..b17ce6f518c 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs @@ -137,9 +137,10 @@ where // Test: Burn an exact amount from the account let amount_to_burn = T::Balance::from(5); + let preservation = Preservation::Expendable; let precision = Precision::Exact; let force = Fortitude::Polite; - T::burn_from(&account, amount_to_burn, precision, force).unwrap(); + T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap(); // Verify: The balance and total issuance should be reduced by the burned amount assert_eq!(T::balance(&account), initial_balance - amount_to_burn); @@ -174,10 +175,11 @@ where // Test: Burn a best effort amount from the account that is greater than the reducible // balance let amount_to_burn = reducible_balance + 5.into(); + let preservation = Preservation::Expendable; let precision = Precision::BestEffort; assert!(amount_to_burn > reducible_balance); assert!(amount_to_burn > T::balance(&account)); - T::burn_from(&account, amount_to_burn, precision, force).unwrap(); + T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap(); // Verify: The balance and total issuance should be reduced by the reducible_balance assert_eq!(T::balance(&account), initial_balance - reducible_balance); @@ -207,9 +209,10 @@ where // Verify: Burn an amount greater than the account's balance with Exact precision returns // Err let amount_to_burn = initial_balance + 10.into(); + let preservation = Preservation::Expendable; let precision = Precision::Exact; let force = Fortitude::Polite; - T::burn_from(&account, amount_to_burn, precision, force).unwrap_err(); + T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap_err(); // Verify: The balance and total issuance should remain unchanged assert_eq!(T::balance(&account), initial_balance); diff --git a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs index 5374cc52bab..2aa53d622db 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs @@ -235,10 +235,18 @@ impl< fn burn_from( who: &AccountId, amount: Self::Balance, + preservation: Preservation, precision: Precision, force: Fortitude, ) -> Result { - >::burn_from(A::get(), who, amount, precision, force) + >::burn_from( + A::get(), + who, + amount, + preservation, + precision, + force, + ) } fn shelve(who: &AccountId, amount: Self::Balance) -> Result { >::shelve(A::get(), who, amount) diff --git a/substrate/frame/support/src/traits/tokens/fungible/regular.rs b/substrate/frame/support/src/traits/tokens/fungible/regular.rs index 4ed31dcf9fb..c46614be473 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/regular.rs @@ -254,19 +254,23 @@ where Ok(actual) } - /// Decrease the balance of `who` by at least `amount`, possibly slightly more in the case of - /// minimum-balance requirements, burning the tokens. If that isn't possible then an `Err` is - /// returned and nothing is changed. If successful, the amount of tokens reduced is returned. + /// Attempt to decrease the balance of `who`, burning the tokens. + /// The actual amount burned is derived from the `amount`, `preservation`, `precision` and + /// `force`, and might end up being more, less or equal to the `amount` specified. + /// + /// If the burn isn't possible then an `Err` is returned and nothing is changed. + /// If successful, the amount of tokens reduced is returned. fn burn_from( who: &AccountId, amount: Self::Balance, + preservation: Preservation, precision: Precision, force: Fortitude, ) -> Result { - let actual = Self::reducible_balance(who, Expendable, force).min(amount); + let actual = Self::reducible_balance(who, preservation, force).min(amount); ensure!(actual == amount || precision == BestEffort, TokenError::FundsUnavailable); Self::total_issuance().checked_sub(&actual).ok_or(ArithmeticError::Overflow)?; - let actual = Self::decrease_balance(who, actual, BestEffort, Expendable, force)?; + let actual = Self::decrease_balance(who, actual, BestEffort, preservation, force)?; Self::set_total_issuance(Self::total_issuance().saturating_sub(actual)); Self::done_burn_from(who, actual); Ok(actual) @@ -342,7 +346,8 @@ where fn set_balance(who: &AccountId, amount: Self::Balance) -> Self::Balance { let b = Self::balance(who); if b > amount { - Self::burn_from(who, b - amount, BestEffort, Force).map(|d| b.saturating_sub(d)) + Self::burn_from(who, b - amount, Expendable, BestEffort, Force) + .map(|d| b.saturating_sub(d)) } else { Self::mint_into(who, amount - b).map(|d| b.saturating_add(d)) } diff --git a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs index db44b2f43a4..63791b05223 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs @@ -442,14 +442,26 @@ impl< asset: Self::AssetId, who: &AccountId, amount: Self::Balance, + preservation: Preservation, precision: Precision, force: Fortitude, ) -> Result { match Criterion::convert(asset) { - Left(()) => - >::burn_from(who, amount, precision, force), - Right(a) => - >::burn_from(a, who, amount, precision, force), + Left(()) => >::burn_from( + who, + amount, + preservation, + precision, + force, + ), + Right(a) => >::burn_from( + a, + who, + amount, + preservation, + precision, + force, + ), } } fn shelve( diff --git a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs index b30e0ae3a2a..946c4756cff 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs @@ -283,16 +283,17 @@ where asset: Self::AssetId, who: &AccountId, amount: Self::Balance, + preservation: Preservation, precision: Precision, force: Fortitude, ) -> Result { - let actual = Self::reducible_balance(asset.clone(), who, Expendable, force).min(amount); + let actual = Self::reducible_balance(asset.clone(), who, preservation, force).min(amount); ensure!(actual == amount || precision == BestEffort, TokenError::FundsUnavailable); Self::total_issuance(asset.clone()) .checked_sub(&actual) .ok_or(ArithmeticError::Overflow)?; let actual = - Self::decrease_balance(asset.clone(), who, actual, BestEffort, Expendable, force)?; + Self::decrease_balance(asset.clone(), who, actual, BestEffort, preservation, force)?; Self::set_total_issuance( asset.clone(), Self::total_issuance(asset.clone()).saturating_sub(actual), @@ -392,7 +393,8 @@ where fn set_balance(asset: Self::AssetId, who: &AccountId, amount: Self::Balance) -> Self::Balance { let b = Self::balance(asset.clone(), who); if b > amount { - Self::burn_from(asset, who, b - amount, BestEffort, Force).map(|d| b.saturating_sub(d)) + Self::burn_from(asset, who, b - amount, Expendable, BestEffort, Force) + .map(|d| b.saturating_sub(d)) } else { Self::mint_into(asset, who, amount - b).map(|d| b.saturating_add(d)) } diff --git a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs index 2c7d4bab7ba..f4259a78f0a 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs @@ -389,14 +389,27 @@ impl< asset: Self::AssetId, who: &AccountId, amount: Self::Balance, + preservation: Preservation, precision: Precision, force: Fortitude, ) -> Result { match Criterion::convert(asset) { - Left(a) => - >::burn_from(a, who, amount, precision, force), - Right(a) => - >::burn_from(a, who, amount, precision, force), + Left(a) => >::burn_from( + a, + who, + amount, + preservation, + precision, + force, + ), + Right(a) => >::burn_from( + a, + who, + amount, + preservation, + precision, + force, + ), } } fn shelve( -- GitLab From 17b56fae2d976a3df87f34076875de8c26da0355 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 8 May 2024 11:26:57 +0300 Subject: [PATCH 061/170] Bridge: check bridge GRANDPA pallet call limits from signed extension (#4385) silent, because it'll be deployed with the https://github.com/paritytech/polkadot-sdk/pull/4102, where this code has been introduced I've planned originally to avoid doing that check in the runtime code, because it **may be** checked offchain. But actually, the check is quite cheap and we could do that onchain too. --- bridges/modules/grandpa/src/call_ext.rs | 67 ++++++++++++++++++++++++- bridges/modules/grandpa/src/lib.rs | 3 ++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/bridges/modules/grandpa/src/call_ext.rs b/bridges/modules/grandpa/src/call_ext.rs index 6fa62ec0cff..98fbeaa30bb 100644 --- a/bridges/modules/grandpa/src/call_ext.rs +++ b/bridges/modules/grandpa/src/call_ext.rs @@ -148,8 +148,13 @@ impl, I: 'static> SubmitFinalityProofHelper { } } - // we do not check whether the header matches free submission criteria here - it is the - // relayer responsibility to check that + // let's also check whether the header submission fits the hardcoded limits. A normal + // relayer would check that before submitting a transaction (since limits are constants + // and do not depend on a volatile runtime state), but the ckeck itself is cheap, so + // let's do it here too + if !call_info.fits_limits() { + return Err(Error::::HeaderOverflowLimits); + } Ok(improved_by) } @@ -468,6 +473,64 @@ mod tests { }) } + #[test] + fn extension_rejects_new_header_if_it_overflow_size_limits() { + run_test(|| { + let mut large_finality_target = test_header(10 + FreeHeadersInterval::get() as u64); + large_finality_target + .digest_mut() + .push(DigestItem::Other(vec![42u8; 1024 * 1024])); + let justification_params = JustificationGeneratorParams { + header: large_finality_target.clone(), + ..Default::default() + }; + let large_justification = make_justification_for_header(justification_params); + + let bridge_grandpa_call = crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(large_finality_target), + justification: large_justification, + current_set_id: 0, + is_free_execution_expected: true, + }; + sync_to_header_10(); + + // if overflow size limits => Err + FreeHeadersRemaining::::put(2); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_err()); + }) + } + + #[test] + fn extension_rejects_new_header_if_it_overflow_weight_limits() { + run_test(|| { + let finality_target = test_header(10 + FreeHeadersInterval::get() as u64); + let justification_params = JustificationGeneratorParams { + header: finality_target.clone(), + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY, + ..Default::default() + }; + let justification = make_justification_for_header(justification_params); + + let bridge_grandpa_call = crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(finality_target), + justification, + current_set_id: 0, + is_free_execution_expected: true, + }; + sync_to_header_10(); + + // if overflow weight limits => Err + FreeHeadersRemaining::::put(2); + assert!(RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call.clone(), + ),) + .is_err()); + }) + } + #[test] fn extension_rejects_new_header_if_free_execution_is_requested_and_improved_by_is_below_expected( ) { diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index efcbfb1654b..a927882aaaa 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -504,6 +504,9 @@ pub mod pallet { /// The submitter wanted free execution, but the difference between best known and /// bundled header numbers is below the `FreeHeadersInterval`. BelowFreeHeaderInterval, + /// The header (and its finality) submission overflows hardcoded chain limits: size + /// and/or weight are larger than expected. + HeaderOverflowLimits, } /// Called when new free header is imported. -- GitLab From 37b1544b51aeba183350d4c8d76987c32e6c9ca7 Mon Sep 17 00:00:00 2001 From: gupnik Date: Wed, 8 May 2024 17:20:23 +0530 Subject: [PATCH 062/170] Adds benchmarking and try-runtime support in frame crate (#4406) --- Cargo.lock | 4 ++++ prdoc/pr_4406.prdoc | 10 ++++++++++ substrate/frame/Cargo.toml | 28 ++++++++++++++++++++++++++++ substrate/frame/src/lib.rs | 10 ++++++++++ 4 files changed, 52 insertions(+) create mode 100644 prdoc/pr_4406.prdoc diff --git a/Cargo.lock b/Cargo.lock index 0dda623c14a..5ee267d691a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13888,10 +13888,13 @@ name = "polkadot-sdk-frame" version = "0.1.0" dependencies = [ "docify", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "frame-try-runtime", "log", "pallet-examples", "parity-scale-codec", @@ -13908,6 +13911,7 @@ dependencies = [ "sp-runtime", "sp-session", "sp-std 14.0.0", + "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", ] diff --git a/prdoc/pr_4406.prdoc b/prdoc/pr_4406.prdoc new file mode 100644 index 00000000000..9372b532512 --- /dev/null +++ b/prdoc/pr_4406.prdoc @@ -0,0 +1,10 @@ +title: Adds benchmarking and try-runtime support in `polkadot-sdk-frame` crate + +doc: + - audience: Runtime Dev + description: | + Adds benchmarking and try-runtime support in `polkadot-sdk-frame` crate + +crates: + - name: polkadot-sdk-frame + bump: minor diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index 729df227be0..44e8d681b01 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -46,10 +46,18 @@ sp-session = { default-features = false, path = "../primitives/session", optiona sp-consensus-aura = { default-features = false, path = "../primitives/consensus/aura", optional = true } sp-consensus-grandpa = { default-features = false, path = "../primitives/consensus/grandpa", optional = true } sp-inherents = { default-features = false, path = "../primitives/inherents", optional = true } +sp-storage = { default-features = false, path = "../primitives/storage", optional = true } frame-executive = { default-features = false, path = "../frame/executive", optional = true } frame-system-rpc-runtime-api = { default-features = false, path = "../frame/system/rpc/runtime-api", optional = true } +# Used for runtime benchmarking +frame-benchmarking = { default-features = false, path = "../frame/benchmarking", optional = true } +frame-system-benchmarking = { default-features = false, path = "../frame/system/benchmarking", optional = true } + +# Used for try-runtime +frame-try-runtime = { default-features = false, path = "../frame/try-runtime", optional = true } + docify = "0.2.8" log = { workspace = true } @@ -67,6 +75,7 @@ runtime = [ "sp-inherents", "sp-offchain", "sp-session", + "sp-storage", "sp-transaction-pool", "sp-version", @@ -74,10 +83,13 @@ runtime = [ "frame-system-rpc-runtime-api", ] std = [ + "frame-benchmarking?/std", "frame-executive?/std", "frame-support/std", + "frame-system-benchmarking?/std", "frame-system-rpc-runtime-api?/std", "frame-system/std", + "frame-try-runtime?/std", "log/std", "parity-scale-codec/std", "scale-info/std", @@ -93,6 +105,22 @@ std = [ "sp-runtime/std", "sp-session?/std", "sp-std/std", + "sp-storage/std", "sp-transaction-pool?/std", "sp-version?/std", ] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-examples/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/frame/src/lib.rs b/substrate/frame/src/lib.rs index 90c446808da..f6507cd02c7 100644 --- a/substrate/frame/src/lib.rs +++ b/substrate/frame/src/lib.rs @@ -363,5 +363,15 @@ pub mod deps { #[cfg(feature = "runtime")] pub use sp_offchain; #[cfg(feature = "runtime")] + pub use sp_storage; + #[cfg(feature = "runtime")] pub use sp_version; + + #[cfg(feature = "runtime-benchmarks")] + pub use frame_benchmarking; + #[cfg(feature = "runtime-benchmarks")] + pub use frame_system_benchmarking; + + #[cfg(feature = "frame-try-runtime")] + pub use frame_try_runtime; } -- GitLab From 6fdb522ded3813f43a539964af78d5fc6d9f1e97 Mon Sep 17 00:00:00 2001 From: Lulu Date: Wed, 8 May 2024 17:17:09 +0100 Subject: [PATCH 063/170] Add semver CI check (#4279) This checks changed files against API surface changes against what the prdoc says. It will error if the detected semver change is greater than the one listed in the prdoc. It will also error if any crates were touched but not mentioned in the prdoc. --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Oliver Tale-Yazdi --- .github/workflows/check-publish.yml | 4 +- .github/workflows/check-semver.yml | 55 +++++++++++++++++++++++ .github/workflows/claim-crates.yml | 4 +- Cargo.lock | 2 +- substrate/client/network/types/Cargo.toml | 2 +- 5 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/check-semver.yml diff --git a/.github/workflows/check-publish.yml b/.github/workflows/check-publish.yml index b16b3d4e5c5..9b5b89e3447 100644 --- a/.github/workflows/check-publish.yml +++ b/.github/workflows/check-publish.yml @@ -20,7 +20,7 @@ jobs: cache-on-failure: true - name: install parity-publish - run: cargo install parity-publish@0.3.0 + run: cargo install parity-publish@0.5.1 - name: parity-publish check - run: parity-publish check --allow-unpublished + run: parity-publish --color always check --allow-unpublished diff --git a/.github/workflows/check-semver.yml b/.github/workflows/check-semver.yml new file mode 100644 index 00000000000..f0e076e8a16 --- /dev/null +++ b/.github/workflows/check-semver.yml @@ -0,0 +1,55 @@ +name: Check semver + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths: + - prdoc/*.prdoc + +jobs: + check-semver: + runs-on: ubuntu-latest + container: + image: docker.io/paritytech/ci-unified:bullseye-1.77.0-2024-04-10-v20240408 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Rust Cache + uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2.7.3 + with: + cache-on-failure: true + + - name: Rust compilation prerequisites + run: | + rustup default nightly-2024-03-01 + rustup target add wasm32-unknown-unknown --toolchain nightly-2024-03-01 + rustup component add rust-src --toolchain nightly-2024-03-01 + + - name: install parity-publish + run: cargo install parity-publish@0.5.1 + + - name: extra git setup + run: | + git config --global --add safe.directory '*' + git fetch --no-tags --no-recurse-submodules --depth=1 origin master + git branch old origin/master + + - name: check semver + run: | + export CARGO_TARGET_DIR=target + export RUSTFLAGS='-A warnings -A missing_docs' + if ! parity-publish --color always prdoc --since old --validate prdoc/pr_$PR.prdoc --toolchain nightly-2024-03-01 -v; then + cat < Date: Thu, 9 May 2024 09:23:59 +0200 Subject: [PATCH 064/170] rpc: add option to `whitelist ips` in rate limiting (#3701) This PR adds two new CLI options to disable rate limiting for certain ip addresses and whether to trust "proxy header". After going back in forth I decided to use ip addr instead host because we don't want rely on the host header which can be spoofed but another solution is to resolve the ip addr from the socket to host name. Example: ```bash $ polkadot --rpc-rate-limit 10 --rpc-rate-limit-whitelisted-ips 127.0.0.1/8 --rpc-rate-limit-trust-proxy-headers ``` The ip addr is read from the HTTP proxy headers `Forwarded`, `X-Forwarded-For` `X-Real-IP` if `--rpc-rate-limit-trust-proxy-headers` is enabled if that is not enabled or the headers are not found then the ip address is read from the socket. //cc @BulatSaif can you test this and give some feedback on it? --- Cargo.lock | 18 ++ cumulus/test/service/src/lib.rs | 2 + polkadot/node/test/service/src/lib.rs | 2 + prdoc/pr_3701.prdoc | 11 + .../bin/node/cli/benches/block_production.rs | 2 + .../bin/node/cli/benches/transaction_pool.rs | 2 + substrate/client/cli/src/commands/run_cmd.rs | 28 ++- substrate/client/cli/src/config.rs | 14 +- substrate/client/cli/src/runner.rs | 2 + substrate/client/rpc-servers/Cargo.toml | 14 +- substrate/client/rpc-servers/src/lib.rs | 94 +++------ substrate/client/rpc-servers/src/utils.rs | 189 ++++++++++++++++++ substrate/client/service/src/config.rs | 5 + substrate/client/service/src/lib.rs | 2 + substrate/client/service/test/src/lib.rs | 2 + 15 files changed, 318 insertions(+), 69 deletions(-) create mode 100644 prdoc/pr_3701.prdoc create mode 100644 substrate/client/rpc-servers/src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 32c50ea350d..d43088704b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5585,6 +5585,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "forwarded-header-value" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" +dependencies = [ + "nonempty", + "thiserror", +] + [[package]] name = "fraction" version = "0.13.1" @@ -9051,6 +9061,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonempty" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" + [[package]] name = "nonzero_ext" version = "0.3.0" @@ -17302,10 +17318,12 @@ dependencies = [ name = "sc-rpc-server" version = "11.0.0" dependencies = [ + "forwarded-header-value", "futures", "governor", "http", "hyper", + "ip_network", "jsonrpsee", "log", "serde_json", diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index 11aa2e5b9f3..f2a61280386 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -824,6 +824,8 @@ pub fn node_config( rpc_message_buffer_capacity: Default::default(), rpc_batch_config: RpcBatchRequestConfig::Unlimited, rpc_rate_limit: None, + rpc_rate_limit_whitelisted_ips: Default::default(), + rpc_rate_limit_trust_proxy_headers: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/polkadot/node/test/service/src/lib.rs b/polkadot/node/test/service/src/lib.rs index 87fbc7c20f3..35156a3a937 100644 --- a/polkadot/node/test/service/src/lib.rs +++ b/polkadot/node/test/service/src/lib.rs @@ -216,6 +216,8 @@ pub fn node_config( rpc_message_buffer_capacity: Default::default(), rpc_batch_config: RpcBatchRequestConfig::Unlimited, rpc_rate_limit: None, + rpc_rate_limit_whitelisted_ips: Default::default(), + rpc_rate_limit_trust_proxy_headers: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/prdoc/pr_3701.prdoc b/prdoc/pr_3701.prdoc new file mode 100644 index 00000000000..6f9fcc92ad3 --- /dev/null +++ b/prdoc/pr_3701.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: add option to whitelist peers in rpc rate limiting + +doc: + - audience: Node Operator + description: | + This PR adds two new CLI options to disable rate limiting for certain ip addresses and whether to trust "proxy headers". + +crates: [ ] diff --git a/substrate/bin/node/cli/benches/block_production.rs b/substrate/bin/node/cli/benches/block_production.rs index f60610873d8..ef7ae4fdf26 100644 --- a/substrate/bin/node/cli/benches/block_production.rs +++ b/substrate/bin/node/cli/benches/block_production.rs @@ -86,6 +86,8 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { rpc_message_buffer_capacity: Default::default(), rpc_batch_config: RpcBatchRequestConfig::Unlimited, rpc_rate_limit: None, + rpc_rate_limit_whitelisted_ips: Default::default(), + rpc_rate_limit_trust_proxy_headers: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/substrate/bin/node/cli/benches/transaction_pool.rs b/substrate/bin/node/cli/benches/transaction_pool.rs index 1906ae697e9..c4488415b98 100644 --- a/substrate/bin/node/cli/benches/transaction_pool.rs +++ b/substrate/bin/node/cli/benches/transaction_pool.rs @@ -82,6 +82,8 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { rpc_message_buffer_capacity: Default::default(), rpc_batch_config: RpcBatchRequestConfig::Unlimited, rpc_rate_limit: None, + rpc_rate_limit_whitelisted_ips: Default::default(), + rpc_rate_limit_trust_proxy_headers: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/substrate/client/cli/src/commands/run_cmd.rs b/substrate/client/cli/src/commands/run_cmd.rs index 221c32affd5..c1288b502c9 100644 --- a/substrate/client/cli/src/commands/run_cmd.rs +++ b/substrate/client/cli/src/commands/run_cmd.rs @@ -30,7 +30,9 @@ use crate::{ use clap::Parser; use regex::Regex; use sc_service::{ - config::{BasePath, PrometheusConfig, RpcBatchRequestConfig, TransactionPoolOptions}, + config::{ + BasePath, IpNetwork, PrometheusConfig, RpcBatchRequestConfig, TransactionPoolOptions, + }, ChainSpec, Role, }; use sc_telemetry::TelemetryEndpoints; @@ -94,6 +96,22 @@ pub struct RunCmd { #[arg(long)] pub rpc_rate_limit: Option, + /// Disable RPC rate limiting for certain ip addresses. + /// + /// Each IP address must be in CIDR notation such as `1.2.3.4/24`. + #[arg(long, num_args = 1..)] + pub rpc_rate_limit_whitelisted_ips: Vec, + + /// Trust proxy headers for disable rate limiting. + /// + /// By default the rpc server will not trust headers such `X-Real-IP`, `X-Forwarded-For` and + /// `Forwarded` and this option will make the rpc server to trust these headers. + /// + /// For instance this may be secure if the rpc server is behind a reverse proxy and that the + /// proxy always sets these headers. + #[arg(long)] + pub rpc_rate_limit_trust_proxy_headers: bool, + /// Set the maximum RPC request payload size for both HTTP and WS in megabytes. #[arg(long, default_value_t = RPC_DEFAULT_MAX_REQUEST_SIZE_MB)] pub rpc_max_request_size: u32, @@ -439,6 +457,14 @@ impl CliConfiguration for RunCmd { Ok(self.rpc_rate_limit) } + fn rpc_rate_limit_whitelisted_ips(&self) -> Result> { + Ok(self.rpc_rate_limit_whitelisted_ips.clone()) + } + + fn rpc_rate_limit_trust_proxy_headers(&self) -> Result { + Ok(self.rpc_rate_limit_trust_proxy_headers) + } + fn transaction_pool(&self, is_dev: bool) -> Result { Ok(self.pool_config.transaction_pool(is_dev)) } diff --git a/substrate/client/cli/src/config.rs b/substrate/client/cli/src/config.rs index 70a4885e5ee..783c9313121 100644 --- a/substrate/client/cli/src/config.rs +++ b/substrate/client/cli/src/config.rs @@ -26,7 +26,7 @@ use log::warn; use names::{Generator, Name}; use sc_service::{ config::{ - BasePath, Configuration, DatabaseSource, KeystoreConfig, NetworkConfiguration, + BasePath, Configuration, DatabaseSource, IpNetwork, KeystoreConfig, NetworkConfiguration, NodeKeyConfig, OffchainWorkerConfig, OutputFormat, PrometheusConfig, PruningMode, Role, RpcBatchRequestConfig, RpcMethods, TelemetryEndpoints, TransactionPoolOptions, WasmExecutionMethod, @@ -349,6 +349,16 @@ pub trait CliConfiguration: Sized { Ok(None) } + /// RPC rate limit whitelisted ip addresses. + fn rpc_rate_limit_whitelisted_ips(&self) -> Result> { + Ok(vec![]) + } + + /// RPC rate limit trust proxy headers. + fn rpc_rate_limit_trust_proxy_headers(&self) -> Result { + Ok(false) + } + /// Get the prometheus configuration (`None` if disabled) /// /// By default this is `None`. @@ -523,6 +533,8 @@ pub trait CliConfiguration: Sized { rpc_message_buffer_capacity: self.rpc_buffer_capacity_per_connection()?, rpc_batch_config: self.rpc_batch_config()?, rpc_rate_limit: self.rpc_rate_limit()?, + rpc_rate_limit_whitelisted_ips: self.rpc_rate_limit_whitelisted_ips()?, + rpc_rate_limit_trust_proxy_headers: self.rpc_rate_limit_trust_proxy_headers()?, prometheus_config: self .prometheus_config(DCV::prometheus_listen_port(), &chain_spec)?, telemetry_endpoints, diff --git a/substrate/client/cli/src/runner.rs b/substrate/client/cli/src/runner.rs index 4201a0f4062..3bf27680784 100644 --- a/substrate/client/cli/src/runner.rs +++ b/substrate/client/cli/src/runner.rs @@ -273,6 +273,8 @@ mod tests { rpc_port: 9944, rpc_batch_config: sc_service::config::RpcBatchRequestConfig::Unlimited, rpc_rate_limit: None, + rpc_rate_limit_whitelisted_ips: Default::default(), + rpc_rate_limit_trust_proxy_headers: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index bc21b5b1582..7837c852a1c 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -16,14 +16,16 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] +forwarded-header-value = "0.1.1" +futures = "0.3.30" +governor = "0.6.0" +http = "0.2.8" +hyper = "0.14.27" +ip_network = "0.4.1" jsonrpsee = { version = "0.22", features = ["server"] } log = { workspace = true, default-features = true } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["parking_lot"] } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } -tower-http = { version = "0.4.0", features = ["cors"] } tower = { version = "0.4.13", features = ["util"] } -http = "0.2.8" -hyper = "0.14.27" -futures = "0.3.30" -governor = "0.6.0" +tower-http = { version = "0.4.0", features = ["cors"] } diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index ad4b444c7ff..ba1fcf5e367 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -21,27 +21,28 @@ #![warn(missing_docs)] pub mod middleware; +pub mod utils; use std::{ convert::Infallible, error::Error as StdError, net::SocketAddr, num::NonZeroU32, time::Duration, }; -use http::header::HeaderValue; use hyper::{ server::conn::AddrStream, service::{make_service_fn, service_fn}, }; use jsonrpsee::{ server::{ - middleware::http::{HostFilterLayer, ProxyGetRequestLayer}, - stop_channel, ws, PingConfig, StopHandle, TowerServiceBuilder, + middleware::http::ProxyGetRequestLayer, stop_channel, ws, PingConfig, StopHandle, + TowerServiceBuilder, }, Methods, RpcModule, }; use tokio::net::TcpListener; use tower::Service; -use tower_http::cors::{AllowOrigin, CorsLayer}; +use utils::{build_rpc_api, format_cors, get_proxy_ip, host_filtering, try_into_cors}; +pub use ip_network::IpNetwork; pub use jsonrpsee::{ core::{ id_providers::{RandomIntegerIdProvider, RandomStringIdProvider}, @@ -85,6 +86,10 @@ pub struct Config<'a, M: Send + Sync + 'static> { pub batch_config: BatchRequestConfig, /// Rate limit calls per minute. pub rate_limit: Option, + /// Disable rate limit for certain ips. + pub rate_limit_whitelisted_ips: Vec, + /// Trust proxy headers for rate limiting. + pub rate_limit_trust_proxy_headers: bool, } #[derive(Debug, Clone)] @@ -117,11 +122,13 @@ where tokio_handle, rpc_api, rate_limit, + rate_limit_whitelisted_ips, + rate_limit_trust_proxy_headers, } = config; let std_listener = TcpListener::bind(addrs.as_slice()).await?.into_std()?; let local_addr = std_listener.local_addr().ok(); - let host_filter = hosts_filtering(cors.is_some(), local_addr); + let host_filter = host_filtering(cors.is_some(), local_addr); let http_middleware = tower::ServiceBuilder::new() .option_layer(host_filter) @@ -160,20 +167,39 @@ where stop_handle: stop_handle.clone(), }; - let make_service = make_service_fn(move |_conn: &AddrStream| { + let make_service = make_service_fn(move |addr: &AddrStream| { let cfg = cfg.clone(); + let rate_limit_whitelisted_ips = rate_limit_whitelisted_ips.clone(); + let ip = addr.remote_addr().ip(); async move { let cfg = cfg.clone(); + let rate_limit_whitelisted_ips = rate_limit_whitelisted_ips.clone(); Ok::<_, Infallible>(service_fn(move |req| { + let proxy_ip = + if rate_limit_trust_proxy_headers { get_proxy_ip(&req) } else { None }; + + let rate_limit_cfg = if rate_limit_whitelisted_ips + .iter() + .any(|ips| ips.contains(proxy_ip.unwrap_or(ip))) + { + log::debug!(target: "rpc", "ip={ip}, proxy_ip={:?} is trusted, disabling rate-limit", proxy_ip); + None + } else { + if !rate_limit_whitelisted_ips.is_empty() { + log::debug!(target: "rpc", "ip={ip}, proxy_ip={:?} is not trusted, rate-limit enabled", proxy_ip); + } + rate_limit + }; + let PerConnection { service_builder, metrics, tokio_handle, stop_handle, methods } = cfg.clone(); let is_websocket = ws::is_upgrade_request(&req); let transport_label = if is_websocket { "ws" } else { "http" }; - let middleware_layer = match (metrics, rate_limit) { + let middleware_layer = match (metrics, rate_limit_cfg) { (None, None) => None, (Some(metrics), None) => Some( MiddlewareLayer::new().with_metrics(Metrics::new(metrics, transport_label)), @@ -227,57 +253,3 @@ where Ok(server_handle) } - -fn hosts_filtering(enabled: bool, addr: Option) -> Option { - // If the local_addr failed, fallback to wildcard. - let port = addr.map_or("*".to_string(), |p| p.port().to_string()); - - if enabled { - // NOTE: The listening addresses are whitelisted by default. - let hosts = - [format!("localhost:{port}"), format!("127.0.0.1:{port}"), format!("[::1]:{port}")]; - Some(HostFilterLayer::new(hosts).expect("Valid hosts; qed")) - } else { - None - } -} - -fn build_rpc_api(mut rpc_api: RpcModule) -> RpcModule { - let mut available_methods = rpc_api.method_names().collect::>(); - // The "rpc_methods" is defined below and we want it to be part of the reported methods. - available_methods.push("rpc_methods"); - available_methods.sort(); - - rpc_api - .register_method("rpc_methods", move |_, _| { - serde_json::json!({ - "methods": available_methods, - }) - }) - .expect("infallible all other methods have their own address space; qed"); - - rpc_api -} - -fn try_into_cors( - maybe_cors: Option<&Vec>, -) -> Result> { - if let Some(cors) = maybe_cors { - let mut list = Vec::new(); - for origin in cors { - list.push(HeaderValue::from_str(origin)?); - } - Ok(CorsLayer::new().allow_origin(AllowOrigin::list(list))) - } else { - // allow all cors - Ok(CorsLayer::permissive()) - } -} - -fn format_cors(maybe_cors: Option<&Vec>) -> String { - if let Some(cors) = maybe_cors { - format!("{:?}", cors) - } else { - format!("{:?}", ["*"]) - } -} diff --git a/substrate/client/rpc-servers/src/utils.rs b/substrate/client/rpc-servers/src/utils.rs new file mode 100644 index 00000000000..d99b8e637d9 --- /dev/null +++ b/substrate/client/rpc-servers/src/utils.rs @@ -0,0 +1,189 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Substrate RPC server utils. + +use std::{ + error::Error as StdError, + net::{IpAddr, SocketAddr}, + str::FromStr, +}; + +use forwarded_header_value::ForwardedHeaderValue; +use hyper::{ + header::{HeaderName, HeaderValue}, + Request, +}; +use jsonrpsee::{server::middleware::http::HostFilterLayer, RpcModule}; +use tower_http::cors::{AllowOrigin, CorsLayer}; + +const X_FORWARDED_FOR: HeaderName = HeaderName::from_static("x-forwarded-for"); +const X_REAL_IP: HeaderName = HeaderName::from_static("x-real-ip"); +const FORWARDED: HeaderName = HeaderName::from_static("forwarded"); + +pub(crate) fn host_filtering(enabled: bool, addr: Option) -> Option { + // If the local_addr failed, fallback to wildcard. + let port = addr.map_or("*".to_string(), |p| p.port().to_string()); + + if enabled { + // NOTE: The listening addresses are whitelisted by default. + let hosts = + [format!("localhost:{port}"), format!("127.0.0.1:{port}"), format!("[::1]:{port}")]; + Some(HostFilterLayer::new(hosts).expect("Valid hosts; qed")) + } else { + None + } +} + +pub(crate) fn build_rpc_api(mut rpc_api: RpcModule) -> RpcModule { + let mut available_methods = rpc_api.method_names().collect::>(); + // The "rpc_methods" is defined below and we want it to be part of the reported methods. + available_methods.push("rpc_methods"); + available_methods.sort(); + + rpc_api + .register_method("rpc_methods", move |_, _| { + serde_json::json!({ + "methods": available_methods, + }) + }) + .expect("infallible all other methods have their own address space; qed"); + + rpc_api +} + +pub(crate) fn try_into_cors( + maybe_cors: Option<&Vec>, +) -> Result> { + if let Some(cors) = maybe_cors { + let mut list = Vec::new(); + for origin in cors { + list.push(HeaderValue::from_str(origin)?); + } + Ok(CorsLayer::new().allow_origin(AllowOrigin::list(list))) + } else { + // allow all cors + Ok(CorsLayer::permissive()) + } +} + +pub(crate) fn format_cors(maybe_cors: Option<&Vec>) -> String { + if let Some(cors) = maybe_cors { + format!("{:?}", cors) + } else { + format!("{:?}", ["*"]) + } +} + +/// Extracts the IP addr from the HTTP request. +/// +/// It is extracted in the following order: +/// 1. `Forwarded` header. +/// 2. `X-Forwarded-For` header. +/// 3. `X-Real-Ip`. +pub(crate) fn get_proxy_ip(req: &Request) -> Option { + if let Some(ip) = req + .headers() + .get(&FORWARDED) + .and_then(|v| v.to_str().ok()) + .and_then(|v| ForwardedHeaderValue::from_forwarded(v).ok()) + .and_then(|v| v.remotest_forwarded_for_ip()) + { + return Some(ip); + } + + if let Some(ip) = req + .headers() + .get(&X_FORWARDED_FOR) + .and_then(|v| v.to_str().ok()) + .and_then(|v| ForwardedHeaderValue::from_x_forwarded_for(v).ok()) + .and_then(|v| v.remotest_forwarded_for_ip()) + { + return Some(ip); + } + + if let Some(ip) = req + .headers() + .get(&X_REAL_IP) + .and_then(|v| v.to_str().ok()) + .and_then(|v| IpAddr::from_str(v).ok()) + { + return Some(ip); + } + + None +} + +#[cfg(test)] +mod tests { + use super::*; + use hyper::header::HeaderValue; + + fn request() -> hyper::Request { + hyper::Request::builder().body(hyper::Body::empty()).unwrap() + } + + #[test] + fn empty_works() { + let req = request(); + let host = get_proxy_ip(&req); + assert!(host.is_none()) + } + + #[test] + fn host_from_x_real_ip() { + let mut req = request(); + + req.headers_mut().insert(&X_REAL_IP, HeaderValue::from_static("127.0.0.1")); + let ip = get_proxy_ip(&req); + assert_eq!(Some(IpAddr::from_str("127.0.0.1").unwrap()), ip); + } + + #[test] + fn ip_from_forwarded_works() { + let mut req = request(); + + req.headers_mut().insert( + &FORWARDED, + HeaderValue::from_static("for=192.0.2.60;proto=http;by=203.0.113.43;host=example.com"), + ); + let ip = get_proxy_ip(&req); + assert_eq!(Some(IpAddr::from_str("192.0.2.60").unwrap()), ip); + } + + #[test] + fn ip_from_forwarded_multiple() { + let mut req = request(); + + req.headers_mut().append(&FORWARDED, HeaderValue::from_static("for=127.0.0.1")); + req.headers_mut().append(&FORWARDED, HeaderValue::from_static("for=192.0.2.60")); + req.headers_mut().append(&FORWARDED, HeaderValue::from_static("for=192.0.2.61")); + let ip = get_proxy_ip(&req); + assert_eq!(Some(IpAddr::from_str("127.0.0.1").unwrap()), ip); + } + + #[test] + fn ip_from_x_forwarded_works() { + let mut req = request(); + + req.headers_mut() + .insert(&X_FORWARDED_FOR, HeaderValue::from_static("127.0.0.1,192.0.2.60,0.0.0.1")); + let ip = get_proxy_ip(&req); + assert_eq!(Some(IpAddr::from_str("127.0.0.1").unwrap()), ip); + } +} diff --git a/substrate/client/service/src/config.rs b/substrate/client/service/src/config.rs index 59e307d7f93..187e18aa3ca 100644 --- a/substrate/client/service/src/config.rs +++ b/substrate/client/service/src/config.rs @@ -34,6 +34,7 @@ pub use sc_network::{ }, Multiaddr, }; +pub use sc_rpc_server::IpNetwork; pub use sc_telemetry::TelemetryEndpoints; pub use sc_transaction_pool::Options as TransactionPoolOptions; use sp_core::crypto::SecretString; @@ -108,6 +109,10 @@ pub struct Configuration { pub rpc_batch_config: RpcBatchRequestConfig, /// RPC rate limit per minute. pub rpc_rate_limit: Option, + /// RPC rate limit whitelisted ip addresses. + pub rpc_rate_limit_whitelisted_ips: Vec, + /// RPC rate limit trust proxy headers. + pub rpc_rate_limit_trust_proxy_headers: bool, /// Prometheus endpoint configuration. `None` if disabled. pub prometheus_config: Option, /// Telemetry service URL. `None` if disabled. diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs index d0f315c30c8..444cb4a06eb 100644 --- a/substrate/client/service/src/lib.rs +++ b/substrate/client/service/src/lib.rs @@ -407,6 +407,8 @@ where cors: config.rpc_cors.as_ref(), tokio_handle: config.tokio_handle.clone(), rate_limit: config.rpc_rate_limit, + rate_limit_whitelisted_ips: config.rpc_rate_limit_whitelisted_ips.clone(), + rate_limit_trust_proxy_headers: config.rpc_rate_limit_trust_proxy_headers, }; // TODO: https://github.com/paritytech/substrate/issues/13773 diff --git a/substrate/client/service/test/src/lib.rs b/substrate/client/service/test/src/lib.rs index b9abd8446f7..f19b5a19739 100644 --- a/substrate/client/service/test/src/lib.rs +++ b/substrate/client/service/test/src/lib.rs @@ -252,6 +252,8 @@ fn node_config< rpc_message_buffer_capacity: Default::default(), rpc_batch_config: RpcBatchRequestConfig::Unlimited, rpc_rate_limit: None, + rpc_rate_limit_whitelisted_ips: Default::default(), + rpc_rate_limit_trust_proxy_headers: Default::default(), prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, -- GitLab From 657df04cd901559cc6e33a8dfe70395bddb079f2 Mon Sep 17 00:00:00 2001 From: gupnik Date: Fri, 10 May 2024 14:49:43 +0530 Subject: [PATCH 065/170] Fixes `frame-support` reference in `try_decode_entire_state` (#4425) --- substrate/frame/support/procedural/src/pallet/expand/storage.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/support/procedural/src/pallet/expand/storage.rs b/substrate/frame/support/procedural/src/pallet/expand/storage.rs index 937b068cfab..3cc8a843e3b 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/storage.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/storage.rs @@ -854,7 +854,7 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream { for #pallet_ident<#type_use_gen> #completed_where_clause { fn try_decode_entire_state() -> Result> { - let pallet_name = <::PalletInfo as frame_support::traits::PalletInfo> + let pallet_name = <::PalletInfo as #frame_support::traits::PalletInfo> ::name::<#pallet_ident<#type_use_gen>>() .expect("Every active pallet has a name in the runtime; qed"); -- GitLab From 2ed0f3e8318df7b78e311933cbec8778ed699e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 10 May 2024 14:05:57 +0200 Subject: [PATCH 066/170] rustls: Disable logging (#4426) Disable logging of rustls to get rid off the following log lines: ``` Sending fatal alert BadCertificate ``` Upstream also removed them: https://github.com/rustls/rustls/pull/1278 Closes: https://github.com/paritytech/polkadot-sdk/issues/3252 --- prdoc/pr_4426.prdoc | 15 +++++++++++++++ substrate/client/tracing/src/logging/mod.rs | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 prdoc/pr_4426.prdoc diff --git a/prdoc/pr_4426.prdoc b/prdoc/pr_4426.prdoc new file mode 100644 index 00000000000..5beccbd2a57 --- /dev/null +++ b/prdoc/pr_4426.prdoc @@ -0,0 +1,15 @@ +title: "Remove warning about `BadCertificate`" + +doc: + - audience: Node Operator + description: | + The node was printing the following warning from time to time: + ``` + Sending fatal alert BadCertificate + ``` + + This is not an user error and thus, the warning will now not be printed + anymore. + +crates: + - name: sc-cli diff --git a/substrate/client/tracing/src/logging/mod.rs b/substrate/client/tracing/src/logging/mod.rs index 8b2ad9b598b..46fd4efb339 100644 --- a/substrate/client/tracing/src/logging/mod.rs +++ b/substrate/client/tracing/src/logging/mod.rs @@ -141,6 +141,10 @@ where .add_directive( parse_default_directive("libp2p_mdns::behaviour::iface=off") .expect("provided directive is valid"), + ) + .add_directive( + parse_default_directive("rustls::common_state=off") + .expect("provided directive is valid"), ); if let Ok(lvl) = std::env::var("RUST_LOG") { -- GitLab From 00440779d42b754292783612fc0f7e99d7cde2d2 Mon Sep 17 00:00:00 2001 From: Maciej Date: Fri, 10 May 2024 13:31:53 +0100 Subject: [PATCH 067/170] Disabling Strategy Implementers Guide (#2955) Closes #1961 --- .../roadmap/implementers-guide/src/SUMMARY.md | 1 + .../src/protocol-disputes.md | 6 +- .../src/protocol-validator-disabling.md | 437 ++++++++++++++++++ 3 files changed, 441 insertions(+), 3 deletions(-) create mode 100644 polkadot/roadmap/implementers-guide/src/protocol-validator-disabling.md diff --git a/polkadot/roadmap/implementers-guide/src/SUMMARY.md b/polkadot/roadmap/implementers-guide/src/SUMMARY.md index bb19390c7af..41485e5df8e 100644 --- a/polkadot/roadmap/implementers-guide/src/SUMMARY.md +++ b/polkadot/roadmap/implementers-guide/src/SUMMARY.md @@ -8,6 +8,7 @@ - [Disputes Process](protocol-disputes.md) - [Dispute Flow](disputes-flow.md) - [Chain Selection and Finalization](protocol-chain-selection.md) + - [Validator Disabling](protocol-validator-disabling.md) - [Architecture Overview](architecture.md) - [Messaging Overview](messaging.md) - [PVF Pre-checking](pvf-prechecking.md) diff --git a/polkadot/roadmap/implementers-guide/src/protocol-disputes.md b/polkadot/roadmap/implementers-guide/src/protocol-disputes.md index 2a4082cc07f..922cc3c3e2b 100644 --- a/polkadot/roadmap/implementers-guide/src/protocol-disputes.md +++ b/polkadot/roadmap/implementers-guide/src/protocol-disputes.md @@ -8,9 +8,9 @@ All parachain blocks that end up in the finalized relay chain should be valid. T only backed, but not included. We have two primary components for ensuring that nothing invalid ends up in the finalized relay chain: - * Approval Checking, as described [here](./protocol-approval.md) and implemented according to the [Approval - Voting](node/approval/approval-voting.md) subsystem. This protocol can be shown to prevent invalid parachain blocks - from making their way into the finalized relay chain as long as the amount of attempts are limited. + * Approval Checking, as described [here](./protocol-approval.md) and implemented accordingly in the [Approval +Voting](node/approval/approval-voting.md) subsystem. This protocol can be shown to prevent invalid parachain blocks +from making their way into the finalized relay chain as long as the amount of attempts are limited. * Disputes, this protocol, which ensures that each attempt to include something bad is caught, and the offending validators are punished. Disputes differ from backing and approval process (and can not be part of those) in that a dispute is independent of a particular fork, while both backing and approval operate on particular forks. This diff --git a/polkadot/roadmap/implementers-guide/src/protocol-validator-disabling.md b/polkadot/roadmap/implementers-guide/src/protocol-validator-disabling.md new file mode 100644 index 00000000000..9fd44c00fa0 --- /dev/null +++ b/polkadot/roadmap/implementers-guide/src/protocol-validator-disabling.md @@ -0,0 +1,437 @@ +# Validator Disabling + +## Background + +As established in the [approval process](protocol-approval.md) dealing with bad parablocks is a three step process: + +1. Detection +1. Escalation +1. Consequences + +The main system responsible for dispensing **consequences** for malicious actors is the [dispute +system](protocol-disputes.md) which eventually dispenses slash events. The slashes itself can be dispensed quickly (a +matter of blocks) but for an extra layer of auditing all slashes are deferred for 27 days (in Polkadot/Kusama) which +gives time for Governance to investigate and potentially alter the punishment. Dispute concluding by itself does not +immediately remove the validator from the active validator set. + +> **Note:** \ +> There was an additional mechanism of automatically chilling the validator which removed their intent to participate in +> the next election, but the removed validator could simply re-register his intent to validate. + +There is a need to have a more immediate way to deal with malicious validators. This is where the validator disabling +comes in. It is focused on dispensing **low latency** consequences for malicious actors. It is important to note that +the validator disabling is not a replacement for the dispute or slashing systems. It is a complementary system that is +focused on lighter but immediate consequences usually in the form of restricted validator privileges. + +The primary goals are: +- Eliminate or minimize cases where attackers can get free attempts at attacking the network +- Eliminate or minimize the risks of honest nodes being pushed out of consensus when getting unjustly slashed (defense + in depth) + +The above two goals are generally at odds so a careful balance has to be struck between them. We will achieve them by +sacrificing some **liveness** in favor of **soundness** when the network is under stress. Maintaining some liveness but +absolute soundness is paramount. + +> **Note:** \ +> Liveness = Valid candidates can go through (at a decent pace) \ +> Security = Invalid candidates cannot go through (or are statistically very improbable) + +Side goals are: +- Reduce the damages to honest nodes that had a fault which might cause repeated slashes +- Reduce liveness impact of individual malicious attackers + +## System Overview + +High level assumptions and goals of the validator disabling system that will be further discussed in the following +sections: + +1. If validator gets slashed (even 0%) we mark them as disabled in the runtime and on the node side. +1. We only disable up to byzantine threshold of the validators. +1. If there are more offenders than byzantine threshold disable only the highest offenders. (Some might get re-enabled.) +1. Disablement lasts for 1 era. +1. Disabled validators remain in the active validator set but have some limited permissions. +1. Disabled validators can get re-elected. +1. Disabled validators can participate in approval checking. +1. Disabled validators can participate in GRANDPA/BEEFY, but equivocations cause disablement. +1. Disabled validators cannot author blocks. +1. Disabled validators cannot back candidates. +1. Disabled validators cannot initiate disputes, but their votes are still counted if a dispute occurs. +1. Disabled validators making dispute statements no-show in approval checking. + +


+ +# Risks + +## Risks of NOT having validator disabling + +Assume that if an offense is committed a slash is deposited but the perpetrator can still act normally. He will be +slashed 100% with a long delay (slash deferral duration which is 27 days). This is akin to the current design. + +A simple argument for disabling is that if someone is already slashed 100% and they have nothing to lose they could +cause harm to the network and should be silenced. + +What harm could they cause? + +**1. Liveness attacks:** + +- 1.1. Break sharding (with mass no-shows or mass disputes): It forces everyone to do all the work which affects + liveness but doesn't kill it completely. The chain can progress at a slow rate. + +- 1.2. Mass invalid candidate backing: Spawns a lot of worthless work that needs to be done but it is bounded by backing + numbers. Honest backers will still back valid candidates and that cannot be stopped. Honest block authors will + eventually select valid candidates and even if disputed they will win and progress the chain. + +**2. Soundness attacks:** + +- 2.1. The best and possibly only way to affect soundness is by getting lucky in the approval process. If by chance all + approval voters would be malicious, the attackers could get a single invalid candidate through. Their chances would be + relatively low but in general this risk has to be taken seriously as it significantly reduces the safety buffer around + approval checking. + +> **Note:** With 30 approvals needed chance that a malicious candidate going through is around 4\*10^-15. Assuming +> attackers can back invalid candidates on 50 cores for 48 hours straight and only those candidates get included it +> still gives a 7\*10^-9 chance of success which is still relatively small considering the cost (all malicious stake +> slashed). + +Attacks 1.2 and 2.1 should generally be pretty futile as a solo attacker while 1.1 could be possible with mass disputes +even from a single attacker. Nevertheless whatever the attack vector within the old system the attackers would get +*eventually* get slashed and pushed out of the active validator set but they had plenty of time to wreck havoc. + +## Risks of having validator disabling + +Assume we fully push out validator when they commit offenses. + +The primary risk behind having any sort of disabling is that it is a double-edged sword that in case of any dispute bugs +or sources of PVF non-determinism could disable honest nodes or be abused by attackers to specifically silence honest +nodes. + +Validators being pushed out of the validator set are an issue because that can greatly skew the numbers game in approval +checking (% for 30-ish malicious in a row). + +There are also censorship or liveness issues if backing is suddenly dominated by malicious nodes but in general even if +some honest blocks get backed liveness should be preserved. + +> **Note:** It is worth noting that is is fundamentally a defense in depth strategy because if we assume disputes are +> perfect it should not be a real concern. In reality disputes and determinism are difficult to get right, and +> non-determinism and happen so defense in depth is crucial when handling those subsystems. + +


+ +# Risks Mitigation + +## Addressing the risks of having validator disabling + +One safety measure is bounding the disabled number to 1/3 ([**Point 2.**](#system-overview)) or to be exact the +byzantine threshold. If for any reason more than 1/3 of validators are getting disabled it means that some part of the +protocol failed or there is more than 1/3 malicious nodes which breaks the assumptions. + +Even in such a dire situation where more than 1/3 got disabled the most likely scenario is a non-determinism bug or +sacrifice attack bug. Those attacks generally cause minor slashes to multiple honest nodes. In such a case the situation +could be salvaged by prioritizing highest offenders for disabling ([**Point 3.**](#system-overview)). + +> **Note:** \ +> System can be launched with re-enabling and will still provide some security improvements. Re-enabling will be +> launched in an upgrade after the initial deployment. + +Fully pushing out offending validator out of the validator set it too risky in case of a dispute bug, non-determinism or +sacrifice attacks. Main issue lies in skewing the numbers in approval checking so instead of fully blocking disabled +nodes a different approach can be taken - one were only some functionalities are disabled ([**Point +5.**](#system-overview)). Once of those functionalities can be approval voting which as pointed above is so crucial that +even in a disabled state nodes should be able to participate in it ([**Point 7.**](#system-overview)). + +> **Note:** \ +> Approval Checking statement are implicitly valid. Sending a statement for an invalid candidate is a part of the +> dispute logic which we did not yet discuss. For now we only allow nodes to state that a candidate is valid or remain +> silent. But this solves the main risk of disabling. + +Because we capped the number of disabled nodes to 1/3 there will always be at least 1/3 honest nodes to participate in +backing so liveness should be preserved. That means that backing **COULD** be safely disabled for disabled nodes +([**Point 10.**](#system-overview)). + + +## Addressing the risks of NOT having validator disabling + +To determine if backing **SHOULD** be disabled the attack vector of 1.2 (Mass invalid candidate backing) and 2.1 +(Getting lucky in approval voting) need to be considered. In both of those cases having extra backed malicious +candidates gives attackers extra chances to get lucky in approval checking. The solution is to not allow for backing in +disablement. ([**Point 10.**](#system-overview)) + +The attack vector 1.1 (Break sharding) requires a bit more nuance. If we assume that the attacker is a single entity and +that he can get a lot of disputes through he could potentially incredibly easily break sharding. This generally points +into the direction of disallowing that during disablement ([**Point 11.**](#system-overview)). + +This might seem like an issue because it takes away the escalation privileges of disabled approval checkers but this is +NOT true. By issuing a dispute statement those nodes remain silent in approval checking because they skip their approval +statement and thus will count as a no-show. This will create a mini escalation for that particular candidate. This means +that disabled nodes maintain just enough escalation that they can protect soundness (same argument as soundness +protection during a DoS attack on approval checking) but they lose their extreme escalation privilege which are only +given to flawlessly performing nodes ([**Point 12.**](#system-overview)). + +As a defense in depth measure dispute statements from disabled validators count toward confirming disputes (byzantine +threshold needed to confirm). If a dispute is confirmed everyone participates in it. This protects us from situations +where due to a bug more than byzantine threshold of validators would be disabled. + +> **Note:** \ +> The way this behavior is achieved easily in implementation is that honest nodes note down dispute statements from +> disabled validators just like they would for normal nodes, but they do not release their own dispute statements unless +> the dispute is confirmed already. This simply stops the escalation process of disputes. + +

+ +# Disabling Duration + +## Context + +A crucial point to understand is that as of the time of writing all slashing events as alluded to in the begging are +delayed for 27 days before being executed. This is primarily because it gives governance enough time to investigate and +potentially intervene. For that duration when the slash is pending the stake is locked and cannot be moved. Time to +unbond you stake is 28 days which ensures that the stake will eventually be slashed before being withdrawn. + +## Design + +A few options for the duration of disablement were considered: +- 1 epoch (4h in Polkadot) +- 1 era (24h in Polkadot) +- 2-26 eras +- 27 eras + +1 epoch is a short period and between a few epochs the validator will most likely be exactly the same. It is also very +difficult to fix any local node issues for honest validator in such a short time so the chance for a repeated offense is +high. + +1 era gives a bit more time to fix any minor issues. Additionally, it guarantees a validator set change at so many of +the currently disabled validator might no longer be present anyway. It also gives the time for the validator to chill +themselves if they have identified a cause and want to spend more time fixing it. ([**Point 4.**](#system-overview)) + +Higher values could be considered and the main arguments for those are based around the fact that it reduces the number +of repeated attacks that will be allowed before the slash execution. Generally 1 attack per era for 27 eras resulting in +27 attacks at most should not compromise our safety assumptions. Although this direction could be further explored and +might be parametrized for governance to decide. + +


+ +# Economic consequences of Disablement + +Disablement is generally a form of punishment and that will be reflected in the rewards at the end of an era. A disabled +validator will not receive any rewards for backing or block authoring. which will reduce its profits. + +That means that the opportunity cost of being disabled is a punishment by itself and thus it can be used for some cases +where a minor punishment is needed. Current implementation was using 0% slashes to mark nodes for chilling and similar +approach of 0% slashes can be used to mark validators for disablement. ([**Point 1.**](#system-overview)) 0% slashes +could for instance be used to punish approval checkers voting invalid on valid candidates. + +Anything higher than 0% will of course also lead to a disablement. + +> **Notes:** \ +> Alternative designs incorporating disabling proportional to offenses were explored but they were deemed too complex +> and not worth the effort. Main issue with those is that proportional disabling would cause back and forth between +> disabled and enabled which complicated tracking the state of disabled validators and messes with optimistic node +> optimizations. Main benefits were that minor slashes will be barely disabled which has nice properties against +> sacrifice attacks. + +


+ +# Redundancy + +Some systems can be greatly simplified or outright removed thanks to the above changes. This leads to reduced complexity +around the systems that were hard to reason about and were sources of potential bugs or new attack vectors. + +## Automatic Chilling + +Chilling is process of a validator dropping theirs intent to validate. This removes them from the upcoming NPoS +elections and effectively pushes them out of the validator set as quickly as of the next era (or 2 era in case of late +offenses). All nominators of that validator were also getting unsubscribed from that validator. Validator could +re-register their intent to validate at any time. The intent behind this logic was to protect honest stakes from +repeated slashes caused by unnoticed bugs. It would give time for validators to fix their issue before continuing as a +validator. + +Chilling had a myriad of problems. It assumes that validators and nominators remain very active and monitor everything. +If a validator got slashed he was getting automatically chilled and his nominators were getting unsubscribed. This was +an issue because of minor non-malicious slashes due to node operator mistakes or small bugs. Validators got those bugs +fixed quickly and were reimbursed but nominator had to manually re-subscribe to the validator, which they often +postponed for very lengthy amounts of time most likely due to simply not checking their stake. **This forced +unsubscribing of nominators was later disabled.** + +Automatic chilling was achieving its goals in ideal scenarios (no attackers, no lazy nominators) but it opened new +vulnerabilities for attackers. The biggest issue was that chilling in case of honest node slashes could lead to honest +validators being quickly pushed out of the next validator set within the next era. This retains the validator set size +but gives an edge to attackers as they can more easily win slots in the NPoS election. + +Disabling allows for punishment that limits the damages malicious actors can cause without having to resort to kicking +them out of the validator set. This protects us from the edge case of honest validators getting quickly pushed out of +the set by slashes. ([**Point 6.**](#system-overview)) + +> **Notes:** \ +> As long as honest slashes absolutely cannot occur automatic chilling is a sensible and desirable. This means it could +> be re-enabled once PolkaVM introduces deterministic gas metering. Then best of both worlds could be achieved. + +## Forcing New Era + +Previous implementation of disabling had some limited mechanisms allowing for validators disablement and if too many +were disabled forcing a new era (new election). Frame staking pallet offered the ability to force a new era but it was +also deemed unsafe as it could be abused and compromised the security of the network for instance by weakening the +randomness used throughout the protocol. + +


+ +# Other types of slashing + +Above slashes were specifically referring to slashing events coming from disputes against candidates, but in Polkadot +other types of offenses exist for example GRANDPA equivocations or block authoring offenses. Question is if the above +defined design can handle those offenses. + +## GRANDPA/BEEFY Offenses + +The main offences for GRANDPA/BEEFY are equivocations. It is not a very serious offense and some nodes committing do not +endanger the system and performance is barely affected. If more than byzantine threshold of nodes equivocate it is a +catastrophic failure potentially resulting in 2 finalized blocks on the same height in the case of GRANDPA. + +Honest nodes generally should not commit those offenses so the goal of protecting them does not apply here. + +> **Note:** \ +> A validator running multiple nodes with the same identity might equivocate. Doing that is highly not advised but it +> has happened before. + +It's not a game of chance so giving attackers extra chances does not compromise soundness. Also it requires a +supermajority of honest nodes to successfully finalize blocks so any disabling of honest nodes from GRANDPA might +compromise liveness. + +Best approach is to allow disabled nodes to participate in GRANDPA/BEEFY as normal and as mentioned before +GRANDPA/BABE/BEEFY equivocations should not happen to honest nodes so we can safely disable the offenders. Additionally +the slashes for singular equivocations will be very low so those offenders would easily get re-enabled in the case of +more serious offenders showing up. ([**Point 8.**](#system-overview)) + +## Block Authoring Offenses (BABE Equivocations) + +Even if all honest nodes are disabled in Block Authoring (BA) liveness is generally preserved. At least 50% of blocks +produced should still be honest. Soundness wise disabled nodes can create a decent amount of wasted work by creating bad +blocks but they only get to do it in bounded amounts. + +Disabling in BA is not a requirement as both liveness and soundness are preserved but it is the current default behavior +as well as it offers a bit less wasted work. + +Offenses in BA just like in backing can be caused by faulty PVFs or bugs. They might happen to honest nodes and +disabling here while not a requirement can also ensure that this node does not repeat the offense as it might not be +trusted with it's PVF anymore. + +Both points above don't present significant risks when disabling so the default behavior is to disable in BA and because +of offenses in BA. ([**Point 9.**](#system-overview)) This filters out honest faulty nodes as well as protects from some +attackers. + +


+ +# Extra Design Considerations + +## Disabling vs Accumulating Slashes + +Instant disabling generally allows us to remove the need for accumulating slashes. It is a more immediate punishment and +it is a more lenient punishment for honest nodes. + +The current architecture of using max slashing can be used and it works around the problems of delaying the slash for a +long period. + +An alternative design with immediate slashing and acclimating slashing could relevant to other systems but it goes +against the governance auditing mechanisms so it's not be suitable for Polkadot. + +## Disabling vs Getting Pushed Out of NPoS Elections + +Validator disabling and getting forced ouf of NPoS elections (1 era) due to slashes are actually very similar processes +in terms of outcomes but there are some differences: + +- **latency** (next few blocks for validator disabling and 27 days for getting pushed out organically) +- **pool restriction** (validator disabling could effectively lower the number of active validators during an era if we + fully disable) +- **granularity** (validator disabling could remove only a portion of validator privileges instead of all) + +Granularity is particularly crucial in the final design as only a few select functions are disabled while others remain. + +## Enabling Approval Voter Slashes + +The original Polkadot 1.0 design describes that all validators on the loosing side of the dispute are slashed. In the +current system only the backers are slashed and any approval voters on the wrong side will not be slashed. This creates +some undesirable incentives: + +- Lazy approval checkers (approvals yay`ing everything) +- Spammy approval checkers (approval voters nay`ing everything) + +Initially those slashes were disabled to reduce the complexity and to minimize the risk surface in case the system +malfunctioned. This is especially risky in case any nondeterministic bugs are present in the system. Once validator +re-enabling is launched approval voter slashes can be re-instated. Numbers need to be further explored but slashes +between 0-2% are reasonable. 0% would still disable which with the opportunity cost consideration should be enough. + + > **Note:** \ +> Spammy approval checkers are in fact not a big issue as a side effect of the offchain-disabling introduced by the +> Defense Against Past-Era Dispute Spam (**Node**) [#2225](https://github.com/paritytech/polkadot-sdk/issues/2225). It +> makes it so all validators loosing a dispute are locally disabled and ignored for dispute initiation so it effectively +> silences spammers. They can still no-show but the damage is minimized. + + +## Interaction with all types of misbehaviors + +With re-enabling in place and potentially approval voter slashes enabled the overall misbehaviour-punishment system can +be as highlighted in the table below: + +|Misbehaviour |Slash % |Onchain Disabling |Offchain Disabling |Chilling |Reputation Costs | +|------------ |------- |----------------- |------------------ |-------- |----------------- | +|Backing Invalid |100% |Yes (High Prio) |Yes (High Prio) |No |No | +|ForInvalid Vote |2% |Yes (Mid Prio) |Yes (Mid Prio) |No |No | +|AgainstValid Vote |0% |Yes (Low Prio) |Yes (Low Prio) |No |No | +|GRANDPA / BABE / BEEFY Equivocations |0.01-100% |Yes (Varying Prio) |No |No |No | +|Seconded + Valid Equivocation |- |No |No |No |No | +|Double Seconded Equivocation |- |No |No |No |Yes | + + +*Ignoring AURA offences. + +**There are some other misbehaviour types handled in rep only (DoS prevention etc) but they are not relevant to this strategy. + +*** BEEFY will soon introduce new slash types so this strategy table will need to be revised but no major changes are expected. + +


+ +# Implementation + +Implementation of the above design covers a few additional areas that allow for node-side optimizations. + +## Core Features + +1. Disabled Validators Tracking (**Runtime**) [#2950](https://github.com/paritytech/polkadot-sdk/issues/2950) + - Expose a ``disabled_validators`` map through a Runtime API +1. Enforce Backing Disabling (**Runtime**) [#1592](https://github.com/paritytech/polkadot-sdk/issues/1592) + - Filter out votes from ``disabled_validators`` in ``BackedCandidates`` in ``process_inherent_data`` +1. Substrate Byzantine Threshold (BZT) as Limit for Disabling + [#1963](https://github.com/paritytech/polkadot-sdk/issues/1963) + - Can be parametrized but default to BZT + - Disable only up to 1/3 of validators +1. Respect Disabling in Backing Statement Distribution (**Node**) + [#1591](https://github.com/paritytech/polkadot-sdk/issues/1951) + - This is an optimization as in the end it would get filtered in the runtime anyway + - Filter out backing statements coming from ``disabled_validators`` +1. Respect Disablement in Backing (**Node**) [#2951](https://github.com/paritytech/polkadot-sdk/issues/2951) + - This is an optimization as in the end it would get filtered in the runtime anyway + - Don't start backing new candidates when disabled + - Don't react to backing requests when disabled +1. Stop Automatic Chilling of Offenders [#1962](https://github.com/paritytech/polkadot-sdk/issues/1962) + - Chilling still persists as a state but is no longer automatically applied on offenses +1. Respect Disabling in Dispute Participation (**Node**) [#2225](https://github.com/paritytech/polkadot-sdk/issues/2225) + - Receive dispute statements from ``disabled_validators`` but do not release own statements + - Ensure dispute confirmation when BZT statements from disabled +1. Remove Liveness Slashes [#1964](https://github.com/paritytech/polkadot-sdk/issues/1964) + - Remove liveness slashes from the system + - The are other incentives to be online and they could be abused to attack the system +1. Defense Against Past-Era Dispute Spam (**Node**) [#2225](https://github.com/paritytech/polkadot-sdk/issues/2225) + - This is needed because runtime cannot disable validators which it no longer knows about + - Add a node-side parallel store of ``disabled_validators`` + - Add new disabled validators to node-side store when they loose a dispute in any leaf in scope + - Runtime ``disabled_validators`` always have priority over node-side ``disabled_validators`` + - Respect the BZT threshold + > **Note:** \ + > An alternative design here was considered where instead of tracking new incoming leaves a relay parent is used. + > This would guarantee determinism as different nodes can see different leaves, but this approach was leaving too + > wide of a window because of Async-Backing. Relay Parent could have been significantly in the past and it would + > give a lot of time for past session disputes to be spammed. +1. Do not block finality for "disabled" disputes [#3358](https://github.com/paritytech/polkadot-sdk/pull/3358) + - Emergency fix to not block finality for disputes initiated only by disabled validators +1. Re-enable small offender when approaching BZT (**Runtime**) #TODO + - When BZT limit is reached and there are more offenders to be disabled re-enable the smallest offenders to disable + the biggest ones -- GitLab From a993513c9c54313bc3c7093563d2f4ff6fe42ae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=B3nal=20Murray?= Date: Fri, 10 May 2024 20:41:02 +0100 Subject: [PATCH 068/170] Add docs to request_core_count (#4423) The fact that this takes two sessions to come into effect is not obvious. Just added some docs to explain that. Also tidied up uses of "broker chain" -> "coretime chain" --- .../runtime/parachains/src/coretime/mod.rs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index 94bce4c83e6..33cbcb98fb2 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -106,7 +106,7 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// The runtime's definition of a Currency. type Currency: Currency; - /// The ParaId of the broker system parachain. + /// The ParaId of the coretime chain. #[pallet::constant] type BrokerId: Get; /// Something that provides the weight of this pallet. @@ -139,10 +139,16 @@ pub mod pallet { #[pallet::call] impl Pallet { + /// Request the configuration to be updated with the specified number of cores. Warning: + /// Since this only schedules a configuration update, it takes two sessions to come into + /// effect. + /// + /// - `origin`: Root or the Coretime Chain + /// - `count`: total number of cores #[pallet::weight(::WeightInfo::request_core_count())] #[pallet::call_index(1)] pub fn request_core_count(origin: OriginFor, count: u16) -> DispatchResult { - // Ignore requests not coming from the broker parachain or root. + // Ignore requests not coming from the coretime chain or root. Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; configuration::Pallet::::set_coretime_cores_unchecked(u32::from(count)) @@ -155,7 +161,7 @@ pub mod pallet { // origin: OriginFor, // _when: BlockNumberFor, //) -> DispatchResult { - // // Ignore requests not coming from the broker parachain or root. + // // Ignore requests not coming from the coretime chain or root. // Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; // Ok(()) //} @@ -168,7 +174,7 @@ pub mod pallet { // _who: T::AccountId, // _amount: BalanceOf, //) -> DispatchResult { - // // Ignore requests not coming from the broker parachain or root. + // // Ignore requests not coming from the coretime chain or root. // Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; // Ok(()) //} @@ -177,7 +183,7 @@ pub mod pallet { /// to be used. /// /// Parameters: - /// -`origin`: The `ExternalBrokerOrigin`, assumed to be the Broker system parachain. + /// -`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. /// -`core`: The core that should be scheduled. /// -`begin`: The starting blockheight of the instruction. /// -`assignment`: How the blockspace should be utilised. @@ -193,7 +199,7 @@ pub mod pallet { assignment: Vec<(CoreAssignment, PartsOf57600)>, end_hint: Option>, ) -> DispatchResult { - // Ignore requests not coming from the broker parachain or root. + // Ignore requests not coming from the coretime chain or root. Self::ensure_root_or_para(origin, T::BrokerId::get().into())?; let core = u32::from(core).into(); @@ -243,7 +249,7 @@ impl Pallet { } } - // Handle legacy swaps in coretime. Notifies broker parachain that a lease swap has occurred via + // Handle legacy swaps in coretime. Notifies coretime chain that a lease swap has occurred via // XCM message. This function is meant to be used in an implementation of `OnSwap` trait. pub fn on_legacy_lease_swap(one: ParaId, other: ParaId) { let message = Xcm(vec![ -- GitLab From 84d64374613f3e2e263d45b0ef16e79b821e0f12 Mon Sep 17 00:00:00 2001 From: "polka.dom" Date: Fri, 10 May 2024 16:59:00 -0400 Subject: [PATCH 069/170] Remove pallet::getter usage from pallet-contracts-mock-network (#4417) A part of #3326 Removes all #[pallet::getter] usage from the contracts mock network pallet. As the storage values were pub(super), read-only visibility was lost external to the crate upon the removal of the macros. I have implemented custom getters as a replacement, keeping the api the same. If we care very much about consistency of the storagevalue::<T>::get() syntax, the other option would be to set the storage values to pub. Though I find preserving data authority better myself. @muraca --- prdoc/pr_4417.prdoc | 13 +++++++++++++ .../contracts/mock-network/src/mocks/msg_queue.rs | 14 ++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 prdoc/pr_4417.prdoc diff --git a/prdoc/pr_4417.prdoc b/prdoc/pr_4417.prdoc new file mode 100644 index 00000000000..5aa72edd066 --- /dev/null +++ b/prdoc/pr_4417.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from pallet-contracts-mock-network + +doc: + - audience: Runtime Dev + description: | + This PR removed the `pallet::getter`s from `pallet-contracts-mock-network`s storage items. + +crates: + - name: pallet-contracts-mock-network + bump: minor diff --git a/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs b/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs index cc81b6bd636..bfdf6dd97ea 100644 --- a/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs +++ b/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs @@ -47,17 +47,15 @@ pub mod pallet { pub struct Pallet(_); #[pallet::storage] - #[pallet::getter(fn parachain_id)] pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; #[pallet::storage] - #[pallet::getter(fn received_dmp)] /// A queue of received DMP messages pub(super) type ReceivedDmp = StorageValue<_, Vec>, ValueQuery>; impl Get for Pallet { fn get() -> ParaId { - Self::parachain_id() + ParachainId::::get() } } @@ -89,6 +87,14 @@ pub mod pallet { ParachainId::::put(para_id); } + pub fn parachain_id() -> ParaId { + ParachainId::::get() + } + + pub fn received_dmp() -> Vec> { + ReceivedDmp::::get() + } + fn handle_xcmp_message( sender: ParaId, _sent_at: RelayBlockNumber, @@ -169,7 +175,7 @@ pub mod pallet { limit, Weight::zero(), ); - >::append(x); + ReceivedDmp::::append(x); Self::deposit_event(Event::ExecutedDownward(id, outcome)); }, }, -- GitLab From 32deb605a09adf28ba30319b06a4197a2d048ef7 Mon Sep 17 00:00:00 2001 From: "polka.dom" Date: Fri, 10 May 2024 17:28:08 -0400 Subject: [PATCH 070/170] Remove `pallet::getter` usage from authority-discovery pallet (#4091) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per #3326, removes pallet::getter usage from the pallet authority-discovery. The syntax `StorageItem::::get()` should be used instead. cc @muraca --------- Co-authored-by: Liam Aharon Co-authored-by: Bastian Köcher --- prdoc/pr_4091.prdoc | 15 +++++++++++++++ substrate/frame/authority-discovery/src/lib.rs | 2 -- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4091.prdoc diff --git a/prdoc/pr_4091.prdoc b/prdoc/pr_4091.prdoc new file mode 100644 index 00000000000..5c38a344bd8 --- /dev/null +++ b/prdoc/pr_4091.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from the authority-discovery pallet + +doc: + - audience: Runtime Dev + description: | + This PR removed `pallet::getter`s from `pallet-authority-discovery`s storage items. + When accessed inside the pallet, use the syntax `StorageItem::::get()`. + When accessed outside the pallet, use the getters current_authorities() and next_authorities() instead. + +crates: + - name: pallet-authority-discovery + bump: major diff --git a/substrate/frame/authority-discovery/src/lib.rs b/substrate/frame/authority-discovery/src/lib.rs index ed9240d99e8..16f71960d69 100644 --- a/substrate/frame/authority-discovery/src/lib.rs +++ b/substrate/frame/authority-discovery/src/lib.rs @@ -48,13 +48,11 @@ pub mod pallet { } #[pallet::storage] - #[pallet::getter(fn keys)] /// Keys of the current authority set. pub(super) type Keys = StorageValue<_, WeakBoundedVec, ValueQuery>; #[pallet::storage] - #[pallet::getter(fn next_keys)] /// Keys of the next authority set. pub(super) type NextKeys = StorageValue<_, WeakBoundedVec, ValueQuery>; -- GitLab From 9e0e5fcd0a814ab30d15b3f8920c8d9ab3970e11 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Sun, 12 May 2024 17:16:23 +0200 Subject: [PATCH 071/170] xcm-emlator: Use `BlockNumberFor` instead of `parachains_common::BlockNumber=u32` (#4434) Closes: https://github.com/paritytech/polkadot-sdk/issues/4428 --- cumulus/xcm/xcm-emulator/src/lib.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs index babb318a995..a50f33951d0 100644 --- a/cumulus/xcm/xcm-emulator/src/lib.rs +++ b/cumulus/xcm/xcm-emulator/src/lib.rs @@ -34,7 +34,9 @@ pub use frame_support::{ }, weights::{Weight, WeightMeter}, }; -pub use frame_system::{Config as SystemConfig, Pallet as SystemPallet}; +pub use frame_system::{ + pallet_prelude::BlockNumberFor, Config as SystemConfig, Pallet as SystemPallet, +}; pub use pallet_balances::AccountData; pub use pallet_message_queue; pub use sp_arithmetic::traits::Bounded; @@ -54,7 +56,7 @@ pub use cumulus_primitives_core::{ pub use cumulus_primitives_parachain_inherent::ParachainInherentData; pub use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; pub use pallet_message_queue::{Config as MessageQueueConfig, Pallet as MessageQueuePallet}; -pub use parachains_common::{AccountId, Balance, BlockNumber}; +pub use parachains_common::{AccountId, Balance}; pub use polkadot_primitives; pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; @@ -657,7 +659,7 @@ macro_rules! decl_test_parachains { .clone() ); ::System::initialize(&block_number, &parent_head_data.hash(), &Default::default()); - <::ParachainSystem as Hooks<$crate::BlockNumber>>::on_initialize(block_number); + <::ParachainSystem as Hooks<$crate::BlockNumberFor>>::on_initialize(block_number); let _ = ::ParachainSystem::set_validation_data( ::RuntimeOrigin::none(), -- GitLab From 5f31981d8bf6d14543b683373ff166d78e079fcf Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Mon, 13 May 2024 07:50:39 +1000 Subject: [PATCH 072/170] `remote-externalities`: store block header in snapshot (#4349) The block header is required to derive inherents for a relay chain next block, this is useful in testing environments. --------- Co-authored-by: Oliver Tale-Yazdi --- .config/lychee.toml | 1 + prdoc/pr_4349.prdoc | 9 ++ .../frame/remote-externalities/src/lib.rs | 90 ++++++++++-------- .../remote-externalities/test_data/proxy_test | Bin 242090 -> 0 bytes .../remote-externalities/test_data/test.snap | Bin 0 -> 1377814 bytes 5 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 prdoc/pr_4349.prdoc delete mode 100644 substrate/utils/frame/remote-externalities/test_data/proxy_test create mode 100644 substrate/utils/frame/remote-externalities/test_data/test.snap diff --git a/.config/lychee.toml b/.config/lychee.toml index 733b77ec0cf..ad6a0ef7554 100644 --- a/.config/lychee.toml +++ b/.config/lychee.toml @@ -32,6 +32,7 @@ exclude = [ "https://github.com/paritytech/polkadot-sdk/substrate/frame/timestamp", "https://github.com/paritytech/substrate/frame/fast-unstake", "https://github.com/zkcrypto/bls12_381/blob/e224ad4ea1babfc582ccd751c2bf128611d10936/src/test-data/mod.rs", + "https://polkadot-try-runtime-node.parity-chains.parity.io/", "https://polkadot.network/the-path-of-a-parachain-block/", "https://research.web3.foundation/en/latest/polkadot/BABE/Babe/#6-practical-results", "https://research.web3.foundation/en/latest/polkadot/NPoS/3.%20Balancing.html", diff --git a/prdoc/pr_4349.prdoc b/prdoc/pr_4349.prdoc new file mode 100644 index 00000000000..fdc9e816e1b --- /dev/null +++ b/prdoc/pr_4349.prdoc @@ -0,0 +1,9 @@ +title: "Store Header in RemoteExt Snapshot" + +doc: + - audience: Runtime Dev + description: Replaces the block hash in the RemoteExt snapshot with the block header. + +crates: + - name: frame-remote-externalities + bump: major diff --git a/substrate/utils/frame/remote-externalities/src/lib.rs b/substrate/utils/frame/remote-externalities/src/lib.rs index 58cb901470c..201b5e176f3 100644 --- a/substrate/utils/frame/remote-externalities/src/lib.rs +++ b/substrate/utils/frame/remote-externalities/src/lib.rs @@ -36,7 +36,7 @@ use sp_core::{ }, }; use sp_runtime::{ - traits::{Block as BlockT, Hash, HashingFor}, + traits::{Block as BlockT, HashingFor}, StateVersion, }; use sp_state_machine::TestExternalities; @@ -58,37 +58,39 @@ type ChildKeyValues = Vec<(ChildInfo, Vec)>; type SnapshotVersion = Compact; const LOG_TARGET: &str = "remote-ext"; -const DEFAULT_HTTP_ENDPOINT: &str = "https://rpc.polkadot.io:443"; -const SNAPSHOT_VERSION: SnapshotVersion = Compact(3); +const DEFAULT_HTTP_ENDPOINT: &str = "https://polkadot-try-runtime-node.parity-chains.parity.io:443"; +const SNAPSHOT_VERSION: SnapshotVersion = Compact(4); /// The snapshot that we store on disk. #[derive(Decode, Encode)] -struct Snapshot { +struct Snapshot { snapshot_version: SnapshotVersion, state_version: StateVersion, - block_hash: H, // > raw_storage: Vec<(Vec, (Vec, i32))>, - storage_root: H, + // The storage root of the state. This may vary from the storage root in the header, if not the + // entire state was fetched. + storage_root: B::Hash, + header: B::Header, } -impl Snapshot { +impl Snapshot { pub fn new( state_version: StateVersion, - block_hash: H, raw_storage: Vec<(Vec, (Vec, i32))>, - storage_root: H, + storage_root: B::Hash, + header: B::Header, ) -> Self { Self { snapshot_version: SNAPSHOT_VERSION, state_version, - block_hash, raw_storage, storage_root, + header, } } - fn load(path: &PathBuf) -> Result, &'static str> { + fn load(path: &PathBuf) -> Result, &'static str> { let bytes = fs::read(path).map_err(|_| "fs::read failed.")?; // The first item in the SCALE encoded struct bytes is the snapshot version. We decode and // check that first, before proceeding to decode the rest of the snapshot. @@ -105,21 +107,21 @@ impl Snapshot { /// An externalities that acts exactly the same as [`sp_io::TestExternalities`] but has a few extra /// bits and pieces to it, and can be loaded remotely. -pub struct RemoteExternalities { +pub struct RemoteExternalities { /// The inner externalities. - pub inner_ext: TestExternalities, - /// The block hash with which we created this externality env. - pub block_hash: H::Out, + pub inner_ext: TestExternalities>, + /// The block header which we created this externality env. + pub header: B::Header, } -impl Deref for RemoteExternalities { - type Target = TestExternalities; +impl Deref for RemoteExternalities { + type Target = TestExternalities>; fn deref(&self) -> &Self::Target { &self.inner_ext } } -impl DerefMut for RemoteExternalities { +impl DerefMut for RemoteExternalities { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner_ext } @@ -859,7 +861,7 @@ where } } -impl Builder +impl Builder where B::Hash: DeserializeOwned, B::Header: DeserializeOwned, @@ -1030,6 +1032,21 @@ where Ok(()) } + async fn load_header(&self) -> Result { + let retry_strategy = + FixedInterval::new(Self::KEYS_PAGE_RETRY_INTERVAL).take(Self::MAX_RETRIES); + let get_header_closure = || { + ChainApi::<(), _, B::Header, ()>::header( + self.as_online().rpc_client(), + Some(self.as_online().at_expected()), + ) + }; + Retry::spawn(retry_strategy, get_header_closure) + .await + .map_err(|_| "Failed to fetch header for block from network")? + .ok_or("Network returned None block header") + } + /// Load the data from a remote server. The main code path is calling into `load_top_remote` and /// `load_child_remote`. /// @@ -1058,13 +1075,11 @@ where // If we need to save a snapshot, save the raw storage and root hash to the snapshot. if let Some(path) = self.as_online().state_snapshot.clone().map(|c| c.path) { let (raw_storage, storage_root) = pending_ext.into_raw_snapshot(); - let snapshot = Snapshot::::new( + let snapshot = Snapshot::::new( state_version, - self.as_online() - .at - .expect("set to `Some` in `init_remote_client`; must be called before; qed"), raw_storage.clone(), storage_root, + self.load_header().await?, ); let encoded = snapshot.encode(); log::info!( @@ -1086,22 +1101,21 @@ where Ok(pending_ext) } - async fn do_load_remote(&mut self) -> Result>, &'static str> { + async fn do_load_remote(&mut self) -> Result, &'static str> { self.init_remote_client().await?; - let block_hash = self.as_online().at_expected(); let inner_ext = self.load_remote_and_maybe_save().await?; - Ok(RemoteExternalities { block_hash, inner_ext }) + Ok(RemoteExternalities { header: self.load_header().await?, inner_ext }) } fn do_load_offline( &mut self, config: OfflineConfig, - ) -> Result>, &'static str> { + ) -> Result, &'static str> { let mut sp = Spinner::with_timer(Spinners::Dots, "Loading snapshot...".into()); let start = Instant::now(); info!(target: LOG_TARGET, "Loading snapshot from {:?}", &config.state_snapshot.path); - let Snapshot { snapshot_version: _, block_hash, state_version, raw_storage, storage_root } = - Snapshot::::load(&config.state_snapshot.path)?; + let Snapshot { snapshot_version: _, header, state_version, raw_storage, storage_root } = + Snapshot::::load(&config.state_snapshot.path)?; let inner_ext = TestExternalities::from_raw_snapshot( raw_storage, @@ -1110,12 +1124,10 @@ where ); sp.stop_with_message(format!("✅ Loaded snapshot ({:.2}s)", start.elapsed().as_secs_f32())); - Ok(RemoteExternalities { inner_ext, block_hash }) + Ok(RemoteExternalities { inner_ext, header }) } - pub(crate) async fn pre_build( - mut self, - ) -> Result>, &'static str> { + pub(crate) async fn pre_build(mut self) -> Result, &'static str> { let mut ext = match self.mode.clone() { Mode::Offline(config) => self.do_load_offline(config)?, Mode::Online(_) => self.do_load_remote().await?, @@ -1154,7 +1166,7 @@ where } // Public methods -impl Builder +impl Builder where B::Hash: DeserializeOwned, B::Header: DeserializeOwned, @@ -1191,7 +1203,7 @@ where self } - pub async fn build(self) -> Result>, &'static str> { + pub async fn build(self) -> Result, &'static str> { let mut ext = self.pre_build().await?; ext.commit_all().unwrap(); @@ -1226,7 +1238,7 @@ mod tests { init_logger(); Builder::::new() .mode(Mode::Offline(OfflineConfig { - state_snapshot: SnapshotConfig::new("test_data/proxy_test"), + state_snapshot: SnapshotConfig::new("test_data/test.snap"), })) .build() .await @@ -1241,7 +1253,7 @@ mod tests { // get the first key from the snapshot file. let some_key = Builder::::new() .mode(Mode::Offline(OfflineConfig { - state_snapshot: SnapshotConfig::new("test_data/proxy_test"), + state_snapshot: SnapshotConfig::new("test_data/test.snap"), })) .build() .await @@ -1255,7 +1267,7 @@ mod tests { Builder::::new() .mode(Mode::Offline(OfflineConfig { - state_snapshot: SnapshotConfig::new("test_data/proxy_test"), + state_snapshot: SnapshotConfig::new("test_data/test.snap"), })) .blacklist_hashed_key(&some_key) .build() @@ -1341,7 +1353,7 @@ mod remote_tests { .await .unwrap(); - assert_eq!(ext.block_hash, cached_ext.block_hash); + assert_eq!(ext.header.hash(), cached_ext.header.hash()); } #[tokio::test] diff --git a/substrate/utils/frame/remote-externalities/test_data/proxy_test b/substrate/utils/frame/remote-externalities/test_data/proxy_test deleted file mode 100644 index f0b1b4f5af40bc8a159c9ee250bee7849cababae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242090 zcmcG$RaBN;yEaUB3(}29H%NC&Bi$)2Azc>@(j{FY-O}ADDRq-l64Kr90q?){kM|k4 z9@k<6*qGxQ$2{XWYtD%TCOA0zA(MbiY3@!F^=yrk`nC zU|BiKhTE11AF`de(Mx4JpK2d zU*Hdao<}+=NF!8dC|woJStE!V*HDOOff5gf&pA*5iVBmLjQAK-@`x0{x)I!T*niQ` zx8GQ29;Ihc;rPwZ1J3yXd8(Tifj&J<43v&8oU$OO2np{fuWtca5ZBRF=|~E;vimy{|25J zcti@OBM3%;N=xImQ!10hwm#v%*w#AfHWqIML$h{(_w5VTlKZdw#UCIj7h)&#U0MsU z;0>KTlG`>a-{>rhrZ7cTvEC}F%~Du}NAdkvq|nc5UrM6{>(ySXZ6R&vF;(L0Q7$9z z+k5kVrbW%t$bP&b>M1O601X_twnJIDQY8Zs5tm3TEN2$5wY8>+bpDv0?~ax!JB!r; zV)8J*x}l^kR-l4L8y#H-;q#;1ki%sK?oV4OS(^mEh+^8-wkwhOlu7X18GGml6J#yO zVQe4}E9Dh}plsG;XiIL3-A{P@qbFml%6+DAIUCgxM(_4tQn1$cy?7Mcf0f(wwzvwY zoVmSe0(}*^PbN>J(bMF;e7Pw27Lkn9uD;1}Vw?=+$!pe5`|MY)!f3xtWGFzUj^{ud zAHLn1@C0{}Lr@x2TX?0jhFHgq2Z91E6rymNOZHfy`)@!-Bg?jqwQ)2R;r79tJF-Qz zcj*12hMz~8R-SCMfWD1(GR2rIuf;v5hPK%mb7W}AIdEyjsxpairSgar1)rmJi9f~c zwfI+u&qyW-3?N2K3&tgy?DTgwbU&lsZZ)gb>9Ui6pcJkYJ-A4#Ky@@D`ji6i&rab> zW-_L4U8+PbD>$d_3ID=tqB6xWh6eTMll)d0D=1~+qJAbs^uTHGOfg|Je-2m;!lijc z3aO9w-6!C_kClw`OyRRWajsh6Tod#c7Uhcyx}rcE9bNK^UND{)AgFxykNXv-Sh9s9 zeTv1g>KuhJanz2Z`UFg;3>6ZMzhD0a(&0?^u99k&!vo{4aRO9QJlPzXs@ISKD~bYr zQwZkN=BF}`NFmfk`u5=>1?@evu}nY_e4y`46WqvHg6;8nb>T)AO7R~w0=pPIKu}H_ z@dK)M=2rad8P1M5fwDtJ&~US_nSb*kK={3YUW5M&r2ge+K;xPG7a=*@vXnQrEe*`l z{7f)9g#FFnh8GFl)fh$(4h{tX4rScM6a?Ts^r8D(70~;E6R~MUtkNyM#9P6#D-j9H zKy#t8L^iX=4`~z>sYWppb9eF!gSG0nwq%ub0+UEHo`2@xFG&RNoYYf!lJ+w%B~OD> z`j^qSX+DoZk1XjZZ6qSY4yio~4%tAjkn#4;zEu^*M!v{WBlehM*Yr1GPg5I-BOZ&)__1fQz_z<#*IlxmJ0t|@jRHgPfle9g+<|6WsUD}MJga#7^uSqN z1a7&fe~Q16vW5s~AZ3MejfX&!Tvy7#x+~?_Ac7SUOu_@-ox!w!i*pWF;dQ*cLujr8 z@yJCoLf)pt*EnJaeB)V--g57oZ5Blqmg_%$lPjsCfxK^j+RxNQjkIM-d5STbju}z6 zV^9oA1Ey0;w1IBGUi-3}=g8xSz>fW4_p!gfn+TQ0Q^ev@OGiR4LQmAg=AQV0G1)n7 zb@;Rhj7Wd&e;$U}m^L(>Dr0j_;Qe*p6T7PTgf6vaO)Ltybxmo$k+fsTz&;#t48E~AdX`3bnDL;c=C_RakF_R;WNdcV;_-f&)mpw9LS1B>18m+{Kp5`FA? zsa^LT4<}hfuGL7L5JB@OI`s+Ze+$FU2RDXfL+D|Rd=w)4J3Uey?f0kteNb50_QpQ@ zklQiT-os=`-~bpRa4iAvBY<8}t$u;jEe-Jc&*Lt0w%y$h33mM2pQFel1qSY!_iLb= zvq$=zOzBHDUNO9OS=tk7w?zFpeo%e4paAr;u$5kdeESOBia zD(qAii<6J8UM896z?+&iE)0!u#$m@$Ry*5T9T6aqCW6{N{|EsGUg?ypFpTK#a|T_f zuCJk-HC+xxvA;bqYbb}r(CH_J_aQ8Z@vTMVmxWbvcMh12w*pXxL^*};fXaY4Y|NOW z?+E5!+LkIW?1}}n(2#Ek$G(&nn_59k=Kq*ee0*-RaLqHl#sE`5twVl@F2^P;!XT>potwJJHZDOLf6%1Zi1GSB~j?vb|MGjP2F$JnpQV!ZG8?@u&!B_$83fnQ! z7=LC-=RJdY^C!CZ?jFs!Tb#Qr(}UlUGx#O%)M>%HL|l;>PJUf>R$w%BZxR-Ap?64&Y{aTp z*r}QA0v%R+kL;r5JE03dhvJ`E63$X~UZLB%VoAq%$jvf}41&EvP$Pxomtn)}+Nz6k z>zwIFGKQmfKxE`BQ3Z#P*~it*z54kc!3u>kKVZ42R^lw1o?kX)ADwwq=Yfph_~NRr zkkq%_o%wg^%HZ$Bkni8b7t?UWCNn7@$2(j+agN!w>`w`IoR3K0h3%Qdo<1b@Wesmt znOY_h)a&OCU`d}C+XYf{>T3W|#DIX_51JPW3EUg7_mwCz?w2M*O8Iz^c28d_DOJi_ z8r3+1OVYIe#2WF&obGj0F@8#%3g+7W>#l;lr!W0GGDgrJrJGi>SSDhKRUB+mW;yqq zi0>qV0J8k)rfLh*?Tsw<0RlUyV_97&$|iNjbY%=XyRWHF z6}bFqO^o8hq-ezE=$!TgN-4Z+?Ns9X-Kk9AeDggIHRGQtDzU9*;Tzg5){o$6PzArp zlHSV&jGYSUmE}=RJV8d*@UpNcmls(a?|_=$);g<}G+>6Vw><8_`Rrb-hhFsc_dW$O zOaT{Od+QVp2ueEN8Y1j?|5lFOq^vPpi#+;h!3IO9(MyeAj(dwKLhwnt|1LJ9Do$w1%=mnb4crB}-o=){@QdIbq^!2`|}CYVCCOS<1=@WF9|u+s*v z;$T;e&xTHKA80+@~Rl7inr5x?w~;NHW_>X_%a@s4SqQhBs#bRgtV; z0M265Cx!gj!Jon*WP~pTdiD2MBGw=kL3n>1NVlSWq4o48e?`Kx?mX}ObHAUu!HJQ@lld;US%6|r*`z% zMikR2LL;QC`jq_YRSUXSKcIYotym?Vnv5wW?@HH^PSh&PFN6E_m8Q(JgI<{7tJjZk zke{tg;|-VGR$nh$Dacr0E&7JyCg={^tZ+8ve3Y?1(fG{0au%~ZyVKs${yv$!`eblb zL5&B(A26!Gu#(-Yk0yxy28QSBifBk9*U6CO^cmQnzO-Kc?NUgTAG_wOM5H$P!lC{fsW$!R&RVxz%WLyF|v9L%(R9eNsTbWYhBkKv?&Mf|wn;6WPp=~& zy@VKG9sD!nq6IdMIS*cJ?#)P{_Hc6thE(kdAXc8BR=>geKrn%u|32`M7$9Q-X2<0d zIvSN~n56T$4^jy@llF@~0`yJmcDCqlTBScUcQ+mU+B*mP5 z7e2}E5h-}(uUqGeerJ_e{zn@~#;pErNqllg#JHIrlS!uBCX}@o1>A@P$RMb%Atrq? zdw5u04rxI)?@Zsw)Wi*rI#5oIu7u^7eH0e|$E@Y~%AOI(VXdn6gkwM}1h!!+GI7_M zI5s)?)_u`lB&CGjlfRaIbXYQgB-q}xpFyHZQC&#X$TGyhRd^_~CQmWG#2}gPTF(R? zxWAmS(zO$hnkDg?5^k~f`1$5cz?{Mf-;-$Lz()*X;m=fz05;KYOiLLHEY;Wya9iEZ z{c7ORrQSd$r5{|_?weZD;duBZcv16;A=g_AcD`+&GiO55+l|>@u z)Pa?`!3Xp~gp4!hNSF!$W2}t+c0`M9hvQ7Ir2Vtdi0+mREY|x-8RfpIz%?4}0buf~ zs93p!!CnH|$*ESz3ZIXzOQ1@}TtV0`?glqH+X1W(YWrt(LU+e>xg%dJ9MVqDwB3xH zCIdrHl=*5DCHWpT-Sz+P7-w#ksp`!~@KN?Al)q(KB>QQeAcwg|e09+;L`8kiorP!u znE`>I#b}9}A9h3|1~Ttx!nXzo7TkX8Tq;xq`Fb|q{8mfdkzOzCKtqTnSdW)Zb&)b1 z1Ds@US{PcH$j&xsG)McWQP2_meUrY;_zOpGE0ibqFafxA>i4Q%!Th-(4Ski5Y3UfF zC(#CIA^|0y{pS3>A=QAcDnfhxZ7KHB;1x%x)z_t}K5O9vE_H25W)6v|a1lM=x64XA zJv((rWQ50Bl9YDGrS>5+;T=&^GjH^PdbUUdfH&Bof?;k>ko{HHk4l372ODRH*(-%9 zf!CKw-+3~`wf@ZXzkxxsv@IfU6LA??n)Xs^1nWAov7Fu;ub#5)>hgc4lHz&f40!t< z;|nGq#o4Lkq%uLp*yFuk4gQp}1G3sHl|@WXeEBp|2{g`t|I;42{If>%h!oms7nIJ~ zN3I6iGbA-@mkH-FIY#fIe-FXMzBkL(x=9c*?TW_2`G1OZUBB^%Vpo!}EH73|t(nvt zgJwaVL>HNU5!0+BaFv+W@23y!1`P(p4HMrA*mejy8wEse#rSfpUqq(+1nZK@At53Q z@s(`>Zoye$%tsiUwY|8qHgnbko$`LjDia`Hk0PD@_iomugEjvpF_YC;vCUtmq z^Ah$|_L~nvo?sv-j2jQjwK8s}YS#tBOlurcyHveZm{HAzuurJ?QROd`{xN_(&o&w0 zn;JEcxIa#oJv7%LcE@I?c<9xT+^V!#3poa(zW4k}K=6g+&{Q5WJ|_bH!Qiq%pK@`1dZ(&@vzah4Gf_o!7SdZ^(Ytl-;c%kCC zShr$7Zk$TTn`lu9_eK&kx6Vh9yFFoTobkcl&O7$+T?FRA&f_ivZ|^LbW&!XiK6}E#C+rwrhZ;oKyYB=%8I4)r1Z-|o7B(Zm{!Fgh zRL|w%k8*{41>J#RBCWU-tQePckS2G<`ZnsNBQye`X3dT17u_P+&QB@uULYuv(1S4K zyYm8J^+=OpFu8^#maB~py~;Nvi>={Auh}8~QLfKtDd*3&86F)62Fd#~ofn3QPuejr z*)+L$V|>|kx{8oIdvPm#LQi99$pRrqu!02$Y7^y$Zo5u3K3!{(%$Ll$uf6zC2ep-% z_J~O(xJajFGXF`L|J8g^M`006K)21!Q+@)-KKi|WwN4@1+o z<^+g)qSY**N2Fk;Lq?Lx6nP=lT?VgZardvy>9d`EhAMw;wba+a!2V4s^P6O$d_wNCdJ+Bb?S<2TMN2W1vePtRVlPm)q_ zP0@RMwaQH78D?u4(2#FFB1Ikiz_Onqlj8HM*Lh<_f4}i&2*!Dzbqy|sZtq&lNl>q} ziBM1F3It`!iOIfwJ<` zmiI&1h-qUBa@xx;BKW-{q7S1-M+8zuvqCr2U)pK4)gOFrZa(-R+1l{X4PMLu#-mJs zA<}^;iy#bFl|8bCK8M%SO3fIz&?o z?IeIvu+e)o1vD|1db382qQ-p8+ zpI54zVCN{!?(tMqhBkrJ@-1ElhDNCY%~ak}{imn5@A=TaXgrz-a(jlNN_3B$eSd~7 zPwp~~ty33=PpJAls=}>ePTx|D2)k$dye%0BYFH{*L|Tt`5o}Ji>MDptneO~jn$=o0 z>L-rag`N7=yT2&7qy@Q^N@04O?nJxbM~zLJ;lrKBTF9liuH+>9gW76Ir`jKp!WA*B zblqo}$g4Q?zF1YV57!rV!v=S{TQm3_oY7>&1o)ZXWQMzwf^FleFtFo{B1%*6tePgkH zn%GUtrfLn7x$S^CHA8$Nt+DUB=6~-SNui(iXLwAOhE(O-J3BVjTYVd@zk0eD@i)ru z6Go-=Dk8S`zdKeIdtxP)v1&Z=ewhNF?e+v{at%cA<U<*Mb)T{dU2yVx{;Pvo;1%*tu4A0GKo(?SFuWyp^EB5xc;)<`iqvNPJvO!bn zg^||BV30_RmD;NpK$CM%hexaWm);|v){nv$=C{dj5hl!0_j{+vaUmtvq?bfihW0C4#_0X?;d9+2CtT%D5 zKy@e)bhyW?WoGi-`I9nso_vE?$D5k|7b7K3dmjsPi-v-AMP| z&l2mSNW06u@uqamfXXd3_zU{8FBi+lALIGyp#=0SvgtLE_@o5ioxLeNfHSJ;c<;7G z96kBa;DPuSrBUPT5=K9gZuvGo(G7h-zFx`d+@n>W1bx09FY+Stj5f}m*h#DARAp5M?RLWr2LRt*}#`|mSYx799) zzRZ7S(2tQH^rC%QWI}wUd6P!y*@gluHoK*|ntodAhhB$!6up+an(g)d>r-@^=8Ge) z)kfr;GN-CP^7lKBz>Ci*v^{}g*UPEa2_6-H`qJ`l9x;~FVr>og52=GNq8pUXUy*5| zxHS~NUYd3E_C`K^>A!VkpErGPQx~}DI@2+)b({}ksrqA?eH^SvGJO*ao-S~)Kj$6s)cz)CT?xW*|?C8vs)kE4&2V60{$YBr)_ zbZ-vw67diE`-e)%M-cGmV8???tPoAX@xf1CbJkjSt*Lo;J&f4-n}NWX&qbr7uT`fxL1G6I{2FW?Vf=KrKR0OjMWL$h!ECwS$Up>`b}b|Mi6U~0Gi}AU@BUG+&xb+GC=praEFAJr^p(7Au@r@?0};aT&@TixKIvHs z#{&wBdJj>V1Oia+Rb9bmOzuz$f?2PjNFB+il;D_q{q5#^-aIGmIXFJx80JhKNm8yY zZ0J}r5ZX3pgCFcn^q!r7Vg2VM3lZ(=p9xNugeIcUu0ZRzdRl4;L-6DTUBuwQJq^8Z z$FAqG;8?cw*yUs5^|GqPaC8a9dOh?-9fj-lR&Y`J_m>S5;x+C`ybIBZLqfehuTrIC z!Qm47vPTIEg52Gif;{ZpHjnZ)D2K1Gt#oeYxBF|d$jHH-TLAU%63Ft?En9LGA> zz{;FH%{*$(kewpgm9A^S*IpMKr;b=Rj|Ko1zKg8C`vzsZF>MA~=)F9hA>IT}7wBiq z#oNA1o!_6$`i?QDNgonO(ICvjiM=RSbwPD5=-TdR%MmOE`VcCj+QPT6_XA6R)3Nve z_S`wE$D-W^s!u>p;7bl%ESq~UeGNIdOoZMhtAfl9RST=!@>$E>o1c%R9EqJxe*k+CpqB3>81pbdepLeOqHq*EPN3Iv~ za3bLF6?5;U*B}U~>B;Vv7;@A)6yFxoe0|b=?VGx#gbw~&oUZ2Rn5)_1B2o_(WYguqUMxRF{#Q8^=KCgXaeep$hNIGAw08BTIlJ|BOzQtq$8~J`8=oSip z)Y0!betbj(ejLeBpO$z*P{QUh zQr)_Z4F|wSB6rx_&z;i|-=#^t=JajZ-x*3>P``feCFI>2$jqAUbog58;20O>paT|N@r~xi@k*jNeBoz)%KT%}nXII%!KP zzNdNQ_Fn;C({?u>L|S#BT=ss!9y^gIgevy!?xZ(OuARG>?S1M+w+<@^s^^CJRqLTF z^MF|i8Q-_|v!*7(6FEu1oVi2CLiXC(>@P$L*G8+>Kx^JJf1(PSR&xBgGSQ^@GdqC{ zi)Ln2X*lWS5B10X5h|KteSohrQ^>s8p35&L1FQR&TuPm6#L9wffsF1y++@|vuP4cM zANof}(!Zwl$y-t(tg^1`F_L(3kIa9(jgZyhv|_sZmaw4rlvh8u=!vfWUHCuBv^r_j zh|MvgtTuj| zz=*P`ZLBlm&cRyy5%&vyH!cc4FBK|%yyoLYc1mew89>PP;#y`Q!Q+sWD3<7$|ALuq zRl*46$V&MJ8$*B8W*GRe?W+1tdII&5veR4Q5k)aGH;0$jg_gB0O!fMc;!NvK7 zOQMSPwHepsG;Ccv6P*p}R|E(Z{TOVKaY*-=-0uYt~D$eL=&SeW&O2gA?eJ*Yo z$a{^~`2a^WBU-Tpi88-Ez|-u~o;ExhpaXqZMH-xs+YPbaMj&V11&^041zRx014`B) zR;z2d+6|>Y!B4gjisQ(r4DY&?MNw=Ywy1OpRRkcYLV zn7)?wvZUqrrOE@(9kKkg4S%=p8}tfKpI)T+!5~}s^=%|IrN>1C?f!z?)_GWUXz^pe zAJq|#CRri5py)cjQ33-t5qwW{iV>$i?sSdqh=~0a6_} z7N%kZlijkNjD14!Mkgvz-cL_+s=uH?h0!k$jd73nTYPRSc-$|?#EhHYT2a~Lun?=b z(O8x?2v$Ev7G!XQ)0-JJw1XBFu9(bwXQ8=sG?UK;`po#V1(!UM>ypl*y_Rt7KAh6Jtvx-X)`m|k`0pkY^qb^M>-D8!nO*z($OXLb1F#ngqgR=1RdX z+@qtVeXL9o&ffTJMl_Hz4=Bmna>>yg!ML2G7BH9CJN|sfO`HTDqRR}#z-#ZT3V7R&qI+^q&o zP>oo{Nm=xv2EOWjx)mI&$ed5<$-T|;PJHx(5!GN_)=2l{%XcaAir~51AddUcNRo2V zh|@zQ7jlE31T}+ahq|#)LS*76b-_5(mm%15R|Ai4HjfU3*8kImo zIUfkeV>^cVd(XwWRr%&4+H^{6kR_6N#5^KJ?DWD^@$&{ViRe3Oj6R6QH>}J2J?QqM z8bfxSP&<~qCCpZ^uM!#rm5U@+hZ7NtqY9pHZMXwd##=o0H6{%6g3kF{aE;J=`oBo( zFEXPusd8`}MlO2|Efh(9gRAbQEKc0$ZG7`R!wbW?3Z;BR3ij!>oNnB!?d{5&E1bYd zO5acOL8x%ZK?;?F21CUCE-W%pvHYX?AgE6<*>g~%ncvMoFR9ZbdsW+%_!e6ur(Fqh zi&2aFJDyrM|8)@my!OxAo;x)Dh!oXOPj|9Ku!+BvX&D^MMYLMK8JV`7zg5O~M;l2! zJ!4f(L<9EnYa2x^Qku7?sg?d?@Nxqkf|f!>r7s+ zp`~*et?7#-FRsFMv1Z^fa&!+SGECJ;8Nu{)br!}=HM|fzpkepu7xEhxDD6;+37YYj z?n!dYL9i#KGDWrfq>Q?p`VZxYbN-2qe#EZIHZF3yvOfmu-kB8Pi%O09TB9cX!G7&W z=lPd1l{iSWD}d`^vw|j-e|xKh_-j?hEkR`iu6_aDX&pIIlZEV2rjT}YBF)#fEpid} z8+n5BxDHaTI6ct1ulQBdiq8wdk1e%6FXh-_HUZATA-eQo#5Sc~lJ#{^EDNp{NYi1-Q*`zt`@0nD{E&xvaa+D+?(k~M zjM2yO$fKEX7+es>V0}T|8FE# zX>_TO^#|o*J}KKgdegsjr|5EPeVo?qA(N7MR^D-CDt&sctDE~~SZkaF7}->;PyN=9 zB8BZUA8WfrQ#IffmW+qlp_<_^!3sqMjueu_mS!hR^J@nE8zd1ytvd~#An zZS}}y;%3YNY-#L6;{gp0c+QpqcK!=3DY_73S zchH}QLj*Qks)C@evPQByxF~bev;Ow=jBKA4JOw18yZivja>3=J;J`I-LT%^I;)ugZ zX~Y}_?*sFle{*=?eeB{^-x%klN%Y8~D@AprcxZynGvFj!!$(rgSb48Rr3y0hTk+D$S(sn}1Y zti3QrxAGI}s01+z2L<|ICDkr7$Dq3WHu zx}Y(Bdg9h9rhU0o(N~St6UBe@n&&GbWw5k?5hDA+K-~*t!s$in_wV$68%#`8@4ZZ~ z5XMVSI(irp!$$#}>D5UhLGRq+hux&?$bG<=WWEZ++bboZKrBp z$0sbJr4moQGU?HUvKOC7?br@XW_zXCxd7ZPlQPr@?IDw(YL%#76hCofm*orTKwgA{vKN?szz$_2E-h995q zw5OAuHb@(!)3jMX`f!&9IZ<5B!qlIzijD0JV>V$DB8*u;h#UC@^D$$S|0>Vtvf-F= zQIzF}76}#^@=IoGk3-7Qbtsw_eHl#x-41Its6? zr6l6XQ)m+iKm-$*N^;SLq7Z*U_wFP#?LymD!<~Fv_^NCf;|7fcUm1G&<*6Xexfrt2 zUv{oO`HpXHX$`NK9_2N55ngY|q3&ULLpErGmYK&lv9966kD%SKVLgF@|I>DDDw{c zpPbFBG$_!)v@fobzsWie?ihF&g=wV^e^=>o8m~&Fbjt3b<%VKjIY@iGZIwn#+Vb{= z+F#IX*~;IA8BkhBY7}h8As0a|!+ll7_onT_uDS;@ zRFARhd9p|AW^}83A^XDDSq{t$DzyaAe_x(ipU(>s^ zk@U<#oRxEsj6P-l3yx!y{NfGf-@bl+5eWpMC#htB4)F8ij<8Dg37OIMbe%X3n4&X5 z{nmZv2$_J0x?n#Rag`e3XTGfK=GN zp%+=(|Aj$J_A*U0tQ29h|bH$ZpJ@B~U6t{L4s_rn7B=fLu?^QG`4 zrsCy9qww%@Jtf*Wk>S>HJvF#k!_4f??-_tif*v?SOMyag1bcJgU7r`iz4I+IR~a4S zo#f<7eiS7e$|#}xKguUjr83s4e1^12w~!P0k3BG;>8@0Cit!N9YzzB#^W+uUkQ z(*SJ7=Y)VH-tY@g*pS&BQF3$Y3BMm;p*{NugI|ikG>8El4uqCazAiJWv!K^vH?<8Q zp%0PDF#Vd|fh%M0!NdFhI@wDf{kFy@oeiX6QM|0~F2Zi1JzGxb``iT%o2-18 zIs5Xc+l!bD-HRKT4U@25AJvF>FLhSFvWB^k*G5=oLk=>h9Cm-fOUjZDOkA8}|1ezZ z(EIGsZC_a>BFx)868N>a0x)$wE$%lD28=HS2|80cnff9RJ=Kl_$~KMNUV}Lb)4rD% zg`l+yatCZ(eqi_s@;ipTn)#Urh7I}iJ!hy1kFXHMt3 zUY)#iZH7HW)vd|%h=@ho!rR~V&)hL$iMUTGJ<+X%hOSwY0G)yEJgz=j>bD{5H*SL% zm2tLLBafpJ=#6{o#;&9;Ula57P_I3Ftyn=DDaD)VB1^#*#bnRw9tTF#S#+s~JU~JD z`j-d|ikpZx%wgh;9Jon&iDO#2H}!~-z1}(w@qeDs`iP0su*f5xQy{Wv|IRVNwKf=c zr&!Rkv z?S$)6qGp))Ib{0==R{bN5ys~X6c(O~oM;*Q#7~QMz#zqFa~oLtL<#EgkqxW}orcfd zhW6S?vteHnoHG1>=YRi89`O7KUxs~&*5G1BR<4vK-?%&8jY()gRQw!kZ^qzFx1qGu zr}i`NhoFUoV1635(D#+AI9nz*c0EhXY%;XJv2Gj`-lc8SY+sw+Hef`M^Y8%K%YfA^ zYcX%=55?;11i-Jw^T5fdWUa4b5$O2^uu<<`{Ub*_pF`JX*0A9-|N6Fs*_%GKCFcRE z5;pmr2{aWL!i2IbV-q&hJ+c|nIYgBwC)6U0NMN=iZ3B$gSu=dPH#fi8o&LxC_M#yA z1^4Z+D2RtPyz9yUM|3NCPH_V4_SMvQBBz;oB)j8{7yBAqN5JKO4&nW`=JxYQ69v&n zPC94BVTxl9ISNVIP$Y8E1pOGYuT07PUJKru+%`QTMM!H#Hv3(V(byxL!Jb;TyRqSa zUYy?ouD@egHoV41N{(+x)Q}kif~va3j@OU)NYNs)aFv5}cmYFdgnSrtE1v;zg(ArG z>7PgV&m#pf{l>p8KrSjWJ(N|Tg63hhWs6f;(3sP#9_U;hqSCvDcti@>4*sR|81L@V zTbV~Gv8>Y0#)=WO29qaQI!jMqJ%)^QzO3T6S;@lzzUFm@;3X9m>q;_=N@>e?f!t=z zD=3@AEN?n4dY7gp|C6u&tBWjY&psLOh!l2Dsn#z`sbwNT0s(43=EcC^RI1DC)rB5W zhg*6N9Vsh27-BKnhpx1^ZATu`EMoMMrx*o7pNJNE@lI|`0=B2`q%*Sj?Q7wG%vYaJ zXGY&azGzmzi^5VVOp=Wy2C=J^YqwB;GWKL`XEkKgwnUeO1McsEbpism>Qk(AX$`;r zjM=V%!+}gw*ui*QGa8-C#qE}JV2s5HT=~c;lnwm)-7m+Do$nukWTu!P)2hKaq83ZC z24Em+oknLwOElz)eSgR2iuRt$-DE)tZo`ab7cI-fTo14wabRlQZa?!9gZf;Ph^b!= zK^rv2Z$MyGFIae<==d72;&HuE7OCrX14sKFR2UvWY(Yy=52 zvbY>Ke&77U|n}|AwxG*PW~*|!IyW7XWsQyMCb2QUTO#xYOC^yhxI#ag=1E|15cHl zvUPp*0ytimC}Py^$LhSy`Xd$Lk`K3j%eVaW<5Wu;wCs1Ud;F$|5)W-3YN5aj*i*i9 z_D~%!Xfy7NrTVm24j1uWQXvf&tJKwWrhieL54K5r5#X_8x=RL!IqPB|6s^5&Qn5M1 zmXh|ZauQuz>A`wLikdpBNcR&*M$P|Ms$|v{$x$h%(Y?aW8_dlV-+I7*${4RL6s6wf z|Fmk07F=HCY?CzlLQD>W*T4%6>)2FOW#QjStgs{#&(uWM0rz;vALR&vvuZ!YtH)z~ zQuz(?(nZI$G#88JNs>)$E@E>~w3*~JNzc2WhdchLtex>}ngjJA75A8u#Z9h}0UHHg z7z^+Utkxsm{%kT&Bq$P9j6{G>KJr7%xo&cM-5j~03#u&Q{V=;pij+h||L3Pg|9jnr z|8~d!`REXD8|)LfTm^+dS(_*2LidZZCsvxhoS5DhR4Oy?*h zKEZY``&po`KulmpxGKbu?i=GvIch)-F&YCnKqr{9Wcoc^a!0~q>qP8?I6Q&NyNt*7 zT{oF7hk>s7GvoIo;c;N_O4S|~kymquZ1eT>1)pIkZy$Fu>_BjHUjKq!`DFZlmhSJb z+F6Pu>lTFK+q}S87nsG20u} zACbbi7rD~8!rbMfzWHcDUEs-zF=qGho*0;JNmP4QfFzFXtse8|>j$Ktgv5ynr!X=G z6EE@MUjAU4xlMJ|xD|-a+(R1?oDP%yi?GTDX6G`b7#_9TG3_49Umy(tD_sFQDhgy(JYl#`jNr;u zRL?O$`Z$y!zs1U&MCi;i@}zy*tzoYt&q8y!E0{V3j0yR^&(;b0*NCVyRJ2=1TrqB7 zAuH)|eIO_*H1dJ#%eU_Q-KVsu9SO)ksb;=MarT(!#C}-E?)w4#j|sr@ZbNk-YI#sV zt|YgLPc4o-lk|0cr?ZW5kT<+>+Yr6S5C0_d5h>#5M9!dv8?f|5i~Ms4?`=QbirR-K zDZO5U)1BofKuH!!4M1#A<&(SJ?D!&nDvH-#x`K%aSewfJTz?vZE z99}N6mMbi;z083b4C|W~*|O+Di%z@a5aoAp2&Cus@}zwT9`&l-LBuRDgpFDiCFi$m zwvG#v5)G;0)DD>a;T9aQkE{M{&$U&f|MRPvfbG=J`|6l71{h@CJn~KR9k2r;{WLy} z&R-`+sdq6c4zC`y1DVB$)wZFt1IK`)&fGalifT+qFIk_p@=d+8L|}7KE`ev@^ho?8l*s#kwD{*!-l8$y zLm?5yAH{3$3?q+*xzhD*3r4*^O3n!{&c3^d>&|)rimJ!@fz345>Nk8nJ!ao0Gw~$n z5(An-3FmvPRZ8cW5VSEaeK1D-hl~4Q5p-C;J{m1gI;WM5A>Hcr6mYA-G4D+aQ2Nng z^?c(0iyE@9oa8Hq{2L)g7bLV`G*Qm8+1@Fj%9Ux#Q$lxwEvf~E`!UudAwVy1p}n~x zd2bMDq49;w$$6{eg+*Fo_$dy)2aUK^gtNEf1Y*el>I9ua%D^>Y>Jm@w8Jn(gz zLow}%(q4%s+}0O-pvQjmA(mnDN@>jfAwAziRsx0& zaBuWZ=op&xuNDnQ{+Pj5J!3Fz?5ewTL_yjJZRKX{0P5@JS^B?Q^hC;=LZ9Og5{Z;77%ZdCoOQW<<1BA{ipB$Wpe2)o|7wve=yx*elHnO>{^=Cj(H&S0dOC|BM z#eAtERYf57#`j%E8V}aB!e|4nNjKjNelvksh=?z<{$6A7~lU8GphaV>B82POz|{t%L3(^nj+b$fcS zr*xNew;F)0Clok*W1nCCv-kkgKoXZ)9|2yvY-xz!D zwPrkP#xuQzxFf95Uf8e*_26y_5%iUyXe)YaEtXPtbE71j0rAya<|2l(geEFe^lQ?E zKF3lkYSwqTjA$x+y?R4B`xE$73yocqqC!rtXBWA)1!8sAmavF-a(#DTz#>%p^?rEU!cdExZevm*DAhvX>`CA z99IC$PKC&*b3?Una~J@PH?X7dk?c`1Xx?}w-71I{u%{LrSJTLCpaMpwmhF+C|1Q+S zu(+rbAcSU)g0%U4n=PEtd3X`~jS2NX#+9dS>$t=1+vp`BrSg%fM{$ewv=JMFyB6Jp zA3LJOb+@J4@7zJKr0{5~=K`*p2*YIiR9lQJS+MhZTQf4L3?*djuT@~^ex9A7zDUuuSQzfrRI5 zaPAjI9)*yr@2XO==8)FUb+Gyc?jDbeH z+Omi5?L2`AMQzI=33S_Qe3ufqzU51i-8$oI>F)-*%rc2^f? zD`qUlWBZo404NK=msqa%kabb?rHUbO=h7WU^p?no*Ony3f&cZs=21odqc*D;$S+Ms z&qm%ZifVYG+-)k+-;VnAiulCjhUkU!b`8%Ef^`Jp-PMqDIX*Zgf;-ungKUS%pC_zX zHG?o<6SURzvevjW;CMn4lxRq=Db)dX2unK<8u{W5$_)Lii4A#s-%r5hU?KfovfAJo zDUr;MT@RbDbAjWcNyxuCQN8Ml%pnRR4J|3FAM~n+)}l1jz&e7+&83yRCj3Id9yKa% z(&1JAzx3AE`+~>VUb2!gnUhj3#3&*vT#K^IgL*8S6?E_mqf9&tq)j#S zXg^?=0)z6K6r~ll46HK8w-k}Xp*5e=EtvH?Y6XANgE1(z^&BSXW`bDa1G3;CiwE#Q zE~uS#^oNE!SWw&-9NXgEyo+kkBo;3wle0X=!%vO1+;md>APZ#6ZG#!UVZo<1EDjYK#E4k{gBV^s^k`-Hq{ zx!f|f9+_+L(OIFwVnx0zaQ>?<@0oiEm@*lE_(oM4cAS4PtCVLMyar+0zLt7CHA9{P zB6t5-rCaeuIADB-m%moE0(}v2Fs>$0^7}YV7XbDSGvePxw3@L9O5>d24fCmR<>l!Gwcun(2B9tVq5yqb

    Aoz010;{6A?_R7J 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

    o@X=c5RLqv8uaqOu+0H8jm2}7?=B_G*ZT1 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

    SLhgzrjl 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 RJg%p=SnPmA>sZ`Q@jnJ|O9KD^ diff --git a/substrate/utils/frame/remote-externalities/test_data/test.snap b/substrate/utils/frame/remote-externalities/test_data/test.snap new file mode 100644 index 0000000000000000000000000000000000000000..28f2012d0f2a1b6a63ee8825deaf70257625279a GIT binary patch literal 1377814 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

    A^BDv@w~(;s*xnH4pxlRVWOlKsOgr6gr=Wd49H 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

    N{@E(T?k}!gRX5($XX4p@#a)e0l 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 OMxTj&lgXdnPa$ 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%0Dvfl0?EvRo)jIv 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%0DgK4$k1B5IIYhk%rv6fOktIAwn^}IyHQWowd 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

    FB*ymPES%lKY_v$Y*=Tvp^Jd90^ko|$nsxG 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

    Ju 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�}apg#pItuIu*dF9J7Ya7F~*Kc)X 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 z

    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 >@e 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