From d7c8fd65eedf41db1f95b660241881214663d611 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 4 May 2021 22:18:11 +0200 Subject: [PATCH 001/109] Fix storage usage bug with migration --- Cargo.lock | 12 + Cargo.toml | 4 +- core/primitives/Cargo.toml | 3 +- core/primitives/src/runtime/apply_state.rs | 4 + core/primitives/src/runtime/migration_data.rs | 39 + core/primitives/src/runtime/mod.rs | 1 + core/primitives/src/types.rs | 3 + core/primitives/src/version.rs | 6 +- core/primitives/src/views.rs | 2 + neard/Cargo.toml | 3 +- neard/res/storage_usage_delta.json | 12450 ++++++++++++++++ neard/src/migrations.rs | 22 + neard/src/runtime/mod.rs | 16 + .../runtime-params-estimator/src/testbed.rs | 1 + runtime/runtime/Cargo.toml | 1 + runtime/runtime/src/lib.rs | 52 +- runtime/runtime/src/state_viewer/mod.rs | 1 + .../runtime/tests/runtime_group_tools/mod.rs | 1 + test-utils/testlib/src/user/runtime_user.rs | 1 + .../storage-usage-delta-calculator/Cargo.toml | 16 + .../src/main.rs | 39 + 21 files changed, 12672 insertions(+), 5 deletions(-) create mode 100644 core/primitives/src/runtime/migration_data.rs create mode 100644 neard/res/storage_usage_delta.json create mode 100644 tools/storage-usage-delta-calculator/Cargo.toml create mode 100644 tools/storage-usage-delta-calculator/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 17dbaddaf45..1bae25c37f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5328,6 +5328,18 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" +[[package]] +name = "storage-usage-delta-calculator" +version = "0.1.0" +dependencies = [ + "env_logger 0.8.3", + "log", + "near-chain-configs", + "near-primitives", + "node-runtime", + "serde_json", +] + [[package]] name = "store-validator" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 8fd5c4e1225..3b5c4f1e742 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,8 @@ members = [ "genesis-tools/keypair-generator", "tools/restaked", "tools/indexer/example", - "tools/delay_detector" + "tools/delay_detector", + "tools/storage-usage-delta-calculator" ] [dev-dependencies] @@ -115,6 +116,7 @@ protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_head protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limit", "node-runtime/protocol_feature_tx_size_limit", "neard/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = ["testlib/protocol_feature_allow_create_account_on_delete", "near-primitives/protocol_feature_allow_create_account_on_delete", "node-runtime/protocol_feature_allow_create_account_on_delete", "neard/protocol_feature_allow_create_account_on_delete"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] +protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] # enable this to build neard with wasmer 1.0 runner # now if none of wasmer0_default, wasmer1_default or wasmtime_default is enabled, wasmer0 would be default diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 2ae8f879af9..eb846b51e0d 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -47,7 +47,8 @@ protocol_feature_block_header_v3 = [] protocol_feature_alt_bn128 = ["near-primitives-core/protocol_feature_alt_bn128", "near-vm-errors/protocol_feature_alt_bn128"] protocol_feature_tx_size_limit = ["near-primitives-core/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = [] -nightly_protocol_features = ["nightly_protocol", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete"] +protocol_feature_fix_storage_usage = [] +nightly_protocol_features = ["nightly_protocol", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "protocol_feature_fix_storage_usage"] nightly_protocol = [] diff --git a/core/primitives/src/runtime/apply_state.rs b/core/primitives/src/runtime/apply_state.rs index e1dfefd2a91..93f6dd73d31 100644 --- a/core/primitives/src/runtime/apply_state.rs +++ b/core/primitives/src/runtime/apply_state.rs @@ -1,3 +1,4 @@ +use crate::runtime::migration_data::MigrationContext; use crate::{ hash::CryptoHash, runtime::config::RuntimeConfig, @@ -41,4 +42,7 @@ pub struct ApplyState { pub evm_chain_id: u64, /// Data collected from making a contract call pub profile: crate::profile::ProfileData, + /// Data for migrations that may need to be applied at the start of an epoch when protocol + /// version changes + pub migration_context: MigrationContext, } diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs new file mode 100644 index 00000000000..bb2bc596cc4 --- /dev/null +++ b/core/primitives/src/runtime/migration_data.rs @@ -0,0 +1,39 @@ +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use crate::types::AccountId; +use std::fmt; +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; + +pub struct MigrationData { + #[cfg(feature = "protocol_feature_fix_storage_usage")] + pub storage_usage_delta: Vec<(AccountId, u64)>, +} + +impl MigrationData { + pub const EMPTY: MigrationData = MigrationData { + #[cfg(feature = "protocol_feature_fix_storage_usage")] + storage_usage_delta: Vec::new(), + }; +} + +pub struct MigrationContext { + pub is_first_block_with_current_version: bool, + pub migration_data: Arc, +} + +impl Default for MigrationContext { + fn default() -> Self { + MigrationContext { + is_first_block_with_current_version: false, + migration_data: Arc::new(MigrationData::EMPTY), + } + } +} + +impl Debug for MigrationContext { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_struct("MigrationContext") + .field("is_first_block_with_current_version", &self.is_first_block_with_current_version) + .finish() + } +} diff --git a/core/primitives/src/runtime/mod.rs b/core/primitives/src/runtime/mod.rs index b150cb45ed3..962204bd5de 100644 --- a/core/primitives/src/runtime/mod.rs +++ b/core/primitives/src/runtime/mod.rs @@ -6,6 +6,7 @@ pub use near_primitives_core::runtime::*; pub mod apply_state; pub mod config; pub use near_primitives_core::runtime::fees; +pub mod migration_data; /// Checks if given account has enough balance for storage stake, and returns: /// - None if account has enough balance, diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index defe244373c..7da4e91d8cb 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -152,6 +152,9 @@ pub enum StateChangeCause { /// State change that happens when we update validator accounts. Not associated with with any /// specific transaction or receipt. ValidatorAccountsUpdate, + /// State change that is happens due to migration that happens in first block of an epoch + /// after protocol upgrade + Migration, } /// This represents the committed changes in the Trie with a change cause. diff --git a/core/primitives/src/version.rs b/core/primitives/src/version.rs index 179adc2b3a3..47deddb2375 100644 --- a/core/primitives/src/version.rs +++ b/core/primitives/src/version.rs @@ -101,6 +101,8 @@ pub enum ProtocolFeature { TransactionSizeLimit, #[cfg(feature = "protocol_feature_allow_create_account_on_delete")] AllowCreateAccountOnDelete, + #[cfg(feature = "protocol_feature_fix_storage_usage")] + FixStorageUsage, } /// Current latest stable version of the protocol. @@ -109,7 +111,7 @@ pub const PROTOCOL_VERSION: ProtocolVersion = 45; /// Current latest nightly version of the protocol. #[cfg(feature = "nightly_protocol")] -pub const PROTOCOL_VERSION: ProtocolVersion = 110; +pub const PROTOCOL_VERSION: ProtocolVersion = 111; impl ProtocolFeature { pub const fn protocol_version(self) -> ProtocolVersion { @@ -135,6 +137,8 @@ impl ProtocolFeature { ProtocolFeature::BlockHeaderV3 => 109, #[cfg(feature = "protocol_feature_allow_create_account_on_delete")] ProtocolFeature::AllowCreateAccountOnDelete => 110, + #[cfg(feature = "protocol_feature_fix_storage_usage")] + ProtocolFeature::FixStorageUsage => 111, } } } diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index 12ee946e0a0..cd2a4a36095 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -1481,6 +1481,7 @@ pub enum StateChangeCauseView { PostponedReceipt { receipt_hash: CryptoHash }, UpdatedDelayedReceipts, ValidatorAccountsUpdate, + Migration, } impl From for StateChangeCauseView { @@ -1505,6 +1506,7 @@ impl From for StateChangeCauseView { } StateChangeCause::UpdatedDelayedReceipts => Self::UpdatedDelayedReceipts, StateChangeCause::ValidatorAccountsUpdate => Self::ValidatorAccountsUpdate, + StateChangeCause::Migration => Self::Migration, } } } diff --git a/neard/Cargo.toml b/neard/Cargo.toml index 00f023f73fe..482fce44f35 100644 --- a/neard/Cargo.toml +++ b/neard/Cargo.toml @@ -71,7 +71,8 @@ protocol_feature_block_header_v3 = ["near-epoch-manager/protocol_feature_block_h protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limit", "node-runtime/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = ["node-runtime/protocol_feature_allow_create_account_on_delete"] -nightly_protocol_features = ["nightly_protocol", "near-primitives/nightly_protocol_features", "near-client/nightly_protocol_features", "near-epoch-manager/nightly_protocol_features", "near-store/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete"] +protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] +nightly_protocol_features = ["nightly_protocol", "near-primitives/nightly_protocol_features", "near-client/nightly_protocol_features", "near-epoch-manager/nightly_protocol_features", "near-store/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "protocol_feature_fix_storage_usage"] nightly_protocol = ["near-primitives/nightly_protocol", "near-jsonrpc/nightly_protocol"] [[bin]] diff --git a/neard/res/storage_usage_delta.json b/neard/res/storage_usage_delta.json new file mode 100644 index 00000000000..1f59836f468 --- /dev/null +++ b/neard/res/storage_usage_delta.json @@ -0,0 +1,12450 @@ +[ + [ + "0.near", + 1 + ], + [ + "00.near", + 1 + ], + [ + "001.near", + 1 + ], + [ + "007.near", + 3 + ], + [ + "0110b3cbbb0eb096319f1e12460519e65d0429375b7258f377265979c119889c", + 3 + ], + [ + "0153b15fecd4ffd382ffad6882ee053e0a0fddefa7e1a99d8aa29eb07dc9bac2", + 2 + ], + [ + "0154af6f1023fdfd8d87906211c7bae2bc2efae1e5b3347683813f598a19d50e", + 1 + ], + [ + "037bf673cb864e5a14fec7c476fb60d0416e1a46b196b2f95b87599c1c73073e", + 3 + ], + [ + "04bbe8cdda12ab0081a3c4379c97623ffebf33ec4c1d7949acc4f2626cd638a9", + 4 + ], + [ + "0514dc4c3005dd273ed59ac5bab420f81008c698df31d72baa088f92c3340ed4", + 1 + ], + [ + "07.near", + 1 + ], + [ + "0a1eb8bbd90d8a187672baab254774424f4fd58bf11fd6025cb60f118f930005", + 1 + ], + [ + "0aab2c312b933402b75764488c5ffdf2e6ef2b7bcc4cdaab422873e17f9b7f6a", + 4 + ], + [ + "0c0dbe4fd0ec7b6f49388fcd80085fc2f58d12b5a353031a15ba3fa0939bc1c3", + 5 + ], + [ + "0c6c891f032d39d667356fb891a1083fa062cefc5aeae2b1786b84104158ae90", + 7 + ], + [ + "0d10552f8c8cc44b2438f086e989b053b0c604e69a1b9e3858f51a334fe3346b", + 1 + ], + [ + "0d5054e7ee907ca117d7660350bd4a023968d51650c7c4d99c4eb86349752f66", + 3 + ], + [ + "0d7b443198e08e34350371f65ace682f1ca9786d9bf54b2b52ae608fbd81c230", + 1 + ], + [ + "0de88eb5ab5894e784f454508f396a7fed67c56d302264becdfaa9029453a138", + 2 + ], + [ + "0e2b64a24d58fdeba14234372bb0b23a8b683033680acf59cc2c8833bb64dbe6", + 5 + ], + [ + "0e7a0c50b20f5037b40a220aef05fab39aff40b923be04006ff7a6062c424c8b", + 2 + ], + [ + "0ed97eb8b992487f7f03451a24b1fe40d53ca6658afc42b0ab8fe4639385439c", + 2 + ], + [ + "0fb8d555930d307a9d20d5ffb0ffdac5e869b31c17277bd1d800ba6d806dc477", + 1 + ], + [ + "0x.near", + 1 + ], + [ + "0x3bfc.near", + 1 + ], + [ + "1.near", + 1 + ], + [ + "10.near", + 2 + ], + [ + "100.near", + 1 + ], + [ + "100x.near", + 1 + ], + [ + "1015a0dadb90ca2d30035c15261204a7b3f4693177ab8a9771b62591af55d737", + 4 + ], + [ + "1024.near", + 1 + ], + [ + "10scarandres.near", + 1 + ], + [ + "11.near", + 1 + ], + [ + "11_8-bernaced-00_7.near", + 5 + ], + [ + "11november.near", + 1 + ], + [ + "123.near", + 1 + ], + [ + "1234.near", + 1 + ], + [ + "12ed01143181f20669a689d0e1ee202a7d8301fba4c4864274de4bdffdc6abe5", + 3 + ], + [ + "132b92af125cb0b94f6cc8767539bf6e6fa3a2761824ba92913e272a4646165a", + 2 + ], + [ + "13ba6764bee29e130a9cea6ff5545ba137ea48ccf23ab08d55001a388d1eed55", + 1 + ], + [ + "14161728bc6fd05a204a6a74c51c1256d1be6160c42b9dbfcb56de24dd24ba2c", + 5 + ], + [ + "14b1f401dc50576118a2472acd428f7c4c2c99e5ae21d1c01dd483593026bf9b", + 7 + ], + [ + "15.near", + 4 + ], + [ + "166a8baa5a06c12a89bd9fe53be82f4f3113aff7a5b8ad1c790f6fe215de69bb", + 5 + ], + [ + "18.near", + 1 + ], + [ + "19240275b389c3d4f37ad6d015d0e5552f353e17a55555f4b88d120e208b35f2", + 2 + ], + [ + "1a1b2e1105736ad5cf15377b239ad0060ff698b427d837047dd8c6cefc664821", + 3 + ], + [ + "1a313ebf78de0975aa0d2d06f064db497e76e82dfe59ae91c6bd11fd96240f1e", + 3 + ], + [ + "1a360b62fac5a1693883a50a8a629f23d54c3ad08f9b1411ba1de41931f6635b", + 1 + ], + [ + "1ab5994f049e3b19f1a9a00af5466184df51143299ff74fdc0ef55ad3c452f60", + 1 + ], + [ + "1e4703c615a76e489c8812485cc48103f05e28ef719c7e64c7f99abbcf3a8514", + 2 + ], + [ + "1e6221ca523a6e16e271dda75b8edeae5b35b30de5b3b666e2eb86a974cd435e", + 1 + ], + [ + "1earn1.near", + 1 + ], + [ + "1inch.near", + 1 + ], + [ + "1kk.near", + 3 + ], + [ + "2.near", + 1 + ], + [ + "2140a646e0a3c8c974fb0c6e318fbf62d086784a5f7419d80caae4fcb40a76d6", + 2 + ], + [ + "22.near", + 1 + ], + [ + "237dd62c081e1ccc75f4ba77b02dcea4e56fde024f16746727285c042dc3027a", + 2 + ], + [ + "23d810a933bbac6447aaada7ef03156eb324a124857a7528942819b47f81c1a3", + 1 + ], + [ + "273ee3cbd1f36fd54dc52a4f93302cc80fd3e7d64486ceba35f5b4d1f7ebea8d", + 3 + ], + [ + "27eef9392cbcd7ff73675755cdf8a930c5d829306f2653b404ca2ebf45821c53", + 3 + ], + [ + "28121990fg.near", + 2 + ], + [ + "294548b971fa95fb635aca80caf6ec25cf26b2082c11beee3ad23edd3c119fbd", + 3 + ], + [ + "29878949f636662ce3c2429e45a68469f799f08817cc2d1b57936ddff2e390e8", + 3 + ], + [ + "2a50c02c6c506d7745713986e4d5fe0fc9806a819dc10225d762d96236a5b986", + 1 + ], + [ + "2bb9146b50b937ae0a02be5407dab2104311c228cf72521d59e652c693927052", + 4 + ], + [ + "2c080e67e1696fce40dbd29f37c0cb222f69d051f3d820479dcf68b69b8b6040", + 1 + ], + [ + "2e8b636a1b4ebc65969e2509dfdae58fd93135d5d688bc6e57ff9443398b4cec", + 4 + ], + [ + "2f7b6346ccb5b22d9e18caf0c46412cdc03b94783d2ecec3f9d3cb62395460a7", + 4 + ], + [ + "2ge.near", + 1 + ], + [ + "2smart4.near", + 1 + ], + [ + "303c0fe14eeac48e62cfc6ea8a4b0ad5c314b56038dd9b618a3a7a68004e0976", + 1 + ], + [ + "31337.near", + 1 + ], + [ + "31536812dcdf087d2f58d2006273342bb8a07691b187e60fa95013c546e3c697", + 22 + ], + [ + "317c975115ab57b7cff17aede35e7313b61d94283653e98193b62f4f5ef84155", + 2 + ], + [ + "329794744.near", + 2 + ], + [ + "362.near", + 1 + ], + [ + "372ad2d5c7cbab331e985ad0b82aa1ef4d8a814114506b55166b46dfedcf3cb8", + 1 + ], + [ + "3803e3358a676111a436ff0c2199165c290200682cedc3cef42b97db3e69436e", + 1 + ], + [ + "3832040fea9bb71e7d5b9878028daa11205347bbc4397120fdd629ebffbb3ee7", + 5 + ], + [ + "3839632950.near", + 1 + ], + [ + "3b83b07cab54824a59c3d3f2e203a7cd913b7fcdc4439595983e2402c2cf791d", + 1 + ], + [ + "3bcec9ab1433c85ec3073271652cbb56970affa28fc7681ed1ee7edcffbb41c8", + 11 + ], + [ + "3dda717ab16163320d3cb4c301d458b747800a78a001a8c2e62d6c67f77e1621", + 1 + ], + [ + "3dee906ea97fae13af3aaeccb3d48b2c26333dbe2e1400e0806d03b366c02554", + 1 + ], + [ + "4.near", + 2 + ], + [ + "40fe3cb2aed51e9566bda6125a73542a4f8783b10cb121adcbd138090413c87c", + 4 + ], + [ + "417d3db9955230c26c5f20d8976238809b93b200b20a902d2026503b564bc590", + 1 + ], + [ + "41a91e65b740aa45f7e43a7beb3f7e7ea89b886ef866d463b649b2ce250c5ac8", + 1 + ], + [ + "42095658e8f68de946387fdb4b57aba8688c19accc0c7561d21a40750acbfc3d", + 3 + ], + [ + "427921797a22047e361bd436fc3046be9af45d9a2fdb889fee4578f7e15b476d", + 16 + ], + [ + "42d4333ddf86fa25f44e3958aaf7c47f8381ba288298913985321778c57b4f87", + 3 + ], + [ + "44.near", + 1 + ], + [ + "454864608.near", + 1 + ], + [ + "4840e45ddb1f88707a66adb4014aef69aac28f4e6bf888be9af9875254778049", + 1 + ], + [ + "489fcc38ffe24db6bf49b37391f16cf55aff87e9e74752206876c5f2bcd96550", + 5 + ], + [ + "49b215f4ce37d8635322a23164e2129832e12a3aad8909f11015682fe2001243", + 3 + ], + [ + "49caf8c545700980ac5cd883bfc3682feeb971083c5569fe6ef67cc93ca3f47f", + 3 + ], + [ + "4b84545328537c4c97fd353879bf016275ae42888a9a613320a0929b3b12be9e", + 1 + ], + [ + "4b919505a2e49a3b47d4b7327d3b3bf1faeb02c21d797e3364bdde605ac03947", + 1 + ], + [ + "4myson.near", + 1 + ], + [ + "4nts.are.near", + 1 + ], + [ + "5.near", + 1 + ], + [ + "501f05dc581cc48e6c49ee2519dd983dcc209fda7d42053adb5d496042b2931e", + 1 + ], + [ + "51.near", + 1 + ], + [ + "51407b06e1740af4f5bc0d6fadbda8ec749087167b965808ed5430e9181f522f", + 2 + ], + [ + "518d7a7700b37d96543682aa5db65ec74082021542a01c32007af800d29da550", + 1 + ], + [ + "51ffc319cb90baa612c62fdb1c36f333db2034e403be321b88f1b0d6f754cfde", + 3 + ], + [ + "520.near", + 1 + ], + [ + "52fd2108c386cf51aea902e6fcea63db21887e3ee6ca4cb01bdea670c9dcf731", + 1 + ], + [ + "55.near", + 1 + ], + [ + "5df4b64e6e427f91d59b802b2447180b914edf54aa9afa28f6c9d5b4b1f7d8ea", + 1 + ], + [ + "5ec98442007ea2f2789e1b18fda4cede7af01e933bd055fd64cfa59d0764070f", + 4 + ], + [ + "5fff20e450e7297c455c88c4deb96679fb4bd360cf029ab65fe6722b37b6ddb5", + 4 + ], + [ + "6.near", + 1 + ], + [ + "6119bc71a0004cd7da1d838c90e43534c15d7e0b7f1233f9a9b9871070d1d54b", + 3 + ], + [ + "632be5d6e0ac3bec82f8cde5cbc29535b3d17c2728332de224d500dd3f919cb4", + 4 + ], + [ + "6577af8fce464dff3bdfcda04c9d93b80eb9bd2d7600648bfb154ece709199ee", + 7 + ], + [ + "659f400d18b5585fbe993d94090a2a7720b3905671c16d939f3ca75dc8748388", + 1 + ], + [ + "66.near", + 1 + ], + [ + "666.near", + 1 + ], + [ + "6755a67d6fc7e0d00eccc19f5f4ac4c796b70a9d05c600213079efdb35929ed8", + 2 + ], + [ + "6a62e81e18f79c5aaf721cd8ec79394e02dacef82b881efebd0840398161fa7e", + 1 + ], + [ + "6a9f536eaaccb62fc3ccda6018aa4a856893a9418dd7c0f62040d49240c925d1", + 1 + ], + [ + "6fe52682536bd3f2195f58a9ace51c9ded130959da5550d936bfb9d000045af1", + 2 + ], + [ + "7013df963f4f3226fc7fe393e0f459c4710c5e4b9f1455b772fb033adcd0db9d", + 2 + ], + [ + "710ea433fd8f67300c78c43351f847b48dd4ac0ae6b958d44081d5efc2458f5f", + 5 + ], + [ + "72119254f1872216214542967b700deecfe12f679c4206bce96159a580827b9a", + 2 + ], + [ + "736d01a5f9e2a6b6cebff2b56eaab5ba86d9efa51f6a292294e7a0f4e4f304bc", + 3 + ], + [ + "75180a176bc103dd239f43271ab8e95da5782755dc9a210925a0e722cb5fccbf", + 6 + ], + [ + "75570b99df84e2e8b138dbb6d084bed628cbb2e8179d0c7ba6d941b445d4f556", + 2 + ], + [ + "7671144.near", + 2 + ], + [ + "77.near", + 2 + ], + [ + "77725bb78fcfe81cbd640fdaa25f28fd3050ceae281c5d3764b694cc32cd66d4", + 1 + ], + [ + "7ee2991cb2076c43e90e37543efd0f1bac32f5c10f9b1755907723725c055444", + 6 + ], + [ + "7inch_dick.near", + 1 + ], + [ + "7nda.near", + 1 + ], + [ + "8.near", + 1 + ], + [ + "810d9ece5ed546dd3f17aea5f22b6044de70477d85ad53307eb07c920fcab139", + 4 + ], + [ + "8378ceb0c3dce515575bc04985acd20ab3de5bfc932daee11db781c0bac2c929", + 1 + ], + [ + "858035a9c9cec30c9f07be24ddf7b1ea1a513b001ce8046e4f6c5eb96222c51f", + 2 + ], + [ + "86.near", + 1 + ], + [ + "86b1889b9876cdfbd40b0bab21b8efa60559e02115850a743cbbdd8063b31803", + 1 + ], + [ + "88.near", + 2 + ], + [ + "8819beaa2fa7cef4fe800f6a890c1293e3e90f21d23027293a2690540de986f7", + 1 + ], + [ + "884e0aa90212fb91dc0b718987c5c5fc140cf5694316645f6716d5aaa2ef0a9a", + 1 + ], + [ + "888.near", + 1 + ], + [ + "88888.near", + 1 + ], + [ + "8888888.near", + 1 + ], + [ + "8cfeba62ea751cac817c7c0a39bd8a594f0f5ba91e4caf4304260785045b2e04", + 2 + ], + [ + "8dc251953d089d322fcdf21853331e12b467285174268f9020834962b3c6eb67", + 3 + ], + [ + "8ee0eabdb51eb6984ceb018851b93cea431681b0f9e0816061a8e7fe23c4a544", + 1 + ], + [ + "90b952a3f8a44642c4c61689bee725a5ce3927ba4a520be031e1c6d23fadc28f", + 3 + ], + [ + "90d23a0362766761a59dad0afca2243d3635f17bd0091aff1f5fb2eb804cb32c", + 10 + ], + [ + "9306bf915f8a4948d1c6b16d3a68897338309be7bdd6ef4887b2a11656c39ee5", + 25 + ], + [ + "93947f0956ab5e947b04775a08a3588818adbacf852de1af10a53cd2fc0913d7", + 2 + ], + [ + "9434e48096b096ac4111a3488cf01c4376aa5ffe111e6be818eaa35ed5be0c1e", + 5 + ], + [ + "960390f1cfc00c5dab00e5a6b148d8105b999b796d7b94b948f588f42fbcd1f1", + 3 + ], + [ + "996.near", + 2 + ], + [ + "999.near", + 1 + ], + [ + "99999.near", + 1 + ], + [ + "9ba1203d33ae0e66f8b0d55a0cc0de4bdc7decbc14912c3192a5d5aacd3f48f7", + 4 + ], + [ + "9e227608367c2ee4fa0b5f4aa1f6a1edca390e30c3eba3c1b478d767873edfb3", + 11 + ], + [ + "9e233ab3b452fd8e3cf322d4285880a30999767e09dc248c95347c0a1bba9bfd", + 3 + ], + [ + "9f01a286fca244938bfb85e4f42513d582b91829ef60ad54e0bf70b39850b2dc", + 2 + ], + [ + "9fb0e708aa699867ddf68297704f5733e0a960c32e4a5a141ebfcb930965105a", + 2 + ], + [ + "a.near", + 1 + ], + [ + "a0244742a4cbe6eb5227022032180ccd97f9860a7d0b3caa23f2da40401cda4f", + 3 + ], + [ + "a03d8af59a1e193e40df0cc3f86cc71854373d757777bc9df1bb3688b8977482", + 2 + ], + [ + "a3d68485efea9f80611ff9a983ea006b24481ca5856da8b2d799e2f51c9b98ce", + 4 + ], + [ + "a4bf751682fb82bc61de4bfd5824ab3191259309d2c37a87c34da62310ccb954", + 4 + ], + [ + "a707181abad1a2679da6ff53c55d8247a636d769215a736b4cb4984e41e3195d", + 4 + ], + [ + "a_mote.near", + 2 + ], + [ + "aaaeeeggg.near", + 2 + ], + [ + "aac2aad7527581b68ca6ec86344f799afa4b75a0014dd0919e755ab8a041c0e9", + 6 + ], + [ + "aad.near", + 1 + ], + [ + "aaronlutze.near", + 1 + ], + [ + "ab1.near", + 2 + ], + [ + "ab2.near", + 1 + ], + [ + "abc.near", + 1 + ], + [ + "abin.near", + 1 + ], + [ + "abl.near", + 2 + ], + [ + "abl2.near", + 2 + ], + [ + "aborjin.near", + 1 + ], + [ + "abosiqi.near", + 3 + ], + [ + "abraham.near", + 1 + ], + [ + "abstractmonday1.near", + 1 + ], + [ + "abu.near", + 1 + ], + [ + "abzman.near", + 1 + ], + [ + "acdab2c10ef8a4aa3e895c90814f3d7a4ca50c5582a3bdbca091f4ec783d924d", + 5 + ], + [ + "ace.near", + 1 + ], + [ + "acelee668.near", + 2 + ], + [ + "acotelo.near", + 1 + ], + [ + "acoyne1.near", + 1 + ], + [ + "acoyne2.near", + 1 + ], + [ + "acp.near", + 2 + ], + [ + "acpearson.near", + 2 + ], + [ + "ad9be0b70a92c588c53934f92a4ba4429ac6173228d9ecb12341fddf449c425e", + 1 + ], + [ + "adamko.near", + 1 + ], + [ + "admin.near", + 2 + ], + [ + "adnan.near", + 1 + ], + [ + "adrianchase.near", + 1 + ], + [ + "adrianirimia.near", + 2 + ], + [ + "adrimrl.near", + 1 + ], + [ + "adrymothe.near", + 1 + ], + [ + "aeeeinvest.near", + 1 + ], + [ + "aeror.near", + 2 + ], + [ + "afqanich.near", + 2 + ], + [ + "age.near", + 2 + ], + [ + "ahe.near", + 2 + ], + [ + "ahmadsalman.near", + 1 + ], + [ + "ahmedjacob.near", + 2 + ], + [ + "ahsette.near", + 1 + ], + [ + "ai.near", + 2 + ], + [ + "aidar.near", + 1 + ], + [ + "airocket.near", + 1 + ], + [ + "aiym.near", + 1 + ], + [ + "ajaykumarp0900.near", + 2 + ], + [ + "ajcct22.near", + 1 + ], + [ + "ak.near", + 1 + ], + [ + "ak6.near", + 1 + ], + [ + "akagetbetter.near", + 1 + ], + [ + "akariko.near", + 2 + ], + [ + "akartik87.near", + 1 + ], + [ + "akil.near", + 2 + ], + [ + "akueitaiwan.near", + 2 + ], + [ + "akulov.near", + 1 + ], + [ + "alan.near", + 1 + ], + [ + "alan1.near", + 2 + ], + [ + "alan2.near", + 2 + ], + [ + "alan3.near", + 1 + ], + [ + "alannice.near", + 1 + ], + [ + "alanromero6695.near", + 1 + ], + [ + "alby.near", + 2 + ], + [ + "alejoy2k.near", + 2 + ], + [ + "aleksandr.near", + 1 + ], + [ + "aleksandr_bakanov.near", + 1 + ], + [ + "aleksey.near", + 1 + ], + [ + "aleph.near", + 1 + ], + [ + "alethea.near", + 1 + ], + [ + "alex.near", + 3 + ], + [ + "alex1.near", + 2 + ], + [ + "alex13.near", + 1 + ], + [ + "alex487.near", + 1 + ], + [ + "alexander.near", + 1 + ], + [ + "alexandermacgg.near", + 1 + ], + [ + "alexbys.near", + 2 + ], + [ + "alexde.near", + 1 + ], + [ + "alexey.near", + 1 + ], + [ + "alexeymarkov080.near", + 1 + ], + [ + "alexk.near", + 1 + ], + [ + "alexmonttoya.near", + 1 + ], + [ + "alextom.near", + 1 + ], + [ + "alexyang.near", + 1 + ], + [ + "ali.near", + 1 + ], + [ + "aliaksandrh.near", + 2 + ], + [ + "alibaba.near", + 1 + ], + [ + "alifromcairo.near", + 1 + ], + [ + "aliskhan.near", + 2 + ], + [ + "alive29.near", + 1 + ], + [ + "aljpra.near", + 2 + ], + [ + "alkan.near", + 1 + ], + [ + "alma.near", + 2 + ], + [ + "almutasemalhaj.near", + 1 + ], + [ + "alpcan.near", + 1 + ], + [ + "alpha25.near", + 1 + ], + [ + "alsharif.near", + 1 + ], + [ + "alvin0617.near", + 1 + ], + [ + "am0250.near", + 1 + ], + [ + "ama89.near", + 2 + ], + [ + "amani.near", + 1 + ], + [ + "amazon.near", + 1 + ], + [ + "amg.near", + 2 + ], + [ + "amir.near", + 1 + ], + [ + "amirmurad.near", + 2 + ], + [ + "amisare.near", + 1 + ], + [ + "amit.near", + 1 + ], + [ + "amos.near", + 1 + ], + [ + "ampl.near", + 1 + ], + [ + "ams.near", + 1 + ], + [ + "amster.near", + 1 + ], + [ + "amyk.near", + 1 + ], + [ + "an.near", + 1 + ], + [ + "analilia23.near", + 1 + ], + [ + "analilia2303.near", + 1 + ], + [ + "anandp1005.near", + 1 + ], + [ + "anastdubrovina.near", + 2 + ], + [ + "andre.near", + 1 + ], + [ + "andre20113.near", + 1 + ], + [ + "andreafortugno.near", + 1 + ], + [ + "andreasmueller.near", + 2 + ], + [ + "andrecronje.near", + 1 + ], + [ + "andrewseptember.near", + 1 + ], + [ + "andrey.near", + 2 + ], + [ + "andreyvelde.near", + 3 + ], + [ + "andrius.near", + 2 + ], + [ + "andy.near", + 2 + ], + [ + "andy12.near", + 1 + ], + [ + "andyf.near", + 1 + ], + [ + "angrykoreandad.near", + 1 + ], + [ + "anisha.near", + 1 + ], + [ + "anki.near", + 2 + ], + [ + "anna.near", + 1 + ], + [ + "annachu8.near", + 1 + ], + [ + "annaleoprowell.near", + 1 + ], + [ + "annastories.near", + 1 + ], + [ + "annet09.near", + 1 + ], + [ + "annita.near", + 1 + ], + [ + "annmarzak2020.near", + 1 + ], + [ + "anoane.near", + 2 + ], + [ + "anonimus_it.near", + 1 + ], + [ + "anonymwhale.near", + 1 + ], + [ + "ant.near", + 1 + ], + [ + "antoinevergne.near", + 1 + ], + [ + "anton.near", + 1 + ], + [ + "antonbvb.near", + 1 + ], + [ + "antonio.near", + 1 + ], + [ + "antsibirev.near", + 1 + ], + [ + "anumation.near", + 1 + ], + [ + "anxongdong.near", + 1 + ], + [ + "anyhowclick.near", + 1 + ], + [ + "anyog77.near", + 1 + ], + [ + "aoi.near", + 1 + ], + [ + "apok.near", + 1 + ], + [ + "apolinares.near", + 1 + ], + [ + "aptemuyc.near", + 2 + ], + [ + "aqua_chiang.near", + 1 + ], + [ + "aquila.near", + 1 + ], + [ + "aramak.near", + 1 + ], + [ + "aravind.near", + 2 + ], + [ + "aravind1456.near", + 1 + ], + [ + "archebald.near", + 1 + ], + [ + "arco.near", + 1 + ], + [ + "arcosivan13.near", + 1 + ], + [ + "arctek.near", + 1 + ], + [ + "are.near", + 2 + ], + [ + "areddy.near", + 1 + ], + [ + "ares.near", + 5 + ], + [ + "arfrol.near", + 1 + ], + [ + "arhimond.near", + 2 + ], + [ + "aris.near", + 1 + ], + [ + "arista.near", + 1 + ], + [ + "arman.near", + 1 + ], + [ + "armi.near", + 1 + ], + [ + "arr.near", + 1 + ], + [ + "art.near", + 2 + ], + [ + "artem.near", + 1 + ], + [ + "arthur.near", + 1 + ], + [ + "arthur36.near", + 1 + ], + [ + "arthurs.near", + 1 + ], + [ + "arthurs2.near", + 1 + ], + [ + "artolose.near", + 1 + ], + [ + "artur.near", + 1 + ], + [ + "aryan.near", + 1 + ], + [ + "ash.near", + 5 + ], + [ + "ashwincc.near", + 9 + ], + [ + "asif.near", + 1 + ], + [ + "asotirov.near", + 1 + ], + [ + "aspaceodyssey2001.near", + 1 + ], + [ + "assefreak.near", + 2 + ], + [ + "astamo.near", + 1 + ], + [ + "astan.near", + 1 + ], + [ + "astro.near", + 1 + ], + [ + "astromartian.near", + 2 + ], + [ + "atillaofcrypto.near", + 1 + ], + [ + "atrdenis.near", + 1 + ], + [ + "atskbook.near", + 2 + ], + [ + "auction.near", + 1 + ], + [ + "audaciousamit30.near", + 1 + ], + [ + "audit.near", + 1 + ], + [ + "auel.near", + 1 + ], + [ + "aurel.near", + 1 + ], + [ + "aurora.near", + 1 + ], + [ + "austin.near", + 4 + ], + [ + "autox.near", + 2 + ], + [ + "avantiurin.near", + 2 + ], + [ + "avh857.near", + 1 + ], + [ + "aviy17.near", + 2 + ], + [ + "avizar.near", + 1 + ], + [ + "avogadro31.near", + 1 + ], + [ + "avtomax.near", + 1 + ], + [ + "aw_khalifa.near", + 1 + ], + [ + "awesome.near", + 1 + ], + [ + "awulf.near", + 1 + ], + [ + "axe.near", + 1 + ], + [ + "axel.near", + 1 + ], + [ + "axl.near", + 1 + ], + [ + "axser.near", + 2 + ], + [ + "ay.near", + 1 + ], + [ + "ayotom4u.near", + 2 + ], + [ + "ayy.near", + 1 + ], + [ + "az58348118.near", + 1 + ], + [ + "az6ykawallet.near", + 1 + ], + [ + "azaticus.near", + 1 + ], + [ + "b03a405ec73abb57ce8379889b4e705b6a33e2178f67349ccda1a87ef87e7cff", + 2 + ], + [ + "b0d8134aef7b38217d53e2df574064a7d2020ecdea4fa7c875a4c6c0b3aa0405", + 4 + ], + [ + "b17088e2d35317c7e38f08689973c71349e9bdc11e08dd4eb8ade316d79e7bad", + 3 + ], + [ + "b4b6c1ba1db210d9dfbb6c242d5d6266988ffae9bdc24f4b2be0b1e700704fc4", + 2 + ], + [ + "b4e194dc7b583f7b95c4549c47206f4283f38b208f293045609cd9ba819db17b", + 4 + ], + [ + "b525bd7c8dda7c6db8dd9da09c8791b2ee2c732c1db10478885084540b600180", + 3 + ], + [ + "b6954715.near", + 1 + ], + [ + "b87d7996f47a8d9c5c838457883abf543918bf1dc915ad033dfbcb40c8062cad", + 1 + ], + [ + "baa52093ca28dbc224c9a699ee559bd3b08c84f2d2c119ad7955722102623500", + 3 + ], + [ + "baba.near", + 1 + ], + [ + "babachyke.near", + 1 + ], + [ + "babooha1.near", + 1 + ], + [ + "babykuteok23.near", + 1 + ], + [ + "back2thailand.near", + 2 + ], + [ + "badgermilk33.near", + 4 + ], + [ + "badick.near", + 1 + ], + [ + "baed60a83adf64b3d89eefcc4c2e9bd53b7e86f02c0afc1e986e5fcf2db418a7", + 1 + ], + [ + "baer.near", + 1 + ], + [ + "baf.near", + 1 + ], + [ + "baggy.near", + 1 + ], + [ + "baidu.near", + 1 + ], + [ + "baillokb.near", + 1 + ], + [ + "bakautm.near", + 1 + ], + [ + "bakulowski23.near", + 1 + ], + [ + "baltitus2020.near", + 5 + ], + [ + "bambaleo.near", + 1 + ], + [ + "bandele.near", + 1 + ], + [ + "bangbangwu.near", + 1 + ], + [ + "bank.near", + 1 + ], + [ + "barbear.near", + 1 + ], + [ + "bas.near", + 2 + ], + [ + "basando09gambler.near", + 1 + ], + [ + "basedserg.near", + 2 + ], + [ + "basov.near", + 1 + ], + [ + "batbh.near", + 1 + ], + [ + "battuta.near", + 1 + ], + [ + "bayswatermay65.near", + 1 + ], + [ + "bayusoe.near", + 1 + ], + [ + "bcd38694fae6dba4b2458d44f5b094096ffc3d2342641e9c4d662e666c05ca9c", + 6 + ], + [ + "bcfiekuo25656.near", + 1 + ], + [ + "bdetto2010.near", + 1 + ], + [ + "be.near", + 1 + ], + [ + "bear.near", + 1 + ], + [ + "beatguy99.near", + 1 + ], + [ + "bedivere007.near", + 1 + ], + [ + "beetlz.near", + 1 + ], + [ + "begimay.near", + 1 + ], + [ + "believemestalinspeakslikeyou.near", + 1 + ], + [ + "bellyom.near", + 1 + ], + [ + "belove.near", + 1 + ], + [ + "ben_1507.near", + 1 + ], + [ + "benhartney.near", + 1 + ], + [ + "benjake.near", + 1 + ], + [ + "benjamin.near", + 2 + ], + [ + "benjaminbalazs.near", + 2 + ], + [ + "benoit.near", + 3 + ], + [ + "bentien.near", + 2 + ], + [ + "beny.near", + 1 + ], + [ + "berkayboga.near", + 1 + ], + [ + "berlin.near", + 1 + ], + [ + "berry3425.near", + 2 + ], + [ + "besavage.near", + 1 + ], + [ + "bet.near", + 1 + ], + [ + "bf15b701370b4024a3b465669425e0c38dab3d11f5bf536c62826d3ca38397d9", + 1 + ], + [ + "bfa14bc3bbc363ace68a1bbce2c03400ad956174d8c0caeb61426484635ef8ac", + 4 + ], + [ + "bibo.near", + 1 + ], + [ + "bichenkk.near", + 1 + ], + [ + "bigcoin.near", + 1 + ], + [ + "bigfish.near", + 2 + ], + [ + "bigpapa.near", + 1 + ], + [ + "bigpapa2.near", + 1 + ], + [ + "bilaljivraj.near", + 2 + ], + [ + "billtr.near", + 2 + ], + [ + "binancelabs.near", + 1 + ], + [ + "bingowrt.near", + 2 + ], + [ + "biogkosm.near", + 1 + ], + [ + "bipbippp.near", + 1 + ], + [ + "birchmd.near", + 2 + ], + [ + "birishka.near", + 1 + ], + [ + "bitcoin.near", + 1 + ], + [ + "bitcoinaddict.near", + 1 + ], + [ + "bitcoinbarber.near", + 2 + ], + [ + "bitcoinrok.near", + 2 + ], + [ + "bitcoins.near", + 2 + ], + [ + "bitfinex.near", + 2 + ], + [ + "bithumb.near", + 1 + ], + [ + "bitinvestia.near", + 1 + ], + [ + "bitlion.near", + 1 + ], + [ + "bitmax.near", + 2 + ], + [ + "bitprop.near", + 1 + ], + [ + "bizi.near", + 1 + ], + [ + "bjorn.near", + 1 + ], + [ + "bkk920.near", + 1 + ], + [ + "bkvkrll.near", + 2 + ], + [ + "blackflag.near", + 1 + ], + [ + "blackheuk.near", + 2 + ], + [ + "blackrium.near", + 1 + ], + [ + "blake.near", + 1 + ], + [ + "blakeboe.near", + 2 + ], + [ + "blakenear.near", + 2 + ], + [ + "blanco-75.near", + 1 + ], + [ + "blasio.near", + 1 + ], + [ + "blasio02.near", + 1 + ], + [ + "blinks.near", + 1 + ], + [ + "blitz-123.near", + 2 + ], + [ + "blizzhard.near", + 1 + ], + [ + "block.near", + 1 + ], + [ + "blockchaincompanies.near", + 2 + ], + [ + "blockdaemon.near", + 1 + ], + [ + "blockstech.near", + 1 + ], + [ + "blok1919.near", + 2 + ], + [ + "bloomedemperor777.near", + 2 + ], + [ + "bluccoj.near", + 1 + ], + [ + "bluccox.near", + 1 + ], + [ + "blueblindmelon.near", + 1 + ], + [ + "blxpro.near", + 1 + ], + [ + "bmahony.near", + 1 + ], + [ + "bmahony2.near", + 1 + ], + [ + "bnb.near", + 1 + ], + [ + "bobek.near", + 1 + ], + [ + "bobjmiles.near", + 2 + ], + [ + "bodin2499.near", + 2 + ], + [ + "bodya.near", + 1 + ], + [ + "bogdan.near", + 1 + ], + [ + "bohdan.near", + 1 + ], + [ + "boiler1981.near", + 2 + ], + [ + "bojana.near", + 1 + ], + [ + "boka_sfc.near", + 4 + ], + [ + "bokhaled.near", + 2 + ], + [ + "bombaymillions.near", + 2 + ], + [ + "bomboleylo.near", + 1 + ], + [ + "bond_y8674.near", + 1 + ], + [ + "bonesdu.near", + 1 + ], + [ + "bonestoh.near", + 2 + ], + [ + "bonka.near", + 1 + ], + [ + "bonmale.near", + 1 + ], + [ + "boot1985.near", + 1 + ], + [ + "borbox14.near", + 1 + ], + [ + "borneodreams.near", + 1 + ], + [ + "boss.near", + 1 + ], + [ + "boss57.near", + 1 + ], + [ + "boulder.near", + 1 + ], + [ + "bowen1.near", + 2 + ], + [ + "br4h.near", + 1 + ], + [ + "braaaaam.near", + 2 + ], + [ + "brad.near", + 2 + ], + [ + "brambumbes.near", + 1 + ], + [ + "bratukhin.near", + 2 + ], + [ + "brianbencom315.near", + 1 + ], + [ + "bridgecraven.near", + 2 + ], + [ + "brightside.near", + 3 + ], + [ + "brka.near", + 1 + ], + [ + "bro.near", + 1 + ], + [ + "brossan.near", + 1 + ], + [ + "brunitob.near", + 2 + ], + [ + "bruno.near", + 1 + ], + [ + "bryan994.near", + 1 + ], + [ + "btc.near", + 1 + ], + [ + "btc123.near", + 1 + ], + [ + "btcd.near", + 1 + ], + [ + "buchi.near", + 1 + ], + [ + "bugzbtc.near", + 1 + ], + [ + "buivantai.near", + 2 + ], + [ + "bulldogs8tigers.near", + 1 + ], + [ + "bulldojkee.near", + 1 + ], + [ + "bunghi.near", + 1 + ], + [ + "bunnydoodle12.near", + 1 + ], + [ + "burgheleaico.near", + 1 + ], + [ + "bustups22.near", + 1 + ], + [ + "buy.near", + 1 + ], + [ + "buzi.near", + 4 + ], + [ + "bve73.near", + 2 + ], + [ + "bydaichi.near", + 1 + ], + [ + "bymetin79.near", + 1 + ], + [ + "c3de7f0ba6ee1cfca2e55541707bb91cb6d0c59a0cb8a489a7f00f5c14360b88", + 4 + ], + [ + "c3lestial.near", + 1 + ], + [ + "c4885c8ab855c95d905be6b160333f55a9294b89641035bd321ab7d051f7e882", + 4 + ], + [ + "c55e4140ef5ed72bfa54f560c795ab96a38cc4e9079c7d07a88433c5b19662fb", + 4 + ], + [ + "c711198b5065bd07dac5a3f2bdc97cd3700b0af7cba0f4b51d91a350513ec942", + 11 + ], + [ + "c77b49f39a3ae39c1d94d8e4186b3110a022a4118c49d7ef2a913809c4046c50", + 4 + ], + [ + "c7f2a4ae16c9514159386f5351bf0365032b8c76801341087bc3627221cdd25e", + 9 + ], + [ + "c80f0a2093b7075b3717ea94dcc3bd54b369e47bc9096d6920f2baf16d1693ec", + 4 + ], + [ + "cacossio.near", + 1 + ], + [ + "cadel.near", + 1 + ], + [ + "caesar0314.near", + 2 + ], + [ + "caizhenhao.near", + 1 + ], + [ + "cake.near", + 2 + ], + [ + "can.near", + 1 + ], + [ + "canahmett.near", + 1 + ], + [ + "captainwhale.near", + 1 + ], + [ + "carangel.near", + 1 + ], + [ + "carles.near", + 1 + ], + [ + "carlos.near", + 2 + ], + [ + "carolinanoriega.near", + 2 + ], + [ + "cashman.near", + 1 + ], + [ + "casino.near", + 1 + ], + [ + "caso234.near", + 1 + ], + [ + "caso234z.near", + 1 + ], + [ + "castleman.near", + 2 + ], + [ + "catalin.near", + 2 + ], + [ + "catfat.near", + 1 + ], + [ + "catoshi.near", + 1 + ], + [ + "cbbffb1ef77b7258ae161102d549251177205345c5318e0be9ab1c0adf95f132", + 2 + ], + [ + "cbret81.near", + 1 + ], + [ + "cc.near", + 1 + ], + [ + "cc3f289f216158c78a126d9394b9b7e50fd27d327e2fc630668bc068a6d07548", + 2 + ], + [ + "cd1ec14a5e33a4d922fffc6eece8dfad31964e7238f28a431550ce2919faad63", + 1 + ], + [ + "ce0c6c3f00cdc1495d78b222b933b7a4a39bfcfdc6b19ee95020ca1faee6ebba", + 1 + ], + [ + "cea7ac3268c4efe1639776501cfd3d486d0cb61e9a0e5888986635944b07d539", + 5 + ], + [ + "cedric.near", + 1 + ], + [ + "ceo.near", + 1 + ], + [ + "cestovatel.near", + 2 + ], + [ + "cesxy.near", + 1 + ], + [ + "ceyptoslash.near", + 1 + ], + [ + "cfzy8888.near", + 1 + ], + [ + "cgrvgha6bvjh2apkzbbcdxdouy3yapjj.near", + 1 + ], + [ + "chad.near", + 1 + ], + [ + "chagabee.near", + 1 + ], + [ + "chain_green.near", + 1 + ], + [ + "chainwang.near", + 2 + ], + [ + "champinemcfaddin.near", + 1 + ], + [ + "chance2dance.near", + 1 + ], + [ + "chandru.near", + 2 + ], + [ + "changning.near", + 1 + ], + [ + "charles.near", + 1 + ], + [ + "charliephy.near", + 2 + ], + [ + "charlotte.near", + 1 + ], + [ + "chcobesc.near", + 1 + ], + [ + "cheburechek.near", + 2 + ], + [ + "cheikhada.near", + 1 + ], + [ + "chen813.near", + 3 + ], + [ + "chenda.near", + 1 + ], + [ + "chengizkhann.near", + 1 + ], + [ + "chengizkhanns.near", + 1 + ], + [ + "chengxiaokris.near", + 1 + ], + [ + "cherouvim21.near", + 1 + ], + [ + "cheryl.near", + 1 + ], + [ + "cheslav.near", + 1 + ], + [ + "chestnut.near", + 2 + ], + [ + "chewie1.near", + 1 + ], + [ + "cheyne.near", + 1 + ], + [ + "chez77.near", + 1 + ], + [ + "chief.near", + 1 + ], + [ + "china.near", + 5 + ], + [ + "chipon46.near", + 1 + ], + [ + "chirag911.near", + 1 + ], + [ + "chiwairen.near", + 5 + ], + [ + "chouchou.near", + 1 + ], + [ + "chouhsinyo.near", + 4 + ], + [ + "chris.near", + 1 + ], + [ + "chris_ns.near", + 1 + ], + [ + "chrispaes.near", + 2 + ], + [ + "christiaan.near", + 2 + ], + [ + "christian.near", + 1 + ], + [ + "christianwolf.near", + 1 + ], + [ + "chrom175.near", + 1 + ], + [ + "chuanshao.near", + 1 + ], + [ + "chuckando.near", + 2 + ], + [ + "chulei.near", + 1 + ], + [ + "chun.near", + 1 + ], + [ + "chung.near", + 3 + ], + [ + "chuppi1108.near", + 2 + ], + [ + "ciprian.near", + 1 + ], + [ + "ciptim.near", + 1 + ], + [ + "ckb.near", + 4 + ], + [ + "ckhk5661.near", + 2 + ], + [ + "claim-tokens.near", + 1 + ], + [ + "clark.near", + 2 + ], + [ + "claudia.near", + 1 + ], + [ + "claudiu.near", + 1 + ], + [ + "claunas.near", + 1 + ], + [ + "clawmvp.near", + 1 + ], + [ + "cleaner.near", + 1 + ], + [ + "cliu.near", + 2 + ], + [ + "cm.near", + 1 + ], + [ + "cn.near", + 1 + ], + [ + "coachb.near", + 1 + ], + [ + "cocolin51.near", + 1 + ], + [ + "code.near", + 1 + ], + [ + "coffee.near", + 1 + ], + [ + "coinbank.near", + 1 + ], + [ + "coinbase.near", + 2 + ], + [ + "coindex.near", + 1 + ], + [ + "coinless.near", + 1 + ], + [ + "coinlist.near", + 1 + ], + [ + "coinmarketcap.near", + 1 + ], + [ + "coinmike86.near", + 1 + ], + [ + "coins.near", + 1 + ], + [ + "coldwinter.near", + 1 + ], + [ + "colli.near", + 1 + ], + [ + "combatant.near", + 1 + ], + [ + "comcmipi.near", + 1 + ], + [ + "commam7109.near", + 1 + ], + [ + "companya.near", + 1 + ], + [ + "compound.near", + 1 + ], + [ + "condes.near", + 1 + ], + [ + "contributors.near", + 1 + ], + [ + "coonolex.near", + 1 + ], + [ + "cooper.near", + 2 + ], + [ + "copperbrain.near", + 1 + ], + [ + "coreman.near", + 1 + ], + [ + "cosmopolite.near", + 1 + ], + [ + "cowaribit.near", + 1 + ], + [ + "cr.near", + 1 + ], + [ + "craig.near", + 1 + ], + [ + "craigwright.near", + 2 + ], + [ + "crasengover.near", + 2 + ], + [ + "crass.near", + 2 + ], + [ + "crazypiano.near", + 1 + ], + [ + "crc5.near", + 1 + ], + [ + "crespo58.near", + 1 + ], + [ + "criogen.near", + 1 + ], + [ + "crlwallet.near", + 1 + ], + [ + "crypted.near", + 1 + ], + [ + "cryptio.near", + 2 + ], + [ + "cryptnito.near", + 1 + ], + [ + "crypto80.near", + 1 + ], + [ + "crypto_bu.near", + 2 + ], + [ + "cryptobro.near", + 1 + ], + [ + "cryptochin.near", + 2 + ], + [ + "cryptocurrency.near", + 1 + ], + [ + "cryptodonny.near", + 2 + ], + [ + "cryptodruu.near", + 1 + ], + [ + "cryptodzh.near", + 1 + ], + [ + "cryptoearn.near", + 2 + ], + [ + "cryptoinvestingk.near", + 1 + ], + [ + "cryptojay.near", + 1 + ], + [ + "cryptojones.near", + 1 + ], + [ + "cryptoking.near", + 2 + ], + [ + "cryptolab.near", + 1 + ], + [ + "cryptolife.near", + 2 + ], + [ + "cryptolonewolf.near", + 2 + ], + [ + "cryptomearis.near", + 1 + ], + [ + "cryptomilion.near", + 1 + ], + [ + "cryptomoneymaker.near", + 1 + ], + [ + "crypton0ob.near", + 1 + ], + [ + "cryptonear.near", + 1 + ], + [ + "cryptosa.near", + 2 + ], + [ + "cryptosafu.near", + 1 + ], + [ + "cryptotiger.near", + 1 + ], + [ + "cryptovision.near", + 1 + ], + [ + "cryptowhale.near", + 1 + ], + [ + "cryptoyoda.near", + 1 + ], + [ + "crysto73.near", + 1 + ], + [ + "csk13925957545.near", + 1 + ], + [ + "ct.near", + 1 + ], + [ + "cxz.near", + 1 + ], + [ + "cypherhunter.near", + 1 + ], + [ + "cz.near", + 1 + ], + [ + "czech.near", + 2 + ], + [ + "czizzy.near", + 3 + ], + [ + "d075b44b14dbda71a31f05abd24aa4c76b1f3ef42898abf67073d38d8fbfe801", + 1 + ], + [ + "d1.near", + 1 + ], + [ + "d1eselforeva.near", + 1 + ], + [ + "d258ab4694321dcde0c5bcc7097e5dafff46523840cf3a7370d78565e96d9253", + 4 + ], + [ + "d31700.near", + 1 + ], + [ + "d4e5cc25b629236480a236553680f218a37972dc3a5eee1bca1aa31838c80541", + 1 + ], + [ + "d53f439c2377739a1e529f5438f2a44821c853ab871d38221f185ccfb7fc8784", + 34 + ], + [ + "d5617c05503cac78c0aae88ed9550932c104e4e734166fa874eefe93c23eacd2", + 1 + ], + [ + "d5f29321220d0829ca1565d04a1fc07aaff326ab655a299add8543aa41bd4f5f", + 4 + ], + [ + "d6e8bfda2d5b11da382de2edb7d4f5a05237a539847dd794cd9ee30ec859bae2", + 4 + ], + [ + "d7c9d5126ef6b118224e49cf44133df2adde499e053d044fa4f860bb97552bbd", + 2 + ], + [ + "daeho.near", + 1 + ], + [ + "daf.near", + 1 + ], + [ + "daflv.near", + 1 + ], + [ + "dahlberry.near", + 4 + ], + [ + "dai.near", + 1 + ], + [ + "daixinyi.near", + 1 + ], + [ + "daliut.near", + 2 + ], + [ + "damianguenther.near", + 1 + ], + [ + "dana888.near", + 1 + ], + [ + "danbiscuitbrown.near", + 1 + ], + [ + "danchr.near", + 1 + ], + [ + "dandoon.near", + 1 + ], + [ + "dane75.near", + 1 + ], + [ + "dangdh.near", + 1 + ], + [ + "danger25.near", + 1 + ], + [ + "dani.near", + 1 + ], + [ + "daniel.near", + 2 + ], + [ + "danielc.near", + 1 + ], + [ + "danielledelsing.near", + 1 + ], + [ + "danil.near", + 1 + ], + [ + "daniyar.near", + 2 + ], + [ + "danklasson.near", + 2 + ], + [ + "dannn14.near", + 1 + ], + [ + "dannyvanosdeman.near", + 1 + ], + [ + "danosn69191969.near", + 1 + ], + [ + "danyjj.near", + 1 + ], + [ + "dao.near", + 1 + ], + [ + "daoasset.near", + 1 + ], + [ + "daphunk.near", + 1 + ], + [ + "dar1.near", + 1 + ], + [ + "dariako13.near", + 1 + ], + [ + "darkec.near", + 1 + ], + [ + "darkodoog.near", + 3 + ], + [ + "darkodoog2.near", + 2 + ], + [ + "darksurfer.near", + 1 + ], + [ + "darlka.near", + 2 + ], + [ + "daunjuan.near", + 2 + ], + [ + "davidbksantos.near", + 1 + ], + [ + "daviddion.near", + 1 + ], + [ + "davideverda.near", + 2 + ], + [ + "davidistaken.near", + 1 + ], + [ + "davinci.near", + 3 + ], + [ + "davram.near", + 1 + ], + [ + "dawg.near", + 1 + ], + [ + "dawns.near", + 1 + ], + [ + "daz.near", + 1 + ], + [ + "dbswap.near", + 2 + ], + [ + "dcha16.near", + 1 + ], + [ + "ddanchev.near", + 1 + ], + [ + "dear.near", + 1 + ], + [ + "decentraliseme.near", + 2 + ], + [ + "deepakdinkan.near", + 2 + ], + [ + "def626f5e77305e783fc61be8ff390c6010bca1779d5a7a0d218dd76802a51c7", + 2 + ], + [ + "defi.near", + 2 + ], + [ + "defiance.near", + 1 + ], + [ + "defykonglong.near", + 1 + ], + [ + "deg.near", + 1 + ], + [ + "del_la.near", + 2 + ], + [ + "delboy.near", + 1 + ], + [ + "delpadschnick.near", + 1 + ], + [ + "deltarun1.near", + 2 + ], + [ + "demerald.near", + 1 + ], + [ + "demon7719.near", + 1 + ], + [ + "demos.near", + 1 + ], + [ + "den.near", + 37 + ], + [ + "den20102004.near", + 1 + ], + [ + "denis125.near", + 1 + ], + [ + "dennis.near", + 1 + ], + [ + "dennison.near", + 1 + ], + [ + "denturebur.near", + 2 + ], + [ + "deposit.near", + 1 + ], + [ + "derkaalbers.near", + 2 + ], + [ + "deskertw.near", + 2 + ], + [ + "destrla.near", + 1 + ], + [ + "desy.near", + 1 + ], + [ + "dev.near", + 3 + ], + [ + "devasterus.near", + 1 + ], + [ + "devdn3dsr63.near", + 1 + ], + [ + "deviate.near", + 1 + ], + [ + "dex.near", + 2 + ], + [ + "dexxa05.near", + 2 + ], + [ + "deyond2020.near", + 1 + ], + [ + "deysler.near", + 1 + ], + [ + "dfa635185b3392d5e5a0eed62eb1f58bb7d6392ce2c5ff07acf4922726744256", + 2 + ], + [ + "dfcb2aff667f14b9adc3522e2db4b2f898f6cc3bf42300175f98661eb89f19b6", + 1 + ], + [ + "dfe4dbf46adc0dfa56c5f612dabe2caf93f783f22f3242e07ee653d85ec421a7", + 3 + ], + [ + "dg.near", + 1 + ], + [ + "dgimmy.near", + 1 + ], + [ + "dharmadhikari.near", + 1 + ], + [ + "dhaval567.near", + 1 + ], + [ + "dhoick.near", + 2 + ], + [ + "diana.near", + 1 + ], + [ + "didi.near", + 1 + ], + [ + "diegordo.near", + 1 + ], + [ + "digimon3y.near", + 3 + ], + [ + "dii.near", + 2 + ], + [ + "dillsp88.near", + 1 + ], + [ + "dimaro.near", + 1 + ], + [ + "dimaro1.near", + 10 + ], + [ + "dimmao.near", + 2 + ], + [ + "dinhhongd.near", + 2 + ], + [ + "dinokidjs.near", + 1 + ], + [ + "dio.near", + 1 + ], + [ + "dipsyv.near", + 2 + ], + [ + "direzza.near", + 1 + ], + [ + "dissy.near", + 2 + ], + [ + "distinct.near", + 1 + ], + [ + "dj72crypt.near", + 1 + ], + [ + "django.near", + 1 + ], + [ + "djchahal.near", + 1 + ], + [ + "djoker.near", + 1 + ], + [ + "dk009.near", + 2 + ], + [ + "dkdk009.near", + 1 + ], + [ + "dlt.near", + 1 + ], + [ + "dlwodlwogks.near", + 1 + ], + [ + "dmark2729.near", + 1 + ], + [ + "dmitri.near", + 2 + ], + [ + "dmt.near", + 2 + ], + [ + "dnovy.near", + 1 + ], + [ + "dog.near", + 1 + ], + [ + "dojisama.near", + 1 + ], + [ + "dolphintwo.near", + 1 + ], + [ + "domains.near", + 1 + ], + [ + "dominic.near", + 2 + ], + [ + "don.near", + 9 + ], + [ + "donaldp.near", + 1 + ], + [ + "donan.near", + 1 + ], + [ + "dongding.near", + 1 + ], + [ + "dot.near", + 1 + ], + [ + "dozer.near", + 2 + ], + [ + "dpod52.near", + 1 + ], + [ + "dragonbran945.near", + 1 + ], + [ + "drchudi_near.near", + 1 + ], + [ + "drewx.near", + 2 + ], + [ + "drey.near", + 1 + ], + [ + "drt860109.near", + 1 + ], + [ + "drupa.near", + 1 + ], + [ + "dsalv.near", + 2 + ], + [ + "dscocco.near", + 1 + ], + [ + "dsgital.near", + 1 + ], + [ + "dsouza.near", + 2 + ], + [ + "dsrv.near", + 1 + ], + [ + "dss.near", + 1 + ], + [ + "du.near", + 1 + ], + [ + "duckhai.near", + 2 + ], + [ + "duongkta.near", + 1 + ], + [ + "duongphi0111.near", + 1 + ], + [ + "durga.near", + 1 + ], + [ + "duxin.near", + 1 + ], + [ + "duyhuanh.near", + 1 + ], + [ + "duytan.near", + 3 + ], + [ + "dxndaniel.near", + 1 + ], + [ + "dytackxh4.near", + 1 + ], + [ + "dz.near", + 1 + ], + [ + "dzlzv.near", + 1 + ], + [ + "e02df51342ae2b7193ac78c721ad12b1dbc684ef99be531ebf2939fa210140cd", + 5 + ], + [ + "e0x.near", + 1 + ], + [ + "e1862ef993daf5a4b7c34aaa8c8dfe018ed273b5e393e73385e5a6f0b9ca7df7", + 8 + ], + [ + "e23100a2e5a3478018364b876ceedc416162f52e6f1edd832f924276bce712e1", + 3 + ], + [ + "e5292fc55f5eee5acbb6de64b5da63b9168bec1741de0b19b88b85fe9fe92996", + 2 + ], + [ + "e597a6b44de31c79b6c15f2030e53ef701ad84efa0f2fa41b5621724132b29fd", + 7 + ], + [ + "e644521f6235ffe0943f6f00ab5081c39b9a32e22feaece47998115a3fa6a7da", + 1 + ], + [ + "e77dc00ba3ca284f3c3186a59dbffce7729e7f8f0dbba7b9bed45b2e5646b983", + 26 + ], + [ + "e7ed1672d8ffa2ba50634e619f0144c55fb44265e7ad979376efbaa8e8a55fec", + 1 + ], + [ + "e7ef040fba4e567e2543e6814387749709d6152329220111b6895f1a845d4ddc", + 3 + ], + [ + "e9bf7bbfe620284ddb7451b8aec7d40a475fd1cf5400f4fe2f2a9a883f0ba462", + 6 + ], + [ + "ea3843fde8e221f237b5cd6d269fcdca69d10b2fabd53e57bde6946dbf5548d4", + 5 + ], + [ + "eagle.near", + 1 + ], + [ + "eagle1024.near", + 2 + ], + [ + "ebc1599e57e840017d8120ba70d9762a21a0444924a29769a5b8fed2546c5dd9", + 3 + ], + [ + "eddienuta.near", + 1 + ], + [ + "ede294.near", + 2 + ], + [ + "eden.near", + 2 + ], + [ + "edgar.near", + 1 + ], + [ + "edgarvgz.near", + 2 + ], + [ + "edrush2004.near", + 1 + ], + [ + "eelco.near", + 2 + ], + [ + "ef46b5bc99d85aacc5858af3ffdb2cc9145eb9913ba3e33317cfa90288312264", + 2 + ], + [ + "ef6e3920b04ff7d203c79ea0271c4fbd3a0c00f699ba72f36b2e1cc2c8930fbe", + 1 + ], + [ + "effylou.near", + 1 + ], + [ + "egle.near", + 2 + ], + [ + "einar.near", + 2 + ], + [ + "einsteiger.near", + 1 + ], + [ + "eintracht1.near", + 6 + ], + [ + "eirjag.near", + 1 + ], + [ + "ek.near", + 5 + ], + [ + "elcapitan.near", + 3 + ], + [ + "elecnodo.near", + 1 + ], + [ + "electro.near", + 1 + ], + [ + "electroexts.near", + 1 + ], + [ + "elegant.near", + 1 + ], + [ + "elemond.near", + 2 + ], + [ + "elen.near", + 1 + ], + [ + "elena.near", + 1 + ], + [ + "elenabot.near", + 1 + ], + [ + "elenagonzalez.near", + 1 + ], + [ + "elianewells.near", + 2 + ], + [ + "ellyse11.near", + 1 + ], + [ + "ellyse12.near", + 1 + ], + [ + "elnikov.near", + 1 + ], + [ + "elorpar.near", + 2 + ], + [ + "elpav70.near", + 1 + ], + [ + "elrider71.near", + 1 + ], + [ + "elrulo.near", + 1 + ], + [ + "elvisy.near", + 1 + ], + [ + "emanueldiniz.near", + 1 + ], + [ + "embiei.near", + 1 + ], + [ + "embydextrous.near", + 2 + ], + [ + "emcs1974.near", + 1 + ], + [ + "emiel.near", + 1 + ], + [ + "emili2017.near", + 1 + ], + [ + "eminem.near", + 1 + ], + [ + "emmazhuxy.near", + 3 + ], + [ + "emptyvoid.near", + 1 + ], + [ + "emre3jw3.near", + 2 + ], + [ + "end.near", + 1 + ], + [ + "end.was.near", + 2 + ], + [ + "enguessanro.near", + 1 + ], + [ + "enzy.near", + 1 + ], + [ + "ep.near", + 1 + ], + [ + "equilibrium.near", + 1 + ], + [ + "erfan.near", + 1 + ], + [ + "erfan_isaac.near", + 1 + ], + [ + "ericyfhung.near", + 2 + ], + [ + "erik.near", + 2 + ], + [ + "ernest.near", + 2 + ], + [ + "ernesto.near", + 1 + ], + [ + "ernesto_cardenas_near.near", + 2 + ], + [ + "erwinfranken.near", + 1 + ], + [ + "esc.near", + 2 + ], + [ + "ese.near", + 2 + ], + [ + "est1908.near", + 1 + ], + [ + "eth.near", + 1 + ], + [ + "ethd.near", + 2 + ], + [ + "ethyhy.near", + 1 + ], + [ + "eti_eyen01.near", + 1 + ], + [ + "etsk.near", + 2 + ], + [ + "eugent.near", + 5 + ], + [ + "europe.near", + 1 + ], + [ + "euthepronto.near", + 1 + ], + [ + "everstake.near", + 1 + ], + [ + "everstake1.near", + 9 + ], + [ + "evg1987a.near", + 1 + ], + [ + "evgen.near", + 1 + ], + [ + "evgeny.near", + 1 + ], + [ + "evgor.near", + 1 + ], + [ + "evian.near", + 1 + ], + [ + "eviltwindc.near", + 2 + ], + [ + "evkim.near", + 2 + ], + [ + "exan.near", + 1 + ], + [ + "excalibur.near", + 1 + ], + [ + "exiart.near", + 1 + ], + [ + "ey.near", + 1 + ], + [ + "ezbruh.near", + 1 + ], + [ + "f.near", + 1 + ], + [ + "f1tz14.near", + 1 + ], + [ + "f2e7e054d0f96e01f1f90e7f2bd5a3fd55437ace0e32b67183f6f3e6eb18f2ad", + 1 + ], + [ + "f5912374fd229bd851f73250abb8839f7fee00b9f17df4915142edfa9ec819c8", + 2 + ], + [ + "fabi.near", + 1 + ], + [ + "fabiolaluna.near", + 2 + ], + [ + "facebook.near", + 2 + ], + [ + "fadiseva.near", + 1 + ], + [ + "fadyamr.near", + 2 + ], + [ + "faprinvest.near", + 2 + ], + [ + "far.near", + 1 + ], + [ + "farhod.near", + 3 + ], + [ + "faridrached.near", + 1 + ], + [ + "faruk.near", + 1 + ], + [ + "fathurohman.near", + 3 + ], + [ + "fauji25.near", + 1 + ], + [ + "fb4caef88752f052dd8a0e17ec18e2a8ba0d75db694dd5ec889de6d80908f21a", + 4 + ], + [ + "fbalwy.near", + 1 + ], + [ + "fc31f902de0ca48ef5def39c3a3d1540fc877b6197fb65c55f71fccf3350a40f", + 1 + ], + [ + "fckmyluck.near", + 2 + ], + [ + "fd04644aae2a2f84e3742269140f5bdc35c70fbed13ff3bd5642a78b0ac572e4", + 2 + ], + [ + "fdbd7d79985344fcf58d4f8a8d067549b907c85355d8d261db19b2f8e5978615", + 1 + ], + [ + "fe5ef5f84e9d40b4901fa8dc602e0acfc77b8b9cbb40508a3d379271287a8370", + 1 + ], + [ + "fedul.near", + 2 + ], + [ + "feng.near", + 1 + ], + [ + "fengkiej.near", + 5 + ], + [ + "ferhat89.near", + 1 + ], + [ + "ferlee.near", + 1 + ], + [ + "fern.near", + 2 + ], + [ + "fernando7.near", + 1 + ], + [ + "ff7247ce7fce8a6d4e615a0507bf0d0d47282fa4cd1dbf1ba5c4aa2e34f4ebca", + 1 + ], + [ + "ff8rinoaff8.near", + 2 + ], + [ + "fifi.near", + 1 + ], + [ + "filipe.near", + 1 + ], + [ + "fill.near", + 2 + ], + [ + "filtom.near", + 1 + ], + [ + "finance.near", + 1 + ], + [ + "finchen.near", + 1 + ], + [ + "finhumb.near", + 1 + ], + [ + "firefist.near", + 1 + ], + [ + "first.near", + 1 + ], + [ + "firstmajor.near", + 1 + ], + [ + "fjbase21.near", + 1 + ], + [ + "fjythomas.near", + 2 + ], + [ + "flashboys.near", + 2 + ], + [ + "flatron7.near", + 1 + ], + [ + "flavian.near", + 1 + ], + [ + "flo.near", + 3 + ], + [ + "florian.near", + 1 + ], + [ + "florinda_gomes.near", + 1 + ], + [ + "fluslie.near", + 1 + ], + [ + "fluxper.near", + 1 + ], + [ + "flyinglooper.near", + 1 + ], + [ + "fmiah.near", + 2 + ], + [ + "fog.near", + 1 + ], + [ + "fokusnik.near", + 1 + ], + [ + "fomo.near", + 1 + ], + [ + "foobar.near", + 2 + ], + [ + "fooc.near", + 1 + ], + [ + "forest.near", + 1 + ], + [ + "foundation.near", + 1 + ], + [ + "foxtraveller.near", + 1 + ], + [ + "fracto.near", + 1 + ], + [ + "francisagui.near", + 1 + ], + [ + "francisobasi.near", + 2 + ], + [ + "franco.near", + 2 + ], + [ + "francodiaz777.near", + 2 + ], + [ + "frani.near", + 2 + ], + [ + "frank.near", + 2 + ], + [ + "frankwhite.near", + 1 + ], + [ + "franky.near", + 1 + ], + [ + "franrodriguez.near", + 1 + ], + [ + "franyjosemaria.near", + 1 + ], + [ + "franziskus.near", + 1 + ], + [ + "fred.near", + 2 + ], + [ + "fred2.near", + 2 + ], + [ + "fredtupas.near", + 4 + ], + [ + "free.near", + 3 + ], + [ + "freemangoo.near", + 3 + ], + [ + "freestriker00.near", + 1 + ], + [ + "frog.near", + 1 + ], + [ + "fruitdealer.near", + 1 + ], + [ + "fruitjuice.near", + 1 + ], + [ + "frytos.near", + 1 + ], + [ + "fsv.near", + 1 + ], + [ + "ftor.near", + 2 + ], + [ + "fuck.near", + 1 + ], + [ + "fulushou7111.near", + 1 + ], + [ + "fundamentallabs.near", + 1 + ], + [ + "funktified.near", + 1 + ], + [ + "fusan.near", + 2 + ], + [ + "future.near", + 3 + ], + [ + "futureis.near", + 1 + ], + [ + "g30ff1rl.near", + 1 + ], + [ + "gabriel.near", + 1 + ], + [ + "gabriel85.near", + 2 + ], + [ + "gagdiez.near", + 1 + ], + [ + "galant.near", + 1 + ], + [ + "games.near", + 1 + ], + [ + "gamesdarker.near", + 1 + ], + [ + "gaming.near", + 1 + ], + [ + "gardel.near", + 2 + ], + [ + "gary.near", + 2 + ], + [ + "garyhagu.near", + 1 + ], + [ + "gaston.near", + 1 + ], + [ + "gate.near", + 1 + ], + [ + "gay.near", + 1 + ], + [ + "gazelle.near", + 1 + ], + [ + "gbali.near", + 1 + ], + [ + "ge9123.near", + 4 + ], + [ + "gelfw12.near", + 2 + ], + [ + "gem.near", + 1 + ], + [ + "gemini.near", + 1 + ], + [ + "gen9.near", + 1 + ], + [ + "genericname.near", + 1 + ], + [ + "genesis.near", + 1 + ], + [ + "genie.near", + 3 + ], + [ + "genius.near", + 1 + ], + [ + "geo.near", + 2 + ], + [ + "george.near", + 1 + ], + [ + "geovanus.near", + 1 + ], + [ + "gerard.near", + 1 + ], + [ + "gewgwe.near", + 1 + ], + [ + "gfflo.near", + 2 + ], + [ + "ggal.near", + 2 + ], + [ + "ggg.near", + 2 + ], + [ + "ghedley.near", + 1 + ], + [ + "giallorossi_10.near", + 1 + ], + [ + "giandmn.near", + 3 + ], + [ + "gibby.near", + 1 + ], + [ + "gidroplan.near", + 1 + ], + [ + "ginzy.near", + 1 + ], + [ + "gio3gio.near", + 1 + ], + [ + "girazoki.near", + 3 + ], + [ + "gktnr0418.near", + 1 + ], + [ + "glad.near", + 1 + ], + [ + "gleb.near", + 1 + ], + [ + "glenn.near", + 1 + ], + [ + "global1.near", + 1 + ], + [ + "gmaverickv.near", + 1 + ], + [ + "gmck.near", + 1 + ], + [ + "goatmine.near", + 1 + ], + [ + "gocrypto.near", + 1 + ], + [ + "goctienao.near", + 1 + ], + [ + "godisgreat.near", + 1 + ], + [ + "godwitt28.near", + 1 + ], + [ + "goli.near", + 1 + ], + [ + "gonchiferradas.near", + 1 + ], + [ + "gonefishing.near", + 2 + ], + [ + "goodwin.near", + 1 + ], + [ + "google.near", + 1 + ], + [ + "goraset.near", + 1 + ], + [ + "goraya.near", + 2 + ], + [ + "gorazd.near", + 2 + ], + [ + "gordonleesmith.near", + 1 + ], + [ + "gorochi.near", + 2 + ], + [ + "gps.near", + 1 + ], + [ + "gramatikov.near", + 1 + ], + [ + "gravelpit.near", + 1 + ], + [ + "great.near", + 1 + ], + [ + "greedywhale.near", + 1 + ], + [ + "greg.near", + 1 + ], + [ + "greg99.near", + 1 + ], + [ + "grehei.near", + 1 + ], + [ + "grek.near", + 1 + ], + [ + "grek_vlg.near", + 1 + ], + [ + "greso.near", + 1 + ], + [ + "gresya.near", + 1 + ], + [ + "grifflet.near", + 1 + ], + [ + "grr.near", + 1 + ], + [ + "guantanamoboy.near", + 1 + ], + [ + "gudu169.near", + 1 + ], + [ + "guillesker.near", + 2 + ], + [ + "gun.near", + 2 + ], + [ + "gurugraptor.near", + 1 + ], + [ + "gustav.near", + 1 + ], + [ + "gustavo.near", + 1 + ], + [ + "gwak.near", + 1 + ], + [ + "gwogwosachi.near", + 1 + ], + [ + "gxlitian.near", + 3 + ], + [ + "h1tthat.near", + 1 + ], + [ + "h4xxl.near", + 1 + ], + [ + "hahaha.near", + 1 + ], + [ + "haihv96.near", + 2 + ], + [ + "haiptmkt.near", + 2 + ], + [ + "hakathon13.near", + 1 + ], + [ + "halar_1099_kimchi.near", + 1 + ], + [ + "hamper.near", + 1 + ], + [ + "hamzanet01.near", + 1 + ], + [ + "hannahui.near", + 1 + ], + [ + "hansu4t.near", + 1 + ], + [ + "hansu4t2.near", + 1 + ], + [ + "hansvl.near", + 5 + ], + [ + "hantaejae.near", + 2 + ], + [ + "hao.near", + 1 + ], + [ + "hardy008.near", + 1 + ], + [ + "haroldbaks77.near", + 1 + ], + [ + "harris.near", + 1 + ], + [ + "haru.near", + 1 + ], + [ + "hash.near", + 1 + ], + [ + "hashboy.near", + 1 + ], + [ + "hashpark.near", + 1 + ], + [ + "hatatoshi.near", + 1 + ], + [ + "hatred09.near", + 1 + ], + [ + "hatropine7.near", + 2 + ], + [ + "haustein.near", + 1 + ], + [ + "hauteclairestassin.near", + 1 + ], + [ + "haydon.near", + 1 + ], + [ + "hb33.near", + 2 + ], + [ + "hcsyyk.near", + 2 + ], + [ + "hdt33.near", + 1 + ], + [ + "he.near", + 1 + ], + [ + "he090279kap.near", + 1 + ], + [ + "he4usa.near", + 1 + ], + [ + "health.near", + 2 + ], + [ + "heartchan.near", + 1 + ], + [ + "hector.near", + 1 + ], + [ + "heinrichschw.near", + 1 + ], + [ + "heisenberg39.near", + 1 + ], + [ + "hejunqiu.near", + 1 + ], + [ + "helen.near", + 1 + ], + [ + "hello.near", + 1 + ], + [ + "helloworld.near", + 1 + ], + [ + "help_is.near", + 1 + ], + [ + "hendrikvveen.near", + 2 + ], + [ + "hennyc.near", + 1 + ], + [ + "henrywang7.near", + 22 + ], + [ + "heraclitus.near", + 1 + ], + [ + "herberthenghan.near", + 2 + ], + [ + "heretikkk.near", + 1 + ], + [ + "hermann.near", + 1 + ], + [ + "hewig.near", + 1 + ], + [ + "hhmeen.near", + 2 + ], + [ + "hhomsi.near", + 1 + ], + [ + "hi.near", + 1 + ], + [ + "hideekin.near", + 2 + ], + [ + "hidesun22.near", + 2 + ], + [ + "hiimyims5111.near", + 2 + ], + [ + "hippaz.near", + 2 + ], + [ + "hirajyoti.near", + 2 + ], + [ + "hirama.near", + 1 + ], + [ + "hiro0911.near", + 1 + ], + [ + "hiroki.near", + 2 + ], + [ + "hisham.near", + 2 + ], + [ + "hitthebricks.near", + 1 + ], + [ + "hl.near", + 1 + ], + [ + "hlongalee.near", + 1 + ], + [ + "hnx.near", + 1 + ], + [ + "hobbit.near", + 1 + ], + [ + "hodarrenkm.near", + 2 + ], + [ + "hodl.near", + 2 + ], + [ + "hodlov.near", + 1 + ], + [ + "hodlsworth.near", + 1 + ], + [ + "holleroi.near", + 1 + ], + [ + "home.near", + 1 + ], + [ + "homejumper.near", + 2 + ], + [ + "hongchang.near", + 1 + ], + [ + "hor.near", + 4 + ], + [ + "hotarrowin.near", + 1 + ], + [ + "hrasta.near", + 1 + ], + [ + "hrock.near", + 4 + ], + [ + "hryshko_denys.near", + 3 + ], + [ + "hua.near", + 1 + ], + [ + "huajuan.near", + 1 + ], + [ + "huckour.near", + 2 + ], + [ + "huehner.near", + 1 + ], + [ + "huenkaileung.near", + 1 + ], + [ + "hughhill.near", + 1 + ], + [ + "hugomartinezrosa.near", + 1 + ], + [ + "hulahuub.near", + 2 + ], + [ + "hulk.near", + 1 + ], + [ + "huluwa.near", + 2 + ], + [ + "humaid475.near", + 2 + ], + [ + "human.near", + 2 + ], + [ + "hungaus811.near", + 1 + ], + [ + "hunnxolo.near", + 1 + ], + [ + "huuhoang4984.near", + 3 + ], + [ + "hyper_doge.near", + 1 + ], + [ + "hyugbin.near", + 1 + ], + [ + "ia.near", + 2 + ], + [ + "ia2jbk3fix7ttxiungh2het2mmxlmkj8.near", + 2 + ], + [ + "iadibr.near", + 6 + ], + [ + "iaecoin.near", + 1 + ], + [ + "ialtaf-choudhry.near", + 1 + ], + [ + "iamluieey.near", + 2 + ], + [ + "ian.near", + 2 + ], + [ + "ianabell.near", + 2 + ], + [ + "ianbonavente.near", + 2 + ], + [ + "iandillon.near", + 1 + ], + [ + "iasonas2019.near", + 1 + ], + [ + "ibardak.near", + 1 + ], + [ + "ibingbing.near", + 1 + ], + [ + "ibm.near", + 1 + ], + [ + "iborion.near", + 1 + ], + [ + "ican3701.near", + 4 + ], + [ + "ichongge.near", + 1 + ], + [ + "icodrops.near", + 1 + ], + [ + "icohiinvestbot.near", + 2 + ], + [ + "icon470.near", + 1 + ], + [ + "icovassabi.near", + 2 + ], + [ + "idnl.near", + 1 + ], + [ + "ig27.near", + 1 + ], + [ + "ig6duv66.near", + 1 + ], + [ + "ignacio1.near", + 2 + ], + [ + "ignacio2.near", + 2 + ], + [ + "igor.near", + 1 + ], + [ + "igor76.near", + 1 + ], + [ + "igorbobritckii.near", + 1 + ], + [ + "igorbunkov.near", + 1 + ], + [ + "igoreshka888.near", + 1 + ], + [ + "ihorhorb.near", + 2 + ], + [ + "iissii97.near", + 1 + ], + [ + "ijulia.near", + 1 + ], + [ + "ikbremen-1073.near", + 2 + ], + [ + "ikqsang.near", + 1 + ], + [ + "ilanedils.near", + 1 + ], + [ + "ilde.near", + 1 + ], + [ + "iliabitfinex.near", + 1 + ], + [ + "ilina.near", + 1 + ], + [ + "illia_k.near", + 1 + ], + [ + "illuminati.near", + 1 + ], + [ + "ilya.near", + 2 + ], + [ + "ilya123.near", + 2 + ], + [ + "ilya4756.near", + 2 + ], + [ + "imanel.near", + 2 + ], + [ + "imker.near", + 1 + ], + [ + "immoait.near", + 2 + ], + [ + "impe83.near", + 1 + ], + [ + "imrano.near", + 1 + ], + [ + "imyourfather.near", + 2 + ], + [ + "india.near", + 1 + ], + [ + "inferno.near", + 1 + ], + [ + "ini333.near", + 2 + ], + [ + "inna.near", + 1 + ], + [ + "inotel.near", + 1 + ], + [ + "insidenima.near", + 1 + ], + [ + "insider.near", + 1 + ], + [ + "inst.near", + 1 + ], + [ + "introbits.near", + 2 + ], + [ + "invest.near", + 1 + ], + [ + "invest115.near", + 1 + ], + [ + "investiq.near", + 1 + ], + [ + "invictus.near", + 1 + ], + [ + "ipanda.near", + 1 + ], + [ + "iren20113.near", + 1 + ], + [ + "irishstevemc.near", + 1 + ], + [ + "irobot.near", + 1 + ], + [ + "ironbear.near", + 1 + ], + [ + "is.near", + 3 + ], + [ + "iskerl.near", + 1 + ], + [ + "itachi7368.near", + 2 + ], + [ + "iterrible.near", + 1 + ], + [ + "ituniversum.near", + 1 + ], + [ + "ivan.near", + 1 + ], + [ + "ivanfurta.near", + 1 + ], + [ + "ivanl.near", + 1 + ], + [ + "ivanortiz96.near", + 2 + ], + [ + "ivanytt.near", + 2 + ], + [ + "ivbeb777.near", + 1 + ], + [ + "ivs19.near", + 1 + ], + [ + "iwan.near", + 1 + ], + [ + "ix3m.near", + 1 + ], + [ + "izixhidi.near", + 1 + ], + [ + "izztalbraqi.near", + 3 + ], + [ + "j.near", + 4 + ], + [ + "j03rg1.near", + 1 + ], + [ + "jack933.near", + 2 + ], + [ + "jackie.near", + 1 + ], + [ + "jacklin.near", + 1 + ], + [ + "jackma.near", + 1 + ], + [ + "jackrose0503.near", + 1 + ], + [ + "jackyu.near", + 2 + ], + [ + "jacobcheng.near", + 1 + ], + [ + "jaegu01.near", + 2 + ], + [ + "jaga.near", + 1 + ], + [ + "jaggz1066.near", + 1 + ], + [ + "jahandadkhan.near", + 1 + ], + [ + "jaihanuman.near", + 1 + ], + [ + "jake.near", + 1 + ], + [ + "jakes2020.near", + 2 + ], + [ + "jamadi5039.near", + 1 + ], + [ + "jamkira.near", + 1 + ], + [ + "jan.near", + 1 + ], + [ + "janoltvoort.near", + 1 + ], + [ + "jantapw.near", + 1 + ], + [ + "japan.near", + 1 + ], + [ + "jarekpiotrowski.near", + 1 + ], + [ + "jash.near", + 2 + ], + [ + "jason.near", + 1 + ], + [ + "jason300000.near", + 1 + ], + [ + "javabdalex.near", + 1 + ], + [ + "javiveloso1.near", + 2 + ], + [ + "jay.near", + 1 + ], + [ + "jaycrypto.near", + 3 + ], + [ + "jayjay888.near", + 1 + ], + [ + "jayyoo.near", + 2 + ], + [ + "jazael90.near", + 2 + ], + [ + "jazza09.near", + 1 + ], + [ + "jc.near", + 1 + ], + [ + "jcj.near", + 2 + ], + [ + "jcmi.near", + 1 + ], + [ + "jeanmart.near", + 1 + ], + [ + "jeedocrypto.near", + 2 + ], + [ + "jeedocrypto2.near", + 2 + ], + [ + "jeez07z.near", + 1 + ], + [ + "jeff0052.near", + 1 + ], + [ + "jegib.near", + 1 + ], + [ + "jehanchu.near", + 1 + ], + [ + "jele7ka.near", + 1 + ], + [ + "jelvin8.near", + 1 + ], + [ + "jen.near", + 7 + ], + [ + "jepped.near", + 1 + ], + [ + "jerrymoon.near", + 1 + ], + [ + "jerrys.near", + 1 + ], + [ + "jeschis.near", + 1 + ], + [ + "jessica.near", + 1 + ], + [ + "jestin.near", + 1 + ], + [ + "jgsp.near", + 1 + ], + [ + "jhuebner1.near", + 1 + ], + [ + "jiang.near", + 1 + ], + [ + "jiangbingquan.near", + 1 + ], + [ + "jianshu.near", + 1 + ], + [ + "jiayaoqi.near", + 1 + ], + [ + "jik_k.near", + 1 + ], + [ + "jikthapat.near", + 1 + ], + [ + "jim.near", + 1 + ], + [ + "jimbo.near", + 1 + ], + [ + "jimmyrhino20.near", + 1 + ], + [ + "jimvdberg24.near", + 3 + ], + [ + "jimy1111.near", + 1 + ], + [ + "jin.near", + 2 + ], + [ + "jinshawn.near", + 1 + ], + [ + "jinxuan.near", + 1 + ], + [ + "jiru.near", + 4 + ], + [ + "jisol8122.near", + 1 + ], + [ + "jjp.near", + 1 + ], + [ + "jk1151.near", + 1 + ], + [ + "jkimmich.near", + 1 + ], + [ + "jkprag78.near", + 2 + ], + [ + "jleang.near", + 2 + ], + [ + "jmdoyle.near", + 1 + ], + [ + "jmunb.near", + 2 + ], + [ + "jnear.near", + 1 + ], + [ + "jocellin.near", + 2 + ], + [ + "joel.near", + 1 + ], + [ + "joeljonas9597.near", + 2 + ], + [ + "joelwee.near", + 2 + ], + [ + "joelyd19.near", + 1 + ], + [ + "joemoms.near", + 1 + ], + [ + "johannesst.near", + 2 + ], + [ + "john.near", + 1 + ], + [ + "johncalvin46.near", + 1 + ], + [ + "johnh.near", + 1 + ], + [ + "johnhoffmann.near", + 2 + ], + [ + "johnny.near", + 2 + ], + [ + "johnryan.near", + 1 + ], + [ + "johnt80.near", + 2 + ], + [ + "jojorge26.near", + 2 + ], + [ + "jollymetalbastard.near", + 2 + ], + [ + "jollymetaltrader.near", + 1 + ], + [ + "jonathan.near", + 1 + ], + [ + "jonathan6620.near", + 2 + ], + [ + "jongkwang.near", + 1 + ], + [ + "jonju.near", + 2 + ], + [ + "joonian.near", + 2 + ], + [ + "jop.near", + 1 + ], + [ + "jordaai.near", + 2 + ], + [ + "jordyfiene.near", + 2 + ], + [ + "jorgellfagundes.near", + 1 + ], + [ + "joryivanoff.near", + 1 + ], + [ + "josebawakeboarder.near", + 8 + ], + [ + "josef.near", + 1 + ], + [ + "josemanuel2.near", + 1 + ], + [ + "josh.near", + 2 + ], + [ + "josh5.near", + 1 + ], + [ + "josh6.near", + 2 + ], + [ + "joshua.near", + 2 + ], + [ + "jpbytez.near", + 1 + ], + [ + "js974lin.near", + 1 + ], + [ + "jsc2.near", + 1 + ], + [ + "jsc3.near", + 1 + ], + [ + "jsc4.near", + 2 + ], + [ + "jsc5.near", + 1 + ], + [ + "jsc6.near", + 1 + ], + [ + "jsc7.near", + 1 + ], + [ + "jsc8.near", + 3 + ], + [ + "jt77.near", + 1 + ], + [ + "jubi.near", + 1 + ], + [ + "juergen311.near", + 3 + ], + [ + "julia.near", + 1 + ], + [ + "jumidamo.near", + 1 + ], + [ + "jun.near", + 3 + ], + [ + "juncuirina.near", + 2 + ], + [ + "junhyub11.near", + 1 + ], + [ + "jurij.near", + 2 + ], + [ + "jurquidiz.near", + 1 + ], + [ + "justcrucial.near", + 1 + ], + [ + "justin.near", + 2 + ], + [ + "jwallet1.near", + 1 + ], + [ + "jwbcdz.near", + 2 + ], + [ + "jy.near", + 2 + ], + [ + "k.near", + 1 + ], + [ + "k111sg.near", + 1 + ], + [ + "k5zr8d.near", + 1 + ], + [ + "kaan.near", + 2 + ], + [ + "kai.near", + 1 + ], + [ + "kairypto.near", + 1 + ], + [ + "kaiserreich.near", + 1 + ], + [ + "kaiyuan.near", + 1 + ], + [ + "kake.near", + 1 + ], + [ + "kalimbamba.near", + 1 + ], + [ + "kalockwo.near", + 1 + ], + [ + "kalom.near", + 2 + ], + [ + "kalyani.near", + 1 + ], + [ + "kamil7890.near", + 3 + ], + [ + "kammon.near", + 1 + ], + [ + "kamui02.near", + 2 + ], + [ + "kaneluo.near", + 1 + ], + [ + "kanemori.near", + 1 + ], + [ + "kanskey.near", + 2 + ], + [ + "kao.near", + 2 + ], + [ + "kar.near", + 1 + ], + [ + "karimfa.near", + 1 + ], + [ + "karimhassaneid.near", + 2 + ], + [ + "karl.near", + 1 + ], + [ + "karthik.near", + 1 + ], + [ + "karthvader.near", + 1 + ], + [ + "katman.near", + 1 + ], + [ + "kato.near", + 2 + ], + [ + "katrin.near", + 1 + ], + [ + "kazadar.near", + 1 + ], + [ + "kazantip.near", + 2 + ], + [ + "kazbek.near", + 1 + ], + [ + "kb1224.near", + 1 + ], + [ + "kcupac.near", + 2 + ], + [ + "kdimarik89.near", + 1 + ], + [ + "keatsol.near", + 1 + ], + [ + "keith.near", + 1 + ], + [ + "kek.near", + 1 + ], + [ + "kellybelly.near", + 1 + ], + [ + "kelvin.near", + 1 + ], + [ + "kelvinngzh.near", + 1 + ], + [ + "kemo.near", + 2 + ], + [ + "kemola.near", + 1 + ], + [ + "kemosabe.near", + 1 + ], + [ + "kendall.near", + 1 + ], + [ + "kenichi.near", + 1 + ], + [ + "kenny2020.near", + 1 + ], + [ + "kennzonki.near", + 1 + ], + [ + "kentoshi.near", + 1 + ], + [ + "kenttran.near", + 1 + ], + [ + "kevinburkhard.near", + 1 + ], + [ + "khaikhai1960.near", + 1 + ], + [ + "khalisy.near", + 2 + ], + [ + "khidir.near", + 1 + ], + [ + "khn.near", + 1 + ], + [ + "khorolets.near", + 1 + ], + [ + "khoruzhyi.near", + 1 + ], + [ + "khunchan.near", + 1 + ], + [ + "kiberg.near", + 1 + ], + [ + "kickbuttowski.near", + 2 + ], + [ + "kiddunstopped.near", + 1 + ], + [ + "killua.near", + 1 + ], + [ + "kimon.near", + 1 + ], + [ + "kinggogh.near", + 3 + ], + [ + "kingstatoshi.near", + 2 + ], + [ + "kiran.near", + 2 + ], + [ + "kircovich.near", + 1 + ], + [ + "kircovich2.near", + 2 + ], + [ + "kirill_ri.near", + 2 + ], + [ + "kishan748.near", + 2 + ], + [ + "kitty.near", + 1 + ], + [ + "kivo2004.near", + 2 + ], + [ + "kiwi092020.near", + 1 + ], + [ + "kjellnearwallet.near", + 1 + ], + [ + "kkund.near", + 1 + ], + [ + "klaustin.near", + 1 + ], + [ + "knyazev7aa.near", + 1 + ], + [ + "kobarisun.near", + 1 + ], + [ + "koenig.near", + 1 + ], + [ + "kokkieroy.near", + 1 + ], + [ + "koledg129g.near", + 2 + ], + [ + "komido815.near", + 1 + ], + [ + "kon.near", + 2 + ], + [ + "kondor.near", + 2 + ], + [ + "konsulat.near", + 2 + ], + [ + "koolkamzzy.near", + 1 + ], + [ + "korkius.near", + 1 + ], + [ + "koszula.near", + 1 + ], + [ + "kps289.near", + 1 + ], + [ + "kramerrold.near", + 1 + ], + [ + "kraze.near", + 1 + ], + [ + "krendelyok.near", + 1 + ], + [ + "kriptofinance.near", + 1 + ], + [ + "kris25.near", + 1 + ], + [ + "kriso444.near", + 2 + ], + [ + "krisszet.near", + 1 + ], + [ + "kristaps.near", + 1 + ], + [ + "kristapsd.near", + 1 + ], + [ + "kritsdapat.near", + 1 + ], + [ + "krobi.near", + 2 + ], + [ + "krol.near", + 2 + ], + [ + "kruggok.near", + 1 + ], + [ + "krypto_jan.near", + 1 + ], + [ + "krypto_jan2.near", + 1 + ], + [ + "ks.near", + 2 + ], + [ + "ksg79.near", + 1 + ], + [ + "kucoin.near", + 1 + ], + [ + "kuka.near", + 1 + ], + [ + "kukulabanze.near", + 1 + ], + [ + "kumosoukai.near", + 1 + ], + [ + "kuroko1949.near", + 1 + ], + [ + "kusola.near", + 1 + ], + [ + "kusols.near", + 1 + ], + [ + "kybik.near", + 1 + ], + [ + "kytzu.near", + 1 + ], + [ + "l3po.near", + 2 + ], + [ + "l7p4qbzj3z.near", + 1 + ], + [ + "lakond.near", + 1 + ], + [ + "lalo2.near", + 1 + ], + [ + "lamandderi.near", + 1 + ], + [ + "lamer.near", + 2 + ], + [ + "lanax.near", + 2 + ], + [ + "lance009.near", + 1 + ], + [ + "lancelot.near", + 2 + ], + [ + "land.near", + 1 + ], + [ + "landa1993.near", + 2 + ], + [ + "lara.near", + 1 + ], + [ + "larch.near", + 1 + ], + [ + "late.near", + 1 + ], + [ + "lauranuta.near", + 1 + ], + [ + "laurent.near", + 1 + ], + [ + "laurentmaillard.near", + 1 + ], + [ + "law.near", + 2 + ], + [ + "lazyhjq.near", + 2 + ], + [ + "lazza_l0ma.near", + 1 + ], + [ + "lbilskicrypto.near", + 1 + ], + [ + "ldn.near", + 1 + ], + [ + "ldn91ptit.near", + 4 + ], + [ + "ledat1612.near", + 1 + ], + [ + "ledger.near", + 1 + ], + [ + "legiojuve.near", + 1 + ], + [ + "lehadobriy.near", + 1 + ], + [ + "lehung.near", + 3 + ], + [ + "lei.near", + 2 + ], + [ + "leifythebeastie.near", + 1 + ], + [ + "lelouch888.near", + 1 + ], + [ + "lenall51.near", + 1 + ], + [ + "lenara.near", + 1 + ], + [ + "lennieyoo.near", + 2 + ], + [ + "lenny00001.near", + 3 + ], + [ + "lentv.near", + 2 + ], + [ + "leo.near", + 1 + ], + [ + "leong.near", + 1 + ], + [ + "leonidtmn.near", + 1 + ], + [ + "leonie.near", + 8 + ], + [ + "leonlauaus.near", + 1 + ], + [ + "leoyishaun.near", + 1 + ], + [ + "lesterrawks123.near", + 1 + ], + [ + "letitia.near", + 1 + ], + [ + "levanquan297.near", + 2 + ], + [ + "levin.near", + 1 + ], + [ + "lewinsuker.near", + 1 + ], + [ + "lewismelland.near", + 2 + ], + [ + "lewyatan.near", + 1 + ], + [ + "lex.near", + 1 + ], + [ + "lex20150720.near", + 2 + ], + [ + "lexlex.near", + 1 + ], + [ + "li.near", + 2 + ], + [ + "libby08.near", + 1 + ], + [ + "life.near", + 1 + ], + [ + "lightzealot.near", + 1 + ], + [ + "likewhite.near", + 2 + ], + [ + "liliherciu.near", + 3 + ], + [ + "lilin_888.near", + 1 + ], + [ + "lin.near", + 1 + ], + [ + "line.near", + 2 + ], + [ + "lingxxx.near", + 1 + ], + [ + "linhphieu.near", + 1 + ], + [ + "linkdrop.near", + 1 + ], + [ + "linusx58.near", + 1 + ], + [ + "lissargentina.near", + 1 + ], + [ + "lito.near", + 1 + ], + [ + "liu120626.near", + 1 + ], + [ + "liu890610.near", + 1 + ], + [ + "liver.near", + 1 + ], + [ + "lixoy.near", + 1 + ], + [ + "lj.near", + 1 + ], + [ + "lkk.near", + 1 + ], + [ + "lntranet.near", + 1 + ], + [ + "lobster_xie.near", + 1 + ], + [ + "locked.near", + 1 + ], + [ + "lockup.near", + 6 + ], + [ + "logic.near", + 2 + ], + [ + "loni.near", + 1 + ], + [ + "loomist.near", + 1 + ], + [ + "loperk.near", + 3 + ], + [ + "lordshillings.near", + 1 + ], + [ + "loris.near", + 1 + ], + [ + "lou135222.near", + 1 + ], + [ + "louanojax.near", + 1 + ], + [ + "louisnguyen.near", + 2 + ], + [ + "love.near", + 1 + ], + [ + "lovemansh84.near", + 1 + ], + [ + "lp.near", + 2 + ], + [ + "lpthanh.near", + 1 + ], + [ + "lrubiorod.near", + 1 + ], + [ + "lt1412.near", + 1 + ], + [ + "lu666.near", + 1 + ], + [ + "luana.near", + 1 + ], + [ + "luca.near", + 1 + ], + [ + "lucas.near", + 2 + ], + [ + "lucho1963.near", + 1 + ], + [ + "lucjah.near", + 1 + ], + [ + "luck.near", + 1 + ], + [ + "luedu2020.near", + 2 + ], + [ + "luffy.near", + 1 + ], + [ + "luhar.near", + 1 + ], + [ + "luisaoxd20.near", + 2 + ], + [ + "luisvillarreal.near", + 1 + ], + [ + "lukasso.near", + 1 + ], + [ + "lukasso2.near", + 1 + ], + [ + "lukecaan.near", + 1 + ], + [ + "lumpi-1714wpx.near", + 1 + ], + [ + "luna.near", + 1 + ], + [ + "luongbdhust.near", + 11 + ], + [ + "luuvu.near", + 1 + ], + [ + "lxbach.near", + 2 + ], + [ + "lyonkwek.near", + 1 + ], + [ + "lyybtc.near", + 2 + ], + [ + "m.near", + 2 + ], + [ + "m17.near", + 2 + ], + [ + "m2dream.near", + 1 + ], + [ + "m3.near", + 1 + ], + [ + "ma.near", + 1 + ], + [ + "maagueror.near", + 2 + ], + [ + "maanimo.near", + 2 + ], + [ + "macanga.near", + 2 + ], + [ + "machina.near", + 1 + ], + [ + "machoman.near", + 1 + ], + [ + "mackalicious.near", + 2 + ], + [ + "madbustazz.near", + 1 + ], + [ + "madcapslaugh.near", + 2 + ], + [ + "madgasm.near", + 1 + ], + [ + "madison.near", + 2 + ], + [ + "madvillain.near", + 1 + ], + [ + "madxista.near", + 1 + ], + [ + "magadan.near", + 1 + ], + [ + "maghrebcrypto.near", + 2 + ], + [ + "magic1go.near", + 1 + ], + [ + "magmza.near", + 2 + ], + [ + "magnetic.near", + 1 + ], + [ + "maher.near", + 1 + ], + [ + "mahmuttahaolcucu.near", + 2 + ], + [ + "maibei.near", + 2 + ], + [ + "majal.near", + 2 + ], + [ + "majest3.near", + 2 + ], + [ + "major.near", + 1 + ], + [ + "majosk.near", + 1 + ], + [ + "make023.near", + 1 + ], + [ + "makhova.near", + 1 + ], + [ + "makindea.near", + 1 + ], + [ + "malik.near", + 1 + ], + [ + "malykhin.near", + 2 + ], + [ + "man.near", + 1 + ], + [ + "manatwork.near", + 2 + ], + [ + "manfred90.near", + 2 + ], + [ + "manginobi.near", + 2 + ], + [ + "maninder.near", + 2 + ], + [ + "manish.near", + 1 + ], + [ + "manju.near", + 1 + ], + [ + "manos.near", + 1 + ], + [ + "manovitskiy-andrey.near", + 1 + ], + [ + "mansley.near", + 7 + ], + [ + "mantradao.near", + 1 + ], + [ + "maotai.near", + 1 + ], + [ + "maratxo.near", + 2 + ], + [ + "marcel1111.near", + 3 + ], + [ + "marcelo.near", + 1 + ], + [ + "margask.near", + 1 + ], + [ + "marianmelinte.near", + 1 + ], + [ + "mariano11.near", + 1 + ], + [ + "mariia33.near", + 2 + ], + [ + "mario.near", + 2 + ], + [ + "mario66.near", + 1 + ], + [ + "marionclaire.near", + 1 + ], + [ + "maritn.near", + 1 + ], + [ + "mark.near", + 1 + ], + [ + "markgenuine.near", + 2 + ], + [ + "marko.near", + 1 + ], + [ + "markwenink.near", + 1 + ], + [ + "markyllanos.near", + 13 + ], + [ + "marley.near", + 1 + ], + [ + "marrescia.near", + 2 + ], + [ + "mars.near", + 1 + ], + [ + "marshx136.near", + 1 + ], + [ + "martian.near", + 1 + ], + [ + "martiescribano.near", + 1 + ], + [ + "martin.near", + 2 + ], + [ + "martin_burgherr.near", + 1 + ], + [ + "martinescribano.near", + 1 + ], + [ + "maruman.near", + 1 + ], + [ + "matejtomazin.near", + 1 + ], + [ + "math.near", + 1 + ], + [ + "mathewvarghese2001.near", + 2 + ], + [ + "mathiaskuehl.near", + 1 + ], + [ + "mathtest.near", + 1 + ], + [ + "mathwallet.near", + 1 + ], + [ + "mathwallet1.near", + 1 + ], + [ + "matrainier.near", + 1 + ], + [ + "mats478.near", + 2 + ], + [ + "matsumoto.near", + 1 + ], + [ + "matt1.near", + 6 + ], + [ + "matt7.near", + 3 + ], + [ + "mattjbailey.near", + 1 + ], + [ + "mattmcl.near", + 1 + ], + [ + "mattmcl1.near", + 1 + ], + [ + "mattrobo3.near", + 1 + ], + [ + "matveynearwallet11.near", + 1 + ], + [ + "matyan5921.near", + 1 + ], + [ + "mav_rick.near", + 1 + ], + [ + "max2017.near", + 1 + ], + [ + "max250777.near", + 1 + ], + [ + "maxfil.near", + 1 + ], + [ + "maxgwei.near", + 2 + ], + [ + "maxib0r.near", + 2 + ], + [ + "maxim.near", + 3 + ], + [ + "maximise.near", + 1 + ], + [ + "maximkhoroshev.near", + 1 + ], + [ + "maximoff.near", + 1 + ], + [ + "maxjirawat.near", + 2 + ], + [ + "maxlev.near", + 9 + ], + [ + "maxyok.near", + 1 + ], + [ + "mazzystar.near", + 3 + ], + [ + "mbarbosa.near", + 2 + ], + [ + "mbtrilla.near", + 1 + ], + [ + "mcb.near", + 2 + ], + [ + "mcb2001.near", + 4 + ], + [ + "mcdcrypt.near", + 1 + ], + [ + "mchristiansen.near", + 1 + ], + [ + "mdzor.near", + 2 + ], + [ + "meadowlane1862.near", + 1 + ], + [ + "meatjuice.near", + 1 + ], + [ + "mecogrouppsy.near", + 1 + ], + [ + "medlucky.near", + 1 + ], + [ + "megacel.near", + 1 + ], + [ + "megachan.near", + 2 + ], + [ + "megagangsta.near", + 1 + ], + [ + "megapapka.near", + 1 + ], + [ + "mehdi.near", + 2 + ], + [ + "meike-9.near", + 1 + ], + [ + "meilin.near", + 1 + ], + [ + "mel_smog.near", + 2 + ], + [ + "meli13.near", + 1 + ], + [ + "mellandlewis.near", + 1 + ], + [ + "melu.near", + 1 + ], + [ + "melvin.near", + 2 + ], + [ + "meomeo.near", + 1 + ], + [ + "mercadobursatil2020.near", + 1 + ], + [ + "merkletree.near", + 1 + ], + [ + "messidou.near", + 2 + ], + [ + "metoo.near", + 1 + ], + [ + "mexite.near", + 1 + ], + [ + "mezoantropo.near", + 1 + ], + [ + "mf.near", + 1 + ], + [ + "mgazvoda.near", + 1 + ], + [ + "mgs.near", + 2 + ], + [ + "mh.near", + 2 + ], + [ + "mhmtozback.near", + 2 + ], + [ + "miaodacuo.near", + 2 + ], + [ + "miaxxx.near", + 1 + ], + [ + "micabytes.near", + 3 + ], + [ + "micdrabble.near", + 2 + ], + [ + "michael.near", + 2 + ], + [ + "michael0503.near", + 2 + ], + [ + "michaelcdeguzman.near", + 1 + ], + [ + "michaeldeguzman.near", + 1 + ], + [ + "michel.near", + 1 + ], + [ + "michen.near", + 1 + ], + [ + "michess.near", + 1 + ], + [ + "midnighter.near", + 2 + ], + [ + "mieszko.near", + 1 + ], + [ + "mighty44.near", + 2 + ], + [ + "migi.near", + 1 + ], + [ + "miguelangelo.near", + 1 + ], + [ + "mihai.near", + 2 + ], + [ + "mijnders.near", + 1 + ], + [ + "mike06.near", + 1 + ], + [ + "mike520.near", + 1 + ], + [ + "mikefluff.near", + 1 + ], + [ + "mikhail.near", + 1 + ], + [ + "mikhalytch.near", + 2 + ], + [ + "mikvol.near", + 1 + ], + [ + "mila.near", + 1 + ], + [ + "mila1.near", + 1 + ], + [ + "milen.near", + 4 + ], + [ + "milica.near", + 1 + ], + [ + "millioner2021-891301.near", + 1 + ], + [ + "millsy.near", + 1 + ], + [ + "mim.near", + 1 + ], + [ + "min.near", + 1 + ], + [ + "minhloc.near", + 1 + ], + [ + "minhtbk.near", + 2 + ], + [ + "minilim.near", + 2 + ], + [ + "miquel.near", + 1 + ], + [ + "miriam.near", + 2 + ], + [ + "mirki.near", + 2 + ], + [ + "miron.near", + 1 + ], + [ + "misch.near", + 1 + ], + [ + "misha.near", + 1 + ], + [ + "missdefi.near", + 2 + ], + [ + "missy-missy.near", + 1 + ], + [ + "mister95.near", + 1 + ], + [ + "mistervp.near", + 1 + ], + [ + "misu.near", + 1 + ], + [ + "mix.near", + 1 + ], + [ + "mjaeckel.near", + 2 + ], + [ + "mjoaquim.near", + 1 + ], + [ + "mlknbr.near", + 2 + ], + [ + "mlr.near", + 1 + ], + [ + "mm.near", + 1 + ], + [ + "mmasal.near", + 2 + ], + [ + "mmasal74.near", + 2 + ], + [ + "mmayer.near", + 1 + ], + [ + "mmladin.near", + 1 + ], + [ + "mmm.near", + 1 + ], + [ + "mmmax5075.near", + 1 + ], + [ + "mnemonik.near", + 1 + ], + [ + "mnnblck.near", + 1 + ], + [ + "mo.near", + 1 + ], + [ + "moi.near", + 2 + ], + [ + "moku.near", + 1 + ], + [ + "momomo.near", + 1 + ], + [ + "monce.near", + 1 + ], + [ + "money.near", + 1 + ], + [ + "moo9000.near", + 2 + ], + [ + "moogz.near", + 1 + ], + [ + "moonboi9001.near", + 1 + ], + [ + "moonhappyblock.near", + 1 + ], + [ + "moonhunter.near", + 1 + ], + [ + "moonshot.near", + 2 + ], + [ + "moontrader.near", + 7 + ], + [ + "mort.near", + 2 + ], + [ + "morten76.near", + 2 + ], + [ + "motao.near", + 1 + ], + [ + "motti.near", + 1 + ], + [ + "mouthface.near", + 1 + ], + [ + "moyatronik1.near", + 1 + ], + [ + "mpescoin94.near", + 1 + ], + [ + "mqamar1994.near", + 1 + ], + [ + "mrak.near", + 1 + ], + [ + "mrbin228.near", + 1 + ], + [ + "mrcrypt.near", + 1 + ], + [ + "mrfinely.near", + 2 + ], + [ + "mrkev.near", + 1 + ], + [ + "mrmirliflore.near", + 1 + ], + [ + "mrreddington2015.near", + 2 + ], + [ + "mrskill.near", + 1 + ], + [ + "mrt.near", + 2 + ], + [ + "mrtn.near", + 1 + ], + [ + "mrtung101291.near", + 1 + ], + [ + "mrwong.near", + 1 + ], + [ + "mrwrong.near", + 1 + ], + [ + "ms31.near", + 1 + ], + [ + "msflorentine.near", + 2 + ], + [ + "mtelegin.near", + 2 + ], + [ + "mueller.near", + 2 + ], + [ + "muffy.near", + 2 + ], + [ + "mula.near", + 2 + ], + [ + "mularkey.near", + 1 + ], + [ + "multiwhs.near", + 2 + ], + [ + "mummyhap.near", + 1 + ], + [ + "mumu.near", + 1 + ], + [ + "mumunana.near", + 1 + ], + [ + "munaf.near", + 1 + ], + [ + "mundocrypto.near", + 1 + ], + [ + "muralikrishnan.near", + 1 + ], + [ + "murderbear.near", + 1 + ], + [ + "musakatae.near", + 1 + ], + [ + "mushhz.near", + 1 + ], + [ + "musk.near", + 1 + ], + [ + "muzammil.near", + 1 + ], + [ + "mw.near", + 1 + ], + [ + "mw3ka2tcj_6pd5f7qoesz.near", + 2 + ], + [ + "mxc.near", + 6 + ], + [ + "my_wallet.near", + 2 + ], + [ + "myaccount.near", + 1 + ], + [ + "mykha2.near", + 2 + ], + [ + "mymali.near", + 1 + ], + [ + "mymind.near", + 1 + ], + [ + "mynear.near", + 1 + ], + [ + "mzidov.near", + 3 + ], + [ + "n3m0.near", + 2 + ], + [ + "n3r0n.near", + 1 + ], + [ + "n44bsa.near", + 1 + ], + [ + "n4o4oakos.near", + 4 + ], + [ + "na5.near", + 1 + ], + [ + "nabeel.near", + 1 + ], + [ + "nabetakato.near", + 1 + ], + [ + "nabulmar.near", + 1 + ], + [ + "nadeemkhan.near", + 1 + ], + [ + "nadezdapw.near", + 1 + ], + [ + "naeun.near", + 2 + ], + [ + "nafooch.near", + 1 + ], + [ + "naka.near", + 1 + ], + [ + "nakamoto.near", + 1 + ], + [ + "nallow.near", + 1 + ], + [ + "namantra.near", + 1 + ], + [ + "namarseklasno.near", + 2 + ], + [ + "naozhong.near", + 4 + ], + [ + "narasimha.near", + 1 + ], + [ + "narniec.near", + 1 + ], + [ + "naruemon.near", + 1 + ], + [ + "narutra2.near", + 1 + ], + [ + "nas.near", + 1 + ], + [ + "nata.near", + 1 + ], + [ + "natalia.near", + 1 + ], + [ + "naturalwarp.near", + 2 + ], + [ + "natyendo.near", + 2 + ], + [ + "navarich.near", + 1 + ], + [ + "nb.near", + 2 + ], + [ + "nbawyl.near", + 2 + ], + [ + "near", + 4196 + ], + [ + "near.near", + 1 + ], + [ + "near001.near", + 1 + ], + [ + "near12.near", + 2 + ], + [ + "near123.near", + 3 + ], + [ + "near24.near", + 2 + ], + [ + "near29holger.near", + 1 + ], + [ + "near34holger.near", + 1 + ], + [ + "near_stepec_ico.near", + 2 + ], + [ + "nearest.near", + 2 + ], + [ + "nearfans.near", + 1 + ], + [ + "nearjapan.near", + 1 + ], + [ + "nearjt.near", + 1 + ], + [ + "nearlover.near", + 1 + ], + [ + "nearman.near", + 2 + ], + [ + "nearman99.near", + 1 + ], + [ + "nearmoon.near", + 2 + ], + [ + "nearorfar.near", + 1 + ], + [ + "nearpig.near", + 2 + ], + [ + "nearwallet.near", + 2 + ], + [ + "necron.near", + 1 + ], + [ + "nedski.near", + 1 + ], + [ + "neerajpoddar.near", + 3 + ], + [ + "negat1ve.near", + 1 + ], + [ + "nene.near", + 1 + ], + [ + "neonoinm14.near", + 2 + ], + [ + "neoxxx.near", + 1 + ], + [ + "nepal.near", + 2 + ], + [ + "nepta.near", + 5 + ], + [ + "nepytaev.near", + 4 + ], + [ + "nero.near", + 1 + ], + [ + "nesh34.near", + 1 + ], + [ + "netfatik.near", + 1 + ], + [ + "netzzimedia.near", + 1 + ], + [ + "nevermind.near", + 2 + ], + [ + "newbietomarket.near", + 2 + ], + [ + "newera.near", + 1 + ], + [ + "newinternet.near", + 1 + ], + [ + "newmancoin.near", + 1 + ], + [ + "newtestone.near", + 1 + ], + [ + "nexus.near", + 1 + ], + [ + "nexus2.near", + 1 + ], + [ + "ngocgiauktb.near", + 1 + ], + [ + "ngoctuyenpro88.near", + 3 + ], + [ + "ngoquanghieu01.near", + 1 + ], + [ + "ngoquanghieu02.near", + 1 + ], + [ + "nguyencongsau.near", + 4 + ], + [ + "nguyenhuuthang.near", + 2 + ], + [ + "nguyenkhang.near", + 2 + ], + [ + "nguyenmanhha.near", + 1 + ], + [ + "nguyenquockhank123321.near", + 1 + ], + [ + "nhanha1960.near", + 1 + ], + [ + "nhatnm.near", + 1 + ], + [ + "nhmh1011.near", + 3 + ], + [ + "nhuanhplc.near", + 2 + ], + [ + "nic.near", + 1 + ], + [ + "nicandro.near", + 1 + ], + [ + "nicolecano.near", + 1 + ], + [ + "nightingale.near", + 1 + ], + [ + "nightsailor.near", + 1 + ], + [ + "nijem79.near", + 2 + ], + [ + "nik.near", + 1 + ], + [ + "nikolai1.near", + 1 + ], + [ + "nikolajrosendal.near", + 1 + ], + [ + "nikolay.near", + 1 + ], + [ + "nikolenko.near", + 1 + ], + [ + "nil.near", + 2 + ], + [ + "ning.near", + 1 + ], + [ + "ninini222nini22.near", + 2 + ], + [ + "ninjazz.near", + 1 + ], + [ + "niocris.near", + 2 + ], + [ + "nitin666.near", + 2 + ], + [ + "nitup88.near", + 1 + ], + [ + "nk112.near", + 1 + ], + [ + "nke1675.near", + 4 + ], + [ + "nknm99.near", + 1 + ], + [ + "nntn61.near", + 1 + ], + [ + "nodeasy.near", + 1 + ], + [ + "nomaan.near", + 1 + ], + [ + "nomer1.near", + 1 + ], + [ + "nomer2.near", + 1 + ], + [ + "nomer3.near", + 1 + ], + [ + "nomer4.near", + 1 + ], + [ + "nomer5.near", + 1 + ], + [ + "nomer6.near", + 1 + ], + [ + "nonli.near", + 1 + ], + [ + "nonsense.near", + 3 + ], + [ + "noom.near", + 1 + ], + [ + "noreply.near", + 1 + ], + [ + "norvit.near", + 3 + ], + [ + "not.near", + 1 + ], + [ + "notfarbutreally.near", + 1 + ], + [ + "notime.near", + 1 + ], + [ + "notsatoshi.near", + 1 + ], + [ + "nottoo.near", + 1 + ], + [ + "nqlarch.near", + 1 + ], + [ + "nsretenovic.near", + 1 + ], + [ + "number9dream.near", + 1 + ], + [ + "nuneun.near", + 8 + ], + [ + "nurgazy.near", + 2 + ], + [ + "nurislan.near", + 1 + ], + [ + "nut.near", + 1 + ], + [ + "nwright.near", + 1 + ], + [ + "nyc.near", + 1 + ], + [ + "o.near", + 1 + ], + [ + "o309steffe.near", + 1 + ], + [ + "o6mopok.near", + 1 + ], + [ + "o_belo.near", + 2 + ], + [ + "od3.near", + 1 + ], + [ + "odin.near", + 1 + ], + [ + "odoovan.near", + 3 + ], + [ + "og.near", + 2 + ], + [ + "ograma.near", + 2 + ], + [ + "ohadbachner.near", + 1 + ], + [ + "ojosdepez.near", + 2 + ], + [ + "okinawa.near", + 1 + ], + [ + "oldripvanwinkle.near", + 1 + ], + [ + "oldschool.near", + 1 + ], + [ + "oleg.near", + 2 + ], + [ + "olegan.near", + 1 + ], + [ + "olegjan2008.near", + 1 + ], + [ + "oleksandrantipin.near", + 2 + ], + [ + "olesiasol1981.near", + 1 + ], + [ + "olha.near", + 2 + ], + [ + "oli.near", + 1 + ], + [ + "olibay.near", + 7 + ], + [ + "oliser.near", + 1 + ], + [ + "omanizen.near", + 1 + ], + [ + "omar.near", + 1 + ], + [ + "omeshock.near", + 2 + ], + [ + "omg.near", + 2 + ], + [ + "omgclayaiken.near", + 1 + ], + [ + "omgwhy.near", + 1 + ], + [ + "omoide365.near", + 1 + ], + [ + "onceberry.near", + 2 + ], + [ + "ondrishe.near", + 4 + ], + [ + "one.near", + 2 + ], + [ + "oni365.near", + 1 + ], + [ + "onslaught.near", + 1 + ], + [ + "ontask.near", + 3 + ], + [ + "onur.near", + 1 + ], + [ + "oops.near", + 1 + ], + [ + "openb0x.near", + 1 + ], + [ + "oracle.near", + 1 + ], + [ + "orange.near", + 1 + ], + [ + "orangelcub.near", + 1 + ], + [ + "ordian.near", + 1 + ], + [ + "ork.near", + 1 + ], + [ + "orlando.near", + 1 + ], + [ + "orlando_larias.near", + 1 + ], + [ + "ortonre.near", + 1 + ], + [ + "os.near", + 1 + ], + [ + "oscar.near", + 2 + ], + [ + "oscarola.near", + 2 + ], + [ + "oscartsui.near", + 2 + ], + [ + "osipoff.near", + 1 + ], + [ + "oskolkov.near", + 2 + ], + [ + "osoroshia.near", + 1 + ], + [ + "othylmann.near", + 1 + ], + [ + "otukarehitoiki.near", + 2 + ], + [ + "ourplay.near", + 1 + ], + [ + "outinside.near", + 1 + ], + [ + "over.near", + 1 + ], + [ + "ovi.near", + 1 + ], + [ + "owarsharif.near", + 1 + ], + [ + "ox5678.near", + 1 + ], + [ + "oxotnik1.near", + 1 + ], + [ + "oxotnik2.near", + 1 + ], + [ + "ozan.near", + 1 + ], + [ + "ozgur.near", + 1 + ], + [ + "ozymandius.near", + 1 + ], + [ + "p007.near", + 2 + ], + [ + "pa132.near", + 1 + ], + [ + "pablo1128.near", + 2 + ], + [ + "pablot-93.near", + 2 + ], + [ + "pacek.near", + 1 + ], + [ + "pacheckd.near", + 1 + ], + [ + "paco.near", + 2 + ], + [ + "pancer.near", + 1 + ], + [ + "panda8888.near", + 1 + ], + [ + "pandalucu66.near", + 1 + ], + [ + "pandeymikhil.near", + 1 + ], + [ + "pantera_capital.near", + 1 + ], + [ + "pantufl.near", + 2 + ], + [ + "paquci.near", + 2 + ], + [ + "paradigm.near", + 1 + ], + [ + "parisa.near", + 2 + ], + [ + "parviz.near", + 3 + ], + [ + "pastamasta.near", + 2 + ], + [ + "pathrock.near", + 1 + ], + [ + "patrick.near", + 6 + ], + [ + "patrick1.near", + 10 + ], + [ + "paul.near", + 1 + ], + [ + "paul_budd1.near", + 1 + ], + [ + "paulbarnard.near", + 1 + ], + [ + "paulgould.near", + 1 + ], + [ + "pauljin.near", + 1 + ], + [ + "paulli31.near", + 1 + ], + [ + "paulnear01.near", + 2 + ], + [ + "paulwhiteway.near", + 1 + ], + [ + "payments.near", + 1 + ], + [ + "paypal.near", + 1 + ], + [ + "pchela_tr.near", + 2 + ], + [ + "peenka.near", + 1 + ], + [ + "peeveee1.near", + 1 + ], + [ + "penatrader.near", + 1 + ], + [ + "pepip.near", + 1 + ], + [ + "peterz.near", + 1 + ], + [ + "petrov.near", + 1 + ], + [ + "petrpko.near", + 1 + ], + [ + "petyokamenov.near", + 1 + ], + [ + "phackrudin.near", + 2 + ], + [ + "phainesthai.near", + 1 + ], + [ + "phigna1022.near", + 1 + ], + [ + "philh.near", + 1 + ], + [ + "philomene57.near", + 2 + ], + [ + "phlippsenx.near", + 1 + ], + [ + "phuonganh.near", + 1 + ], + [ + "phuongdung224466.near", + 1 + ], + [ + "phuongnt.near", + 1 + ], + [ + "piahrey.near", + 1 + ], + [ + "pierandrea.near", + 1 + ], + [ + "pihun.near", + 5 + ], + [ + "pikanou.near", + 1 + ], + [ + "pinkmole.near", + 1 + ], + [ + "pintofmilk.near", + 2 + ], + [ + "pip_gazebo.near", + 2 + ], + [ + "pirosiki.near", + 2 + ], + [ + "pishikinaleks.near", + 4 + ], + [ + "pitafina.near", + 2 + ], + [ + "pizza.near", + 1 + ], + [ + "pjh.near", + 1 + ], + [ + "pkmelee337.near", + 1 + ], + [ + "plavi.near", + 2 + ], + [ + "plavi23.near", + 2 + ], + [ + "plus3crypto.near", + 2 + ], + [ + "pmerheb.near", + 1 + ], + [ + "poker.near", + 1 + ], + [ + "polaco.near", + 5 + ], + [ + "policej.near", + 1 + ], + [ + "politicalbadger.near", + 1 + ], + [ + "polyatskiy.near", + 1 + ], + [ + "pomalllka.near", + 1 + ], + [ + "pompomlewis.near", + 2 + ], + [ + "pongty.near", + 3 + ], + [ + "ponomarev1980.near", + 1 + ], + [ + "pooh.near", + 4 + ], + [ + "poojabarman1960.near", + 1 + ], + [ + "poopoopaper.near", + 1 + ], + [ + "power.near", + 6 + ], + [ + "ppp666.near", + 1 + ], + [ + "pradeep1231.near", + 2 + ], + [ + "pradeipnear.near", + 3 + ], + [ + "prague.near", + 1 + ], + [ + "prateek.near", + 1 + ], + [ + "prateekj.near", + 1 + ], + [ + "prateekjassal.near", + 1 + ], + [ + "praxr.near", + 2 + ], + [ + "preddy.near", + 1 + ], + [ + "preico.near", + 1 + ], + [ + "prhino.near", + 1 + ], + [ + "primerwallet.near", + 1 + ], + [ + "prinjangwanich.near", + 7 + ], + [ + "priyanka.near", + 2 + ], + [ + "proff23562356.near", + 1 + ], + [ + "proofofstack.near", + 6 + ], + [ + "protector23.near", + 1 + ], + [ + "protocol.near", + 2 + ], + [ + "pruvh.near", + 1 + ], + [ + "prymmer.near", + 1 + ], + [ + "ptrpollupuu.near", + 1 + ], + [ + "pucheta.near", + 1 + ], + [ + "puchicoins.near", + 2 + ], + [ + "puchojenso.near", + 1 + ], + [ + "pukutai.near", + 1 + ], + [ + "pushpraj.near", + 1 + ], + [ + "putin.near", + 1 + ], + [ + "pvkpgp.near", + 1 + ], + [ + "pycche.near", + 1 + ], + [ + "q9.near", + 1 + ], + [ + "qasemiah.near", + 1 + ], + [ + "qcs13.near", + 1 + ], + [ + "qianji.near", + 1 + ], + [ + "qmargo.near", + 2 + ], + [ + "qmargo1.near", + 2 + ], + [ + "qmargo2.near", + 2 + ], + [ + "qq.near", + 2 + ], + [ + "qs6.near", + 1 + ], + [ + "quangnvd.near", + 1 + ], + [ + "quantum.near", + 1 + ], + [ + "quecksilber.near", + 2 + ], + [ + "queen.near", + 1 + ], + [ + "quickbrownfox.near", + 1 + ], + [ + "quimby.near", + 1 + ], + [ + "quocdung.near", + 2 + ], + [ + "qwer947.near", + 2 + ], + [ + "r1chman.near", + 1 + ], + [ + "r4bb1t.near", + 2 + ], + [ + "r4bbit.near", + 1 + ], + [ + "r9ph9fe8fbrq3.near", + 1 + ], + [ + "rabadji.near", + 1 + ], + [ + "rabbidfly.near", + 1 + ], + [ + "rabbit5.near", + 2 + ], + [ + "radikkrs.near", + 1 + ], + [ + "rafa.near", + 3 + ], + [ + "raghul.near", + 1 + ], + [ + "raj.near", + 1 + ], + [ + "rakmon.near", + 1 + ], + [ + "ramacoin.near", + 1 + ], + [ + "ramen.near", + 1 + ], + [ + "rameshilu.near", + 1 + ], + [ + "ramikorhonen.near", + 1 + ], + [ + "ramil.near", + 3 + ], + [ + "ramonrov.near", + 1 + ], + [ + "ramonrov2.near", + 1 + ], + [ + "rani.near", + 1 + ], + [ + "rasec24ollirum.near", + 1 + ], + [ + "rash1k.near", + 1 + ], + [ + "rasher17.near", + 1 + ], + [ + "rastalandtv.near", + 1 + ], + [ + "ratatoeskr.near", + 3 + ], + [ + "rav.near", + 2 + ], + [ + "ravikan.near", + 1 + ], + [ + "raymaker.near", + 2 + ], + [ + "raz.near", + 1 + ], + [ + "rback.near", + 2 + ], + [ + "rbb.near", + 1 + ], + [ + "rdrkn.near", + 1 + ], + [ + "realfriend.near", + 1 + ], + [ + "rebel_121.near", + 1 + ], + [ + "red.near", + 1 + ], + [ + "redlof.near", + 1 + ], + [ + "redpacket.near", + 1 + ], + [ + "reef2020.near", + 1 + ], + [ + "reemo.near", + 1 + ], + [ + "rehash.near", + 1 + ], + [ + "reiss.near", + 1 + ], + [ + "remedj.near", + 1 + ], + [ + "renatov.near", + 1 + ], + [ + "renta.near", + 1 + ], + [ + "renuo.near", + 1 + ], + [ + "reon.near", + 1 + ], + [ + "rest.near", + 1 + ], + [ + "resta69.near", + 2 + ], + [ + "retsambew.near", + 1 + ], + [ + "revenge.near", + 1 + ], + [ + "revolution.near", + 1 + ], + [ + "rezzak.near", + 1 + ], + [ + "rflxvty.near", + 1 + ], + [ + "rhaoniaragao.near", + 1 + ], + [ + "rhrusch.near", + 1 + ], + [ + "rhunestel.near", + 1 + ], + [ + "riccardo.near", + 1 + ], + [ + "richarddixon.near", + 2 + ], + [ + "rick.near", + 1 + ], + [ + "rimednid.near", + 2 + ], + [ + "rimrim.near", + 3 + ], + [ + "rinisoemarwoto.near", + 1 + ], + [ + "ripzery.near", + 1 + ], + [ + "rishabhtushar.near", + 2 + ], + [ + "risinghigh.near", + 1 + ], + [ + "ritesh.near", + 1 + ], + [ + "ritsu.near", + 1 + ], + [ + "rivendell.near", + 1 + ], + [ + "rizkiutama.near", + 2 + ], + [ + "rkreinbihl.near", + 1 + ], + [ + "rl149.near", + 1 + ], + [ + "rmayav.near", + 3 + ], + [ + "rmoiseenkov.near", + 5 + ], + [ + "rnd.near", + 1 + ], + [ + "roadtobitcoin.near", + 1 + ], + [ + "robert-zaremba.near", + 1 + ], + [ + "robert.near", + 2 + ], + [ + "robertkirchner.near", + 2 + ], + [ + "robertlim01.near", + 2 + ], + [ + "roberto_carlos_1987.near", + 2 + ], + [ + "robfarg.near", + 1 + ], + [ + "robin.near", + 2 + ], + [ + "robin23tt.near", + 2 + ], + [ + "robotix.near", + 1 + ], + [ + "rocco19.near", + 1 + ], + [ + "rodnca.near", + 1 + ], + [ + "rogertje.near", + 1 + ], + [ + "rohitgarnaik.near", + 1 + ], + [ + "rojer.near", + 1 + ], + [ + "rok.near", + 1 + ], + [ + "rokmc1066k.near", + 1 + ], + [ + "rokradej.near", + 2 + ], + [ + "romacdmx2020.near", + 1 + ], + [ + "romacdmx20202.near", + 2 + ], + [ + "roman.near", + 1 + ], + [ + "romano.near", + 1 + ], + [ + "romario.near", + 2 + ], + [ + "romaxa92.near", + 1 + ], + [ + "romezzz.near", + 1 + ], + [ + "ronaldboege.near", + 1 + ], + [ + "ronmnm.near", + 1 + ], + [ + "rooat.near", + 2 + ], + [ + "rovve89.near", + 1 + ], + [ + "royalfly.near", + 1 + ], + [ + "royalfu.near", + 1 + ], + [ + "rpw30078.near", + 3 + ], + [ + "rromic.near", + 2 + ], + [ + "rsidhu.near", + 2 + ], + [ + "rsiva.near", + 1 + ], + [ + "rss335.near", + 2 + ], + [ + "rtd2.near", + 9 + ], + [ + "rthom.near", + 9 + ], + [ + "ru.near", + 4 + ], + [ + "rubin315.near", + 1 + ], + [ + "ruchitha.near", + 1 + ], + [ + "ruda.near", + 1 + ], + [ + "rudaneck.near", + 1 + ], + [ + "ruelas.near", + 3 + ], + [ + "ruoyanlee.near", + 4 + ], + [ + "rus.near", + 1 + ], + [ + "rusalimchik.near", + 1 + ], + [ + "ruslan.near", + 1 + ], + [ + "russia.near", + 1 + ], + [ + "ruviy.near", + 1 + ], + [ + "ruxpin1.near", + 1 + ], + [ + "ryancollison.near", + 2 + ], + [ + "rybardolaza.near", + 2 + ], + [ + "ryn5g3du.near", + 1 + ], + [ + "ryr.near", + 2 + ], + [ + "rzz.near", + 2 + ], + [ + "s.near", + 4 + ], + [ + "sacha.near", + 2 + ], + [ + "sachaeslahi.near", + 3 + ], + [ + "saechiis.near", + 1 + ], + [ + "saengsooday.near", + 1 + ], + [ + "saenzcalzada.near", + 2 + ], + [ + "safranov.near", + 1 + ], + [ + "saganata.near", + 1 + ], + [ + "sailinon.near", + 1 + ], + [ + "sajakhta.near", + 1 + ], + [ + "saker2811.near", + 2 + ], + [ + "sam.near", + 1 + ], + [ + "samakrutti.near", + 1 + ], + [ + "samanthabarretto.near", + 2 + ], + [ + "samdiacos.near", + 2 + ], + [ + "samer.near", + 3 + ], + [ + "samgold.near", + 1 + ], + [ + "sami1.near", + 1 + ], + [ + "sami2.near", + 1 + ], + [ + "samijomana.near", + 5 + ], + [ + "samime.near", + 1 + ], + [ + "sammy.near", + 1 + ], + [ + "samolower.near", + 1 + ], + [ + "sandeepsudagani.near", + 2 + ], + [ + "sander.near", + 1 + ], + [ + "sanders-z.near", + 3 + ], + [ + "sandy.near", + 1 + ], + [ + "sangoku.near", + 1 + ], + [ + "sanjay_mandhan.near", + 1 + ], + [ + "sanket.near", + 1 + ], + [ + "santucho1979.near", + 1 + ], + [ + "sanz.near", + 1 + ], + [ + "sarang.near", + 1 + ], + [ + "saravana.near", + 1 + ], + [ + "sas.near", + 1 + ], + [ + "sasha.near", + 1 + ], + [ + "sashareyes.near", + 1 + ], + [ + "satinevood.near", + 1 + ], + [ + "satoshi-nakamoto.near", + 1 + ], + [ + "satoshi.near", + 1 + ], + [ + "satoshi0124.near", + 2 + ], + [ + "satoshi_nakamoto.near", + 2 + ], + [ + "satoshi_near.near", + 1 + ], + [ + "sauceee.near", + 2 + ], + [ + "sauges.near", + 2 + ], + [ + "saulscotland19.near", + 2 + ], + [ + "sav.near", + 1 + ], + [ + "savelev.near", + 1 + ], + [ + "sayes.near", + 1 + ], + [ + "sbls0919.near", + 1 + ], + [ + "scale.near", + 2 + ], + [ + "scazie.near", + 1 + ], + [ + "schlaptop.near", + 3 + ], + [ + "schmidde83.near", + 1 + ], + [ + "schopenhauer.near", + 1 + ], + [ + "schwendenwein.near", + 1 + ], + [ + "scorind5.near", + 1 + ], + [ + "scouser.near", + 2 + ], + [ + "scout.near", + 2 + ], + [ + "scoutz52.near", + 2 + ], + [ + "scrappy.near", + 1 + ], + [ + "se.near", + 1 + ], + [ + "sean.near", + 2 + ], + [ + "seb.near", + 1 + ], + [ + "seba.near", + 1 + ], + [ + "sebo58.near", + 1 + ], + [ + "sed19.near", + 1 + ], + [ + "segundawallet.near", + 1 + ], + [ + "sei204.near", + 2 + ], + [ + "sejwa.near", + 1 + ], + [ + "selenaarh1.near", + 1 + ], + [ + "selvam22.near", + 1 + ], + [ + "semenivanov6677.near", + 1 + ], + [ + "send.near", + 1 + ], + [ + "seniores111.near", + 1 + ], + [ + "seoj.near", + 1 + ], + [ + "seokhyun.near", + 2 + ], + [ + "seomax.near", + 1 + ], + [ + "serg.near", + 2 + ], + [ + "sergeyostrovnoy.near", + 7 + ], + [ + "sergeyrozov.near", + 1 + ], + [ + "sergio.near", + 1 + ], + [ + "sergiofranco.near", + 1 + ], + [ + "serik.near", + 1 + ], + [ + "serjlug2020.near", + 1 + ], + [ + "serjsergsky.near", + 2 + ], + [ + "service.near", + 1 + ], + [ + "serzh32.near", + 8 + ], + [ + "sessileserrated.near", + 1 + ], + [ + "seven.near", + 1 + ], + [ + "sex.near", + 1 + ], + [ + "sfeinberg.near", + 1 + ], + [ + "sfeinberg818.near", + 1 + ], + [ + "sff.near", + 1 + ], + [ + "sgvtys.near", + 1 + ], + [ + "shadyrifles.near", + 1 + ], + [ + "shahnawaz.near", + 1 + ], + [ + "shakur.near", + 1 + ], + [ + "shanton.near", + 2 + ], + [ + "shar.near", + 1 + ], + [ + "sharding786.near", + 1 + ], + [ + "sharzone.near", + 1 + ], + [ + "shaurya11.near", + 1 + ], + [ + "shazib.near", + 1 + ], + [ + "shekhar.near", + 1 + ], + [ + "sheva_9.near", + 1 + ], + [ + "shikione.near", + 1 + ], + [ + "shinevillehome.near", + 5 + ], + [ + "shitcoinsenpai.near", + 1 + ], + [ + "shivam.near", + 1 + ], + [ + "shodan.near", + 2 + ], + [ + "shower.near", + 2 + ], + [ + "shreyas.near", + 1 + ], + [ + "shryi41.near", + 1 + ], + [ + "shubyhere.near", + 1 + ], + [ + "shuo.near", + 1 + ], + [ + "shushle04.near", + 1 + ], + [ + "silent.near", + 2 + ], + [ + "silvano.near", + 2 + ], + [ + "simbro.near", + 1 + ], + [ + "simon.near", + 1 + ], + [ + "simona.near", + 1 + ], + [ + "simonasta.near", + 1 + ], + [ + "simongotlib.near", + 1 + ], + [ + "simonyeung.near", + 1 + ], + [ + "simple_simon.near", + 1 + ], + [ + "siribo4134.near", + 1 + ], + [ + "sirius.near", + 1 + ], + [ + "sittipong.near", + 2 + ], + [ + "siva.near", + 1 + ], + [ + "sixi.near", + 1 + ], + [ + "sjsvvsd2.near", + 1 + ], + [ + "sjsvvsd3.near", + 1 + ], + [ + "sjteeves.near", + 1 + ], + [ + "skarabej.near", + 1 + ], + [ + "skeanparty.near", + 1 + ], + [ + "skippasteve.near", + 1 + ], + [ + "skiprippa.near", + 1 + ], + [ + "skkyy.near", + 1 + ], + [ + "skopintsev.near", + 4 + ], + [ + "skorikoff.near", + 2 + ], + [ + "skycastle.near", + 1 + ], + [ + "skydan.near", + 3 + ], + [ + "slattz83.near", + 4 + ], + [ + "slavon.near", + 2 + ], + [ + "slimchance.near", + 1 + ], + [ + "slnear.near", + 1 + ], + [ + "slowpok.near", + 1 + ], + [ + "smart.near", + 1 + ], + [ + "smartstake.near", + 1 + ], + [ + "smercer.near", + 2 + ], + [ + "smith.near", + 1 + ], + [ + "smj9065.near", + 1 + ], + [ + "smoke.near", + 1 + ], + [ + "smurfoleta.near", + 1 + ], + [ + "snakamoto.near", + 2 + ], + [ + "sneza.near", + 1 + ], + [ + "snowman.near", + 1 + ], + [ + "sokolenkoandr.near", + 2 + ], + [ + "solimir.near", + 1 + ], + [ + "sonic.near", + 1 + ], + [ + "sorokin87.near", + 1 + ], + [ + "sp1010.near", + 1 + ], + [ + "spacex.near", + 1 + ], + [ + "spaincity914.near", + 1 + ], + [ + "sparrow.near", + 1 + ], + [ + "spartacus.near", + 1 + ], + [ + "spasoman.near", + 1 + ], + [ + "specialnear.near", + 1 + ], + [ + "spedisci.near", + 1 + ], + [ + "sphinx.near", + 1 + ], + [ + "spoonmeon.near", + 2 + ], + [ + "sprigan.near", + 2 + ], + [ + "spritelemon36.near", + 1 + ], + [ + "sputnik.near", + 1 + ], + [ + "sqzz.near", + 1 + ], + [ + "sr-trading.near", + 1 + ], + [ + "srazajamal.near", + 2 + ], + [ + "sreeraj.near", + 1 + ], + [ + "sri.near", + 1 + ], + [ + "srikanthraju1979.near", + 1 + ], + [ + "srini.near", + 3 + ], + [ + "sromic2.near", + 3 + ], + [ + "srubarmichal.near", + 1 + ], + [ + "srv.near", + 1 + ], + [ + "ss.near", + 1 + ], + [ + "stack.near", + 1 + ], + [ + "stacks.near", + 1 + ], + [ + "stakery.near", + 1 + ], + [ + "stakeservice.near", + 2 + ], + [ + "staking4all-validator.near", + 1 + ], + [ + "staking4all.near", + 1 + ], + [ + "staking4all01.near", + 1 + ], + [ + "stan.near", + 1 + ], + [ + "stanchocorporation.near", + 1 + ], + [ + "standrews.near", + 2 + ], + [ + "stanislavmileshin.near", + 2 + ], + [ + "stankf.near", + 2 + ], + [ + "stanly.near", + 1 + ], + [ + "stanvtb.near", + 1 + ], + [ + "stanwang.near", + 2 + ], + [ + "stardust.near", + 6 + ], + [ + "startico2017.near", + 7 + ], + [ + "stbanhf.near", + 2 + ], + [ + "steefan.near", + 1 + ], + [ + "steeny.near", + 1 + ], + [ + "stefan.near", + 1 + ], + [ + "stefan1103.near", + 2 + ], + [ + "steffen.near", + 2 + ], + [ + "stela.near", + 1 + ], + [ + "stells.near", + 1 + ], + [ + "sten.near", + 2 + ], + [ + "stephenreid.near", + 1 + ], + [ + "sterx.near", + 1 + ], + [ + "stevanus.near", + 1 + ], + [ + "steve.near", + 1 + ], + [ + "steven1989.near", + 2 + ], + [ + "stevenlwk.near", + 1 + ], + [ + "stijnlohuis.near", + 4 + ], + [ + "stirzy.near", + 1 + ], + [ + "stone.near", + 1 + ], + [ + "straj7771.near", + 1 + ], + [ + "strikerjax.near", + 1 + ], + [ + "studeywebs.near", + 1 + ], + [ + "stumpydoo5.near", + 1 + ], + [ + "styxson.near", + 2 + ], + [ + "subaozi.near", + 1 + ], + [ + "subbu.near", + 1 + ], + [ + "suhanbae.near", + 2 + ], + [ + "suisiwen.near", + 1 + ], + [ + "sukrucildirr.near", + 1 + ], + [ + "sumit.near", + 2 + ], + [ + "sun.near", + 1 + ], + [ + "sung.near", + 1 + ], + [ + "sunliming.near", + 2 + ], + [ + "sunrise.near", + 1 + ], + [ + "sunshine.near", + 1 + ], + [ + "superlogico1983.near", + 2 + ], + [ + "superman.near", + 1 + ], + [ + "superpups.near", + 2 + ], + [ + "superzack1221.near", + 1 + ], + [ + "supi-tup.near", + 1 + ], + [ + "suppernho.near", + 5 + ], + [ + "suresh.near", + 1 + ], + [ + "surf.near", + 1 + ], + [ + "sushi.near", + 1 + ], + [ + "sushiswap.near", + 1 + ], + [ + "suyoda.near", + 2 + ], + [ + "suzu151091.near", + 1 + ], + [ + "svdv.near", + 1 + ], + [ + "svetlanabunkova.near", + 1 + ], + [ + "svetlanaby.near", + 1 + ], + [ + "swaggadan.near", + 2 + ], + [ + "swagomat.near", + 1 + ], + [ + "sweetpotatoz.near", + 1 + ], + [ + "swiss-staking.near", + 1 + ], + [ + "swx123.near", + 3 + ], + [ + "swys.near", + 1 + ], + [ + "sxguan666.near", + 1 + ], + [ + "sxguanok.near", + 2 + ], + [ + "symadrynnikov.near", + 1 + ], + [ + "syncnode.near", + 1 + ], + [ + "system_s.near", + 1 + ], + [ + "sz.near", + 2 + ], + [ + "t14ul1.near", + 1 + ], + [ + "tabtrading.near", + 1 + ], + [ + "taforyou.near", + 1 + ], + [ + "taganskii.near", + 1 + ], + [ + "taheer121.near", + 2 + ], + [ + "taiyab.near", + 2 + ], + [ + "takashi.near", + 2 + ], + [ + "taku.near", + 1 + ], + [ + "tameemwallet2.near", + 1 + ], + [ + "tanderug.near", + 1 + ], + [ + "taoros.near", + 3 + ], + [ + "tarun.near", + 1 + ], + [ + "taruntrav.near", + 2 + ], + [ + "tatelinpp.near", + 5 + ], + [ + "tatyana_igumenceva.near", + 1 + ], + [ + "taurolsan.near", + 1 + ], + [ + "taylorholland13.near", + 1 + ], + [ + "tayyab.near", + 1 + ], + [ + "tb.near", + 1 + ], + [ + "tchiu.near", + 2 + ], + [ + "tclshilf.near", + 1 + ], + [ + "tdmoor.near", + 5 + ], + [ + "techno.near", + 1 + ], + [ + "teleginate.near", + 1 + ], + [ + "telegins.near", + 1 + ], + [ + "teleginsv.near", + 1 + ], + [ + "temaspeak.near", + 2 + ], + [ + "temidayore.near", + 1 + ], + [ + "tententen2.near", + 3 + ], + [ + "terencehan.near", + 1 + ], + [ + "terentyev089.near", + 1 + ], + [ + "terror7777.near", + 1 + ], + [ + "terryow11.near", + 1 + ], + [ + "teuhcatl.near", + 1 + ], + [ + "teusevi.near", + 2 + ], + [ + "tevinl.near", + 2 + ], + [ + "texgeek.near", + 2 + ], + [ + "th3m477.near", + 1 + ], + [ + "thanhvinh10589.near", + 1 + ], + [ + "thatalex.near", + 1 + ], + [ + "the.near", + 1 + ], + [ + "the_lexa.near", + 1 + ], + [ + "the_liolik.near", + 1 + ], + [ + "thegoat.near", + 2 + ], + [ + "thehatter.near", + 1 + ], + [ + "themoon.near", + 1 + ], + [ + "theo.near", + 2 + ], + [ + "theobtl.near", + 1 + ], + [ + "theresa.near", + 1 + ], + [ + "thesky1234.near", + 2 + ], + [ + "thienlongtu.near", + 6 + ], + [ + "thisismynearwallet.near", + 1 + ], + [ + "thiyaneswaran.near", + 2 + ], + [ + "thomas.near", + 1 + ], + [ + "thomasbaak.near", + 2 + ], + [ + "thomasschneider110471.near", + 12 + ], + [ + "thsnz.near", + 1 + ], + [ + "ti3au.near", + 2 + ], + [ + "tichathegreat.near", + 1 + ], + [ + "tiger.near", + 1 + ], + [ + "till.near", + 1 + ], + [ + "timchuk_vladimir89.near", + 1 + ], + [ + "timo.near", + 2 + ], + [ + "timolei.near", + 1 + ], + [ + "timonthen3arkat.near", + 1 + ], + [ + "tinaing2019.near", + 2 + ], + [ + "tinanpha.near", + 1 + ], + [ + "tinotrung.near", + 1 + ], + [ + "tipazloy.near", + 2 + ], + [ + "tirreg9.near", + 1 + ], + [ + "titalunz.near", + 2 + ], + [ + "titikaka791.near", + 1 + ], + [ + "tj77.near", + 6 + ], + [ + "tlinder.near", + 1 + ], + [ + "tobeaj2mer.near", + 1 + ], + [ + "tobiofneptune.near", + 1 + ], + [ + "todamoon.near", + 1 + ], + [ + "todd.near", + 3 + ], + [ + "todeco.near", + 2 + ], + [ + "toebee.near", + 1 + ], + [ + "tof.near", + 1 + ], + [ + "tokenfundamentalist.near", + 1 + ], + [ + "tolzr.near", + 1 + ], + [ + "tom.near", + 2 + ], + [ + "tom68.near", + 1 + ], + [ + "tomas.near", + 1 + ], + [ + "tomas007ales.near", + 1 + ], + [ + "tomasz.near", + 2 + ], + [ + "tome.near", + 1 + ], + [ + "tommy.near", + 1 + ], + [ + "tommybananas.near", + 1 + ], + [ + "tommynara.near", + 2 + ], + [ + "tommyvo.near", + 1 + ], + [ + "tommzardoz.near", + 1 + ], + [ + "tompi_2014.near", + 1 + ], + [ + "tongcp1576.near", + 1 + ], + [ + "tonton.near", + 3 + ], + [ + "tony.near", + 1 + ], + [ + "toonni.near", + 2 + ], + [ + "torledo.near", + 1 + ], + [ + "toth3moon.near", + 1 + ], + [ + "tp493159.near", + 1 + ], + [ + "trachartem.near", + 2 + ], + [ + "tradesman.near", + 1 + ], + [ + "trananhkhoait.near", + 1 + ], + [ + "tranducnham.near", + 1 + ], + [ + "travellerfrank.near", + 1 + ], + [ + "treasury.near", + 1 + ], + [ + "trepidswampmountain.near", + 1 + ], + [ + "trevordagg.near", + 2 + ], + [ + "tribe.near", + 1 + ], + [ + "trick.near", + 1 + ], + [ + "trim.near", + 1 + ], + [ + "trojan.near", + 1 + ], + [ + "troks.near", + 2 + ], + [ + "trongtour.near", + 4 + ], + [ + "troy.near", + 1 + ], + [ + "true.near", + 2 + ], + [ + "truongpx.near", + 1 + ], + [ + "truongvanhoa19.near", + 1 + ], + [ + "tschimi.near", + 1 + ], + [ + "tso.near", + 1 + ], + [ + "tsyregma.near", + 1 + ], + [ + "tuanduongk37.near", + 1 + ], + [ + "tunghaolin.near", + 1 + ], + [ + "tuzem.near", + 1 + ], + [ + "twintbeast.near", + 2 + ], + [ + "twr.near", + 2 + ], + [ + "txentejmnz.near", + 2 + ], + [ + "txirrisklas.near", + 2 + ], + [ + "tyler.near", + 1 + ], + [ + "tymon.near", + 4 + ], + [ + "tyoo.near", + 1 + ], + [ + "tzouf.near", + 1 + ], + [ + "u.near", + 2 + ], + [ + "ubikcapital.near", + 1 + ], + [ + "uen.near", + 2 + ], + [ + "ujjwal.near", + 1 + ], + [ + "ul.near", + 1 + ], + [ + "ula.near", + 1 + ], + [ + "ultracyl.near", + 1 + ], + [ + "undefined.near", + 2 + ], + [ + "underminer.near", + 1 + ], + [ + "unicorn.near", + 1 + ], + [ + "uniswap.near", + 1 + ], + [ + "unit.near", + 1 + ], + [ + "unknow-person.near", + 1 + ], + [ + "unlimg.near", + 1 + ], + [ + "unternehmer_83.near", + 1 + ], + [ + "up.near", + 6 + ], + [ + "upepe3keyama.near", + 4 + ], + [ + "uptowneric.near", + 1 + ], + [ + "ural.near", + 1 + ], + [ + "urmas.near", + 1 + ], + [ + "us.near", + 2 + ], + [ + "usa.near", + 1 + ], + [ + "usd.near", + 1 + ], + [ + "usdt.near", + 1 + ], + [ + "username.near", + 4 + ], + [ + "userzuzer.near", + 2 + ], + [ + "utifom.near", + 1 + ], + [ + "vabsie.near", + 1 + ], + [ + "vaclavmaslov1975.near", + 1 + ], + [ + "vadim_0060708.near", + 2 + ], + [ + "vadimpigolenko.near", + 2 + ], + [ + "vaihen.near", + 1 + ], + [ + "valodja.near", + 2 + ], + [ + "vananh.near", + 1 + ], + [ + "vanminh122298.near", + 1 + ], + [ + "vantoanbk57.near", + 2 + ], + [ + "vanvinh.near", + 1 + ], + [ + "varenka.near", + 1 + ], + [ + "varlan.near", + 2 + ], + [ + "varun.near", + 1 + ], + [ + "vasay1990.near", + 1 + ], + [ + "vasilies.near", + 1 + ], + [ + "vasilij333.near", + 2 + ], + [ + "vavanu4.near", + 2 + ], + [ + "vbs.near", + 1 + ], + [ + "vcar.near", + 1 + ], + [ + "vdfrost.near", + 1 + ], + [ + "vdyz4t8u.near", + 1 + ], + [ + "vega.near", + 1 + ], + [ + "veitali.near", + 3 + ], + [ + "vencn.near", + 1 + ], + [ + "venediger.near", + 1 + ], + [ + "verosar.near", + 1 + ], + [ + "very.near", + 3 + ], + [ + "vgng.near", + 2 + ], + [ + "vicky.near", + 2 + ], + [ + "vickyrock30.near", + 1 + ], + [ + "vict.near", + 1 + ], + [ + "vietanh.near", + 1 + ], + [ + "vietanhle8888.near", + 1 + ], + [ + "vietdo.near", + 1 + ], + [ + "vigneshmadrista.near", + 1 + ], + [ + "vigneshpandian.near", + 1 + ], + [ + "vijayakumar.near", + 1 + ], + [ + "vikassood1.near", + 1 + ], + [ + "viktor.near", + 2 + ], + [ + "viktor_benner.near", + 1 + ], + [ + "viktorliu.near", + 1 + ], + [ + "viktorskf.near", + 1 + ], + [ + "vikusss89.near", + 1 + ], + [ + "vilija.near", + 2 + ], + [ + "vincent.near", + 1 + ], + [ + "vinilpc.near", + 1 + ], + [ + "vinmar.near", + 3 + ], + [ + "vip.near", + 1 + ], + [ + "vitalik.near", + 1 + ], + [ + "vitalik_buterin.near", + 1 + ], + [ + "vitaliy.near", + 1 + ], + [ + "vitaly.near", + 1 + ], + [ + "vitas86.near", + 1 + ], + [ + "vitkov.near", + 1 + ], + [ + "vitkov2.near", + 1 + ], + [ + "vivi1333.near", + 1 + ], + [ + "vk1118.near", + 1 + ], + [ + "vlad.near", + 1 + ], + [ + "vladimirg.near", + 1 + ], + [ + "vladis.near", + 1 + ], + [ + "vladsmd.near", + 2 + ], + [ + "voland04.near", + 1 + ], + [ + "vote4pedro.near", + 1 + ], + [ + "vovusik.near", + 1 + ], + [ + "vox.near", + 1 + ], + [ + "vy_vy_22.near", + 1 + ], + [ + "vytas.near", + 1 + ], + [ + "wang16.near", + 2 + ], + [ + "wangchao86.near", + 1 + ], + [ + "wanglei0095.near", + 1 + ], + [ + "wangsta.near", + 1 + ], + [ + "wanseob.near", + 1 + ], + [ + "warisyaqubi.near", + 2 + ], + [ + "warlock.near", + 1 + ], + [ + "warmcapital.near", + 1 + ], + [ + "was.near", + 3 + ], + [ + "waters.near", + 1 + ], + [ + "wearesatoshi.near", + 1 + ], + [ + "weariedatom.near", + 3 + ], + [ + "web3.near", + 1 + ], + [ + "webmel.near", + 2 + ], + [ + "weed.near", + 1 + ], + [ + "weiliangfung.near", + 2 + ], + [ + "wenjielu.near", + 2 + ], + [ + "wenxianjiang.near", + 1 + ], + [ + "wetez.near", + 1 + ], + [ + "whatever.near", + 1 + ], + [ + "whiletrue.near", + 2 + ], + [ + "white_house.near", + 3 + ], + [ + "whoismrbru.near", + 1 + ], + [ + "whoismrskill.near", + 1 + ], + [ + "wildalert.near", + 1 + ], + [ + "willymooth.near", + 1 + ], + [ + "wimscot123.near", + 2 + ], + [ + "win.near", + 1 + ], + [ + "winnerclubs.near", + 1 + ], + [ + "winnieyow.near", + 1 + ], + [ + "wistar.near", + 1 + ], + [ + "wladka666.near", + 3 + ], + [ + "wodikasha.near", + 1 + ], + [ + "wojak.near", + 1 + ], + [ + "wolf34.near", + 1 + ], + [ + "wompwomp.near", + 1 + ], + [ + "wonbo.near", + 1 + ], + [ + "wonderreturn.near", + 1 + ], + [ + "woodwam.near", + 1 + ], + [ + "wookiewarrior.near", + 2 + ], + [ + "wow.near", + 1 + ], + [ + "wowanjd.near", + 1 + ], + [ + "wr.near", + 1 + ], + [ + "wtldmrs.near", + 2 + ], + [ + "wu365.near", + 1 + ], + [ + "wu40.near", + 1 + ], + [ + "wudi.near", + 2 + ], + [ + "wuffle.near", + 1 + ], + [ + "wurstmensch.near", + 1 + ], + [ + "ww.near", + 1 + ], + [ + "wx.near", + 2 + ], + [ + "x.near", + 1 + ], + [ + "xafobia.near", + 2 + ], + [ + "xander.near", + 1 + ], + [ + "xanyar.near", + 2 + ], + [ + "xbadmax.near", + 2 + ], + [ + "xbleidx11.near", + 1 + ], + [ + "xedap.near", + 1 + ], + [ + "xianghong0912.near", + 1 + ], + [ + "xiaobo.near", + 1 + ], + [ + "xiaojun.near", + 1 + ], + [ + "xikunying.near", + 1 + ], + [ + "xoreth.near", + 8 + ], + [ + "xpaco.near", + 2 + ], + [ + "xpromt.near", + 1 + ], + [ + "xrahul.near", + 1 + ], + [ + "xtreme11.near", + 1 + ], + [ + "xtreme12.near", + 1 + ], + [ + "xuyogi.near", + 1 + ], + [ + "xvideos469.near", + 2 + ], + [ + "xx.near", + 1 + ], + [ + "xxx.near", + 1 + ], + [ + "xy.near", + 2 + ], + [ + "xyb.near", + 2 + ], + [ + "y0b.near", + 1 + ], + [ + "yajirushiworks2020.near", + 2 + ], + [ + "yakultza.near", + 2 + ], + [ + "yam.near", + 1 + ], + [ + "yams.near", + 4 + ], + [ + "yan.near", + 5 + ], + [ + "yangchj.near", + 1 + ], + [ + "yangshen.near", + 1 + ], + [ + "yangweizi911.near", + 1 + ], + [ + "yanmingguo.near", + 1 + ], + [ + "yanok1985.near", + 2 + ], + [ + "yaomengmeng1986.near", + 1 + ], + [ + "yarco.near", + 1 + ], + [ + "yashman.near", + 1 + ], + [ + "yasser.near", + 2 + ], + [ + "ybob.near", + 2 + ], + [ + "yc.near", + 2 + ], + [ + "ycl.near", + 2 + ], + [ + "yderdiki.near", + 1 + ], + [ + "yearn.near", + 1 + ], + [ + "yellowboy.near", + 1 + ], + [ + "yessin.near", + 2 + ], + [ + "yfi.near", + 1 + ], + [ + "yfledger.near", + 1 + ], + [ + "yicrson.near", + 1 + ], + [ + "yin123y.near", + 3 + ], + [ + "yinqa.near", + 1 + ], + [ + "ykhan60.near", + 1 + ], + [ + "ykvph.near", + 1 + ], + [ + "yl.near", + 1 + ], + [ + "yoda.near", + 3 + ], + [ + "yoda_uk.near", + 2 + ], + [ + "yodake.near", + 2 + ], + [ + "yolo_surf.near", + 1 + ], + [ + "yongming.near", + 5 + ], + [ + "yoonho00.near", + 1 + ], + [ + "york1ng99.near", + 1 + ], + [ + "youtube.near", + 2 + ], + [ + "yrl2000.near", + 1 + ], + [ + "ysxlin01.near", + 2 + ], + [ + "yt8686jh.near", + 1 + ], + [ + "yuchialiang.near", + 2 + ], + [ + "yuggalen.near", + 1 + ], + [ + "yujinbo.near", + 1 + ], + [ + "yulian.near", + 1 + ], + [ + "yuridiablo.near", + 2 + ], + [ + "yuristturist.near", + 1 + ], + [ + "yuriy.near", + 1 + ], + [ + "yury.near", + 1 + ], + [ + "yuta.near", + 1 + ], + [ + "yuther.near", + 1 + ], + [ + "yy.near", + 1 + ], + [ + "yylai.near", + 2 + ], + [ + "z.near", + 1 + ], + [ + "zachzwei.near", + 1 + ], + [ + "zaebumba.near", + 1 + ], + [ + "zamzam1.near", + 1 + ], + [ + "zamzam2.near", + 1 + ], + [ + "zano66.near", + 1 + ], + [ + "zaremba.near", + 1 + ], + [ + "zazoley.near", + 2 + ], + [ + "zealot.near", + 1 + ], + [ + "zeecity.near", + 1 + ], + [ + "zenithli.near", + 1 + ], + [ + "zeromax.near", + 1 + ], + [ + "zeroone.near", + 1 + ], + [ + "zeus7912.near", + 4 + ], + [ + "zeusone.near", + 1 + ], + [ + "zeze.near", + 2 + ], + [ + "zhartur89.near", + 1 + ], + [ + "zhelserhii09.near", + 1 + ], + [ + "zhuhao529440.near", + 1 + ], + [ + "zhuoyue.near", + 1 + ], + [ + "ziaaddils.near", + 1 + ], + [ + "zilj.near", + 1 + ], + [ + "zinur.near", + 1 + ], + [ + "zitko.near", + 2 + ], + [ + "ziyou.near", + 1 + ], + [ + "zjouraolian.near", + 1 + ], + [ + "zkp.near", + 2 + ], + [ + "zoek.near", + 1 + ], + [ + "zorro.near", + 1 + ], + [ + "zpool.near", + 4 + ], + [ + "zyzygy.near", + 1 + ], + [ + "zzangpk.near", + 1 + ], + [ + "zzf.near", + 1 + ], + [ + "zztom.near", + 1 + ] +] \ No newline at end of file diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 8aee70d68a6..7dae3399924 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -5,6 +5,7 @@ use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo}; use near_chain::{ChainStore, ChainStoreAccess, ChainStoreUpdate, RuntimeAdapter}; use near_epoch_manager::{EpochManager, RewardCalculator}; use near_primitives::epoch_manager::EpochConfig; +use near_primitives::runtime::migration_data::MigrationData; use near_primitives::sharding::{ChunkHash, ShardChunkHeader, ShardChunkV1}; use near_primitives::transaction::ExecutionOutcomeWithIdAndProof; use near_primitives::types::{BlockHeight, ShardId}; @@ -259,3 +260,24 @@ pub fn migrate_19_to_20(path: &String, near_config: &NearConfig) { set_store_version(&store, 20); } + +#[cfg(feature = "protocol_feature_fix_storage_usage")] +lazy_static_include::lazy_static_include_bytes! { + /// File with account ids and deltas that need to be applied in order to fix storage usage + /// difference between actual and stored usage, introduced due to bug in access key deletion, + /// see https://github.com/near/nearcore/issues/3824 + MAINNET_STORAGE_USAGE_DELTA => "res/storage_usage_delta.json", +} + +pub fn load_migration_data(chain_id: &String) -> MigrationData { + #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] + let _ = chain_id; + MigrationData { + #[cfg(feature = "protocol_feature_fix_storage_usage")] + storage_usage_delta: if chain_id == "mainnet" { + serde_json::from_slice(&MAINNET_STORAGE_USAGE_DELTA).unwrap() + } else { + Vec::new() + }, + } +} diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index d4ff279365d..2c9f1967a92 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -58,7 +58,9 @@ use node_runtime::{ use crate::shard_tracker::{account_id_to_shard_id, ShardTracker}; use near_primitives::runtime::config::RuntimeConfig; +use crate::migrations::load_migration_data; use errors::FromStateViewerErrors; +use near_primitives::runtime::migration_data::{MigrationContext, MigrationData}; pub mod errors; @@ -130,6 +132,7 @@ pub struct NightshadeRuntime { epoch_manager: SafeEpochManager, shard_tracker: ShardTracker, genesis_state_roots: Vec, + migration_data: Arc, } impl NightshadeRuntime { @@ -181,6 +184,7 @@ impl NightshadeRuntime { epoch_manager: SafeEpochManager(epoch_manager), shard_tracker, genesis_state_roots: state_roots, + migration_data: Arc::new(load_migration_data(&genesis.config.chain_id)), } } @@ -193,6 +197,11 @@ impl NightshadeRuntime { epoch_manager.get_epoch_info(&epoch_id).map(|info| info.epoch_height()).map_err(Error::from) } + fn get_epoch_id(&self, parent_hash: &CryptoHash) -> Result { + let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); + epoch_manager.get_epoch_id(parent_hash).map_err(Error::from) + } + fn genesis_state_from_dump(store: Arc, home_dir: &Path) -> Vec { error!(target: "near", "Loading genesis from a state dump file. Do not use this outside of genesis-tools"); let mut state_file = home_dir.to_path_buf(); @@ -395,7 +404,9 @@ impl NightshadeRuntime { let epoch_height = self.get_epoch_height_from_prev_block(prev_block_hash)?; let epoch_id = self.get_epoch_id_from_prev_block(prev_block_hash)?; + let prev_block_epoch_id = self.get_epoch_id(prev_block_hash)?; let current_protocol_version = self.get_epoch_protocol_version(&epoch_id)?; + let prev_block_protocol_version = self.get_epoch_protocol_version(&prev_block_epoch_id)?; let apply_state = ApplyState { block_index: block_height, @@ -417,6 +428,11 @@ impl NightshadeRuntime { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: self.evm_chain_id(), profile: Default::default(), + migration_context: MigrationContext { + is_first_block_with_current_version: current_protocol_version + != prev_block_protocol_version, + migration_data: self.migration_data.clone(), + }, }; let apply_result = self diff --git a/runtime/runtime-params-estimator/src/testbed.rs b/runtime/runtime-params-estimator/src/testbed.rs index 7685d2db46a..37ead67726e 100644 --- a/runtime/runtime-params-estimator/src/testbed.rs +++ b/runtime/runtime-params-estimator/src/testbed.rs @@ -95,6 +95,7 @@ impl RuntimeTestbed { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: Default::default(), + migration_context: Default::default(), }; Self { workdir, diff --git a/runtime/runtime/Cargo.toml b/runtime/runtime/Cargo.toml index caa858786ac..3d397737128 100644 --- a/runtime/runtime/Cargo.toml +++ b/runtime/runtime/Cargo.toml @@ -53,6 +53,7 @@ protocol_feature_alt_bn128 = [ ] protocol_feature_tx_size_limit = [] protocol_feature_allow_create_account_on_delete = ["near-primitives/protocol_feature_allow_create_account_on_delete", "near-vm-logic/protocol_feature_allow_create_account_on_delete"] +protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage"] [dev-dependencies] tempfile = "3" diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index c1b51b4627f..95fc2867222 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1070,6 +1070,47 @@ impl Runtime { Ok(()) } + // In test runs reads and writes here used 442 TGas. Added 10% to account for possible bigger + // state + #[cfg(feature = "protocol_feature_fix_storage_usage")] + const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 490_000_000_000_000; + + pub fn apply_migrations( + &self, + state_update: &mut TrieUpdate, + apply_state: &ApplyState, + ) -> Result { + #[cfg(feature = "protocol_feature_fix_storage_usage")] + let mut gas_used: Gas = 0; + #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] + let gas_used: Gas = 0; + #[cfg(feature = "protocol_feature_fix_storage_usage")] + if ProtocolFeature::FixStorageUsage.protocol_version() + == apply_state.current_protocol_version + { + for (account_id, delta) in + &apply_state.migration_context.migration_data.storage_usage_delta + { + match get_account(state_update, account_id)? { + Some(mut account) => { + // Storage usage is saved in state, hence it is nowhere close to max value + // of u64, and maximal delta is 4196, se we can add here without checking + // for overflow + account.set_storage_usage(account.storage_usage() + delta); + set_account(state_update, account_id.clone(), &account); + } + // Account could have been deleted in the meantime + None => {} + } + } + gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; + state_update.commit(StateChangeCause::Migration); + } + #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] + (state_update, apply_state); + Ok(gas_used) + } + /// Applies new singed transactions and incoming receipts for some chunk/shard on top of /// given trie and the given state root. /// If the validator accounts update is provided, updates validators accounts. @@ -1120,11 +1161,19 @@ impl Runtime { }); } + let gas_used_for_migrations = + if apply_state.migration_context.is_first_block_with_current_version { + self.apply_migrations(&mut state_update, apply_state) + .map_err(|e| RuntimeError::StorageError(e))? + } else { + 0 as Gas + }; + let mut outgoing_receipts = Vec::new(); let mut validator_proposals = vec![]; let mut local_receipts = vec![]; let mut outcomes = vec![]; - let mut total_gas_burnt = 0; + let mut total_gas_burnt = gas_used_for_migrations; for signed_transaction in transactions { let (receipt, outcome_with_id) = self.process_transaction( @@ -1557,6 +1606,7 @@ mod tests { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: ProfileData::new_enabled(), + migration_context: Default::default(), }; (runtime, tries, root, apply_state, signer, MockEpochInfoProvider::default()) diff --git a/runtime/runtime/src/state_viewer/mod.rs b/runtime/runtime/src/state_viewer/mod.rs index eea7f84ecf7..33c7fa5184d 100644 --- a/runtime/runtime/src/state_viewer/mod.rs +++ b/runtime/runtime/src/state_viewer/mod.rs @@ -225,6 +225,7 @@ impl TrieViewer { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: view_state.evm_chain_id, profile: Default::default(), + migration_context: Default::default(), }; let action_receipt = ActionReceipt { signer_id: originator_id.clone(), diff --git a/runtime/runtime/tests/runtime_group_tools/mod.rs b/runtime/runtime/tests/runtime_group_tools/mod.rs index 48f3532250c..329c48080b8 100644 --- a/runtime/runtime/tests/runtime_group_tools/mod.rs +++ b/runtime/runtime/tests/runtime_group_tools/mod.rs @@ -73,6 +73,7 @@ impl StandaloneRuntime { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: Default::default(), + migration_context: Default::default(), }; Self { diff --git a/test-utils/testlib/src/user/runtime_user.rs b/test-utils/testlib/src/user/runtime_user.rs index 1aac9fa9943..848cd0257ca 100644 --- a/test-utils/testlib/src/user/runtime_user.rs +++ b/test-utils/testlib/src/user/runtime_user.rs @@ -143,6 +143,7 @@ impl RuntimeUser { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: TESTNET_EVM_CHAIN_ID, profile: Default::default(), + migration_context: Default::default(), } } diff --git a/tools/storage-usage-delta-calculator/Cargo.toml b/tools/storage-usage-delta-calculator/Cargo.toml new file mode 100644 index 00000000000..a8c2c20ddba --- /dev/null +++ b/tools/storage-usage-delta-calculator/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "storage-usage-delta-calculator" +version = "0.1.0" +authors = ["Egor Kulikov "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde_json = "1.0" +log = "0.4" +env_logger = "0.8" + +near-chain-configs = { path = "../../core/chain-configs" } +near-primitives = { path = "../../core/primitives" } +node-runtime = { path = "../../runtime/runtime" } diff --git a/tools/storage-usage-delta-calculator/src/main.rs b/tools/storage-usage-delta-calculator/src/main.rs new file mode 100644 index 00000000000..17ae83a6efa --- /dev/null +++ b/tools/storage-usage-delta-calculator/src/main.rs @@ -0,0 +1,39 @@ +use log::{debug, LevelFilter}; +use near_chain_configs::Genesis; +use near_primitives::runtime::config::RuntimeConfig; +use near_primitives::state_record::StateRecord; +use node_runtime::Runtime; +use std::fs::File; +use std::io::Error; + +/// Calculates delta between actual storage usage and one saved in state +/// output.json should contain dump of current state, +/// run state-viewer --home ~/.near/mainnet/ dump_state +/// to get it +fn main() -> Result<(), Error> { + env_logger::Builder::new().filter(None, LevelFilter::Debug).init(); + + debug!("Start"); + + let genesis = Genesis::from_file("output.json"); + debug!("Genesis read"); + + let storage_usage = + Runtime::new().compute_storage_usage(&genesis.records.0[..], &RuntimeConfig::default()); + debug!("Storage usage calculated"); + + let mut result = Vec::new(); + for record in genesis.records.0 { + if let StateRecord::Account { account_id, account } = record { + let actual_storage_usage = storage_usage.get(account_id.as_str()).unwrap(); + let saved_storage_usage = account.storage_usage(); + let delta = actual_storage_usage - saved_storage_usage; + if delta != 0 { + debug!("{},{}", account_id, delta); + result.push((account_id.clone(), delta)); + } + } + } + serde_json::to_writer_pretty(&File::create("storage_usage_delta.json")?, &result)?; + Ok(()) +} From c24c930ad015fa5d491d060d1c39122c8591a920 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 4 May 2021 22:35:51 +0200 Subject: [PATCH 002/109] Sanity test --- neard/src/migrations.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 7dae3399924..f8b491d8eba 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -281,3 +281,25 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { }, } } + +#[cfg(test)] +mod tests { + use super::*; + #[cfg(feature = "protocol_feature_fix_storage_usage")] + use near_primitives::hash::hash; + #[cfg(feature = "protocol_feature_fix_storage_usage")] + use near_primitives::serialize::to_base; + + #[test] + #[cfg(feature = "protocol_feature_fix_storage_usage")] + fn test_migration_data() { + assert_eq!( + to_base(&hash(&MAINNET_STORAGE_USAGE_DELTA)), + "6CFkdSZZVj4v83cMPD3z6Y8XSQhDh3EQjFh3PRAqFEAx" + ); + let mainnet_migration_data = load_migration_data(&"mainnet".to_string()); + assert_eq!(mainnet_migration_data.storage_usage_delta.len(), 3112); + let testnet_migration_data = load_migration_data(&"testnet".to_string()); + assert_eq!(testnet_migration_data.storage_usage_delta.len(), 0); + } +} From 4e762c722f8c3c17c60f52d70c163bf3f37f6cfd Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 4 May 2021 23:29:41 +0200 Subject: [PATCH 003/109] Compilation fix, added description to migration cause --- chain/rosetta-rpc/src/adapters/mod.rs | 3 +++ core/primitives/src/types.rs | 2 +- core/primitives/src/views.rs | 6 ++++-- runtime/runtime/src/lib.rs | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/chain/rosetta-rpc/src/adapters/mod.rs b/chain/rosetta-rpc/src/adapters/mod.rs index ea90704976e..8d1496111e2 100644 --- a/chain/rosetta-rpc/src/adapters/mod.rs +++ b/chain/rosetta-rpc/src/adapters/mod.rs @@ -186,6 +186,9 @@ fn convert_block_changes_to_transactions( "State Change 'NotWritableToDisk' should never be observed".to_string(), )); } + StateChangeCauseView::Migration { description } => { + format!("migration due to {}", description); + } }; let current_transaction = diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index 7da4e91d8cb..bf0780f0204 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -154,7 +154,7 @@ pub enum StateChangeCause { ValidatorAccountsUpdate, /// State change that is happens due to migration that happens in first block of an epoch /// after protocol upgrade - Migration, + Migration { description: String }, } /// This represents the committed changes in the Trie with a change cause. diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index cd2a4a36095..63d5062b4d4 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -1481,7 +1481,7 @@ pub enum StateChangeCauseView { PostponedReceipt { receipt_hash: CryptoHash }, UpdatedDelayedReceipts, ValidatorAccountsUpdate, - Migration, + Migration { description: String }, } impl From for StateChangeCauseView { @@ -1506,7 +1506,9 @@ impl From for StateChangeCauseView { } StateChangeCause::UpdatedDelayedReceipts => Self::UpdatedDelayedReceipts, StateChangeCause::ValidatorAccountsUpdate => Self::ValidatorAccountsUpdate, - StateChangeCause::Migration => Self::Migration, + StateChangeCause::Migration { description } => { + Self::Migration { description: description.clone() } + } } } } diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 95fc2867222..051b0ada2f7 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1104,7 +1104,8 @@ impl Runtime { } } gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; - state_update.commit(StateChangeCause::Migration); + state_update + .commit(StateChangeCause::Migration { description: "Storage usage fix".to_string }); } #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] (state_update, apply_state); From 91d6ef882e1d1ff9eebbe8c8986383e9f79858bd Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 4 May 2021 23:39:33 +0200 Subject: [PATCH 004/109] Added feature to root cargo --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3b5c4f1e742..dbaba61cf8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -109,7 +109,7 @@ metric_recorder = ["neard/metric_recorder"] delay_detector = ["neard/delay_detector"] rosetta_rpc = ["neard/rosetta_rpc"] nightly_protocol = ["near-primitives/nightly_protocol", "near-jsonrpc/nightly_protocol", "testlib/nightly_protocol", "neard/nightly_protocol"] -nightly_protocol_features = ["nightly_protocol", "neard/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "testlib/nightly_protocol_features"] +nightly_protocol_features = ["nightly_protocol", "neard/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "testlib/nightly_protocol_features", "protocol_feature_fix_storage_usage"] protocol_feature_evm = ["neard/protocol_feature_evm", "testlib/protocol_feature_evm", "runtime-params-estimator/protocol_feature_evm"] protocol_feature_alt_bn128 = ["neard/protocol_feature_alt_bn128", "testlib/protocol_feature_alt_bn128", "runtime-params-estimator/protocol_feature_alt_bn128"] protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] From 329976285e2c05d9dd1b557fe590064833a41409 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 00:20:22 +0200 Subject: [PATCH 005/109] Compilation fix --- chain/rosetta-rpc/src/adapters/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/rosetta-rpc/src/adapters/mod.rs b/chain/rosetta-rpc/src/adapters/mod.rs index 8d1496111e2..0938ab9696f 100644 --- a/chain/rosetta-rpc/src/adapters/mod.rs +++ b/chain/rosetta-rpc/src/adapters/mod.rs @@ -187,7 +187,7 @@ fn convert_block_changes_to_transactions( )); } StateChangeCauseView::Migration { description } => { - format!("migration due to {}", description); + format!("migration due to {}", description) } }; From 45a9802d035298e75c897e8d3ddb66ea640f4ff7 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 00:48:02 +0200 Subject: [PATCH 006/109] Compilation fix --- neard/src/migrations.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index f8b491d8eba..1a72125a41b 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -284,6 +284,7 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { #[cfg(test)] mod tests { + #[cfg(feature = "protocol_feature_fix_storage_usage")] use super::*; #[cfg(feature = "protocol_feature_fix_storage_usage")] use near_primitives::hash::hash; From 8c42e7af737d8006919e8a4f12dc121dfa41bb42 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 10:12:17 +0200 Subject: [PATCH 007/109] Compilation fix --- runtime/runtime/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 051b0ada2f7..17389642897 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1104,8 +1104,9 @@ impl Runtime { } } gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; - state_update - .commit(StateChangeCause::Migration { description: "Storage usage fix".to_string }); + state_update.commit(StateChangeCause::Migration { + description: "Storage usage fix".to_string(), + }); } #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] (state_update, apply_state); From 4f8363b144a677d7fc8bbfe20ec7cd22b3d86990 Mon Sep 17 00:00:00 2001 From: EgorKulikov Date: Wed, 5 May 2021 11:50:31 +0200 Subject: [PATCH 008/109] Update core/primitives/src/views.rs Co-authored-by: Aleksey Kladov --- core/primitives/src/views.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index 63d5062b4d4..d25f0c36f91 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -1507,7 +1507,7 @@ impl From for StateChangeCauseView { StateChangeCause::UpdatedDelayedReceipts => Self::UpdatedDelayedReceipts, StateChangeCause::ValidatorAccountsUpdate => Self::ValidatorAccountsUpdate, StateChangeCause::Migration { description } => { - Self::Migration { description: description.clone() } + Self::Migration { description } } } } From 3a7426db272f681830521fadc393807a8606f222 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 12:01:29 +0200 Subject: [PATCH 009/109] Suggestions by matklad --- chain/rosetta-rpc/src/adapters/mod.rs | 4 ++-- core/primitives/src/runtime/migration_data.rs | 16 +++------------- core/primitives/src/types.rs | 17 ++++++++++++++++- core/primitives/src/views.rs | 12 +++++------- neard/src/runtime/mod.rs | 2 +- runtime/runtime/src/lib.rs | 6 +++--- 6 files changed, 30 insertions(+), 27 deletions(-) diff --git a/chain/rosetta-rpc/src/adapters/mod.rs b/chain/rosetta-rpc/src/adapters/mod.rs index 0938ab9696f..31f9cd2bdfa 100644 --- a/chain/rosetta-rpc/src/adapters/mod.rs +++ b/chain/rosetta-rpc/src/adapters/mod.rs @@ -186,8 +186,8 @@ fn convert_block_changes_to_transactions( "State Change 'NotWritableToDisk' should never be observed".to_string(), )); } - StateChangeCauseView::Migration { description } => { - format!("migration due to {}", description) + StateChangeCauseView::Migration { migration_id } => { + format!("migration due to {}", migration_id) } }; diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index bb2bc596cc4..816abc6a79e 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -4,32 +4,22 @@ use std::fmt; use std::fmt::{Debug, Formatter}; use std::sync::Arc; +#[derive(Default)] pub struct MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] pub storage_usage_delta: Vec<(AccountId, u64)>, } impl MigrationData { - pub const EMPTY: MigrationData = MigrationData { - #[cfg(feature = "protocol_feature_fix_storage_usage")] - storage_usage_delta: Vec::new(), - }; + pub const EMPTY: MigrationData = Default::default(); } +#[derive(Default)] pub struct MigrationContext { pub is_first_block_with_current_version: bool, pub migration_data: Arc, } -impl Default for MigrationContext { - fn default() -> Self { - MigrationContext { - is_first_block_with_current_version: false, - migration_data: Arc::new(MigrationData::EMPTY), - } - } -} - impl Debug for MigrationContext { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { f.debug_struct("MigrationContext") diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index bf0780f0204..917d6a73118 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -13,6 +13,8 @@ use crate::trie_key::TrieKey; /// Reexport primitive types pub use near_primitives_core::types::*; +use std::fmt; +use std::fmt::Formatter; /// Hash used by to store state root. pub type StateRoot = CryptoHash; @@ -154,7 +156,20 @@ pub enum StateChangeCause { ValidatorAccountsUpdate, /// State change that is happens due to migration that happens in first block of an epoch /// after protocol upgrade - Migration { description: String }, + Migration { migration_id: MigrationId }, +} + +#[derive(Serialize, Deserialize, Clone)] +pub enum MigrationId { + StorageUsageFix, +} + +impl fmt::Display for MigrationId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + Self::StorageUsageFix => write!(f, "Storage usage fix"), + } + } } /// This represents the committed changes in the Trie with a change cause. diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index d25f0c36f91..5c5cca6138d 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -44,9 +44,9 @@ use crate::transaction::{ }; use crate::types::{ AccountId, AccountWithPublicKey, Balance, BlockHeight, CompiledContractCache, EpochHeight, - EpochId, FunctionArgs, Gas, Nonce, NumBlocks, ShardId, StateChangeCause, StateChangeKind, - StateChangeValue, StateChangeWithCause, StateChangesRequest, StateRoot, StorageUsage, StoreKey, - StoreValue, ValidatorKickoutReason, + EpochId, FunctionArgs, Gas, MigrationId, Nonce, NumBlocks, ShardId, StateChangeCause, + StateChangeKind, StateChangeValue, StateChangeWithCause, StateChangesRequest, StateRoot, + StorageUsage, StoreKey, StoreValue, ValidatorKickoutReason, }; use crate::version::{ProtocolVersion, Version}; use validator_stake_view::ValidatorStakeView; @@ -1481,7 +1481,7 @@ pub enum StateChangeCauseView { PostponedReceipt { receipt_hash: CryptoHash }, UpdatedDelayedReceipts, ValidatorAccountsUpdate, - Migration { description: String }, + Migration { migration_id: MigrationId }, } impl From for StateChangeCauseView { @@ -1506,9 +1506,7 @@ impl From for StateChangeCauseView { } StateChangeCause::UpdatedDelayedReceipts => Self::UpdatedDelayedReceipts, StateChangeCause::ValidatorAccountsUpdate => Self::ValidatorAccountsUpdate, - StateChangeCause::Migration { description } => { - Self::Migration { description } - } + StateChangeCause::Migration { migration_id } => Self::Migration { migration_id }, } } } diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 2c9f1967a92..9f0f98a9c72 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -431,7 +431,7 @@ impl NightshadeRuntime { migration_context: MigrationContext { is_first_block_with_current_version: current_protocol_version != prev_block_protocol_version, - migration_data: self.migration_data.clone(), + migration_data: Arc::clone(&self.migration_data), }, }; diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 17389642897..4d506b31c25 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -51,6 +51,7 @@ use crate::verifier::validate_receipt; pub use crate::verifier::{validate_transaction, verify_and_charge_transaction}; pub use near_primitives::runtime::apply_state::ApplyState; use near_primitives::runtime::fees::RuntimeFeesConfig; +use near_primitives::types::MigrationId; use near_primitives::version::{ is_implicit_account_creation_enabled, ProtocolFeature, ProtocolVersion, }; @@ -1104,9 +1105,8 @@ impl Runtime { } } gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; - state_update.commit(StateChangeCause::Migration { - description: "Storage usage fix".to_string(), - }); + state_update + .commit(StateChangeCause::Migration { migration_id: MigrationId::StorageUsageFix }); } #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] (state_update, apply_state); From 3817c08ffb19e5a1e59ca20ae1765a0bf545f307 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 12:09:10 +0200 Subject: [PATCH 010/109] Suggestions by matklad --- core/primitives/src/runtime/migration_data.rs | 5 ++++- core/primitives/src/types.rs | 8 +++++++- runtime/runtime/src/lib.rs | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index 816abc6a79e..2474e39882e 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -11,7 +11,10 @@ pub struct MigrationData { } impl MigrationData { - pub const EMPTY: MigrationData = Default::default(); + pub const EMPTY: MigrationData = MigrationData { + #[cfg(feature = "protocol_feature_fix_storage_usage")] + storage_usage_delta: Vec::new(), + }; } #[derive(Default)] diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index 917d6a73118..4f7908a06b0 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -159,7 +159,7 @@ pub enum StateChangeCause { Migration { migration_id: MigrationId }, } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize, Clone, BorshSerialize, BorshDeserialize)] pub enum MigrationId { StorageUsageFix, } @@ -172,6 +172,12 @@ impl fmt::Display for MigrationId { } } +impl fmt::Debug for MigrationId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + (self as &dyn fmt::Display).fmt(f) + } +} + /// This represents the committed changes in the Trie with a change cause. #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] pub struct RawStateChange { diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 4d506b31c25..c0f40476adb 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -51,6 +51,7 @@ use crate::verifier::validate_receipt; pub use crate::verifier::{validate_transaction, verify_and_charge_transaction}; pub use near_primitives::runtime::apply_state::ApplyState; use near_primitives::runtime::fees::RuntimeFeesConfig; +#[cfg(feature = "protocol_feature_fix_storage_usage")] use near_primitives::types::MigrationId; use near_primitives::version::{ is_implicit_account_creation_enabled, ProtocolFeature, ProtocolVersion, From d7e903fd650a14b873e9760d87ec40051f3e4e96 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 12:35:43 +0200 Subject: [PATCH 011/109] Removing unneeded trait --- core/primitives/src/types.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index 4f7908a06b0..36bdd78a5cd 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -164,7 +164,7 @@ pub enum MigrationId { StorageUsageFix, } -impl fmt::Display for MigrationId { +impl fmt::Debug for MigrationId { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { Self::StorageUsageFix => write!(f, "Storage usage fix"), @@ -172,12 +172,6 @@ impl fmt::Display for MigrationId { } } -impl fmt::Debug for MigrationId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - (self as &dyn fmt::Display).fmt(f) - } -} - /// This represents the committed changes in the Trie with a change cause. #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] pub struct RawStateChange { From af8d2fe984f3c19c88daf9d538e7b92f1427409b Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 12:40:13 +0200 Subject: [PATCH 012/109] Additional comment --- neard/src/migrations.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 1a72125a41b..069505ec936 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -266,6 +266,7 @@ lazy_static_include::lazy_static_include_bytes! { /// File with account ids and deltas that need to be applied in order to fix storage usage /// difference between actual and stored usage, introduced due to bug in access key deletion, /// see https://github.com/near/nearcore/issues/3824 + /// This file was generated using tools/storage-usage-delta-calculator MAINNET_STORAGE_USAGE_DELTA => "res/storage_usage_delta.json", } From f32b999f0262579e2ec8680e3c2e9e3664abf756 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 15:14:42 +0300 Subject: [PATCH 013/109] Take receipts from stub file --- chain/chain/src/chain.rs | 10 ++++++++++ neard/res/fix_apply_chunks_receipts.json | 0 2 files changed, 10 insertions(+) create mode 100644 neard/res/fix_apply_chunks_receipts.json diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 4b25321fa01..8829f994393 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2737,6 +2737,16 @@ impl<'a> ChainUpdate<'a> { let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; + if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) + && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { + let mut receipt_result = HashMap::default(); + let receipts_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipts = serde_json::from_str::>(receipts_json).expect("File with receipts restored after apply_chunks fix have to be correct"); + // let rxs_read = >::try_from_slice(bytes).unwrap(); + receipt_result.insert(0, receipts); + self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); + } + for (shard_id, (chunk_header, prev_chunk_header)) in (block.chunks().iter().zip(prev_block.chunks().iter())).enumerate() { diff --git a/neard/res/fix_apply_chunks_receipts.json b/neard/res/fix_apply_chunks_receipts.json new file mode 100644 index 00000000000..e69de29bb2d From 4449613730692eeda2040958950d7bb322fe158e Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 29 Apr 2021 15:26:51 +0300 Subject: [PATCH 014/109] Fix import --- Cargo.lock | 1 + chain/chain/Cargo.toml | 1 + chain/chain/src/chain.rs | 8 +++++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1bae25c37f5..b06880c5c3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3017,6 +3017,7 @@ dependencies = [ "num-rational", "rand 0.7.3", "serde", + "serde_json", "strum", "thiserror", "tracing", diff --git a/chain/chain/Cargo.toml b/chain/chain/Cargo.toml index 34d2b13848c..ed0124b952c 100644 --- a/chain/chain/Cargo.toml +++ b/chain/chain/Cargo.toml @@ -17,6 +17,7 @@ num-rational = "0.3" tracing = "0.1.13" thiserror = "1.0" strum = "0.20" +serde_json = "1" borsh = "0.8.1" diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 8829f994393..5fbbbd939b2 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -53,7 +53,6 @@ use near_primitives::types::{ ShardId, }; use near_primitives::unwrap_or_return; -#[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::version::ProtocolFeature; use near_primitives::views::{ ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, @@ -2737,11 +2736,14 @@ impl<'a> ChainUpdate<'a> { let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; + // Re-introduce receipts missing before apply_chunks fix (see https://github.com/near/nearcore/pull/4228) if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) - && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { + && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() + { let mut receipt_result = HashMap::default(); let receipts_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); - let receipts = serde_json::from_str::>(receipts_json).expect("File with receipts restored after apply_chunks fix have to be correct"); + let receipts = serde_json::from_str::>(receipts_json) + .expect("File with receipts restored after apply_chunks fix have to be correct"); // let rxs_read = >::try_from_slice(bytes).unwrap(); receipt_result.insert(0, receipts); self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); From 50a8da2eba388371d02fd36fe294fe6c67ab758c Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 15:16:45 +0300 Subject: [PATCH 015/109] Add script for verifying receipts --- Cargo.lock | 12 + Cargo.toml | 3 +- neard/res/fix_apply_chunks_receipts.json | 8749 ++++++++++++++++++ utils/restored-receipts-verifier/Cargo.toml | 16 + utils/restored-receipts-verifier/src/main.rs | 116 + 5 files changed, 8895 insertions(+), 1 deletion(-) create mode 100644 utils/restored-receipts-verifier/Cargo.toml create mode 100644 utils/restored-receipts-verifier/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index b06880c5c3b..6d02394fddf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4767,6 +4767,18 @@ dependencies = [ "testlib", ] +[[package]] +name = "restored-receipts-verifier" +version = "0.1.0" +dependencies = [ + "clap 2.33.3", + "near-chain", + "near-primitives", + "near-store", + "neard", + "serde_json", +] + [[package]] name = "ring" version = "0.16.20" diff --git a/Cargo.toml b/Cargo.toml index dbaba61cf8c..88ab5aac6dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,8 @@ members = [ "tools/restaked", "tools/indexer/example", "tools/delay_detector", - "tools/storage-usage-delta-calculator" + "tools/storage-usage-delta-calculator", + "utils/restored-receipts-verifier" ] [dev-dependencies] diff --git a/neard/res/fix_apply_chunks_receipts.json b/neard/res/fix_apply_chunks_receipts.json index e69de29bb2d..7b60c52ed2e 100644 --- a/neard/res/fix_apply_chunks_receipts.json +++ b/neard/res/fix_apply_chunks_receipts.json @@ -0,0 +1,8749 @@ +{ + "0": [ + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "7WEzUsFtzkFpVSic4vRZcG8Y19p2Y8QpwCi3NxzBHDj8", + "receipt": { + "Action": { + "signer_id": "8e41bf0bd25afc7f1a433f8697144d043ed751369086304a95c2d18294306b5b", + "signer_public_key": "ed25519:AaK3HcMvzxDCTK36f313m3tFrL2e7MCzxmttGotJ7ytE", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "Xf9QBkyAfxMhjAeFkSDR2nW8YAeRPbRAZjXxgEk15H6", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI4ZTQxYmYwYmQyNWFmYzdmMWE0MzNmODY5NzE0NGQwNDNlZDc1MTM2OTA4NjMwNGE5NWMyZDE4Mjk0MzA2YjViIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "9A9j7Zc5rCaUfRUz9uiiyz1Eqhd2LTAWfsxYPxw1NxEr", + "receipt": { + "Action": { + "signer_id": "8e41bf0bd25afc7f1a433f8697144d043ed751369086304a95c2d18294306b5b", + "signer_public_key": "ed25519:AaK3HcMvzxDCTK36f313m3tFrL2e7MCzxmttGotJ7ytE", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "Xf9QBkyAfxMhjAeFkSDR2nW8YAeRPbRAZjXxgEk15H6" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI4ZTQxYmYwYmQyNWFmYzdmMWE0MzNmODY5NzE0NGQwNDNlZDc1MTM2OTA4NjMwNGE5NWMyZDE4Mjk0MzA2YjViIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8e41bf0bd25afc7f1a433f8697144d043ed751369086304a95c2d18294306b5b", + "receipt_id": "GM1eVjC8U6krA6uN2xxGoYBKj5UCDSAg7nMPfx5UJrzb", + "receipt": { + "Action": { + "signer_id": "8e41bf0bd25afc7f1a433f8697144d043ed751369086304a95c2d18294306b5b", + "signer_public_key": "ed25519:AaK3HcMvzxDCTK36f313m3tFrL2e7MCzxmttGotJ7ytE", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5775133625563966418790" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "FLTGRxYW3VGJCaVvPLXLDSTpezGrHFqVHxPzuVgU22mv", + "receipt": { + "Action": { + "signer_id": "f259745440ddbe754409af393195e59654b3595731d1207eebf12c1835444145", + "signer_public_key": "ed25519:HK2n48XXnW4fD66HFemhY6noaeMwzauvnK9WHk3fBiGk", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "9KjZNxSZUJ3XLbVt8YyQFDVxvBxP5hwPKkdjFDEPJ7yA", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmMjU5NzQ1NDQwZGRiZTc1NDQwOWFmMzkzMTk1ZTU5NjU0YjM1OTU3MzFkMTIwN2VlYmYxMmMxODM1NDQ0MTQ1IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "3SCbhx5E5hiESF5wJ5Nvo7gUba2ghxzHHkxvnHPH7SWT", + "receipt": { + "Action": { + "signer_id": "f259745440ddbe754409af393195e59654b3595731d1207eebf12c1835444145", + "signer_public_key": "ed25519:HK2n48XXnW4fD66HFemhY6noaeMwzauvnK9WHk3fBiGk", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "9KjZNxSZUJ3XLbVt8YyQFDVxvBxP5hwPKkdjFDEPJ7yA" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmMjU5NzQ1NDQwZGRiZTc1NDQwOWFmMzkzMTk1ZTU5NjU0YjM1OTU3MzFkMTIwN2VlYmYxMmMxODM1NDQ0MTQ1IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f259745440ddbe754409af393195e59654b3595731d1207eebf12c1835444145", + "receipt_id": "4RhWYnSzVZCJSqEM4vg1E3Ae3nj8hsbPdTyztPtHGane", + "receipt": { + "Action": { + "signer_id": "f259745440ddbe754409af393195e59654b3595731d1207eebf12c1835444145", + "signer_public_key": "ed25519:HK2n48XXnW4fD66HFemhY6noaeMwzauvnK9WHk3fBiGk", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "CpsvnQxCkxGG9k3ELqHyioyxjvqM3LxYobGqHmSbgP4M", + "receipt": { + "Action": { + "signer_id": "665fda562084fe42cfbb797a2ff0eb47f3b9e57a4ed070abdd7b958353194089", + "signer_public_key": "ed25519:7tdMm7iw6iutM3LrikJzfqaNp1zcsFQmYBWMgGzNR4Pr", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "DmeqnUe81ZCrdwk1mF2PLJF5MBnXf5nwq6MpmnXod9XA", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2NjVmZGE1NjIwODRmZTQyY2ZiYjc5N2EyZmYwZWI0N2YzYjllNTdhNGVkMDcwYWJkZDdiOTU4MzUzMTk0MDg5IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "GSXVxk2HtAPeR4xumXW26Jcy5MmedxKrg5dWAyo1ytaK", + "receipt": { + "Action": { + "signer_id": "665fda562084fe42cfbb797a2ff0eb47f3b9e57a4ed070abdd7b958353194089", + "signer_public_key": "ed25519:7tdMm7iw6iutM3LrikJzfqaNp1zcsFQmYBWMgGzNR4Pr", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "DmeqnUe81ZCrdwk1mF2PLJF5MBnXf5nwq6MpmnXod9XA" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2NjVmZGE1NjIwODRmZTQyY2ZiYjc5N2EyZmYwZWI0N2YzYjllNTdhNGVkMDcwYWJkZDdiOTU4MzUzMTk0MDg5IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "665fda562084fe42cfbb797a2ff0eb47f3b9e57a4ed070abdd7b958353194089", + "receipt_id": "5NAQ4JUWExVtHHLCBC8p5R5evAzF5P9wakSeTkmrotdi", + "receipt": { + "Action": { + "signer_id": "665fda562084fe42cfbb797a2ff0eb47f3b9e57a4ed070abdd7b958353194089", + "signer_public_key": "ed25519:7tdMm7iw6iutM3LrikJzfqaNp1zcsFQmYBWMgGzNR4Pr", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "BHh2UEHg4qWrQkQCBAq6CtzBBjEWQGK4RLHvb2KzvmMs", + "receipt": { + "Action": { + "signer_id": "9e1cf7a1181ddb552c4d97baf33ba788245d90cfacdf53b7ce4a1385864d7c08", + "signer_public_key": "ed25519:BeD32zXm5SFfxUkaamJ6bRNDXnP7b59DdDEYVUJzdbaw", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "EVYg66Mnw4riTVejwJigP8VtQfKExiFxG3Jbr9M8mXvC", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI5ZTFjZjdhMTE4MWRkYjU1MmM0ZDk3YmFmMzNiYTc4ODI0NWQ5MGNmYWNkZjUzYjdjZTRhMTM4NTg2NGQ3YzA4IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "8dxnRTnXaY8SCZ4BDHEyMzLgKYYRpAZRrnnohyD2bds5", + "receipt": { + "Action": { + "signer_id": "9e1cf7a1181ddb552c4d97baf33ba788245d90cfacdf53b7ce4a1385864d7c08", + "signer_public_key": "ed25519:BeD32zXm5SFfxUkaamJ6bRNDXnP7b59DdDEYVUJzdbaw", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "EVYg66Mnw4riTVejwJigP8VtQfKExiFxG3Jbr9M8mXvC" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI5ZTFjZjdhMTE4MWRkYjU1MmM0ZDk3YmFmMzNiYTc4ODI0NWQ5MGNmYWNkZjUzYjdjZTRhMTM4NTg2NGQ3YzA4IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9e1cf7a1181ddb552c4d97baf33ba788245d90cfacdf53b7ce4a1385864d7c08", + "receipt_id": "5LwXXAevURHBKXZYbuMrtkPfxzWztHhYuzWLsVeZPhrs", + "receipt": { + "Action": { + "signer_id": "9e1cf7a1181ddb552c4d97baf33ba788245d90cfacdf53b7ce4a1385864d7c08", + "signer_public_key": "ed25519:BeD32zXm5SFfxUkaamJ6bRNDXnP7b59DdDEYVUJzdbaw", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "4HuEsXREgtUCJsbb5nMR7LSsgvmAmnrtkAz4nFp5dD29", + "receipt": { + "Action": { + "signer_id": "c91e7bb8ebec8c634b415413e723c492cb0c37bea4710c9817a4aa3f42437307", + "signer_public_key": "ed25519:EY5ubZkZzojiwemgP64S5PhhpVodd1QqVKkw1bCNwTdQ", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "AUjrjwtDZEH6TNwcwKyXx87pnofZJsxCWmwCq5AAZdEG", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJjOTFlN2JiOGViZWM4YzYzNGI0MTU0MTNlNzIzYzQ5MmNiMGMzN2JlYTQ3MTBjOTgxN2E0YWEzZjQyNDM3MzA3IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "7U4xv5UuKc4YR8GEStsYH3yHYPwfwe6xDVLb7d32GRM", + "receipt": { + "Action": { + "signer_id": "c91e7bb8ebec8c634b415413e723c492cb0c37bea4710c9817a4aa3f42437307", + "signer_public_key": "ed25519:EY5ubZkZzojiwemgP64S5PhhpVodd1QqVKkw1bCNwTdQ", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "AUjrjwtDZEH6TNwcwKyXx87pnofZJsxCWmwCq5AAZdEG" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJjOTFlN2JiOGViZWM4YzYzNGI0MTU0MTNlNzIzYzQ5MmNiMGMzN2JlYTQ3MTBjOTgxN2E0YWEzZjQyNDM3MzA3IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c91e7bb8ebec8c634b415413e723c492cb0c37bea4710c9817a4aa3f42437307", + "receipt_id": "5w6bgotpzy179yUFVjWex8Rn7kVXKLgfPBU46dubetPF", + "receipt": { + "Action": { + "signer_id": "c91e7bb8ebec8c634b415413e723c492cb0c37bea4710c9817a4aa3f42437307", + "signer_public_key": "ed25519:EY5ubZkZzojiwemgP64S5PhhpVodd1QqVKkw1bCNwTdQ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "7rhZCLKSmwyGD1uHgV5cF4xSjEt6xKSPHrCbAMvaUwK2", + "receipt": { + "Action": { + "signer_id": "96868d0db4b1bf344d9758117c3ff54c24794af7687d70e01c6ae3caf6438fc3", + "signer_public_key": "ed25519:B8b9q9GwrXmQKJYq6uX2LWgVUz6JgK2neEGrDQ281Zii", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "DhPBhqt67J1U3wVGn2QqESwcqnGrzZMQyhWTNZN9NPQm", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI5Njg2OGQwZGI0YjFiZjM0NGQ5NzU4MTE3YzNmZjU0YzI0Nzk0YWY3Njg3ZDcwZTAxYzZhZTNjYWY2NDM4ZmMzIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "Bt67WMrbX1FmTX7hF7RVzRr2cXmqLcB4MtL9b1ELNksB", + "receipt": { + "Action": { + "signer_id": "96868d0db4b1bf344d9758117c3ff54c24794af7687d70e01c6ae3caf6438fc3", + "signer_public_key": "ed25519:B8b9q9GwrXmQKJYq6uX2LWgVUz6JgK2neEGrDQ281Zii", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "DhPBhqt67J1U3wVGn2QqESwcqnGrzZMQyhWTNZN9NPQm" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI5Njg2OGQwZGI0YjFiZjM0NGQ5NzU4MTE3YzNmZjU0YzI0Nzk0YWY3Njg3ZDcwZTAxYzZhZTNjYWY2NDM4ZmMzIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "96868d0db4b1bf344d9758117c3ff54c24794af7687d70e01c6ae3caf6438fc3", + "receipt_id": "65yBB2XVcuzBQxBrNy3xXooAbAVWgJFnAzD1MWVnYm5w", + "receipt": { + "Action": { + "signer_id": "96868d0db4b1bf344d9758117c3ff54c24794af7687d70e01c6ae3caf6438fc3", + "signer_public_key": "ed25519:B8b9q9GwrXmQKJYq6uX2LWgVUz6JgK2neEGrDQ281Zii", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "3g1mtQDFMv6rRZJrPuroQH7A5Wqobornd1tsZUB3Mt3i", + "receipt": { + "Action": { + "signer_id": "d1b4bdebb50fcf3a29707620f5143d6567a1f3d8b1a6daccab9d70b6f0f0e1fd", + "signer_public_key": "ed25519:F7c4MfBUxdhfbL3Vuck1iDEF6L8FFQhpmWxM6Y6DeZet", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "4fyMQ1ghscrgNd3kiCuyHjrJRUeSdNKiqjFQhQTcjo4U", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkMWI0YmRlYmI1MGZjZjNhMjk3MDc2MjBmNTE0M2Q2NTY3YTFmM2Q4YjFhNmRhY2NhYjlkNzBiNmYwZjBlMWZkIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "G8YWiNSJcQX7t3SYtqAWTZzWy5RmhkbNoKzv1FigwRU6", + "receipt": { + "Action": { + "signer_id": "d1b4bdebb50fcf3a29707620f5143d6567a1f3d8b1a6daccab9d70b6f0f0e1fd", + "signer_public_key": "ed25519:F7c4MfBUxdhfbL3Vuck1iDEF6L8FFQhpmWxM6Y6DeZet", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "4fyMQ1ghscrgNd3kiCuyHjrJRUeSdNKiqjFQhQTcjo4U" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkMWI0YmRlYmI1MGZjZjNhMjk3MDc2MjBmNTE0M2Q2NTY3YTFmM2Q4YjFhNmRhY2NhYjlkNzBiNmYwZjBlMWZkIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d1b4bdebb50fcf3a29707620f5143d6567a1f3d8b1a6daccab9d70b6f0f0e1fd", + "receipt_id": "FrhzkJ4yQVcj4UmRZRqmiuzLXv4D3zrJWXPxBY7QB2Cs", + "receipt": { + "Action": { + "signer_id": "d1b4bdebb50fcf3a29707620f5143d6567a1f3d8b1a6daccab9d70b6f0f0e1fd", + "signer_public_key": "ed25519:F7c4MfBUxdhfbL3Vuck1iDEF6L8FFQhpmWxM6Y6DeZet", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "9B7ovtuQQYbWzCgguLZRUhL5EAP6MQmXwHHXSUbLByCe", + "receipt": { + "Action": { + "signer_id": "aded10ace49471f43ea1b70766a5500d0366155a3fae62352462443abd8d2e73", + "signer_public_key": "ed25519:ChwCDLZr4f91AcaajQpxH2oigwZRLHDtoHfhhaQrtzHg", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "8i7ytmYEHWFowyeMkDAvjZzskbqomGNt6rVjifBtA4cx", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhZGVkMTBhY2U0OTQ3MWY0M2VhMWI3MDc2NmE1NTAwZDAzNjYxNTVhM2ZhZTYyMzUyNDYyNDQzYWJkOGQyZTczIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "3zUPNxLXpUSt9EBBdNSKe8UfYcqgtQoaqtvr7E1tNywR", + "receipt": { + "Action": { + "signer_id": "aded10ace49471f43ea1b70766a5500d0366155a3fae62352462443abd8d2e73", + "signer_public_key": "ed25519:ChwCDLZr4f91AcaajQpxH2oigwZRLHDtoHfhhaQrtzHg", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "8i7ytmYEHWFowyeMkDAvjZzskbqomGNt6rVjifBtA4cx" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhZGVkMTBhY2U0OTQ3MWY0M2VhMWI3MDc2NmE1NTAwZDAzNjYxNTVhM2ZhZTYyMzUyNDYyNDQzYWJkOGQyZTczIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "aded10ace49471f43ea1b70766a5500d0366155a3fae62352462443abd8d2e73", + "receipt_id": "AU4GsYdN6H4b3rKyAfYYVRBfmXuvKg1jJqabM89eQqPe", + "receipt": { + "Action": { + "signer_id": "aded10ace49471f43ea1b70766a5500d0366155a3fae62352462443abd8d2e73", + "signer_public_key": "ed25519:ChwCDLZr4f91AcaajQpxH2oigwZRLHDtoHfhhaQrtzHg", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "AC3xXafUpjX8yNjPjgNV7kHeJzXjQPiT6QEgoDtpNrc8", + "receipt": { + "Action": { + "signer_id": "45e271a4672463996edbe970b4392e544c6475cbd614ba6ef970e372993391c2", + "signer_public_key": "ed25519:5hoQADcP2N4JNNDgG7pFePtMGF1UK889Baj7vHmfTpjs", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "CkyHw4HKN6mNYyNxtaxkpQrpCEeWSom3x5FAXEg92frJ", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI0NWUyNzFhNDY3MjQ2Mzk5NmVkYmU5NzBiNDM5MmU1NDRjNjQ3NWNiZDYxNGJhNmVmOTcwZTM3Mjk5MzM5MWMyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "BDDm9G9hqWqpZyn6o3Nhvjz7uAnhcGtosFjAB9414LUG", + "receipt": { + "Action": { + "signer_id": "45e271a4672463996edbe970b4392e544c6475cbd614ba6ef970e372993391c2", + "signer_public_key": "ed25519:5hoQADcP2N4JNNDgG7pFePtMGF1UK889Baj7vHmfTpjs", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "CkyHw4HKN6mNYyNxtaxkpQrpCEeWSom3x5FAXEg92frJ" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI0NWUyNzFhNDY3MjQ2Mzk5NmVkYmU5NzBiNDM5MmU1NDRjNjQ3NWNiZDYxNGJhNmVmOTcwZTM3Mjk5MzM5MWMyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "45e271a4672463996edbe970b4392e544c6475cbd614ba6ef970e372993391c2", + "receipt_id": "EhoE4Y2xTouoktMNfeUf4fXZUrEvq2GpA26Zvt1tsJeF", + "receipt": { + "Action": { + "signer_id": "45e271a4672463996edbe970b4392e544c6475cbd614ba6ef970e372993391c2", + "signer_public_key": "ed25519:5hoQADcP2N4JNNDgG7pFePtMGF1UK889Baj7vHmfTpjs", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "3wCj7wvNM7kn483Hz6fypRio8iPaPefnBFKKZadDgyU4", + "receipt": { + "Action": { + "signer_id": "024d0c2be073ee5c67261aee66612b12f99cab7de4c9444364db2eba18c03463", + "signer_public_key": "ed25519:9yxV7s83e85jr8kBns1SVKFmZ5bwNoSH7uy6q3xn5ML", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "8ATMMbPYVkPo2tYVUhr2fbk4JpVoUV7w3V19BRePaqDX", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiIwMjRkMGMyYmUwNzNlZTVjNjcyNjFhZWU2NjYxMmIxMmY5OWNhYjdkZTRjOTQ0NDM2NGRiMmViYTE4YzAzNDYzIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "ChJvLzqmGmtj6Y7SVPAMJyF37npQegySBmpDjahpnbV2", + "receipt": { + "Action": { + "signer_id": "024d0c2be073ee5c67261aee66612b12f99cab7de4c9444364db2eba18c03463", + "signer_public_key": "ed25519:9yxV7s83e85jr8kBns1SVKFmZ5bwNoSH7uy6q3xn5ML", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "8ATMMbPYVkPo2tYVUhr2fbk4JpVoUV7w3V19BRePaqDX" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiIwMjRkMGMyYmUwNzNlZTVjNjcyNjFhZWU2NjYxMmIxMmY5OWNhYjdkZTRjOTQ0NDM2NGRiMmViYTE4YzAzNDYzIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "024d0c2be073ee5c67261aee66612b12f99cab7de4c9444364db2eba18c03463", + "receipt_id": "GAF8NUgHZgsiDriRKTDbvpHyW8QTeGNmkS78eKZ1RnvA", + "receipt": { + "Action": { + "signer_id": "024d0c2be073ee5c67261aee66612b12f99cab7de4c9444364db2eba18c03463", + "signer_public_key": "ed25519:9yxV7s83e85jr8kBns1SVKFmZ5bwNoSH7uy6q3xn5ML", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "FkGVsfCw16FpuPmQeXrmGxNjh9ybwPWGNrkASCrsGHCP", + "receipt": { + "Action": { + "signer_id": "d7f233fc4d32717dfc6adc35dcd35b9566be1423b869b8336374c714baa48181", + "signer_public_key": "ed25519:FXxrvCFpraE6YupfxA9Gw21SWDJjMbPwjKWHXueoYLm6", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "AfZQQ3d24wjgkYm7JqtSDyfvoesvumQkCDEHeLcFatKZ", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkN2YyMzNmYzRkMzI3MTdkZmM2YWRjMzVkY2QzNWI5NTY2YmUxNDIzYjg2OWI4MzM2Mzc0YzcxNGJhYTQ4MTgxIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "BcHYZhXM1QY4gcEkPN9bKywSPpSiNi1eU8hkTHRuoSKY", + "receipt": { + "Action": { + "signer_id": "d7f233fc4d32717dfc6adc35dcd35b9566be1423b869b8336374c714baa48181", + "signer_public_key": "ed25519:FXxrvCFpraE6YupfxA9Gw21SWDJjMbPwjKWHXueoYLm6", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "AfZQQ3d24wjgkYm7JqtSDyfvoesvumQkCDEHeLcFatKZ" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkN2YyMzNmYzRkMzI3MTdkZmM2YWRjMzVkY2QzNWI5NTY2YmUxNDIzYjg2OWI4MzM2Mzc0YzcxNGJhYTQ4MTgxIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d7f233fc4d32717dfc6adc35dcd35b9566be1423b869b8336374c714baa48181", + "receipt_id": "F1WoYrzK6x4eEtto6oEGDLrbHf4hcw8M72dm34N3kbsw", + "receipt": { + "Action": { + "signer_id": "d7f233fc4d32717dfc6adc35dcd35b9566be1423b869b8336374c714baa48181", + "signer_public_key": "ed25519:FXxrvCFpraE6YupfxA9Gw21SWDJjMbPwjKWHXueoYLm6", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "126jLBWSDoHVAy43ZRnbjdYFgVn8qX21JQAegy3AJ9dG", + "receipt": { + "Action": { + "signer_id": "a8542246f9268abcdb8109d3215a260e70c8879c7c54acd57768948a9a6fa979", + "signer_public_key": "ed25519:CL5uJDABW5SCXRN51gyvPMccTA9a5QzDqD7igkyF1i7z", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "ESevef5UhAov5afjKQavMBJEnuHjoHCZmxhJurLa1v12", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhODU0MjI0NmY5MjY4YWJjZGI4MTA5ZDMyMTVhMjYwZTcwYzg4NzljN2M1NGFjZDU3NzY4OTQ4YTlhNmZhOTc5IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "93PNwuWnLQSAfw5zx5YQUnbS4vddsJuBwNBSj5FJrq9g", + "receipt": { + "Action": { + "signer_id": "a8542246f9268abcdb8109d3215a260e70c8879c7c54acd57768948a9a6fa979", + "signer_public_key": "ed25519:CL5uJDABW5SCXRN51gyvPMccTA9a5QzDqD7igkyF1i7z", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "ESevef5UhAov5afjKQavMBJEnuHjoHCZmxhJurLa1v12" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhODU0MjI0NmY5MjY4YWJjZGI4MTA5ZDMyMTVhMjYwZTcwYzg4NzljN2M1NGFjZDU3NzY4OTQ4YTlhNmZhOTc5IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a8542246f9268abcdb8109d3215a260e70c8879c7c54acd57768948a9a6fa979", + "receipt_id": "4eChDED6dhdzFfZtq7Z2bV3EGK53uSPoRTvxBtxkiNg5", + "receipt": { + "Action": { + "signer_id": "a8542246f9268abcdb8109d3215a260e70c8879c7c54acd57768948a9a6fa979", + "signer_public_key": "ed25519:CL5uJDABW5SCXRN51gyvPMccTA9a5QzDqD7igkyF1i7z", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "BSPtFXuX9VWdem2YM3ktunSew5jHpZHwAKsKWXpPdjHr", + "receipt": { + "Action": { + "signer_id": "5b66e43149ae4c8a73baa693d2cca2b0e76b1beee9610e5f454a055eaf0f6540", + "signer_public_key": "ed25519:79o6hBaue6SjAsLCkpVz5Rk9rqFzhHUYSPxFrE8nKqyH", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "4Xm8ytqfQoUpb7MbmLaCV876JLE6Wrog9Bu19hykFJxs", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI1YjY2ZTQzMTQ5YWU0YzhhNzNiYWE2OTNkMmNjYTJiMGU3NmIxYmVlZTk2MTBlNWY0NTRhMDU1ZWFmMGY2NTQwIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "6zNuWyDqmYkaRTktT8iCWpbgUWjXcSvDcJbxq9N4ctX9", + "receipt": { + "Action": { + "signer_id": "5b66e43149ae4c8a73baa693d2cca2b0e76b1beee9610e5f454a055eaf0f6540", + "signer_public_key": "ed25519:79o6hBaue6SjAsLCkpVz5Rk9rqFzhHUYSPxFrE8nKqyH", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "4Xm8ytqfQoUpb7MbmLaCV876JLE6Wrog9Bu19hykFJxs" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI1YjY2ZTQzMTQ5YWU0YzhhNzNiYWE2OTNkMmNjYTJiMGU3NmIxYmVlZTk2MTBlNWY0NTRhMDU1ZWFmMGY2NTQwIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5b66e43149ae4c8a73baa693d2cca2b0e76b1beee9610e5f454a055eaf0f6540", + "receipt_id": "8ei4t6sX4tJS7g4Jp8vAgqKQzgi4CdVLtWJGRuy9zSZk", + "receipt": { + "Action": { + "signer_id": "5b66e43149ae4c8a73baa693d2cca2b0e76b1beee9610e5f454a055eaf0f6540", + "signer_public_key": "ed25519:79o6hBaue6SjAsLCkpVz5Rk9rqFzhHUYSPxFrE8nKqyH", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "E6HvHMwE9QLt77o426s5DseCvzvWp5NkeADWQ4yE7hte", + "receipt": { + "Action": { + "signer_id": "12e7194d1f35c20a07c188a7881cf092c1ae184e690fc3a9763d4f1635231fca", + "signer_public_key": "ed25519:2GnixzB6x1osnonp8A9x6UkjnLXgqt48CRQYCgEzSu3o", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "BUq3Hv3cFx1Wq37nLwmnCE2ikrjjTE1kLMsxhTdauQqE", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiIxMmU3MTk0ZDFmMzVjMjBhMDdjMTg4YTc4ODFjZjA5MmMxYWUxODRlNjkwZmMzYTk3NjNkNGYxNjM1MjMxZmNhIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "FRcUo5JcqWRrUH6wfCE5KzJzyNyCtK1Rd9YXQrtu7MjN", + "receipt": { + "Action": { + "signer_id": "12e7194d1f35c20a07c188a7881cf092c1ae184e690fc3a9763d4f1635231fca", + "signer_public_key": "ed25519:2GnixzB6x1osnonp8A9x6UkjnLXgqt48CRQYCgEzSu3o", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "BUq3Hv3cFx1Wq37nLwmnCE2ikrjjTE1kLMsxhTdauQqE" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiIxMmU3MTk0ZDFmMzVjMjBhMDdjMTg4YTc4ODFjZjA5MmMxYWUxODRlNjkwZmMzYTk3NjNkNGYxNjM1MjMxZmNhIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "12e7194d1f35c20a07c188a7881cf092c1ae184e690fc3a9763d4f1635231fca", + "receipt_id": "BJDYRFMsZjZ5SVSf2JsPgMGC2ekmiwLURJwkgJPyP3xR", + "receipt": { + "Action": { + "signer_id": "12e7194d1f35c20a07c188a7881cf092c1ae184e690fc3a9763d4f1635231fca", + "signer_public_key": "ed25519:2GnixzB6x1osnonp8A9x6UkjnLXgqt48CRQYCgEzSu3o", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "GFATWJJjmwWczAXf6xw3yhdWh3yEvkx2cwpfoWd7h7b2", + "receipt": { + "Action": { + "signer_id": "27e1b99da5956b968f4e18eef758bd3dd4c51d0bb39487dce611c7efbab97622", + "signer_public_key": "ed25519:3ggXtfxibkZBCznykcqbSLAN6RhtK4QGKSX2BnwPLqv9", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "DL6dsiDcSAx6Rf9Lw7YZ6XYUFWHzBSCu7CHkxRqxyajm", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiIyN2UxYjk5ZGE1OTU2Yjk2OGY0ZTE4ZWVmNzU4YmQzZGQ0YzUxZDBiYjM5NDg3ZGNlNjExYzdlZmJhYjk3NjIyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "8imDisv6DPXa8YWNztgYWXM4M3F9kkHBRipUui1t2zrz", + "receipt": { + "Action": { + "signer_id": "27e1b99da5956b968f4e18eef758bd3dd4c51d0bb39487dce611c7efbab97622", + "signer_public_key": "ed25519:3ggXtfxibkZBCznykcqbSLAN6RhtK4QGKSX2BnwPLqv9", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "DL6dsiDcSAx6Rf9Lw7YZ6XYUFWHzBSCu7CHkxRqxyajm" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiIyN2UxYjk5ZGE1OTU2Yjk2OGY0ZTE4ZWVmNzU4YmQzZGQ0YzUxZDBiYjM5NDg3ZGNlNjExYzdlZmJhYjk3NjIyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "27e1b99da5956b968f4e18eef758bd3dd4c51d0bb39487dce611c7efbab97622", + "receipt_id": "FYRXR44CKmynPVBaMCGSGS2gYCswUBWjZ6QetF9KNDMJ", + "receipt": { + "Action": { + "signer_id": "27e1b99da5956b968f4e18eef758bd3dd4c51d0bb39487dce611c7efbab97622", + "signer_public_key": "ed25519:3ggXtfxibkZBCznykcqbSLAN6RhtK4QGKSX2BnwPLqv9", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "DdXiFK5asLygRwkGtE5E5YfChMnbArK8ozZh6DjX8AvQ", + "receipt": { + "Action": { + "signer_id": "e6964cf50afb3b7d7e6b0da93d780d9df6f13e77b7239d64fd8178ba5c3c04d2", + "signer_public_key": "ed25519:GX7hS5YZ81wqmu8kzqWuCuKmpa2pSeBwaS2AJUrT13gu", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6ujmzShuCHfKUdyJ4rNcU2MVJkjpigRZfhiLftmv4Uug", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlNjk2NGNmNTBhZmIzYjdkN2U2YjBkYTkzZDc4MGQ5ZGY2ZjEzZTc3YjcyMzlkNjRmZDgxNzhiYTVjM2MwNGQyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "9rTpUwYqQyWQg6BXDAUabwuZqFTYoRY18gEMtL87AHJ", + "receipt": { + "Action": { + "signer_id": "e6964cf50afb3b7d7e6b0da93d780d9df6f13e77b7239d64fd8178ba5c3c04d2", + "signer_public_key": "ed25519:GX7hS5YZ81wqmu8kzqWuCuKmpa2pSeBwaS2AJUrT13gu", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6ujmzShuCHfKUdyJ4rNcU2MVJkjpigRZfhiLftmv4Uug" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlNjk2NGNmNTBhZmIzYjdkN2U2YjBkYTkzZDc4MGQ5ZGY2ZjEzZTc3YjcyMzlkNjRmZDgxNzhiYTVjM2MwNGQyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e6964cf50afb3b7d7e6b0da93d780d9df6f13e77b7239d64fd8178ba5c3c04d2", + "receipt_id": "2whRMGh4Bcj3PG1YQwTechaiM2qJRGeukq3ucUqjHvZ4", + "receipt": { + "Action": { + "signer_id": "e6964cf50afb3b7d7e6b0da93d780d9df6f13e77b7239d64fd8178ba5c3c04d2", + "signer_public_key": "ed25519:GX7hS5YZ81wqmu8kzqWuCuKmpa2pSeBwaS2AJUrT13gu", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "CABeaPods2v6d4wdGMMNQAWxLTXturMa8UYVw4Kb29a5", + "receipt": { + "Action": { + "signer_id": "e291748ca4f5f06fe6ada8d5bb72927dc53947ddf4714602a827f0839a1743c9", + "signer_public_key": "ed25519:GFRnJXk3XVqB21SexNAosuM9ESY5vvFK27PFPVR3HqiY", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6NrL97N8kEBYWV359wt1qCkm7aKodNw9nFEaVEsxJJC2", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlMjkxNzQ4Y2E0ZjVmMDZmZTZhZGE4ZDViYjcyOTI3ZGM1Mzk0N2RkZjQ3MTQ2MDJhODI3ZjA4MzlhMTc0M2M5IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "6Pbv7vTfnWc8hZHwXKPv3m2uGQyCK1qYKKUg6MrvCtgq", + "receipt": { + "Action": { + "signer_id": "e291748ca4f5f06fe6ada8d5bb72927dc53947ddf4714602a827f0839a1743c9", + "signer_public_key": "ed25519:GFRnJXk3XVqB21SexNAosuM9ESY5vvFK27PFPVR3HqiY", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6NrL97N8kEBYWV359wt1qCkm7aKodNw9nFEaVEsxJJC2" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlMjkxNzQ4Y2E0ZjVmMDZmZTZhZGE4ZDViYjcyOTI3ZGM1Mzk0N2RkZjQ3MTQ2MDJhODI3ZjA4MzlhMTc0M2M5IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e291748ca4f5f06fe6ada8d5bb72927dc53947ddf4714602a827f0839a1743c9", + "receipt_id": "FFaP2L22Bz2vKvLzfxPjFHoFJaYTkZanLCsACZv4KQNL", + "receipt": { + "Action": { + "signer_id": "e291748ca4f5f06fe6ada8d5bb72927dc53947ddf4714602a827f0839a1743c9", + "signer_public_key": "ed25519:GFRnJXk3XVqB21SexNAosuM9ESY5vvFK27PFPVR3HqiY", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "68Te51F9SjFZYHLLEfFhC1r6pbpLT5CpVToWxvDtG8po", + "receipt": { + "Action": { + "signer_id": "7b1c881095bdd0e63be8d3120fbd2e12b36c7386366d46cb8766fa20aa5a691c", + "signer_public_key": "ed25519:9HaP46YrvzigHL7fRiLLsLJdieVrnhjcCMW6RxAmKrnP", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "pnPCQ1ZbLiyyiLGip6WTjMRkHJWsR1ajSPCXJyCevdd", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI3YjFjODgxMDk1YmRkMGU2M2JlOGQzMTIwZmJkMmUxMmIzNmM3Mzg2MzY2ZDQ2Y2I4NzY2ZmEyMGFhNWE2OTFjIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "k8AWZp6v3oy1MB2iAYWcXoUHKrdivaZTPdJnP7gt5YY", + "receipt": { + "Action": { + "signer_id": "7b1c881095bdd0e63be8d3120fbd2e12b36c7386366d46cb8766fa20aa5a691c", + "signer_public_key": "ed25519:9HaP46YrvzigHL7fRiLLsLJdieVrnhjcCMW6RxAmKrnP", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "pnPCQ1ZbLiyyiLGip6WTjMRkHJWsR1ajSPCXJyCevdd" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI3YjFjODgxMDk1YmRkMGU2M2JlOGQzMTIwZmJkMmUxMmIzNmM3Mzg2MzY2ZDQ2Y2I4NzY2ZmEyMGFhNWE2OTFjIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "7b1c881095bdd0e63be8d3120fbd2e12b36c7386366d46cb8766fa20aa5a691c", + "receipt_id": "7ynNksQwsWb888DnzxR7j43i62WQZT3GX6jWmsMHCyf9", + "receipt": { + "Action": { + "signer_id": "7b1c881095bdd0e63be8d3120fbd2e12b36c7386366d46cb8766fa20aa5a691c", + "signer_public_key": "ed25519:9HaP46YrvzigHL7fRiLLsLJdieVrnhjcCMW6RxAmKrnP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "4yTQ6k4CdYLrcoCrBZuNiJgmfMyqyKcsRgz5kKTyRzqh", + "receipt": { + "Action": { + "signer_id": "f9d1087abb2e72f7e3899302915356832c918f4cac3344d39c9a0b54d3b19504", + "signer_public_key": "ed25519:HpBPRr2J1m7aUw92sLwMdCEztLsU64eVfiCaug1B22BM", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "55qrjmqCgmPxq8pSkbNHjmvfFPPdRj86TYBhNSN14BQG", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmOWQxMDg3YWJiMmU3MmY3ZTM4OTkzMDI5MTUzNTY4MzJjOTE4ZjRjYWMzMzQ0ZDM5YzlhMGI1NGQzYjE5NTA0IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "44PSDS2kSMyHRLpgQfMR8uNTEA8DrKPyH7LMCUdef5oK", + "receipt": { + "Action": { + "signer_id": "f9d1087abb2e72f7e3899302915356832c918f4cac3344d39c9a0b54d3b19504", + "signer_public_key": "ed25519:HpBPRr2J1m7aUw92sLwMdCEztLsU64eVfiCaug1B22BM", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "55qrjmqCgmPxq8pSkbNHjmvfFPPdRj86TYBhNSN14BQG" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmOWQxMDg3YWJiMmU3MmY3ZTM4OTkzMDI5MTUzNTY4MzJjOTE4ZjRjYWMzMzQ0ZDM5YzlhMGI1NGQzYjE5NTA0IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f9d1087abb2e72f7e3899302915356832c918f4cac3344d39c9a0b54d3b19504", + "receipt_id": "ENvf1J567ZVBbEZpYetH7wc1u5dGpRHFhCrMzpZE4b58", + "receipt": { + "Action": { + "signer_id": "f9d1087abb2e72f7e3899302915356832c918f4cac3344d39c9a0b54d3b19504", + "signer_public_key": "ed25519:HpBPRr2J1m7aUw92sLwMdCEztLsU64eVfiCaug1B22BM", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "z9bqpMMf6Z47jhfAYqMMZQrCgJJqYukgu4Wsu7NbKEh", + "receipt": { + "Action": { + "signer_id": "f8e98fefd6f7c06830f13ed768042f732a7030c39aa568e5eeb45162b63ed9bf", + "signer_public_key": "ed25519:Hkeg1v4JwgUKzoaAxRp4Qz2UybvhqhkrYyYPnJNTSu18", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "64hZTfY26N93V3QyG7CVaQkiY92ioYrftgSJSkKZk9hL", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmOGU5OGZlZmQ2ZjdjMDY4MzBmMTNlZDc2ODA0MmY3MzJhNzAzMGMzOWFhNTY4ZTVlZWI0NTE2MmI2M2VkOWJmIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "A4PpbYGxs2wAvXHjmDaQ55JfoBw6zUobMS8S2mJkWCxD", + "receipt": { + "Action": { + "signer_id": "f8e98fefd6f7c06830f13ed768042f732a7030c39aa568e5eeb45162b63ed9bf", + "signer_public_key": "ed25519:Hkeg1v4JwgUKzoaAxRp4Qz2UybvhqhkrYyYPnJNTSu18", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "64hZTfY26N93V3QyG7CVaQkiY92ioYrftgSJSkKZk9hL" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmOGU5OGZlZmQ2ZjdjMDY4MzBmMTNlZDc2ODA0MmY3MzJhNzAzMGMzOWFhNTY4ZTVlZWI0NTE2MmI2M2VkOWJmIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f8e98fefd6f7c06830f13ed768042f732a7030c39aa568e5eeb45162b63ed9bf", + "receipt_id": "7zBEEna1T9RNwF8uQjCgcBy5TBx5kVa8923aTeGHdYYq", + "receipt": { + "Action": { + "signer_id": "f8e98fefd6f7c06830f13ed768042f732a7030c39aa568e5eeb45162b63ed9bf", + "signer_public_key": "ed25519:Hkeg1v4JwgUKzoaAxRp4Qz2UybvhqhkrYyYPnJNTSu18", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "FnNNt3sZuEn28pCwnJ2crc2pFYaZDRoN4kpizKJQJJyz", + "receipt": { + "Action": { + "signer_id": "fe75433b6985ab37f6cfee452002cce76842304e938c4e4073652da3dfc22bc1", + "signer_public_key": "ed25519:J8JGFNK4YP6eFcb8ZsVSUizM2hqsNZPtVSt8SS6Aj2WC", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "5jsatDYVN5tFbcpbdPpETjAFKqgzG8xUq674tdwhuh1z", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmZTc1NDMzYjY5ODVhYjM3ZjZjZmVlNDUyMDAyY2NlNzY4NDIzMDRlOTM4YzRlNDA3MzY1MmRhM2RmYzIyYmMxIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "8hWafkKaMig2CFqfvEheLShSsKx471ZAjiB1VGJscGbQ", + "receipt": { + "Action": { + "signer_id": "fe75433b6985ab37f6cfee452002cce76842304e938c4e4073652da3dfc22bc1", + "signer_public_key": "ed25519:J8JGFNK4YP6eFcb8ZsVSUizM2hqsNZPtVSt8SS6Aj2WC", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "5jsatDYVN5tFbcpbdPpETjAFKqgzG8xUq674tdwhuh1z" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmZTc1NDMzYjY5ODVhYjM3ZjZjZmVlNDUyMDAyY2NlNzY4NDIzMDRlOTM4YzRlNDA3MzY1MmRhM2RmYzIyYmMxIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "fe75433b6985ab37f6cfee452002cce76842304e938c4e4073652da3dfc22bc1", + "receipt_id": "8aM3yh65g1VPxyqALVT68ygobsRw8SXDpDj6Kr8cnBru", + "receipt": { + "Action": { + "signer_id": "fe75433b6985ab37f6cfee452002cce76842304e938c4e4073652da3dfc22bc1", + "signer_public_key": "ed25519:J8JGFNK4YP6eFcb8ZsVSUizM2hqsNZPtVSt8SS6Aj2WC", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "CB6JJsDmEJCCyQ512tEaCk8BmStrDa9xSnCKaS2AEuBD", + "receipt": { + "Action": { + "signer_id": "da47ffc9d6490de39dece9519ff4a9c17851e94f4aaf7f1122fecbf025a2b712", + "signer_public_key": "ed25519:Fh5ZAVaqAWAuw6oWpqqnm2VP7nCTATFkDYYSjgBnX97P", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6WPdFpumY5JB4HBJxtZEmTPtJuTyXd2jwP58wGNBbM9k", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkYTQ3ZmZjOWQ2NDkwZGUzOWRlY2U5NTE5ZmY0YTljMTc4NTFlOTRmNGFhZjdmMTEyMmZlY2JmMDI1YTJiNzEyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "24sdwPdfYLuWwCNEA7B3wkgZGPxtFH6gpSFAnSQHqsEe", + "receipt": { + "Action": { + "signer_id": "da47ffc9d6490de39dece9519ff4a9c17851e94f4aaf7f1122fecbf025a2b712", + "signer_public_key": "ed25519:Fh5ZAVaqAWAuw6oWpqqnm2VP7nCTATFkDYYSjgBnX97P", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6WPdFpumY5JB4HBJxtZEmTPtJuTyXd2jwP58wGNBbM9k" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkYTQ3ZmZjOWQ2NDkwZGUzOWRlY2U5NTE5ZmY0YTljMTc4NTFlOTRmNGFhZjdmMTEyMmZlY2JmMDI1YTJiNzEyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "da47ffc9d6490de39dece9519ff4a9c17851e94f4aaf7f1122fecbf025a2b712", + "receipt_id": "AHDetUWD8sdXR9SCUQ5BFdEhP44MC6jXfiRe2VSmU3Kv", + "receipt": { + "Action": { + "signer_id": "da47ffc9d6490de39dece9519ff4a9c17851e94f4aaf7f1122fecbf025a2b712", + "signer_public_key": "ed25519:Fh5ZAVaqAWAuw6oWpqqnm2VP7nCTATFkDYYSjgBnX97P", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "F8b5k6z6aNJ5tn7YjgTmNhwWRpoTozeSvroQZXup1BFV", + "receipt": { + "Action": { + "signer_id": "4ce4deadc2705a5f4433bd12de089b27bf1b0c9d28ed86e66ffbab0049cb6474", + "signer_public_key": "ed25519:6BAQ89PW7i7PgLFfRjTAiqSSnTZqZzKe12NFP9tsw1Xy", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "8vw6vF7hdhx4dt1Li1BuuDhT3WvPjremqpKKsTAZcfiS", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI0Y2U0ZGVhZGMyNzA1YTVmNDQzM2JkMTJkZTA4OWIyN2JmMWIwYzlkMjhlZDg2ZTY2ZmZiYWIwMDQ5Y2I2NDc0IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "B53ZWDd84EMRASB53FRFrUT3R3Z7ucZkBLwfzts7myxz", + "receipt": { + "Action": { + "signer_id": "4ce4deadc2705a5f4433bd12de089b27bf1b0c9d28ed86e66ffbab0049cb6474", + "signer_public_key": "ed25519:6BAQ89PW7i7PgLFfRjTAiqSSnTZqZzKe12NFP9tsw1Xy", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "8vw6vF7hdhx4dt1Li1BuuDhT3WvPjremqpKKsTAZcfiS" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI0Y2U0ZGVhZGMyNzA1YTVmNDQzM2JkMTJkZTA4OWIyN2JmMWIwYzlkMjhlZDg2ZTY2ZmZiYWIwMDQ5Y2I2NDc0IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "4ce4deadc2705a5f4433bd12de089b27bf1b0c9d28ed86e66ffbab0049cb6474", + "receipt_id": "4BBzfo5sv7x9nvpkSqwh15tETS1zGfqALFbiAQN4qdu5", + "receipt": { + "Action": { + "signer_id": "4ce4deadc2705a5f4433bd12de089b27bf1b0c9d28ed86e66ffbab0049cb6474", + "signer_public_key": "ed25519:6BAQ89PW7i7PgLFfRjTAiqSSnTZqZzKe12NFP9tsw1Xy", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "29nccxmoMNXSVDUttPiDHdy6kdxVXiBWMUjqNv1uNSok", + "receipt": { + "Action": { + "signer_id": "68c4a3c5370fa876328343570bc44ca481444b100887978dde5bfb6ebbc42359", + "signer_public_key": "ed25519:83yJxxtS2KAGpzRqeECEqpscKrjG4bFG3nB5mieWq7bW", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "5F14zVDyxRFrcQ6DR2QJKEywfHBretqYQN2vXy3grajA", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2OGM0YTNjNTM3MGZhODc2MzI4MzQzNTcwYmM0NGNhNDgxNDQ0YjEwMDg4Nzk3OGRkZTViZmI2ZWJiYzQyMzU5IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "4ZYG8PZUvp4ciwUJHvefshUpPcJeKkRwRyjWwjCtqxGr", + "receipt": { + "Action": { + "signer_id": "68c4a3c5370fa876328343570bc44ca481444b100887978dde5bfb6ebbc42359", + "signer_public_key": "ed25519:83yJxxtS2KAGpzRqeECEqpscKrjG4bFG3nB5mieWq7bW", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "5F14zVDyxRFrcQ6DR2QJKEywfHBretqYQN2vXy3grajA" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2OGM0YTNjNTM3MGZhODc2MzI4MzQzNTcwYmM0NGNhNDgxNDQ0YjEwMDg4Nzk3OGRkZTViZmI2ZWJiYzQyMzU5IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "68c4a3c5370fa876328343570bc44ca481444b100887978dde5bfb6ebbc42359", + "receipt_id": "BoRmNLPHWk82Ru5gSGv5CKdt8rEyXmLXoeCGFfvLU6em", + "receipt": { + "Action": { + "signer_id": "68c4a3c5370fa876328343570bc44ca481444b100887978dde5bfb6ebbc42359", + "signer_public_key": "ed25519:83yJxxtS2KAGpzRqeECEqpscKrjG4bFG3nB5mieWq7bW", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "C5YaTXkWapPUKjLqu5KjXNn4uD8b8ztucHaNv5BpHztK", + "receipt": { + "Action": { + "signer_id": "b6600dae3575a2e71d8630ef81d4c42202a9dc732140f14e14d03177853002e2", + "signer_public_key": "ed25519:DGv9mSVPn1YF6Jt8bNaLHUbqbDsr7paiausXtDYdiRTP", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "36Xy6GXZrZqKQkk8gbumNgLQYF7rwD1k6tswCG3Dh1JL", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiNjYwMGRhZTM1NzVhMmU3MWQ4NjMwZWY4MWQ0YzQyMjAyYTlkYzczMjE0MGYxNGUxNGQwMzE3Nzg1MzAwMmUyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "HaDECLKDQYvtjnGkbAJjU1Mgrdvv141yRE6CGzDDi5B2", + "receipt": { + "Action": { + "signer_id": "b6600dae3575a2e71d8630ef81d4c42202a9dc732140f14e14d03177853002e2", + "signer_public_key": "ed25519:DGv9mSVPn1YF6Jt8bNaLHUbqbDsr7paiausXtDYdiRTP", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "36Xy6GXZrZqKQkk8gbumNgLQYF7rwD1k6tswCG3Dh1JL" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiNjYwMGRhZTM1NzVhMmU3MWQ4NjMwZWY4MWQ0YzQyMjAyYTlkYzczMjE0MGYxNGUxNGQwMzE3Nzg1MzAwMmUyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b6600dae3575a2e71d8630ef81d4c42202a9dc732140f14e14d03177853002e2", + "receipt_id": "Ay3YiT8XebJSMqTWomaqLU1uwpiwLUqKDqMNepyBo9by", + "receipt": { + "Action": { + "signer_id": "b6600dae3575a2e71d8630ef81d4c42202a9dc732140f14e14d03177853002e2", + "signer_public_key": "ed25519:DGv9mSVPn1YF6Jt8bNaLHUbqbDsr7paiausXtDYdiRTP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "3B2M96AW3QWKgrW2bvWjFKajbieALHb2hb5aKirTEnAJ", + "receipt": { + "Action": { + "signer_id": "ec960585471cbcb86a12339835d1e93007f567585ae8d46d29ceed5d576f61d8", + "signer_public_key": "ed25519:GvXtzqiutgqbkwhdW7xfHHqaawKwKCwTDhRKzzsHCVrP", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "9nb11V5f929WsZpviQobUJzbj9BKs5CTKy7qvbWPJp7X", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlYzk2MDU4NTQ3MWNiY2I4NmExMjMzOTgzNWQxZTkzMDA3ZjU2NzU4NWFlOGQ0NmQyOWNlZWQ1ZDU3NmY2MWQ4IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "6jXkb2hcgFh9kF1a9eFBrkyfvW3uHXC7rTVFuNWgPz5m", + "receipt": { + "Action": { + "signer_id": "ec960585471cbcb86a12339835d1e93007f567585ae8d46d29ceed5d576f61d8", + "signer_public_key": "ed25519:GvXtzqiutgqbkwhdW7xfHHqaawKwKCwTDhRKzzsHCVrP", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "9nb11V5f929WsZpviQobUJzbj9BKs5CTKy7qvbWPJp7X" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlYzk2MDU4NTQ3MWNiY2I4NmExMjMzOTgzNWQxZTkzMDA3ZjU2NzU4NWFlOGQ0NmQyOWNlZWQ1ZDU3NmY2MWQ4IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ec960585471cbcb86a12339835d1e93007f567585ae8d46d29ceed5d576f61d8", + "receipt_id": "BUbxMLvxBKCZR71NuEj2mnEjf77U4VitWoKHYrRxg1rh", + "receipt": { + "Action": { + "signer_id": "ec960585471cbcb86a12339835d1e93007f567585ae8d46d29ceed5d576f61d8", + "signer_public_key": "ed25519:GvXtzqiutgqbkwhdW7xfHHqaawKwKCwTDhRKzzsHCVrP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "ErfDTtYv5Hb3qQ2EjxkygXiZ3AfF36E6AZdQpZBpTrus", + "receipt": { + "Action": { + "signer_id": "83057af2467f8abef59d55540e406bcd59194b9e4dbed5ac05bcc2c321286232", + "signer_public_key": "ed25519:9pTFoQsYqi6FAK6x8uGMbg5FLayj1hZmWryGnGzYzbjo", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "7L7JEoQG9vgZ6PNQcaos1MZ6XEZCNctf6jr1UP8i3W1F", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI4MzA1N2FmMjQ2N2Y4YWJlZjU5ZDU1NTQwZTQwNmJjZDU5MTk0YjllNGRiZWQ1YWMwNWJjYzJjMzIxMjg2MjMyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "GkKaXeNhGHoB3bmMB6KxrWhhUmxPxRnmpajdRQSEVdMU", + "receipt": { + "Action": { + "signer_id": "83057af2467f8abef59d55540e406bcd59194b9e4dbed5ac05bcc2c321286232", + "signer_public_key": "ed25519:9pTFoQsYqi6FAK6x8uGMbg5FLayj1hZmWryGnGzYzbjo", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "7L7JEoQG9vgZ6PNQcaos1MZ6XEZCNctf6jr1UP8i3W1F" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI4MzA1N2FmMjQ2N2Y4YWJlZjU5ZDU1NTQwZTQwNmJjZDU5MTk0YjllNGRiZWQ1YWMwNWJjYzJjMzIxMjg2MjMyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "83057af2467f8abef59d55540e406bcd59194b9e4dbed5ac05bcc2c321286232", + "receipt_id": "2yBSngaPJt16zFUQsLkygxWaQQhwCpQkoWfYzAJQkdXS", + "receipt": { + "Action": { + "signer_id": "83057af2467f8abef59d55540e406bcd59194b9e4dbed5ac05bcc2c321286232", + "signer_public_key": "ed25519:9pTFoQsYqi6FAK6x8uGMbg5FLayj1hZmWryGnGzYzbjo", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "BrF5x1qcjgZFABxk8HFPWXT2518eLCH9Q5JkrHsBhA3H", + "receipt": { + "Action": { + "signer_id": "d76de16fc5ae649a57730bed7b2f0facc8070196d3037fd361e7865edf886fc9", + "signer_public_key": "ed25519:FVwqNYDAywHhuc6yWDB2nqZQWyFv9PVdhgN9bfGCfddJ", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "BP3NhoV5x6sLxwvX8qKWmJfkRigGtCnLXBguQVTF6jeG", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkNzZkZTE2ZmM1YWU2NDlhNTc3MzBiZWQ3YjJmMGZhY2M4MDcwMTk2ZDMwMzdmZDM2MWU3ODY1ZWRmODg2ZmM5IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "9WFY4HnxnNYFntLc4eGsDDzoPsHqUaKFeJmjJvBK2Ncr", + "receipt": { + "Action": { + "signer_id": "d76de16fc5ae649a57730bed7b2f0facc8070196d3037fd361e7865edf886fc9", + "signer_public_key": "ed25519:FVwqNYDAywHhuc6yWDB2nqZQWyFv9PVdhgN9bfGCfddJ", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "BP3NhoV5x6sLxwvX8qKWmJfkRigGtCnLXBguQVTF6jeG" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkNzZkZTE2ZmM1YWU2NDlhNTc3MzBiZWQ3YjJmMGZhY2M4MDcwMTk2ZDMwMzdmZDM2MWU3ODY1ZWRmODg2ZmM5IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d76de16fc5ae649a57730bed7b2f0facc8070196d3037fd361e7865edf886fc9", + "receipt_id": "DoFpKxruwMZSj3jHiTAxY2a9RZJnFB6fqPCmHpBLgiud", + "receipt": { + "Action": { + "signer_id": "d76de16fc5ae649a57730bed7b2f0facc8070196d3037fd361e7865edf886fc9", + "signer_public_key": "ed25519:FVwqNYDAywHhuc6yWDB2nqZQWyFv9PVdhgN9bfGCfddJ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "BB6enSF9u69KTXiqkQUtqikiiUPoXmh5gQfGtzr8Uivq", + "receipt": { + "Action": { + "signer_id": "9375fffe3685efb35859008a25960dedd5f8e04bd64c262a5ee9e22a54a6305f", + "signer_public_key": "ed25519:AvdHu5uEtk5wqoR51HtdFp4htSjhjKZMHp4UD5xVLGrJ", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "B7GuGL6FNPP8SMCSYW1fiscLm2jS5eNYn1rxS9CaNKGz", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI5Mzc1ZmZmZTM2ODVlZmIzNTg1OTAwOGEyNTk2MGRlZGQ1ZjhlMDRiZDY0YzI2MmE1ZWU5ZTIyYTU0YTYzMDVmIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "Fs4TWKMVNoWZ5roWAM4TC1bgX7NQrKqJ7k8qFNTfQedf", + "receipt": { + "Action": { + "signer_id": "9375fffe3685efb35859008a25960dedd5f8e04bd64c262a5ee9e22a54a6305f", + "signer_public_key": "ed25519:AvdHu5uEtk5wqoR51HtdFp4htSjhjKZMHp4UD5xVLGrJ", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "B7GuGL6FNPP8SMCSYW1fiscLm2jS5eNYn1rxS9CaNKGz" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI5Mzc1ZmZmZTM2ODVlZmIzNTg1OTAwOGEyNTk2MGRlZGQ1ZjhlMDRiZDY0YzI2MmE1ZWU5ZTIyYTU0YTYzMDVmIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9375fffe3685efb35859008a25960dedd5f8e04bd64c262a5ee9e22a54a6305f", + "receipt_id": "2hhZ2L8Pbumj6k6ZXmz59YqtKnnNZVfwtJqhiibQgbLC", + "receipt": { + "Action": { + "signer_id": "9375fffe3685efb35859008a25960dedd5f8e04bd64c262a5ee9e22a54a6305f", + "signer_public_key": "ed25519:AvdHu5uEtk5wqoR51HtdFp4htSjhjKZMHp4UD5xVLGrJ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "2fcVd96b1h3utC6Q7UeBT5jcoYszZPUdqsXb5sx2vYjM", + "receipt": { + "Action": { + "signer_id": "f5ae69c59e056965e8294c05c2e2278848529a32bad867828237a21126af285d", + "signer_public_key": "ed25519:HY38zi9mbNGyw8XPcqMtFUmE6Wxbi5wSXo5PZg447wJk", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6UugSXcVYACwXj9n9h4JX7XhV3syirHjGmfzqeP1w5YE", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmNWFlNjljNTllMDU2OTY1ZTgyOTRjMDVjMmUyMjc4ODQ4NTI5YTMyYmFkODY3ODI4MjM3YTIxMTI2YWYyODVkIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "E4BzkPXBLLvzCGD1DVGpzwjTUoXQSuRqcTZqCvAuz73m", + "receipt": { + "Action": { + "signer_id": "f5ae69c59e056965e8294c05c2e2278848529a32bad867828237a21126af285d", + "signer_public_key": "ed25519:HY38zi9mbNGyw8XPcqMtFUmE6Wxbi5wSXo5PZg447wJk", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6UugSXcVYACwXj9n9h4JX7XhV3syirHjGmfzqeP1w5YE" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmNWFlNjljNTllMDU2OTY1ZTgyOTRjMDVjMmUyMjc4ODQ4NTI5YTMyYmFkODY3ODI4MjM3YTIxMTI2YWYyODVkIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f5ae69c59e056965e8294c05c2e2278848529a32bad867828237a21126af285d", + "receipt_id": "GntyaXCKKZCVNuYXp7XEQXHsWpUzPzd4voh2cYArB2H9", + "receipt": { + "Action": { + "signer_id": "f5ae69c59e056965e8294c05c2e2278848529a32bad867828237a21126af285d", + "signer_public_key": "ed25519:HY38zi9mbNGyw8XPcqMtFUmE6Wxbi5wSXo5PZg447wJk", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "9aqRtQBKK33aaVCBopDT84Lsh2NTjvDNQvfezWWFT9zq", + "receipt": { + "Action": { + "signer_id": "e458a95d4d2fb55511fd31ffadd87b7c6c5d401a4d26a8ceaaa5f855a4a49619", + "signer_public_key": "ed25519:GNNNLR4KeTY1U6AkJitumwgUj7nhbb2iXhjQtrwNci5e", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "3BNLEPBGgZoxGnUPeKGdiNYo7SmATKCMa2KXAMqmGceh", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlNDU4YTk1ZDRkMmZiNTU1MTFmZDMxZmZhZGQ4N2I3YzZjNWQ0MDFhNGQyNmE4Y2VhYWE1Zjg1NWE0YTQ5NjE5IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "A55KHCTQyFNe6rZhEnK6V6H7k7c5XwHXvLNw9oKxTzHc", + "receipt": { + "Action": { + "signer_id": "e458a95d4d2fb55511fd31ffadd87b7c6c5d401a4d26a8ceaaa5f855a4a49619", + "signer_public_key": "ed25519:GNNNLR4KeTY1U6AkJitumwgUj7nhbb2iXhjQtrwNci5e", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "3BNLEPBGgZoxGnUPeKGdiNYo7SmATKCMa2KXAMqmGceh" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlNDU4YTk1ZDRkMmZiNTU1MTFmZDMxZmZhZGQ4N2I3YzZjNWQ0MDFhNGQyNmE4Y2VhYWE1Zjg1NWE0YTQ5NjE5IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e458a95d4d2fb55511fd31ffadd87b7c6c5d401a4d26a8ceaaa5f855a4a49619", + "receipt_id": "3SnwbJ9upeYwQBDzKNMBMaxgjFSKpNSQPLNTLBSycUW9", + "receipt": { + "Action": { + "signer_id": "e458a95d4d2fb55511fd31ffadd87b7c6c5d401a4d26a8ceaaa5f855a4a49619", + "signer_public_key": "ed25519:GNNNLR4KeTY1U6AkJitumwgUj7nhbb2iXhjQtrwNci5e", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5884650560955752838630" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "BctiKRTfyoiz1FDCAy34AByewCsDQJ2eNd2UY8iUrfWT", + "receipt": { + "Action": { + "signer_id": "b273c99335764062b4ec3d54b1bf67d2e353efbd33b4249af8992db6f4d34013", + "signer_public_key": "ed25519:D1bySjc1EjoYKBFeNhmeA47V81aPSgCfB8Dv9SiXMjQN", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "BxrftNueY1xfeF8RmQK9BPuueWBnmo4WXGuB4QcUZXX1", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiMjczYzk5MzM1NzY0MDYyYjRlYzNkNTRiMWJmNjdkMmUzNTNlZmJkMzNiNDI0OWFmODk5MmRiNmY0ZDM0MDEzIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "3eLrWheRxChogkdUVbBsQfWrt3hGop3p4YEfpBnkXdY7", + "receipt": { + "Action": { + "signer_id": "b273c99335764062b4ec3d54b1bf67d2e353efbd33b4249af8992db6f4d34013", + "signer_public_key": "ed25519:D1bySjc1EjoYKBFeNhmeA47V81aPSgCfB8Dv9SiXMjQN", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "BxrftNueY1xfeF8RmQK9BPuueWBnmo4WXGuB4QcUZXX1" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiMjczYzk5MzM1NzY0MDYyYjRlYzNkNTRiMWJmNjdkMmUzNTNlZmJkMzNiNDI0OWFmODk5MmRiNmY0ZDM0MDEzIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b273c99335764062b4ec3d54b1bf67d2e353efbd33b4249af8992db6f4d34013", + "receipt_id": "Gx9Lhjpw7ierRTNdEj8mhDSuUkCDqieqTk5wTwEQmKCY", + "receipt": { + "Action": { + "signer_id": "b273c99335764062b4ec3d54b1bf67d2e353efbd33b4249af8992db6f4d34013", + "signer_public_key": "ed25519:D1bySjc1EjoYKBFeNhmeA47V81aPSgCfB8Dv9SiXMjQN", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5884650560955752838630" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "mdYvrFyLmUvq9HyX14d8QuLN5SWKt59ungatAjQUxxF", + "receipt": { + "Action": { + "signer_id": "502b972ac697a6c05316fb1e44da364a7ccb82a1f6f9c4d6b609a21c94571cdc", + "signer_public_key": "ed25519:6PxAiPm9gVjsZWJRLrPdTaTRBAtGfFvN6EC5NbKZ4ydV", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "AeVDeqE3s1DDmEHL3TmajDTec8GRDv41tSCLEruGmS4F", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI1MDJiOTcyYWM2OTdhNmMwNTMxNmZiMWU0NGRhMzY0YTdjY2I4MmExZjZmOWM0ZDZiNjA5YTIxYzk0NTcxY2RjIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "CLfnEkZZ3nafgg26Pr7XYKa2seZKG7Q9KvHKSdsNkyFb", + "receipt": { + "Action": { + "signer_id": "502b972ac697a6c05316fb1e44da364a7ccb82a1f6f9c4d6b609a21c94571cdc", + "signer_public_key": "ed25519:6PxAiPm9gVjsZWJRLrPdTaTRBAtGfFvN6EC5NbKZ4ydV", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "AeVDeqE3s1DDmEHL3TmajDTec8GRDv41tSCLEruGmS4F" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI1MDJiOTcyYWM2OTdhNmMwNTMxNmZiMWU0NGRhMzY0YTdjY2I4MmExZjZmOWM0ZDZiNjA5YTIxYzk0NTcxY2RjIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "502b972ac697a6c05316fb1e44da364a7ccb82a1f6f9c4d6b609a21c94571cdc", + "receipt_id": "2ktr1nUEtUP6jQre29KJ9ruQdArWamkhL1rkfbupHp9D", + "receipt": { + "Action": { + "signer_id": "502b972ac697a6c05316fb1e44da364a7ccb82a1f6f9c4d6b609a21c94571cdc", + "signer_public_key": "ed25519:6PxAiPm9gVjsZWJRLrPdTaTRBAtGfFvN6EC5NbKZ4ydV", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "J4Kt64rZwKmxXnfN1o46WNuh3nztXnbMupKzjsrpvMGr", + "receipt": { + "Action": { + "signer_id": "68409f027aeaa537ec26e409b7769e4804de91b14140d62518e63010b0364358", + "signer_public_key": "ed25519:81xZ1LPtcR1g8nMQH1VAGb5RwALiPVAW45oezatCXRqR", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "HqpjvmaGvvs5DMKVGSKVoAgFkXnRzdFmCCk56eLHY2Yy", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2ODQwOWYwMjdhZWFhNTM3ZWMyNmU0MDliNzc2OWU0ODA0ZGU5MWIxNDE0MGQ2MjUxOGU2MzAxMGIwMzY0MzU4IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "FEi3W4tG6MfAVPnFWnEj9WDcTUJH5tDAurLgM8UG64K5", + "receipt": { + "Action": { + "signer_id": "68409f027aeaa537ec26e409b7769e4804de91b14140d62518e63010b0364358", + "signer_public_key": "ed25519:81xZ1LPtcR1g8nMQH1VAGb5RwALiPVAW45oezatCXRqR", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "HqpjvmaGvvs5DMKVGSKVoAgFkXnRzdFmCCk56eLHY2Yy" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2ODQwOWYwMjdhZWFhNTM3ZWMyNmU0MDliNzc2OWU0ODA0ZGU5MWIxNDE0MGQ2MjUxOGU2MzAxMGIwMzY0MzU4IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "68409f027aeaa537ec26e409b7769e4804de91b14140d62518e63010b0364358", + "receipt_id": "6DWqbWdekZ4SZ2zdSnwXXvQJK6Aq6RgNnWQQxJfYRWwH", + "receipt": { + "Action": { + "signer_id": "68409f027aeaa537ec26e409b7769e4804de91b14140d62518e63010b0364358", + "signer_public_key": "ed25519:81xZ1LPtcR1g8nMQH1VAGb5RwALiPVAW45oezatCXRqR", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "HspNuP9xvL1p9FoYR9WmMdn9vW2krKWNxWHxpqPDr1Fa", + "receipt": { + "Action": { + "signer_id": "a6c5de8b0902861145ebcdc5e2d4ff7c130c7c7717c738f5ea26b81f090cd768", + "signer_public_key": "ed25519:CE1g7qxpYDShQGVXkqDKuBJHGPNZDBrKuHshssa8DNEK", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "DSghGdri1UPvZ5JfvuxcEXbh8mihChtYSUPUeNSnCND2", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhNmM1ZGU4YjA5MDI4NjExNDVlYmNkYzVlMmQ0ZmY3YzEzMGM3Yzc3MTdjNzM4ZjVlYTI2YjgxZjA5MGNkNzY4IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "49RbmebsToNvfHxwBbfjESwyJaRwivz1HMVdCGBHkUtg", + "receipt": { + "Action": { + "signer_id": "a6c5de8b0902861145ebcdc5e2d4ff7c130c7c7717c738f5ea26b81f090cd768", + "signer_public_key": "ed25519:CE1g7qxpYDShQGVXkqDKuBJHGPNZDBrKuHshssa8DNEK", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "DSghGdri1UPvZ5JfvuxcEXbh8mihChtYSUPUeNSnCND2" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhNmM1ZGU4YjA5MDI4NjExNDVlYmNkYzVlMmQ0ZmY3YzEzMGM3Yzc3MTdjNzM4ZjVlYTI2YjgxZjA5MGNkNzY4IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a6c5de8b0902861145ebcdc5e2d4ff7c130c7c7717c738f5ea26b81f090cd768", + "receipt_id": "721KaibXNvTrFJytaab2X63ShQkmV8CvZmv3kS8HT5gC", + "receipt": { + "Action": { + "signer_id": "a6c5de8b0902861145ebcdc5e2d4ff7c130c7c7717c738f5ea26b81f090cd768", + "signer_public_key": "ed25519:CE1g7qxpYDShQGVXkqDKuBJHGPNZDBrKuHshssa8DNEK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "5pmm6wrPmwWVLYrHFGiUZxKPNnWG95XWNhDLwuCjq6d1", + "receipt": { + "Action": { + "signer_id": "fbeb59b9e63b9ce058448b37f80dfc6ef6592f31100ed9cc1e4d5dcfef3f59d3", + "signer_public_key": "ed25519:HxPUgfL6XArzkFXwdsyT9DqbnfiNSsK5nDk4RvFEUb14", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "3gyvGLjLBXYYzu6vppQvQf5xeruwdwtQM18QQCcaoGz4", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmYmViNTliOWU2M2I5Y2UwNTg0NDhiMzdmODBkZmM2ZWY2NTkyZjMxMTAwZWQ5Y2MxZTRkNWRjZmVmM2Y1OWQzIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "7qCe9WqqSv4nuqzMnn3HteapyCQ2hcgcxydtGbqCTtez", + "receipt": { + "Action": { + "signer_id": "fbeb59b9e63b9ce058448b37f80dfc6ef6592f31100ed9cc1e4d5dcfef3f59d3", + "signer_public_key": "ed25519:HxPUgfL6XArzkFXwdsyT9DqbnfiNSsK5nDk4RvFEUb14", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "3gyvGLjLBXYYzu6vppQvQf5xeruwdwtQM18QQCcaoGz4" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmYmViNTliOWU2M2I5Y2UwNTg0NDhiMzdmODBkZmM2ZWY2NTkyZjMxMTAwZWQ5Y2MxZTRkNWRjZmVmM2Y1OWQzIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "fbeb59b9e63b9ce058448b37f80dfc6ef6592f31100ed9cc1e4d5dcfef3f59d3", + "receipt_id": "FTENhFaA79vTzPGVz22do3SLrzxLdQeG12Eujhv8axe1", + "receipt": { + "Action": { + "signer_id": "fbeb59b9e63b9ce058448b37f80dfc6ef6592f31100ed9cc1e4d5dcfef3f59d3", + "signer_public_key": "ed25519:HxPUgfL6XArzkFXwdsyT9DqbnfiNSsK5nDk4RvFEUb14", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "DR1qQ1PZeadQqzJFqJ7zySa9qL4oVmr8tvcKn3HtUMTg", + "receipt": { + "Action": { + "signer_id": "d53992179bfc33eda3d827897f5b3de1acafbbc4db26c3256be6c3844d54f852", + "signer_public_key": "ed25519:FMLkpE7UPjACMk5MVe4M3erXsdGmWkXzuHoA2ViubYrm", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "HWNsgkesjxBLyLp5nA5UvZZoKHu7gcVf63PaRypfuhNn", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkNTM5OTIxNzliZmMzM2VkYTNkODI3ODk3ZjViM2RlMWFjYWZiYmM0ZGIyNmMzMjU2YmU2YzM4NDRkNTRmODUyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "7qTxqgWY7EcNGsNdFAAY5xbwLks4UrfqgCDWtSbw3dm", + "receipt": { + "Action": { + "signer_id": "d53992179bfc33eda3d827897f5b3de1acafbbc4db26c3256be6c3844d54f852", + "signer_public_key": "ed25519:FMLkpE7UPjACMk5MVe4M3erXsdGmWkXzuHoA2ViubYrm", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "HWNsgkesjxBLyLp5nA5UvZZoKHu7gcVf63PaRypfuhNn" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkNTM5OTIxNzliZmMzM2VkYTNkODI3ODk3ZjViM2RlMWFjYWZiYmM0ZGIyNmMzMjU2YmU2YzM4NDRkNTRmODUyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d53992179bfc33eda3d827897f5b3de1acafbbc4db26c3256be6c3844d54f852", + "receipt_id": "HqmnrQoDnvp95t2RNnTYZFs7zMp4vBcT8PeVKby5M7Tc", + "receipt": { + "Action": { + "signer_id": "d53992179bfc33eda3d827897f5b3de1acafbbc4db26c3256be6c3844d54f852", + "signer_public_key": "ed25519:FMLkpE7UPjACMk5MVe4M3erXsdGmWkXzuHoA2ViubYrm", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "4FtN3SL2v7669BC5NHBZGoMT1epzkD1X7ENrF9qQ8xgj", + "receipt": { + "Action": { + "signer_id": "ad36afa78073407b3c1412a8dbc227b1cc7e3fba37523fafb932be9deca74600", + "signer_public_key": "ed25519:Cf9tzZRgUQBFidboWnMGV2eRDZvL9r4GR4zEPdT3Y2WK", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6LFqfQFEDiFysJ2Pvr8hGE5ee5H46WjTkcCFmdEyFePg", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhZDM2YWZhNzgwNzM0MDdiM2MxNDEyYThkYmMyMjdiMWNjN2UzZmJhMzc1MjNmYWZiOTMyYmU5ZGVjYTc0NjAwIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "BQViHrVcV7YA9jLzLtwFakF2iGSRkDsAxHYiX5SpwWeQ", + "receipt": { + "Action": { + "signer_id": "ad36afa78073407b3c1412a8dbc227b1cc7e3fba37523fafb932be9deca74600", + "signer_public_key": "ed25519:Cf9tzZRgUQBFidboWnMGV2eRDZvL9r4GR4zEPdT3Y2WK", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6LFqfQFEDiFysJ2Pvr8hGE5ee5H46WjTkcCFmdEyFePg" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhZDM2YWZhNzgwNzM0MDdiM2MxNDEyYThkYmMyMjdiMWNjN2UzZmJhMzc1MjNmYWZiOTMyYmU5ZGVjYTc0NjAwIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ad36afa78073407b3c1412a8dbc227b1cc7e3fba37523fafb932be9deca74600", + "receipt_id": "6bjTniWQyk3ycZ2qs4gMByt3QUYhoP9kHuYdTJNw2H6n", + "receipt": { + "Action": { + "signer_id": "ad36afa78073407b3c1412a8dbc227b1cc7e3fba37523fafb932be9deca74600", + "signer_public_key": "ed25519:Cf9tzZRgUQBFidboWnMGV2eRDZvL9r4GR4zEPdT3Y2WK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "6KcadZ2EhqfuUDeTQkqPt9jHQKGzNxKWPmknYh9VQJVs", + "receipt": { + "Action": { + "signer_id": "2489e4be7e8df9e199b2f62feda07e479e615a44450eaa223d1f4d0a0c8b1ba1", + "signer_public_key": "ed25519:3TddbCwkcki3NBQMT2ENafwVLGcgkiSqd2Dc2ZgTCwSg", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "EUN1nVhuub98dvfK3Et8m8FBYWwx6K71ggbA3JEGzADu", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiIyNDg5ZTRiZTdlOGRmOWUxOTliMmY2MmZlZGEwN2U0NzllNjE1YTQ0NDUwZWFhMjIzZDFmNGQwYTBjOGIxYmExIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "HJ8v7EdZ5QVxpsr2j3B1hJrS6fu5e93aGcCVfbHQb7Sk", + "receipt": { + "Action": { + "signer_id": "2489e4be7e8df9e199b2f62feda07e479e615a44450eaa223d1f4d0a0c8b1ba1", + "signer_public_key": "ed25519:3TddbCwkcki3NBQMT2ENafwVLGcgkiSqd2Dc2ZgTCwSg", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "EUN1nVhuub98dvfK3Et8m8FBYWwx6K71ggbA3JEGzADu" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiIyNDg5ZTRiZTdlOGRmOWUxOTliMmY2MmZlZGEwN2U0NzllNjE1YTQ0NDUwZWFhMjIzZDFmNGQwYTBjOGIxYmExIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "2489e4be7e8df9e199b2f62feda07e479e615a44450eaa223d1f4d0a0c8b1ba1", + "receipt_id": "FBzcr8JUDytF9VGrXH8iSARZ2XnGbwhiEKGPmWZphSu9", + "receipt": { + "Action": { + "signer_id": "2489e4be7e8df9e199b2f62feda07e479e615a44450eaa223d1f4d0a0c8b1ba1", + "signer_public_key": "ed25519:3TddbCwkcki3NBQMT2ENafwVLGcgkiSqd2Dc2ZgTCwSg", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "3axkUvBtyBuhyRy6ex6D8asVCbtkSxAKYrum23MhH9Q7", + "receipt": { + "Action": { + "signer_id": "69a9624854e5a2f8592ac57abaa3ee399a838e784c9ec9457efd0850e345745f", + "signer_public_key": "ed25519:87TcWe6UK1uCWnxphbdMMSJbVCWJqmuVL6Sihfd7oq5g", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "54dSBq9ah9BXnhDUpXMYNNdQ9KZXj6xPkfDu8a8ZX28t", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2OWE5NjI0ODU0ZTVhMmY4NTkyYWM1N2FiYWEzZWUzOTlhODM4ZTc4NGM5ZWM5NDU3ZWZkMDg1MGUzNDU3NDVmIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "7u5jVvybKFPvP6BJMD5ZctQNKqMkamt8VZVEGvJCdVVB", + "receipt": { + "Action": { + "signer_id": "69a9624854e5a2f8592ac57abaa3ee399a838e784c9ec9457efd0850e345745f", + "signer_public_key": "ed25519:87TcWe6UK1uCWnxphbdMMSJbVCWJqmuVL6Sihfd7oq5g", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "54dSBq9ah9BXnhDUpXMYNNdQ9KZXj6xPkfDu8a8ZX28t" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2OWE5NjI0ODU0ZTVhMmY4NTkyYWM1N2FiYWEzZWUzOTlhODM4ZTc4NGM5ZWM5NDU3ZWZkMDg1MGUzNDU3NDVmIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "69a9624854e5a2f8592ac57abaa3ee399a838e784c9ec9457efd0850e345745f", + "receipt_id": "5msEbwbJ2MDoaVBjCDHTRzqfNm1ueWpZWg5wBnEy6Xeo", + "receipt": { + "Action": { + "signer_id": "69a9624854e5a2f8592ac57abaa3ee399a838e784c9ec9457efd0850e345745f", + "signer_public_key": "ed25519:87TcWe6UK1uCWnxphbdMMSJbVCWJqmuVL6Sihfd7oq5g", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "XkbEhMwg6RERNns8TJnCFdaSVWB6saoTBQ9KGkRcnfQ", + "receipt": { + "Action": { + "signer_id": "f611eba55a7df6a499e958041fa57baa9d6ec9d47783d3a1db2295fadd205b12", + "signer_public_key": "ed25519:HZZ9GnUjiQu8KRHUGtueVXdDFjJAMmen97eNXFofaHPF", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "FGmJMV8vFmMg2zbEc9Qju84cAQGbJVU896b3YMwLCWYg", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmNjExZWJhNTVhN2RmNmE0OTllOTU4MDQxZmE1N2JhYTlkNmVjOWQ0Nzc4M2QzYTFkYjIyOTVmYWRkMjA1YjEyIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "2CXM88aiSZgaMT6ikP9fTYj6fxxGX3uUwW5kgncwTdeF", + "receipt": { + "Action": { + "signer_id": "f611eba55a7df6a499e958041fa57baa9d6ec9d47783d3a1db2295fadd205b12", + "signer_public_key": "ed25519:HZZ9GnUjiQu8KRHUGtueVXdDFjJAMmen97eNXFofaHPF", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "FGmJMV8vFmMg2zbEc9Qju84cAQGbJVU896b3YMwLCWYg" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmNjExZWJhNTVhN2RmNmE0OTllOTU4MDQxZmE1N2JhYTlkNmVjOWQ0Nzc4M2QzYTFkYjIyOTVmYWRkMjA1YjEyIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f611eba55a7df6a499e958041fa57baa9d6ec9d47783d3a1db2295fadd205b12", + "receipt_id": "J75AAFA7CbekAShDZuujzE2ue3aKXTzxnQTch4XHHCZb", + "receipt": { + "Action": { + "signer_id": "f611eba55a7df6a499e958041fa57baa9d6ec9d47783d3a1db2295fadd205b12", + "signer_public_key": "ed25519:HZZ9GnUjiQu8KRHUGtueVXdDFjJAMmen97eNXFofaHPF", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "J3kUg3j6nFXczLfNtTyxxiwHxSyVvC9gNi1BnXiabPRJ", + "receipt": { + "Action": { + "signer_id": "eb46e034b19aa78afd13692816e781b17ccf1876c3088bf1c36b66c1824143a5", + "signer_public_key": "ed25519:GqRVXjUiMnoVYeYfLDWMvsEzgsvcN6hsRFVKS6oGqz44", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "AEqYroZMrGrwYXBHfFwvE7i27W7MfQaeVJneSm4Bv16A", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlYjQ2ZTAzNGIxOWFhNzhhZmQxMzY5MjgxNmU3ODFiMTdjY2YxODc2YzMwODhiZjFjMzZiNjZjMTgyNDE0M2E1IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "8MFfyUY4YVzERq69UY5vV8NzaEugBG25LaTJNpye8HyL", + "receipt": { + "Action": { + "signer_id": "eb46e034b19aa78afd13692816e781b17ccf1876c3088bf1c36b66c1824143a5", + "signer_public_key": "ed25519:GqRVXjUiMnoVYeYfLDWMvsEzgsvcN6hsRFVKS6oGqz44", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "AEqYroZMrGrwYXBHfFwvE7i27W7MfQaeVJneSm4Bv16A" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJlYjQ2ZTAzNGIxOWFhNzhhZmQxMzY5MjgxNmU3ODFiMTdjY2YxODc2YzMwODhiZjFjMzZiNjZjMTgyNDE0M2E1IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "eb46e034b19aa78afd13692816e781b17ccf1876c3088bf1c36b66c1824143a5", + "receipt_id": "8vzpnZ3BTzUZVncHvcSpXLs1rqSYSNHq3i5vMDhAxneN", + "receipt": { + "Action": { + "signer_id": "eb46e034b19aa78afd13692816e781b17ccf1876c3088bf1c36b66c1824143a5", + "signer_public_key": "ed25519:GqRVXjUiMnoVYeYfLDWMvsEzgsvcN6hsRFVKS6oGqz44", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "GiRUYtJUhSBaQoZJfHRZxhdEgvUqzvqBohRHrUMxjyHD", + "receipt": { + "Action": { + "signer_id": "f963b51fc6512c65eee9c24f5fb696b0df6ca3dbddb68a78a98ca9e75c55c8ec", + "signer_public_key": "ed25519:HnWhX1QtwxJVA3BWhSJtgvhSgfgQHDm3ZvXd8jn6DwXy", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6RaDMfkH2fMjizWintDrLi5oXNJgzpdgnF7Y329Q4zHM", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmOTYzYjUxZmM2NTEyYzY1ZWVlOWMyNGY1ZmI2OTZiMGRmNmNhM2RiZGRiNjhhNzhhOThjYTllNzVjNTVjOGVjIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "AV1FeCTf3NgBAYeqk4SR35DaudMbdYG8ktMFPycmi9FE", + "receipt": { + "Action": { + "signer_id": "f963b51fc6512c65eee9c24f5fb696b0df6ca3dbddb68a78a98ca9e75c55c8ec", + "signer_public_key": "ed25519:HnWhX1QtwxJVA3BWhSJtgvhSgfgQHDm3ZvXd8jn6DwXy", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6RaDMfkH2fMjizWintDrLi5oXNJgzpdgnF7Y329Q4zHM" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJmOTYzYjUxZmM2NTEyYzY1ZWVlOWMyNGY1ZmI2OTZiMGRmNmNhM2RiZGRiNjhhNzhhOThjYTllNzVjNTVjOGVjIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f963b51fc6512c65eee9c24f5fb696b0df6ca3dbddb68a78a98ca9e75c55c8ec", + "receipt_id": "6uhjBPPas3od2GgtZmZsinztK1JuRyHsucC2EiZEC3yz", + "receipt": { + "Action": { + "signer_id": "f963b51fc6512c65eee9c24f5fb696b0df6ca3dbddb68a78a98ca9e75c55c8ec", + "signer_public_key": "ed25519:HnWhX1QtwxJVA3BWhSJtgvhSgfgQHDm3ZvXd8jn6DwXy", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "EzQhz6vhN1eYBCdVaSFXeonPy39huVmDPGJvqMw7dYJZ", + "receipt": { + "Action": { + "signer_id": "802efa65820935a2460d9d562595f9879e0219112e00dbf66611703996852054", + "signer_public_key": "ed25519:9dNjWnnmQe5hM2Rh2jbHGC7aM9v2KPRVk8bADKYe3E11", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "8EjAFwmw78XyF8RLhyCKuZSriupFV72iJWVBvtpe1ZBv", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI4MDJlZmE2NTgyMDkzNWEyNDYwZDlkNTYyNTk1Zjk4NzllMDIxOTExMmUwMGRiZjY2NjExNzAzOTk2ODUyMDU0IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "7eCy6LsyTn46Zw6zHgC4AEgD6KsuJFVPy7pGET1kgrvE", + "receipt": { + "Action": { + "signer_id": "802efa65820935a2460d9d562595f9879e0219112e00dbf66611703996852054", + "signer_public_key": "ed25519:9dNjWnnmQe5hM2Rh2jbHGC7aM9v2KPRVk8bADKYe3E11", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "8EjAFwmw78XyF8RLhyCKuZSriupFV72iJWVBvtpe1ZBv" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI4MDJlZmE2NTgyMDkzNWEyNDYwZDlkNTYyNTk1Zjk4NzllMDIxOTExMmUwMGRiZjY2NjExNzAzOTk2ODUyMDU0IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "802efa65820935a2460d9d562595f9879e0219112e00dbf66611703996852054", + "receipt_id": "4UumEMHMy67sMK3qHcWPL97CuY5uTK3jSVH2xjibjjUm", + "receipt": { + "Action": { + "signer_id": "802efa65820935a2460d9d562595f9879e0219112e00dbf66611703996852054", + "signer_public_key": "ed25519:9dNjWnnmQe5hM2Rh2jbHGC7aM9v2KPRVk8bADKYe3E11", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "CxLgbaqK2SY4gCGgEPbS1gNYVqY1Pi1HzGWVAsYi3nPW", + "receipt": { + "Action": { + "signer_id": "be1009a4018d330fddca34f9e870914e218dd7b44248fa5ef2129ea69ce1839d", + "signer_public_key": "ed25519:DnveVMrpZ7PUMkz5i4rbDvRBfuvgf5srbRmpADsyVAtk", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "8cpPbZqnXia5RSNqnTrM8tafZCTAgmAqdxrGYntJTvMq", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiZTEwMDlhNDAxOGQzMzBmZGRjYTM0ZjllODcwOTE0ZTIxOGRkN2I0NDI0OGZhNWVmMjEyOWVhNjljZTE4MzlkIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "DAHX7gRMSyX7Ni9RQYARdfZegnCYXqGhHCKJRymC8v1F", + "receipt": { + "Action": { + "signer_id": "be1009a4018d330fddca34f9e870914e218dd7b44248fa5ef2129ea69ce1839d", + "signer_public_key": "ed25519:DnveVMrpZ7PUMkz5i4rbDvRBfuvgf5srbRmpADsyVAtk", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "8cpPbZqnXia5RSNqnTrM8tafZCTAgmAqdxrGYntJTvMq" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiZTEwMDlhNDAxOGQzMzBmZGRjYTM0ZjllODcwOTE0ZTIxOGRkN2I0NDI0OGZhNWVmMjEyOWVhNjljZTE4MzlkIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "be1009a4018d330fddca34f9e870914e218dd7b44248fa5ef2129ea69ce1839d", + "receipt_id": "Ba1Pb3z18Cx2icqsaFWMqFLj1G4cdwBz5jbpgAstf6yH", + "receipt": { + "Action": { + "signer_id": "be1009a4018d330fddca34f9e870914e218dd7b44248fa5ef2129ea69ce1839d", + "signer_public_key": "ed25519:DnveVMrpZ7PUMkz5i4rbDvRBfuvgf5srbRmpADsyVAtk", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "4Qeb7ZTmSmothyUqsCokWkBRR5bNUvxY1bzW4C4MmCJa", + "receipt": { + "Action": { + "signer_id": "7f858468df4b938147ba238793457783d376f35ebed79eb54ab2489e6c173de6", + "signer_public_key": "ed25519:9anrwA6ULtN6HiHRvyY22SPKoUCvgZZrW7gobf4KHge9", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "6V1rE4neBhQ9kb9KZoRMnFkDsxx6X6tazoNc3ipxdG64", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI3Zjg1ODQ2OGRmNGI5MzgxNDdiYTIzODc5MzQ1Nzc4M2QzNzZmMzVlYmVkNzllYjU0YWIyNDg5ZTZjMTczZGU2IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "4bPpcLBgjt9iNwYAyWpSCFTgNH5CHLMvqJ1sLmKmi5mC", + "receipt": { + "Action": { + "signer_id": "7f858468df4b938147ba238793457783d376f35ebed79eb54ab2489e6c173de6", + "signer_public_key": "ed25519:9anrwA6ULtN6HiHRvyY22SPKoUCvgZZrW7gobf4KHge9", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "6V1rE4neBhQ9kb9KZoRMnFkDsxx6X6tazoNc3ipxdG64" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI3Zjg1ODQ2OGRmNGI5MzgxNDdiYTIzODc5MzQ1Nzc4M2QzNzZmMzVlYmVkNzllYjU0YWIyNDg5ZTZjMTczZGU2IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "7f858468df4b938147ba238793457783d376f35ebed79eb54ab2489e6c173de6", + "receipt_id": "FBiiYRJ5V7tybUuaWjKhmGCqb6jdLNqX7xF3Xs1BTsou", + "receipt": { + "Action": { + "signer_id": "7f858468df4b938147ba238793457783d376f35ebed79eb54ab2489e6c173de6", + "signer_public_key": "ed25519:9anrwA6ULtN6HiHRvyY22SPKoUCvgZZrW7gobf4KHge9", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "AtT9WZKF8X7R9FcVsEJsWH7uR1PrT6S1A9fuDRqLzEja", + "receipt": { + "Action": { + "signer_id": "5b661f5cb82735bce376359f46aec287fd182228e1117ada4d09003360817e33", + "signer_public_key": "ed25519:79nRFh8rDzw6EKn2H3BFvgTFPqtiC2zcapL4DojRJ5Mt", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "9JWhzwZNHZTt6iSb9PFuLhzQJjrUcMwTFqf1WDA8EM2L", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI1YjY2MWY1Y2I4MjczNWJjZTM3NjM1OWY0NmFlYzI4N2ZkMTgyMjI4ZTExMTdhZGE0ZDA5MDAzMzYwODE3ZTMzIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "8fcSTmLEj1XKpWAZfX9KiMTvjy1qYV74PDLUsXiJj77j", + "receipt": { + "Action": { + "signer_id": "5b661f5cb82735bce376359f46aec287fd182228e1117ada4d09003360817e33", + "signer_public_key": "ed25519:79nRFh8rDzw6EKn2H3BFvgTFPqtiC2zcapL4DojRJ5Mt", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "9JWhzwZNHZTt6iSb9PFuLhzQJjrUcMwTFqf1WDA8EM2L" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI1YjY2MWY1Y2I4MjczNWJjZTM3NjM1OWY0NmFlYzI4N2ZkMTgyMjI4ZTExMTdhZGE0ZDA5MDAzMzYwODE3ZTMzIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5b661f5cb82735bce376359f46aec287fd182228e1117ada4d09003360817e33", + "receipt_id": "6kXRUBote14mjKY9NEMgVgDkMmcgAxehaQQTaykj59Rq", + "receipt": { + "Action": { + "signer_id": "5b661f5cb82735bce376359f46aec287fd182228e1117ada4d09003360817e33", + "signer_public_key": "ed25519:79nRFh8rDzw6EKn2H3BFvgTFPqtiC2zcapL4DojRJ5Mt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5874383348262772861770" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "HQBZa1wQpRnGNRAKUZ9FEPuxwrF1Drt1JUiUxAZh32c7", + "receipt": { + "Action": { + "signer_id": "a36f94bd041dcde5f1ac46fc10840710d27cfbf4fc864aa15121fd4b3d047bb3", + "signer_public_key": "ed25519:Bzz8yhj2J3rcZTiohpg5V3rVKuT2ELyWrzapoZB6Xvgi", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "CovHSxc56D9iK7Z2b2yuKdZZRJq55izTvGTvMkKySU5h", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhMzZmOTRiZDA0MWRjZGU1ZjFhYzQ2ZmMxMDg0MDcxMGQyN2NmYmY0ZmM4NjRhYTE1MTIxZmQ0YjNkMDQ3YmIzIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "3KQJRDQn6s7mw4dv9fEWsyKUeXYZmLw3xHvub2EF3kXV", + "receipt": { + "Action": { + "signer_id": "a36f94bd041dcde5f1ac46fc10840710d27cfbf4fc864aa15121fd4b3d047bb3", + "signer_public_key": "ed25519:Bzz8yhj2J3rcZTiohpg5V3rVKuT2ELyWrzapoZB6Xvgi", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "CovHSxc56D9iK7Z2b2yuKdZZRJq55izTvGTvMkKySU5h" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJhMzZmOTRiZDA0MWRjZGU1ZjFhYzQ2ZmMxMDg0MDcxMGQyN2NmYmY0ZmM4NjRhYTE1MTIxZmQ0YjNkMDQ3YmIzIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a36f94bd041dcde5f1ac46fc10840710d27cfbf4fc864aa15121fd4b3d047bb3", + "receipt_id": "2evdvzWoANB6N8aRrTGysejcNqfr3GmtWXtiWdTdTeeC", + "receipt": { + "Action": { + "signer_id": "a36f94bd041dcde5f1ac46fc10840710d27cfbf4fc864aa15121fd4b3d047bb3", + "signer_public_key": "ed25519:Bzz8yhj2J3rcZTiohpg5V3rVKuT2ELyWrzapoZB6Xvgi", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5877805752493766187390" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "F9QzfycXo3YdjjLCJ2K5hbmC5vjbs9EbHygLcnoT4bfV", + "receipt": { + "Action": { + "signer_id": "ba97412f6eba6162312580649ad9edce8291d8bd2e922de0e824c7689b6f7c66", + "signer_public_key": "ed25519:DZNbvck6pbw5KWowfKXRB4XuKZ77u3PFwHhmBZG8Y7T3", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "GGHYtbQHrWG6G1qBw428KvmNRjgtcx5fc5ykm96xGvpN", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiYTk3NDEyZjZlYmE2MTYyMzEyNTgwNjQ5YWQ5ZWRjZTgyOTFkOGJkMmU5MjJkZTBlODI0Yzc2ODliNmY3YzY2IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "4WAW8jWocqJdgjgNHQkvBmtmU5u4MSjDyMd3HvgvhPUJ", + "receipt": { + "Action": { + "signer_id": "ba97412f6eba6162312580649ad9edce8291d8bd2e922de0e824c7689b6f7c66", + "signer_public_key": "ed25519:DZNbvck6pbw5KWowfKXRB4XuKZ77u3PFwHhmBZG8Y7T3", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "GGHYtbQHrWG6G1qBw428KvmNRjgtcx5fc5ykm96xGvpN" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiYTk3NDEyZjZlYmE2MTYyMzEyNTgwNjQ5YWQ5ZWRjZTgyOTFkOGJkMmU5MjJkZTBlODI0Yzc2ODliNmY3YzY2IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ba97412f6eba6162312580649ad9edce8291d8bd2e922de0e824c7689b6f7c66", + "receipt_id": "ChERjm92vGwZBiyeVNrm3dEcrbMLKCizF3hF4QB4FLRK", + "receipt": { + "Action": { + "signer_id": "ba97412f6eba6162312580649ad9edce8291d8bd2e922de0e824c7689b6f7c66", + "signer_public_key": "ed25519:DZNbvck6pbw5KWowfKXRB4XuKZ77u3PFwHhmBZG8Y7T3", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "CSjxyymjxfRiWQM57jFohhaZrUCCgcKdHuTyovSFCT7e", + "receipt": { + "Action": { + "signer_id": "b771dc9b98e630bbd946e033c728e53b1a3c8bdad1c0c76e9548cd464197b69d", + "signer_public_key": "ed25519:DM6Ju8H4CTquSTfzSZJzV5HJ7m9wVFY9pTsKPKts6Vnt", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "4ZazYfcX7AAGxk49pMUWqzdZb8fTt6nqQzkFBZXP8S8p", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiNzcxZGM5Yjk4ZTYzMGJiZDk0NmUwMzNjNzI4ZTUzYjFhM2M4YmRhZDFjMGM3NmU5NTQ4Y2Q0NjQxOTdiNjlkIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "AsGiozZga53PsZ7PLDMjEcfCsNL1sjPxZpwK6K1tzyvh", + "receipt": { + "Action": { + "signer_id": "b771dc9b98e630bbd946e033c728e53b1a3c8bdad1c0c76e9548cd464197b69d", + "signer_public_key": "ed25519:DM6Ju8H4CTquSTfzSZJzV5HJ7m9wVFY9pTsKPKts6Vnt", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "4ZazYfcX7AAGxk49pMUWqzdZb8fTt6nqQzkFBZXP8S8p" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJiNzcxZGM5Yjk4ZTYzMGJiZDk0NmUwMzNjNzI4ZTUzYjFhM2M4YmRhZDFjMGM3NmU5NTQ4Y2Q0NjQxOTdiNjlkIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b771dc9b98e630bbd946e033c728e53b1a3c8bdad1c0c76e9548cd464197b69d", + "receipt_id": "EE7wVXFcyky9yZbvF54wCCFECCB9aM5MP2yFNigNM3ww", + "receipt": { + "Action": { + "signer_id": "b771dc9b98e630bbd946e033c728e53b1a3c8bdad1c0c76e9548cd464197b69d", + "signer_public_key": "ed25519:DM6Ju8H4CTquSTfzSZJzV5HJ7m9wVFY9pTsKPKts6Vnt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "4XjugAC2V7EhcMCqQ498E2UX6E1ZQ13zuMcyJqGT5QdX", + "receipt": { + "Action": { + "signer_id": "64622d70a15b99209a28f77e523050793c57a65bb67d876f3894b383603280e1", + "signer_public_key": "ed25519:7krbiCh972A89AK9xijAGvZrGBpBGdw3HpDvuXfjwR1r", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "9kNUMtXPgS8J7e8UwQgDxDgiwgoAWY9mnEduA3NWUSem", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2NDYyMmQ3MGExNWI5OTIwOWEyOGY3N2U1MjMwNTA3OTNjNTdhNjViYjY3ZDg3NmYzODk0YjM4MzYwMzI4MGUxIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "2G3geRWVnRV9eAGgk5xssPBXXRyKvYgvGdghJRJhRTwV", + "receipt": { + "Action": { + "signer_id": "64622d70a15b99209a28f77e523050793c57a65bb67d876f3894b383603280e1", + "signer_public_key": "ed25519:7krbiCh972A89AK9xijAGvZrGBpBGdw3HpDvuXfjwR1r", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "9kNUMtXPgS8J7e8UwQgDxDgiwgoAWY9mnEduA3NWUSem" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2NDYyMmQ3MGExNWI5OTIwOWEyOGY3N2U1MjMwNTA3OTNjNTdhNjViYjY3ZDg3NmYzODk0YjM4MzYwMzI4MGUxIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "64622d70a15b99209a28f77e523050793c57a65bb67d876f3894b383603280e1", + "receipt_id": "AYd29XfZgaWgsnrCFScMC5aUB9ekxXfdByd1Ttnqk1en", + "receipt": { + "Action": { + "signer_id": "64622d70a15b99209a28f77e523050793c57a65bb67d876f3894b383603280e1", + "signer_public_key": "ed25519:7krbiCh972A89AK9xijAGvZrGBpBGdw3HpDvuXfjwR1r", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "5CXp64sNkGYydpjxgj6Jvcc8d8YaBiMKd6UhTBh5w3ys", + "receipt": { + "Action": { + "signer_id": "756ad7319847864952e8bb311f0af834a8474c9556b41e94474feeba9dcdc105", + "signer_public_key": "ed25519:8uMC5YiMNPeFcUTHehqKnPh4Z2pXZFd2zoHmH8cCAbC8", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "7M8j3dFceUvb25ThPH3swUBJydYEpwSXRfxH93hXQFDF", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI3NTZhZDczMTk4NDc4NjQ5NTJlOGJiMzExZjBhZjgzNGE4NDc0Yzk1NTZiNDFlOTQ0NzRmZWViYTlkY2RjMTA1IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "2gBBVqMZQE3Q2UnbXXPwicUCt8XvzzzpFvwvVk7CLCAM", + "receipt": { + "Action": { + "signer_id": "756ad7319847864952e8bb311f0af834a8474c9556b41e94474feeba9dcdc105", + "signer_public_key": "ed25519:8uMC5YiMNPeFcUTHehqKnPh4Z2pXZFd2zoHmH8cCAbC8", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "7M8j3dFceUvb25ThPH3swUBJydYEpwSXRfxH93hXQFDF" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI3NTZhZDczMTk4NDc4NjQ5NTJlOGJiMzExZjBhZjgzNGE4NDc0Yzk1NTZiNDFlOTQ0NzRmZWViYTlkY2RjMTA1IiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "756ad7319847864952e8bb311f0af834a8474c9556b41e94474feeba9dcdc105", + "receipt_id": "4trnDdEVMHkCcgtk2DnksCMkwKNdyfAwovJ4U5bgQji5", + "receipt": { + "Action": { + "signer_id": "756ad7319847864952e8bb311f0af834a8474c9556b41e94474feeba9dcdc105", + "signer_public_key": "ed25519:8uMC5YiMNPeFcUTHehqKnPh4Z2pXZFd2zoHmH8cCAbC8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5884650560955752838630" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "EyBb2X6cVZVfEzYjJGt37j1P54G6J5PritfDqGzeQzaP", + "receipt": { + "Action": { + "signer_id": "d6175429043c812e387d2698a9584eebbd4624f283e0350b1b3e1c1aab7feaea", + "signer_public_key": "ed25519:FQit1Fr3gUXqGN4q9fYmXVtnEcipH7ZpgNexGgMuoYBT", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "Hyzx6fn9X9WdtGTSsAQ1VwUuohYPowd7a3Hzwtd52N1v", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkNjE3NTQyOTA0M2M4MTJlMzg3ZDI2OThhOTU4NGVlYmJkNDYyNGYyODNlMDM1MGIxYjNlMWMxYWFiN2ZlYWVhIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "7FD8fcXzsvoxPwfkLFHrLEiPLUKLoERCpdoPD61Va9rD", + "receipt": { + "Action": { + "signer_id": "d6175429043c812e387d2698a9584eebbd4624f283e0350b1b3e1c1aab7feaea", + "signer_public_key": "ed25519:FQit1Fr3gUXqGN4q9fYmXVtnEcipH7ZpgNexGgMuoYBT", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "Hyzx6fn9X9WdtGTSsAQ1VwUuohYPowd7a3Hzwtd52N1v" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiJkNjE3NTQyOTA0M2M4MTJlMzg3ZDI2OThhOTU4NGVlYmJkNDYyNGYyODNlMDM1MGIxYjNlMWMxYWFiN2ZlYWVhIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d6175429043c812e387d2698a9584eebbd4624f283e0350b1b3e1c1aab7feaea", + "receipt_id": "7cge1MGQRQCoJ1MNxCkXZDu4RmFca6XKazdaD9FpcEwY", + "receipt": { + "Action": { + "signer_id": "d6175429043c812e387d2698a9584eebbd4624f283e0350b1b3e1c1aab7feaea", + "signer_public_key": "ed25519:FQit1Fr3gUXqGN4q9fYmXVtnEcipH7ZpgNexGgMuoYBT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5881228156724759513010" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "amm.counselor.near", + "receipt_id": "XUt4nVrFL7jdw34XLxyp1mYEuAyL9bpjQoUuKRcXbi2", + "receipt": { + "Action": { + "signer_id": "67bad843e9ecaab916f0f28ae100b8e0541f4ab3648a0958ac9b3a44eb5031cb", + "signer_public_key": "ed25519:7yvEtACLafq9JCii5SPWh4dercz5BkjTKXck1oSGiWFL", + "gas_price": "347841850", + "output_data_receivers": [ + { + "data_id": "G1Dy9q4a7YfyvEQbLZc4b8RDWoYgfwcmU3bxePtRXVJz", + "receiver_id": "wrap.near" + } + ], + "input_data_ids": [], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_on_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2N2JhZDg0M2U5ZWNhYWI5MTZmMGYyOGFlMTAwYjhlMDU0MWY0YWIzNjQ4YTA5NThhYzliM2E0NGViNTAzMWNiIiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCIsIm1zZyI6IntcImZ1bmN0aW9uXCI6XCJidXlcIixcImFyZ3NcIjp7XCJtYXJrZXRfaWRcIjpcIjM0XCIsXCJvdXRjb21lX3RhcmdldFwiOjAsXCJtaW5fc2hhcmVzX291dFwiOlwiMFwifX0ifQ==", + "gas": 170000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "wrap.near", + "receiver_id": "wrap.near", + "receipt_id": "3RgTMGUKLxZF6BJ6zhwTVgPM3MvykAoSiS9MPKWwEgeR", + "receipt": { + "Action": { + "signer_id": "67bad843e9ecaab916f0f28ae100b8e0541f4ab3648a0958ac9b3a44eb5031cb", + "signer_public_key": "ed25519:7yvEtACLafq9JCii5SPWh4dercz5BkjTKXck1oSGiWFL", + "gas_price": "347841850", + "output_data_receivers": [], + "input_data_ids": [ + "G1Dy9q4a7YfyvEQbLZc4b8RDWoYgfwcmU3bxePtRXVJz" + ], + "actions": [ + { + "FunctionCall": { + "method_name": "ft_resolve_transfer", + "args": "eyJzZW5kZXJfaWQiOiI2N2JhZDg0M2U5ZWNhYWI5MTZmMGYyOGFlMTAwYjhlMDU0MWY0YWIzNjQ4YTA5NThhYzliM2E0NGViNTAzMWNiIiwicmVjZWl2ZXJfaWQiOiJhbW0uY291bnNlbG9yLm5lYXIiLCJhbW91bnQiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIn0=", + "gas": 5000000000000, + "deposit": "0" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "67bad843e9ecaab916f0f28ae100b8e0541f4ab3648a0958ac9b3a44eb5031cb", + "receipt_id": "2AZ3LZiJzdTkmuf5P7u4ksYDKhNa5WhH2PZu9BjFy7Do", + "receipt": { + "Action": { + "signer_id": "67bad843e9ecaab916f0f28ae100b8e0541f4ab3648a0958ac9b3a44eb5031cb", + "signer_public_key": "ed25519:7yvEtACLafq9JCii5SPWh4dercz5BkjTKXck1oSGiWFL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "5884650560955752838630" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e16f51c60e28107634badab485b5880e8fd0de5e21f8e44ee8f9f8730b1d590e", + "receipt_id": "JCc4dbfSqCzF8HvXd1TLUiPJnyWn3FxEe33zcSD6gJEg", + "receipt": { + "Action": { + "signer_id": "e16f51c60e28107634badab485b5880e8fd0de5e21f8e44ee8f9f8730b1d590e", + "signer_public_key": "ed25519:GB1BeAqXp9kyrWj69MjqQ5npUkbrAkMzRTdMLtzwNZEM", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2202721678614593074010" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "fdf3c0ba76b88752da7b3c2281d59d453f6bbc3ebbb9a90419a32c32a6e37b9e", + "receipt_id": "DFpxfN9y4vBGj5WgZRD2LM41iczCyoujVGZ4KRWboYKo", + "receipt": { + "Action": { + "signer_id": "fdf3c0ba76b88752da7b3c2281d59d453f6bbc3ebbb9a90419a32c32a6e37b9e", + "signer_public_key": "ed25519:J6KiypFaYysRYYnLusad15ntATNqXPfSgSRBtcPAqgmT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "69391a26878dc60f48f4c6571ad696cd7e9954aff10eedb3a2074fff865f45bd", + "receipt_id": "3ciY175jWZN7EhfdGDHo5PdqVEw44RR79TAGFxJ8QUXw", + "receipt": { + "Action": { + "signer_id": "69391a26878dc60f48f4c6571ad696cd7e9954aff10eedb3a2074fff865f45bd", + "signer_public_key": "ed25519:85kJxpT9AegNntRVwGSBZ9oCHNj33kxWcJYYBuvihThN", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "2ea3a819b54d727eea5905b0b585eef7c95dab63141c0abb89897bda4669bb23", + "receipt_id": "4hjy4597msgd7GmCdCYfqoUaTk1a18GCM7MchadNiFoy", + "receipt": { + "Action": { + "signer_id": "2ea3a819b54d727eea5905b0b585eef7c95dab63141c0abb89897bda4669bb23", + "signer_public_key": "ed25519:494Vaz7VHVMvLtgx6WT1sBd6yDgZM2AR9BjLdSgtbPT8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e1c47b3a8a009791f20838d976954a902113dc2cf82eb88c9910557a2abf1938", + "receipt_id": "NKK1EuV9P26kYVrNGYPiJGxJoAgPdrUSPi2jteQo3f9", + "receipt": { + "Action": { + "signer_id": "e1c47b3a8a009791f20838d976954a902113dc2cf82eb88c9910557a2abf1938", + "signer_public_key": "ed25519:GCJW4jMQLos7WC4UwtyKUkYqUFw836hNh4Bge3cz4SyV", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b4a0c9f6f783bfcde1b1d4b75c85341c1c0d2e075f58d7a231601193d14ff91a", + "receipt_id": "GG7LPZYzfa3uKxnpzvXCgkJEWcWzWxkydiCEWxykN3AT", + "receipt": { + "Action": { + "signer_id": "b4a0c9f6f783bfcde1b1d4b75c85341c1c0d2e075f58d7a231601193d14ff91a", + "signer_public_key": "ed25519:DA6b7Vc8DkKw3m3UjEGDCvN779ciCo5VMwnHf7sTsTw7", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "27ff5373c141a3c65de7f08351caa7cf32456734fb903542e11df6b3adff2cda", + "receipt_id": "4HGHodYW9FAGeCFWPgsHd88GCH2G4sxLBRCSXvFXV4sf", + "receipt": { + "Action": { + "signer_id": "27ff5373c141a3c65de7f08351caa7cf32456734fb903542e11df6b3adff2cda", + "signer_public_key": "ed25519:3h8iHXKaEybfkUAXzN9bH9QcPKaMwZMY4DYm1615td2R", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ccf4d8c5cb4c2b61caf4e2993c7be1fec7f604983174568c1371ce52c9687359", + "receipt_id": "AwcKwazpnyCa8f8BcS2ZGTd8jwDX84i5iTxDqz2UqJ8v", + "receipt": { + "Action": { + "signer_id": "ccf4d8c5cb4c2b61caf4e2993c7be1fec7f604983174568c1371ce52c9687359", + "signer_public_key": "ed25519:Eo4iR7tZ1SNSKZLfWqGijfy3YTs3LQTBsuRNiGp6bXNY", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a4420bdf0dbf92834296100d7d3e878f97ef4325d55ef3be49c7d02cf0a86505", + "receipt_id": "D4bXqCdFy6Crq9D5A6Bh5kyNF75pf5f5ux4pLQmgmY3x", + "receipt": { + "Action": { + "signer_id": "a4420bdf0dbf92834296100d7d3e878f97ef4325d55ef3be49c7d02cf0a86505", + "signer_public_key": "ed25519:C4CGuLfz2dbNVmg3HxzwyScXQoCHyVH81vsRQkxB6jK2", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "62029ea73bde940bdca4ac7a37103174cc94333c67f095f00ba69efd4588373a", + "receipt_id": "AF2nML54ZcwLgbo7JFo64FMRNx1rJm1TiBP9HNW7T3iH", + "receipt": { + "Action": { + "signer_id": "62029ea73bde940bdca4ac7a37103174cc94333c67f095f00ba69efd4588373a", + "signer_public_key": "ed25519:7bbGjdBzpHuimsG4RJ7wu7f5umfCwtw1YD8wcZQspRLu", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "346c50b5e3601c1472072919b2d3c478ed8d89d37d6f17c0e280666e01b463fe", + "receipt_id": "Cu7Mc5PLzgZyqKEMEhBmPwzVxHxUJTDxgPSGmUGAjxye", + "receipt": { + "Action": { + "signer_id": "346c50b5e3601c1472072919b2d3c478ed8d89d37d6f17c0e280666e01b463fe", + "signer_public_key": "ed25519:4XdzhiZVcfJekmLYaBM5WA7iKvtjY7iAS4n2XU6f4D3b", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ada56dd31338b61688a1bbccf9136010c93e640cf76af38bf1fff5d89cdbe88c", + "receipt_id": "FYqAXm8KyR6Ptzjt7hHvrAAi9NWzusTy3VNus43EpFsa", + "receipt": { + "Action": { + "signer_id": "ada56dd31338b61688a1bbccf9136010c93e640cf76af38bf1fff5d89cdbe88c", + "signer_public_key": "ed25519:CgqqbuBmU7fz6i1tJdq2pi4rXejnVRCKKr7fpsgGkcxb", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8850bfa0acaf43c0af7cfae7e63f95d1bbf5cc6456c6b037d763a4006e796edf", + "receipt_id": "36zZTnLGS31nwWyzy4WvtVEuUyUwCRVsXgpoKHYDownL", + "receipt": { + "Action": { + "signer_id": "8850bfa0acaf43c0af7cfae7e63f95d1bbf5cc6456c6b037d763a4006e796edf", + "signer_public_key": "ed25519:AB7rxUa2AEBZHZXZxToWprirKzy9JdPbvD78qk7xo1tr", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "38bbba4522fb45b4bef0c1454ee4bf0ac9ae210608a5a3500a69dacf58caa2bc", + "receipt_id": "CQA8seKhXNmba6npvnspWZJZafcpTmiuYTQE5eovsY9F", + "receipt": { + "Action": { + "signer_id": "38bbba4522fb45b4bef0c1454ee4bf0ac9ae210608a5a3500a69dacf58caa2bc", + "signer_public_key": "ed25519:4pTrnRi7bJy7Kwp4ysxTpoPdGgZz2FV4qdfcXJuGQkZh", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a84f16490fcca438161789940634e7374c85f82f689967c76e149037f13ef759", + "receipt_id": "FSKqWBLLu7xTvrQuaRdjNr4WNPDzQFGqkwEr78EvpNMm", + "receipt": { + "Action": { + "signer_id": "a84f16490fcca438161789940634e7374c85f82f689967c76e149037f13ef759", + "signer_public_key": "ed25519:CL1SR9noD9sVY2JSPUbSwBRFz5qF9zzSyzgtyKN6JQsr", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9d43a591c1177f6db71c7396202be99ab0f2d6c24a21fd2eb7e2908058b8071d", + "receipt_id": "2pNf5Fi1pyCEGQWeRJHAqcMQb7bwZA75Wd8PA4zq8q2A", + "receipt": { + "Action": { + "signer_id": "9d43a591c1177f6db71c7396202be99ab0f2d6c24a21fd2eb7e2908058b8071d", + "signer_public_key": "ed25519:BatqUEYvk3cefSPdbDwBN6iPALdcNs1AhoUX1qNMKSwn", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "db8d152e3d6bebc828897d6f45c71f17add023b8330ce0b16f5228e8d73b94ac", + "receipt_id": "426jQKcXvVAxjTTajXYATfVZGxcZbuMwCZ88pCpxJafD", + "receipt": { + "Action": { + "signer_id": "db8d152e3d6bebc828897d6f45c71f17add023b8330ce0b16f5228e8d73b94ac", + "signer_public_key": "ed25519:Fn34VAiUZtnAvnRawewutABVMf8P7CgaLcAGWtQgjiKu", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "951471e0814756b302c809ed03e783c5f00807050e6e8573d9a576249d0b32c7", + "receipt_id": "9TwR46JMU9gvtv2rauQaWJJVn8QNfNvWGHMkpr8Y4vgz", + "receipt": { + "Action": { + "signer_id": "951471e0814756b302c809ed03e783c5f00807050e6e8573d9a576249d0b32c7", + "signer_public_key": "ed25519:B2wq41H57YSvkDDZfM55ZGofryR4ukCRykvNAAoTteVc", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c5b41c0b7acf736d417f84d22cac0eed3921c1aeca5fc80d024e7c8e7cff9c51", + "receipt_id": "FspUdBvyjm1MBWhSv27AcZBeHn4NkDfNjQpJxuGjYGH6", + "receipt": { + "Action": { + "signer_id": "c5b41c0b7acf736d417f84d22cac0eed3921c1aeca5fc80d024e7c8e7cff9c51", + "signer_public_key": "ed25519:EJkcATFEhPzNuuDmTuSG4ihCyZKoMgW3J3nCz98FKtGp", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e9bffb51db321c42a25d34282ee943cdb41f8fc0fdd7920f134ce2073115d188", + "receipt_id": "DtpDxZAnAvjQcRG8c7LTvHfq8ETTuuPfXWXEJuYSbQxV", + "receipt": { + "Action": { + "signer_id": "e9bffb51db321c42a25d34282ee943cdb41f8fc0fdd7920f134ce2073115d188", + "signer_public_key": "ed25519:GjTnRdN34nCf6AQA8sxLJjGbdQU62N5nE8rVG2XFWMX5", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "95bec7e57ef31eb8bd81993a678bdb1363e7d007b239ba65925af5af43653cc7", + "receipt_id": "5Us3Vejyorp2j21QftbsV8e2mfnELJoSk1ZJvLc8yEks", + "receipt": { + "Action": { + "signer_id": "95bec7e57ef31eb8bd81993a678bdb1363e7d007b239ba65925af5af43653cc7", + "signer_public_key": "ed25519:B5YUXGFxfqDeKhx2MSAize6eiYwGnfpkPDhq5XvhmqzW", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d482c54f3b9ab801baca5810dfcfb7160d5aec673570c1a23f70a80ff5eb663f", + "receipt_id": "4owQb8GWbZJ1a5G3dTZrhiyL2yr3m72w5URA7ecnfeLs", + "receipt": { + "Action": { + "signer_id": "d482c54f3b9ab801baca5810dfcfb7160d5aec673570c1a23f70a80ff5eb663f", + "signer_public_key": "ed25519:FJZ615hc3tDSHAhNNvxj3sTqastSkJPE4q1RaYGaitcE", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "adc2a42bc959c3b0596cf653a8b562ef421890bedbaf8ea9144ebb0557605c1e", + "receipt_id": "BaJZHTgm8siwTuKz3mKaz2arsxRgmjiCvNzCz2dPCeGk", + "receipt": { + "Action": { + "signer_id": "adc2a42bc959c3b0596cf653a8b562ef421890bedbaf8ea9144ebb0557605c1e", + "signer_public_key": "ed25519:ChHg4WweaL3zH9inBQiu47nyh7vL5bxFJwnK37PiG8TP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f6964201d324203ea3657473a62873d917542c19cc5e522d54f5f13bbfd4054f", + "receipt_id": "2mMai51XuzFAYFAfEba1UtPAnmq3NjDFXJ7VaE4dkUNH", + "receipt": { + "Action": { + "signer_id": "f6964201d324203ea3657473a62873d917542c19cc5e522d54f5f13bbfd4054f", + "signer_public_key": "ed25519:HbaBakCuBcmHpXS2ekW91hHpeNGXmJQFrcnUrrzL8pTg", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cb6c9942fe09078c116f42300fa4c41957d2cf74e0461dff3113fd82e82552b6", + "receipt_id": "CgxadAJvuFsywTWHXSmNc8seK4YtW13DxMp426sXWZyZ", + "receipt": { + "Action": { + "signer_id": "cb6c9942fe09078c116f42300fa4c41957d2cf74e0461dff3113fd82e82552b6", + "signer_public_key": "ed25519:Eh5orfc6AV8dQiiExNprFrz84fDghyDoXaNFfgfFMjwK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c75aed38d44b0402c2676bf78264f34dd0521405b54b51c01df13e002f88ffda", + "receipt_id": "2jLTX7bwkvJNupJ8qhzgu3ueuuMBxKZoqvm15JsM5r8o", + "receipt": { + "Action": { + "signer_id": "c75aed38d44b0402c2676bf78264f34dd0521405b54b51c01df13e002f88ffda", + "signer_public_key": "ed25519:ERCYmwoBzCY3VHJchMNx37PY65WTbM8q9BayjqfJKcnV", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "22b634bd3b9f6cf5dce2374b8445f59c7772b1bcfd452876a0118727c63c44a1", + "receipt_id": "8gwaXrriECf3tQmJJqG2a6bZp8GLqzLX1xiTxLgHFPR9", + "receipt": { + "Action": { + "signer_id": "22b634bd3b9f6cf5dce2374b8445f59c7772b1bcfd452876a0118727c63c44a1", + "signer_public_key": "ed25519:3LW1KzQNTbvQXHpzvrs2fYsbLbCGUjAg9jvdEXDx2T4t", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9e0d32c1e5e536acd1408f2109b992b63da4d402c717bb4a045faf82f84150b5", + "receipt_id": "8x6AJpX7pxSX77HTK2bwpN73kvQKWMKQbTyVnVZgMyzo", + "receipt": { + "Action": { + "signer_id": "9e0d32c1e5e536acd1408f2109b992b63da4d402c717bb4a045faf82f84150b5", + "signer_public_key": "ed25519:Bdy69wUEbDDQc1EvBQxJM8ntmrsQzUV4N2osdQodovdi", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b692a421b9447690a6627ab67ddd477607a35493e78de0f875eee0994157e41d", + "receipt_id": "2fje43BUwNQ4Cxy2bPj7P7G7cQiQm7qsPNx6Z5AbyiNp", + "receipt": { + "Action": { + "signer_id": "b692a421b9447690a6627ab67ddd477607a35493e78de0f875eee0994157e41d", + "signer_public_key": "ed25519:DHgtgry1xXuMQt4CSvkHYc7d4pVDQZ12qPh2GoNZk3Xr", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8c023e8a8aa769c51b3a9198ea28e2067a73455d109bd5475dd07df40fa8a1d3", + "receipt_id": "Fdcwzdr7NkAwnavU1JGQ2zvhNNVhaaMKzRYTDX9n6JGE", + "receipt": { + "Action": { + "signer_id": "8c023e8a8aa769c51b3a9198ea28e2067a73455d109bd5475dd07df40fa8a1d3", + "signer_public_key": "ed25519:ARY4dSrNrYE6ktcjhGVkNePoE2zSpq36mdhKN3fTWNE6", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e528a122e6217e29e12162c0c04b3c0fac1a9d893e9b2854ac89a5da504b9be4", + "receipt_id": "CPwan3Nm66uLQier4gAcBdBznaVQTRzz8NVdLSa9Px56", + "receipt": { + "Action": { + "signer_id": "e528a122e6217e29e12162c0c04b3c0fac1a9d893e9b2854ac89a5da504b9be4", + "signer_public_key": "ed25519:GRYJ9dZLRFGzfERMdVAvkL4uF1DR84CT9X96Z5mCuMbH", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "bf10089507eab7423978cfa4dd83a8c5287476bce26609507929997cdd607c70", + "receipt_id": "7nccKAxbSmxRnqSyL4tPEyb5uvaN69QfxTHLV95WBRPf", + "receipt": { + "Action": { + "signer_id": "bf10089507eab7423978cfa4dd83a8c5287476bce26609507929997cdd607c70", + "signer_public_key": "ed25519:Drq3vZ6ndoVSywo6Not9GFUFJ3jSUUupdEN6f7NwkC1m", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "86316ea0b03e99303b8fb1868b223c5548976a3d250749793b25ec2872a1cb7e", + "receipt_id": "Hyxz66eW6s9Nun9FiZ6aAHfbyQgsSSe9rzS56B6Qafiw", + "receipt": { + "Action": { + "signer_id": "86316ea0b03e99303b8fb1868b223c5548976a3d250749793b25ec2872a1cb7e", + "signer_public_key": "ed25519:A2qMGqQxJuGYDPiqLQkXGmVNjxGagh6mJjdH9D4hfaRT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9c599d6ab77500d535d9fbbe728b7a631b45d0a2249872f090b0c355b89477c5", + "receipt_id": "Gtptbztaxw6XM91fQNQMsfm5qcSn8Z46K1uQCTMgyisR", + "receipt": { + "Action": { + "signer_id": "9c599d6ab77500d535d9fbbe728b7a631b45d0a2249872f090b0c355b89477c5", + "signer_public_key": "ed25519:BXKrh3XCTaZzdd3Yt2n9VgEQY8YffnZBRpkGksqhhr1a", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2244371072686879729910" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9b3aed246ad3825a690fe37a534447359838530add978a26517bbc35b16da721", + "receipt_id": "6RPHF978X8escbNhb63qfmMVpb2exgE8745w9uBnGEtb", + "receipt": { + "Action": { + "signer_id": "9b3aed246ad3825a690fe37a534447359838530add978a26517bbc35b16da721", + "signer_public_key": "ed25519:BSxJrnnVQ6kjsg4tX99DdoTQcChP5y8BQAdxwetFsMRJ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "7e275210db68d04783386a8b19992954a6fe027a8025e58210c179b28d1cf739", + "receipt_id": "3Bxr5BwVMXwxUuG7v9JtcFHnrWamGoAU3VmbL6ckvojG", + "receipt": { + "Action": { + "signer_id": "7e275210db68d04783386a8b19992954a6fe027a8025e58210c179b28d1cf739", + "signer_public_key": "ed25519:9VT9RYwcQXB14zDUnBSaC9uNksYG8o4N6vxzhpe9C95S", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ec20f015d77f523102b412458564a2ef54121863cfb7dad9f454d83c7412676c", + "receipt_id": "GBUS9x6LS63yLdWCuNK1KVaTFd7KuGm8pv63NqGpf2GT", + "receipt": { + "Action": { + "signer_id": "ec20f015d77f523102b412458564a2ef54121863cfb7dad9f454d83c7412676c", + "signer_public_key": "ed25519:GtkM8WFnLEgL9Ne6TUXgzKS54d54GuJfFfBs86YRFTNs", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d4db0497cfbad28e3b0dd724060f6bfb780dbe3263e8acf779c9ae8f16f63998", + "receipt_id": "ENyVpadta1KA1kXtDrh8JJSVjSZXA9XrpRtnssPVn6g7", + "receipt": { + "Action": { + "signer_id": "d4db0497cfbad28e3b0dd724060f6bfb780dbe3263e8acf779c9ae8f16f63998", + "signer_public_key": "ed25519:FKu8gjwkoURPNYPZQNKmM9Lrzewev27q4vKyVPcBjV1R", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6c55a22ccf93c51a4ac7f4fdc04409d6bae8617f55643d13c6e7e2f5d7d73ada", + "receipt_id": "8y1sR6sGMf925Kb3kdNNNZpcEH8V9z3ryxmopUSdQ2pQ", + "receipt": { + "Action": { + "signer_id": "6c55a22ccf93c51a4ac7f4fdc04409d6bae8617f55643d13c6e7e2f5d7d73ada", + "signer_public_key": "ed25519:8HtmS1oMpHUzBpz1nvPpRhrtpu3XQUEdGro6ez2a34Mf", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c2d6dd31401dd18bed6dd7b72a028518b079a4ee34c6573416720a2cc4c73125", + "receipt_id": "6DrinKb5U3dXCyCVhfrJaR6Vbap9cZUPmHBJxMPeTqVe", + "receipt": { + "Action": { + "signer_id": "c2d6dd31401dd18bed6dd7b72a028518b079a4ee34c6573416720a2cc4c73125", + "signer_public_key": "ed25519:E7a7yNXnXUhqMjGup1ZganQfFFbk7j1yd3tfNiUv8DZn", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "fe9ab0f4c8dc72b41ab2a55dbb3c9d5994110926b139f14aea65a98f2b4a8e9c", + "receipt_id": "69JURLNT5N73uUuQKP1AyXSxm1igSSUax9NUEkMHCfZK", + "receipt": { + "Action": { + "signer_id": "fe9ab0f4c8dc72b41ab2a55dbb3c9d5994110926b139f14aea65a98f2b4a8e9c", + "signer_public_key": "ed25519:J8sNAfvzXgj3sfbpDP8Etz2h8h18TUtQsM6jvuRmrTJs", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "79b6e05e6237effbb697fbd795e25cd89e1cf02fb46d842f4b82a025e42c57b7", + "receipt_id": "8DF2K9uTekwDfRtKP2SbM43f9BQn1qXz55NGaEDnU5qf", + "receipt": { + "Action": { + "signer_id": "79b6e05e6237effbb697fbd795e25cd89e1cf02fb46d842f4b82a025e42c57b7", + "signer_public_key": "ed25519:9C84xhDxEofzGfzXzjs3zYtUXPTEM5qK6yXKeEkzhajY", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ab848f5e55f34eac36139d0468fe3e4a8f20eb4413c04ad446b1c90adc72c9c8", + "receipt_id": "7B2KCziD8WZw54WRM4CpdQdLRia9gFH5jDGfmwHpXUzx", + "receipt": { + "Action": { + "signer_id": "ab848f5e55f34eac36139d0468fe3e4a8f20eb4413c04ad446b1c90adc72c9c8", + "signer_public_key": "ed25519:CYXxHAqfLjp9Gun6Xc9QRchrGP35uQJNrQfgyZnR69w5", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b34b5ce808125be5fe0c7c2d2cebe34b0028b76f0dc09c191e5454e4a9d3fd2f", + "receipt_id": "8JJ5AGFAhr64UjFrm8nX1PPfmAor7XnUdUuu5DmbpxEN", + "receipt": { + "Action": { + "signer_id": "b34b5ce808125be5fe0c7c2d2cebe34b0028b76f0dc09c191e5454e4a9d3fd2f", + "signer_public_key": "ed25519:D4tdVn1s5QBenipizvKx1KbXUsTeFB7VDy4BQUgew5FL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d86315f3bd9cc2169f224c8c46708c42e53316337fe4f73da028bddedd6ef5b1", + "receipt_id": "AJ2eNdux99dAECEkaGnBunv4B5YtPF8tidwRGUMSTYY", + "receipt": { + "Action": { + "signer_id": "d86315f3bd9cc2169f224c8c46708c42e53316337fe4f73da028bddedd6ef5b1", + "signer_public_key": "ed25519:FZghHpobchb9Xwq3LQQXsV1F2eax96dgbtDtUXKBmg32", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cbd3eb3fdd1e649180493be73135f5b42ffb6dd3ddbe14a805e5ff7da55c33ac", + "receipt_id": "3g2zSqxzoUFYwyciv97mmHQ5CYZ2tQUKH8fBZfJ2RNNn", + "receipt": { + "Action": { + "signer_id": "cbd3eb3fdd1e649180493be73135f5b42ffb6dd3ddbe14a805e5ff7da55c33ac", + "signer_public_key": "ed25519:EifBinBUGCzUANwQ7HUirzqWSrpWbVPJJSi46XWfFMAb", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "97632a15a2e5a4e8b651af4fa7c09f201ce61c15396476a5ea980d10820a124b", + "receipt_id": "HQLtpHNkiZ5SSaCjXKTjVoJjdjnb6jNNbdwGxhBSpWhJ", + "receipt": { + "Action": { + "signer_id": "97632a15a2e5a4e8b651af4fa7c09f201ce61c15396476a5ea980d10820a124b", + "signer_public_key": "ed25519:BBxGJbz8e6LbZsf3qVLvhRVa5tc6x4REJohgeTrH1ENN", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "bf2e395fa8291c98822818a82e77085d1376625efe748ae6ba4f6fa49fa32644", + "receipt_id": "5e7k9kRPWjJS66ozemyh4jwbJVRXr755R2Zjc47eytjE", + "receipt": { + "Action": { + "signer_id": "bf2e395fa8291c98822818a82e77085d1376625efe748ae6ba4f6fa49fa32644", + "signer_public_key": "ed25519:DsHkZkWXaCED9TYpb8B4mkaC4QsB2SdVWtd1CkmMUJtT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f65f8c1efd21b7f3e360cefda9b32d436d1324449bede9fe5e78fc6db9d3759d", + "receipt_id": "EnKrgNWjnyXYCbovP3StmZPWdcdQ67PXNjycTJdKtZGm", + "receipt": { + "Action": { + "signer_id": "f65f8c1efd21b7f3e360cefda9b32d436d1324449bede9fe5e78fc6db9d3759d", + "signer_public_key": "ed25519:HajoBSkUGuKGkvhk8yzLHrWwC8h1kfdARypceQrLKCPv", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9e33bfcb688a1d9eb9602423c4fa1be7ac1dfb8cf0c955670e2cc53dde09b514", + "receipt_id": "H1nezbFhmMraS4wcVqtzjWPxptFsysggV6UBDX8aACno", + "receipt": { + "Action": { + "signer_id": "9e33bfcb688a1d9eb9602423c4fa1be7ac1dfb8cf0c955670e2cc53dde09b514", + "signer_public_key": "ed25519:BeZBeHqXKqMLEfpVuDjKFakE9xqX1kmSGZ9k1QT25FBh", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "dcb2189f37930d19268031bb9ded48f601ac7fbedefe463e0bed182f12dcad18", + "receipt_id": "8y189UhNkGVhMt7a3kBUP65p1Eo1xmViueMVdHmiHkhB", + "receipt": { + "Action": { + "signer_id": "dcb2189f37930d19268031bb9ded48f601ac7fbedefe463e0bed182f12dcad18", + "signer_public_key": "ed25519:FrWCkndPFphk9dEQkozcwM8pjJmp3iNd7Ed25VTe1uUT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "86cae95ab9610267315602b8e9c5deac35def217d3ac469d119a6f35537b4961", + "receipt_id": "3xSnPwoakkthFsH5DjDga4v9ohCDLsmevfdkbHnbHwYH", + "receipt": { + "Action": { + "signer_id": "86cae95ab9610267315602b8e9c5deac35def217d3ac469d119a6f35537b4961", + "signer_public_key": "ed25519:A5B65LMR4Te1vrvRb5khxX4aWXLuQbaWQv5CNVX4vjyJ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d2d11c58348c0c6e7bab3ff46943166e4614bb767e452054d37f8ba2526296f1", + "receipt_id": "nPcAwL1A3cPAYCGR3GHFtCGeayE8tbwGmTtvta2bMyT", + "receipt": { + "Action": { + "signer_id": "d2d11c58348c0c6e7bab3ff46943166e4614bb767e452054d37f8ba2526296f1", + "signer_public_key": "ed25519:FBwZCPuzBG8q126sPMBSrBVKJwPPM48J2NmT8PHZjWBA", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "dc0395aaeb1563588c46b473457db5000fbc387b8bb0f0d7da95ad2bc38ff94a", + "receipt_id": "GcSfu3im2GoVaHjaNWfkN6pnNVEiLwKWG4H4Sp72E9ei", + "receipt": { + "Action": { + "signer_id": "dc0395aaeb1563588c46b473457db5000fbc387b8bb0f0d7da95ad2bc38ff94a", + "signer_public_key": "ed25519:Foqs6kxkxvU7ta8MFao1tmtrJmJK88FPqdNYnKvWXxXb", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "bd7b296ee5112130d3f8267132059c383018510e0104961d6eac0086949c0be9", + "receipt_id": "8ybECCyPSHapm6Y7GbpZTX6a8D8QaXiUDgepPn7QrTox", + "receipt": { + "Action": { + "signer_id": "bd7b296ee5112130d3f8267132059c383018510e0104961d6eac0086949c0be9", + "signer_public_key": "ed25519:DkeyqBXdoHyZyD8fUHkiiz7NGH2u6bzQ15MVbgXBFN8G", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6110555fd56d62549f722d080162aedae5068dec1ba2b856e51326daaf1cbc19", + "receipt_id": "3Aut3qHpRXNjY1vJ17Q1eKVBVpjMB1FvoXGFYzFwnoQW", + "receipt": { + "Action": { + "signer_id": "6110555fd56d62549f722d080162aedae5068dec1ba2b856e51326daaf1cbc19", + "signer_public_key": "ed25519:7XtzYT3n5ogWVA3DyXWpDJCs3qh11jU4B9EBsbZJEF3N", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "85d120d634d75910b15f2a22532c840bf7a827499234bcf8dd9f8b582786edfa", + "receipt_id": "DpUpt6CxuLMFLEcw3iF73DBDAG9oK3uRVpT8XnDzZnWo", + "receipt": { + "Action": { + "signer_id": "85d120d634d75910b15f2a22532c840bf7a827499234bcf8dd9f8b582786edfa", + "signer_public_key": "ed25519:A1NBKU2YsTBxh3tRiq1JyLWsiDvGDCHuL6ZzjkbHa2WV", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "64eea8dbb351e58717fad21fb7fe7391fcdbd903e69408c9e10dc10868844af5", + "receipt_id": "2WA9wxECXFZKnkZJeN7zMBJeQcnXbtiesK8H2CBKFiJq", + "receipt": { + "Action": { + "signer_id": "64eea8dbb351e58717fad21fb7fe7391fcdbd903e69408c9e10dc10868844af5", + "signer_public_key": "ed25519:7nzqowDvv6iMuE1GwJAsr1p7MJ9GJqHiUDJwau7cZ7Me", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9e550695d89179b13b87d4d50aa4257aaa51ea414e31c67845cb3fe0b49fc33d", + "receipt_id": "D6Y6vC7LAznzng4VSkb8Nzy7d15LYjeX9fXCLEz5P7ny", + "receipt": { + "Action": { + "signer_id": "9e550695d89179b13b87d4d50aa4257aaa51ea414e31c67845cb3fe0b49fc33d", + "signer_public_key": "ed25519:Bf4caa5nHpniVajitqzn347G5Nu3B92vHYS17fLKitvg", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9af100e2c40fdd1b5f5481b6165949d6eb51ba79a744140667c7e30cf9a26c41", + "receipt_id": "EZNeqgx5PyPYEozbw2PzMmYhVVwRcBv9wZP1Y69KdVqq", + "receipt": { + "Action": { + "signer_id": "9af100e2c40fdd1b5f5481b6165949d6eb51ba79a744140667c7e30cf9a26c41", + "signer_public_key": "ed25519:BRpvwyvJYLCdMAVQANG3qAVZddihStjF4Sg8RXEWU8jS", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a6a92ac66c4c1c843c5445eff294551306a72ec27b4d4cb9e940aa3808929666", + "receipt_id": "GQwxpfqiQwcciFABkBAMiaTeypk2kHLLYAPNdD44pjAJ", + "receipt": { + "Action": { + "signer_id": "a6a92ac66c4c1c843c5445eff294551306a72ec27b4d4cb9e940aa3808929666", + "signer_public_key": "ed25519:CDaHpmHaeLoY9MHi7Mv4UuhPtFuXxwXqmm7PaCCT4tXw", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5ece99c2dad18bc360488c55f976c86953177b2d88c895cb1539b88972e2b665", + "receipt_id": "43hRVfQKceZsYu4dJn1GxVbCMoRjez9kc98eeUGNLihi", + "receipt": { + "Action": { + "signer_id": "5ece99c2dad18bc360488c55f976c86953177b2d88c895cb1539b88972e2b665", + "signer_public_key": "ed25519:7P63T5HcjqwZnJYnvL83WMNZWSvp3ghcfjrA1WAemZye", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cec2438622e4c0cbaca15e76aa09158b8c41ba593509e8bf403e341d9f8cee67", + "receipt_id": "GVx3eCqARts9F3DuqGVpBQw7JE8js1KLnbhzKGp8LAJh", + "receipt": { + "Action": { + "signer_id": "cec2438622e4c0cbaca15e76aa09158b8c41ba593509e8bf403e341d9f8cee67", + "signer_public_key": "ed25519:Ev6o2fTf2gG6LimMc77BcZ1DCwu7GHcXa1oCcVVYjnMC", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "2e36db745cd6e52613cad698b4eeee0a1b460485ccd406b904f095752229df82", + "receipt_id": "Gax4rQgd1SWnEaxLfeCXKvn8diBpabLNUdqQn4cpkYJp", + "receipt": { + "Action": { + "signer_id": "2e36db745cd6e52613cad698b4eeee0a1b460485ccd406b904f095752229df82", + "signer_public_key": "ed25519:47QGfh3D6ZuB2Wo9XBeG9vqZW6LaYNQ9jC9xQuYWeyPo", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "398cb52fd6a20f216aff694fbaec4f318b38de2a15e803876c8938e14c10759d", + "receipt_id": "9vyx9R2QnAobbzq2HAdWtnWudAgzYorsE3J8LfjqN3DW", + "receipt": { + "Action": { + "signer_id": "398cb52fd6a20f216aff694fbaec4f318b38de2a15e803876c8938e14c10759d", + "signer_public_key": "ed25519:4segXL7WVV2BMEt6eMDKr3BJvdya7ZiU13Jf85igpF8g", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b34ec17c714cd2a33a5eed2f331b479db90d89d0aa5d2c78d302330554a95674", + "receipt_id": "6Dgnbg4KPNqHCBS793KBRhkUb79KvFtMHQCq8qQB1hnU", + "receipt": { + "Action": { + "signer_id": "b34ec17c714cd2a33a5eed2f331b479db90d89d0aa5d2c78d302330554a95674", + "signer_public_key": "ed25519:D4wdY6PxzTQBBeH9VAKgvWvUtXHRGEq18m3SBi4vm8d1", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b1b7c86ce1fb46a12003eb437fbcd2dfc8e7667046c9a9f24a7c7c633936f888", + "receipt_id": "DKN7YveuEoSEpmK12u4uq7DBAoH6XaeW2TggX9Ne9ngD", + "receipt": { + "Action": { + "signer_id": "b1b7c86ce1fb46a12003eb437fbcd2dfc8e7667046c9a9f24a7c7c633936f888", + "signer_public_key": "ed25519:CxjhfJkzM2AL9gxaptN67s1qKSPcBxwaTPCPHKSBDNXh", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "665f03be2d015e96a40c92f8bbf7d78a7afdf551d9fc46c12267035b5c2f848b", + "receipt_id": "7A1VCXp4ErpCskYhj3E4FUYs1bny4QieUNseeBJ1uqEE", + "receipt": { + "Action": { + "signer_id": "665f03be2d015e96a40c92f8bbf7d78a7afdf551d9fc46c12267035b5c2f848b", + "signer_public_key": "ed25519:7tccmBtofbVHCc2wYXZtUAuTVNHLof72csxBGMSdhXWa", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "2ba0d812e1849ba2274f6547c113b78b0cb7a63fdc951252bd07ec40d2a9c3ea", + "receipt_id": "6cCdFfGExsRfsCxyxVkh7RAXoQWj4NWFKdEHrqSv1jVt", + "receipt": { + "Action": { + "signer_id": "2ba0d812e1849ba2274f6547c113b78b0cb7a63fdc951252bd07ec40d2a9c3ea", + "signer_public_key": "ed25519:3wJnNcU22nWDpYNrMN2Kg47Hv6hrhKEiPa1WfyyLuuZB", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e878fa4447575b4c3978bfd0d81015368a48e15dea0738ae3b158bf2c7c81789", + "receipt_id": "BYwJkwaJ2oweKPoYw3WmopC3WQdYjZbQYMDdhun167kx", + "receipt": { + "Action": { + "signer_id": "e878fa4447575b4c3978bfd0d81015368a48e15dea0738ae3b158bf2c7c81789", + "signer_public_key": "ed25519:GeUab3rjc9ifKukpJys7pbKtPHZ9g1YaMp7qvm7Mo6KJ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "977d37d51ad52025f814e572a2ac749e76d2035912c9fdcf5012941b48fe9b71", + "receipt_id": "CtV5wtg2FqoyYMLij2yFmgi4eW7rk4ghqN2pyFzVK4vD", + "receipt": { + "Action": { + "signer_id": "977d37d51ad52025f814e572a2ac749e76d2035912c9fdcf5012941b48fe9b71", + "signer_public_key": "ed25519:BCMJjyvtTymrf4yYQQcxKjrCTFzj2NA1BdJaCtU5kpHW", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "4a02b292c00f310d845cd881433fd55f516d0b232f0ca4d5bbdd9651f578a94a", + "receipt_id": "J5qVd5qAjFRFZm49XBbjzrpA41jJNK9j4Phb24xMiqro", + "receipt": { + "Action": { + "signer_id": "4a02b292c00f310d845cd881433fd55f516d0b232f0ca4d5bbdd9651f578a94a", + "signer_public_key": "ed25519:5yuZDEwRvthNswPnHBVcso8m8w8eRcBAw26ZuPx9DzEM", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c6b39564526aaad07bf30538916ec07d4a369cf048c12c9321c969ab598ce137", + "receipt_id": "GA4upJTLz3Qoa1QmRyN1Gye9oPFUgYGTyLpQAZeG7tdy", + "receipt": { + "Action": { + "signer_id": "c6b39564526aaad07bf30538916ec07d4a369cf048c12c9321c969ab598ce137", + "signer_public_key": "ed25519:ENeYq4VRZRii154ZU4ppryyTMCHjf9aMJe474CsKaJmL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "efe1428295b1e114fa4cbf816e509a3edf52ddc8598d64d0a477311b95600e38", + "receipt_id": "HFVV4YoZqQQyPgnes6gKwjyK3rsDADVmtC4azo6yJhv2", + "receipt": { + "Action": { + "signer_id": "efe1428295b1e114fa4cbf816e509a3edf52ddc8598d64d0a477311b95600e38", + "signer_public_key": "ed25519:H9PfKXJDFEHs1sGfsHKxHNgtsNgSLW4BAtduDsjHjvZu", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a015838bb5bf36a599767ee230bcc6aba759cdf5c913af47356da20a593fd9f4", + "receipt_id": "A7Czd4NhwFuPkp4ywbtKNHPsomWGjXN4JCfMBQ6h5DZ1", + "receipt": { + "Action": { + "signer_id": "a015838bb5bf36a599767ee230bcc6aba759cdf5c913af47356da20a593fd9f4", + "signer_public_key": "ed25519:BmuFzw2AwcFcHAV7wAvHTfA3oWxyEK2aQjDf4eHqsHmm", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f19767f7d037901a2bb744b1d083fb21208d41abfabf47bbe240013ea8cd246d", + "receipt_id": "5sEqrRnJw77xjUf4LUHvoEihKnJzqXjctuffJzVNqQ5J", + "receipt": { + "Action": { + "signer_id": "f19767f7d037901a2bb744b1d083fb21208d41abfabf47bbe240013ea8cd246d", + "signer_public_key": "ed25519:HG5AFaLuCQfu1LLy24LcxWnGqYYWSiaF43smaeU4HGuz", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c91eb75e4c9866d7061125fda55aab4cf466706f3966fbd107081cbcabee45d5", + "receipt_id": "AoRCjYHAdg5JgYbjoHgdmzcnmgFpY5TkoJ3XPnuDmGN", + "receipt": { + "Action": { + "signer_id": "c91eb75e4c9866d7061125fda55aab4cf466706f3966fbd107081cbcabee45d5", + "signer_public_key": "ed25519:EY67YkS1G6Ag457mfJz7zahWmiBbc9pX2Ui5ccJpwTkp", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "bd096f601f98f22c4ebd977259628c6c79edf5aadcd52fbcc45a0fb729fe4a08", + "receipt_id": "Hz1rSK1FaPC7pjdJ8jUT2W8jWE6N9Te4yiW3AWcnfVYu", + "receipt": { + "Action": { + "signer_id": "bd096f601f98f22c4ebd977259628c6c79edf5aadcd52fbcc45a0fb729fe4a08", + "signer_public_key": "ed25519:DivQADhVUq6RbrfbAB3QL3srBDhrKk1hrxSjDUEKyQ1D", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9ff6ff2ad63f9183e64d0c7eae2f57ab4e42d311befaceb8802b5ec034293d5c", + "receipt_id": "FQkPBwwHv1iS17JjT5tMX3xN4vQUJoBLc7YWFsmhBJmZ", + "receipt": { + "Action": { + "signer_id": "9ff6ff2ad63f9183e64d0c7eae2f57ab4e42d311befaceb8802b5ec034293d5c", + "signer_public_key": "ed25519:BmSGcKTK1AbKCuBoWBwozSCerkPeMYaRFNbMBiA8mBbH", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "783bb90d52468e7faedb0141cfbe032d7138617cfbef1fee231b36ef34e53379", + "receipt_id": "G184YmDQmRR71uVBN17vtfuaGfbwnvAbF2YedVffhBeA", + "receipt": { + "Action": { + "signer_id": "783bb90d52468e7faedb0141cfbe032d7138617cfbef1fee231b36ef34e53379", + "signer_public_key": "ed25519:96Lk6DmS4uTKjjWxKgJZZUMasA35Ckqynau8GqeiLe1W", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b957b9e970ebf7b3f49cb9458f7b0556ce3b275a7ff819c5adc687d2f76fefff", + "receipt_id": "5LcxPP25fxizdcGCq59GW8mgPoS6nJukjrcy2iCTXEqg", + "receipt": { + "Action": { + "signer_id": "b957b9e970ebf7b3f49cb9458f7b0556ce3b275a7ff819c5adc687d2f76fefff", + "signer_public_key": "ed25519:DUW1ZHgfJHxQnSsZD4MQc2L1cUbuw7KB2ZG6QSrFKkgE", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8e972caaeaf483332ab5efd66a5348f8f7ff8c27ab0e1d3e517171d3bc27ba78", + "receipt_id": "BWRW2f2g9j97c2dVJKDNPTRtgQUFviq9uLtLuynv4jD2", + "receipt": { + "Action": { + "signer_id": "8e972caaeaf483332ab5efd66a5348f8f7ff8c27ab0e1d3e517171d3bc27ba78", + "signer_public_key": "ed25519:AbcbNNohYvM5HNic84YAjSsVA3v1Fz3bTUdrYV6FDufm", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8f74f92c9ac8065fcc4befe44aa087df0c1e32f72912dfa4608decdd1d565827", + "receipt_id": "7vVp6jNnS68DfnVTz3qGs9t9dCaCp3hwQ3Y1PsKrZxFR", + "receipt": { + "Action": { + "signer_id": "8f74f92c9ac8065fcc4befe44aa087df0c1e32f72912dfa4608decdd1d565827", + "signer_public_key": "ed25519:AezkeiivjF9SKcm4JDmPDTtm3H1YSCDNYKCUhvcxvH1G", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "898134e580c7e05ec5b765a499cd046348ebba06ed9ad622adb7d32101ee4180", + "receipt_id": "2VS42MVPAgHUShH7XvVTLJEM8P6ffzxGNnFout37N3GK", + "receipt": { + "Action": { + "signer_id": "898134e580c7e05ec5b765a499cd046348ebba06ed9ad622adb7d32101ee4180", + "signer_public_key": "ed25519:AFm8HUx9ZaqyqAwSGAcW3iXf787iwjzTgnLDpksuRPuZ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ac45f601af54cf7190dbdb36123a19c296217c698579098b4177a53b95e65388", + "receipt_id": "9dtTB7Fos32QNPpQ8oj9HDCKUhqWLVzQcfJ45oRR2sjQ", + "receipt": { + "Action": { + "signer_id": "ac45f601af54cf7190dbdb36123a19c296217c698579098b4177a53b95e65388", + "signer_public_key": "ed25519:CbUzskd7J6uToaEKsyxpyewPM7f2FuV3F3KyC5mCUVjm", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e9ff82c731c68f900b5ac9cd437c1a603e75ddf913808224a27bac2d12f78e93", + "receipt_id": "6KTKN9HV8sgsnCGb9cKusGw5Fd4CfMgAR5WGwqeBBCnL", + "receipt": { + "Action": { + "signer_id": "e9ff82c731c68f900b5ac9cd437c1a603e75ddf913808224a27bac2d12f78e93", + "signer_public_key": "ed25519:GkRyBcMypeCkV5pncHisSAsuF9C99oCk9yBrdrJmiiHg", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a4f83b79f0cd51ff5f0e944d8379aebe0910b6461f633d222635cf9406700c1e", + "receipt_id": "WyxCJQ8KqQvviZpmb23aNQvYEESLk3CtJ2vTHa3nokQ", + "receipt": { + "Action": { + "signer_id": "a4f83b79f0cd51ff5f0e944d8379aebe0910b6461f633d222635cf9406700c1e", + "signer_public_key": "ed25519:C6yQDphQyoEpVRcAFG4B3miCa3nRbP6U9dBhKjYhT6m3", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ca56d5327c525b64338555a43972c5a8982a878d86a0e12f6487552ccbfb6e4e", + "receipt_id": "CwMfMoyPKCSzmgWD6jU4v73i35tT8mo4xARtoyqF6jiv", + "receipt": { + "Action": { + "signer_id": "ca56d5327c525b64338555a43972c5a8982a878d86a0e12f6487552ccbfb6e4e", + "signer_public_key": "ed25519:Ecr9ifnbevjxw3SPBputeiPoXrb7EztkFvvcFRwBgsyX", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5e02467f987a3a30bc2d47c8b5514e027d6fee93353df6f6e7848dca0129c1b7", + "receipt_id": "FbpjrU8qdnnhBteXVDhXhqB9uMKczUHm4opHGt7Masqq", + "receipt": { + "Action": { + "signer_id": "5e02467f987a3a30bc2d47c8b5514e027d6fee93353df6f6e7848dca0129c1b7", + "signer_public_key": "ed25519:7KyLV96KfRABw2xQL7M3pNMDtqntyLtfZX5pKdowpYuU", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8430793009aa9e43b87f3c6d073121ed8ddbb2a6901c20fe88a065499a22a3aa", + "receipt_id": "BHsiGNVKybeAnum61bfR2xEDYfhNwoVZCSvuQJefQgVW", + "receipt": { + "Action": { + "signer_id": "8430793009aa9e43b87f3c6d073121ed8ddbb2a6901c20fe88a065499a22a3aa", + "signer_public_key": "ed25519:9u1goRuqXfGKafRqfikustoeD6XSv1xty7GpfKEtHpbB", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "1704536907b138a2cc7ce71a6662017aaef8947b4f54f1c80e484a34e8d78358", + "receipt_id": "ADwGRjEfFe7bTbFb1Dbsctsd7vqcoQE87fiwXXAnFn7P", + "receipt": { + "Action": { + "signer_id": "1704536907b138a2cc7ce71a6662017aaef8947b4f54f1c80e484a34e8d78358", + "signer_public_key": "ed25519:2YrCmJxSHVBEmQNJBb5vBECdSnJAa4PxgMdTeUYzkKJF", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "99e2894a2819a8c892a78ca4423e26f7dbfcc5ea2dad662b221e0db657b4bbad", + "receipt_id": "FiR5v2rA5BPcc3gXLBJMDe2YpYwxEEMkaXoo88cRio3d", + "receipt": { + "Action": { + "signer_id": "99e2894a2819a8c892a78ca4423e26f7dbfcc5ea2dad662b221e0db657b4bbad", + "signer_public_key": "ed25519:BMhjCeFp9mGQt9aXVVERTK4zByH6pWgcBjzrJm6odb8p", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a25ed719f9a6afc27a18a3af0473ad4e6c8a377eddf1198fe4b5dc2f623bbfa7", + "receipt_id": "CioZVTnj3P94rWsaMS4xwZ7YtN8psyKvZhddw2oeCtBZ", + "receipt": { + "Action": { + "signer_id": "a25ed719f9a6afc27a18a3af0473ad4e6c8a377eddf1198fe4b5dc2f623bbfa7", + "signer_public_key": "ed25519:Bvpvc6fuGgZ1PxiHyJhbkswESp9Cc6uEiKNtkbYCfJFQ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f2f29e305a59ec0514136d7fdc93821213df769a13d25cca0bd697e223aef1c9", + "receipt_id": "9B4mq6yw15ZXBHZN1iCPvT4oAjY5wUGQxrrarE6m7XVh", + "receipt": { + "Action": { + "signer_id": "f2f29e305a59ec0514136d7fdc93821213df769a13d25cca0bd697e223aef1c9", + "signer_public_key": "ed25519:HMNEepiPGWcZRsRbckrhhaWgVjNqWKFcwU2x3Pnq8dTW", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "41f21acf6c8de8a97292963c24e95981b516fab553540bd258af6abf79b2e105", + "receipt_id": "7pKVJTQxjn5oKrgfo98iJpFqb9uevLng9hoJLWpS873T", + "receipt": { + "Action": { + "signer_id": "41f21acf6c8de8a97292963c24e95981b516fab553540bd258af6abf79b2e105", + "signer_public_key": "ed25519:5SRcuKt9Aywyyr93D9dHwFMQtGUcrQikven6CpBEbmYp", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d644260f8558ef4e47c16b2aa2684924148052b78ca599123a6aeebc99c126d0", + "receipt_id": "JA6fz8BfAfrX3gj5Cfza6Ts766Ef4Z67tTZgEn5fWtHR", + "receipt": { + "Action": { + "signer_id": "d644260f8558ef4e47c16b2aa2684924148052b78ca599123a6aeebc99c126d0", + "signer_public_key": "ed25519:FRQX4k5UH7GzC8Jqn72ASxrNq2MVf5VvexeYViTxkbZZ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2257564517856291433790" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6d99a67e7fff68871bdd7b66a1fc9eaeef5f65127b772322b8e171b7a60e0b5b", + "receipt_id": "HLocyZ6Qx6rXbRYgVsLTw7hbgqgdSyzmZQaZNnHKgAjt", + "receipt": { + "Action": { + "signer_id": "6d99a67e7fff68871bdd7b66a1fc9eaeef5f65127b772322b8e171b7a60e0b5b", + "signer_public_key": "ed25519:8NqL38gcX4msSWtTVByNsgW3mXnjJtUepCk185ENMfzA", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f24c2c96377147ccdf762d3f277c591649d1ee8e8f10a7be98a96b1b6a24c8d5", + "receipt_id": "8TnNYVaVSdEXGdJ1ud5aQ1kDiSdicdXarkytJGzEYTBT", + "receipt": { + "Action": { + "signer_id": "f24c2c96377147ccdf762d3f277c591649d1ee8e8f10a7be98a96b1b6a24c8d5", + "signer_public_key": "ed25519:HJq2qZiVEv8RdRPNa72TAmHtwWLY1a5qNRvDyaTMAXsa", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "650aa91f367e93c4296db463626ebd561f282a641296a03ec0b8715bf57d3dbf", + "receipt_id": "12Skb2WEhMc78tJBVnaUQjsgKA3vArgCfK1sB27XWY1C", + "receipt": { + "Action": { + "signer_id": "650aa91f367e93c4296db463626ebd561f282a641296a03ec0b8715bf57d3dbf", + "signer_public_key": "ed25519:7oRc8tAAVJ26wqf2ACLa1u7GQj5M7jwn1HGzoaVexvRt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "43b5867d7b4f8d4fafa4e6c943a7be85b5012b34e15db5a758b64fe5d266a826", + "receipt_id": "DJtSCTEKutA33K1Woak1dg4HtqgQFkbHh9bZdv1SqY8J", + "receipt": { + "Action": { + "signer_id": "43b5867d7b4f8d4fafa4e6c943a7be85b5012b34e15db5a758b64fe5d266a826", + "signer_public_key": "ed25519:5ZJrkGwo3XvGJVnw2KmsS3WrT1Zt21SwjRWJgv1Z24yb", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8919b79b3169550ce520b9d475a7f4ccd258dec250c022dc1065d3b26688a9d1", + "receipt_id": "DaENK2zXEoe8tnVzZ2pvsSWt8qc8xPha8PspD5sZLSHB", + "receipt": { + "Action": { + "signer_id": "8919b79b3169550ce520b9d475a7f4ccd258dec250c022dc1065d3b26688a9d1", + "signer_public_key": "ed25519:AEBbk87tRtbBUNySqNF7eqydP8k8KhEZXcozUt9c4br8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "83b026173d9ecc2afd0619b7408e9a0d4745f6d4c781b77b8994c6f542445b84", + "receipt_id": "7cBSLVtZXzkQqCBm8Qva5y2kjxFpsQZBqubf3qNf1bhm", + "receipt": { + "Action": { + "signer_id": "83b026173d9ecc2afd0619b7408e9a0d4745f6d4c781b77b8994c6f542445b84", + "signer_public_key": "ed25519:9s4CKxhr1fsXQL2ScPzcar12pDETgq5UefF16uz5LrwD", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f019135ebc5f67c67f4f0cde906c3fed9c4be66aa0fad6d7cbb08e6a73f33325", + "receipt_id": "86GAHpzHEHLfBYDTi6K68ZX1YafMitEiH5jmi6YP5dYa", + "receipt": { + "Action": { + "signer_id": "f019135ebc5f67c67f4f0cde906c3fed9c4be66aa0fad6d7cbb08e6a73f33325", + "signer_public_key": "ed25519:HAF2RSg5hYUffzuQsUtYVzSz9eZ9sp5jbqjHjs45mp1A", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b828e1925025d7e12d1cf1268d6d9316c9972f85913bf302458a33516c3ebaef", + "receipt_id": "Afwpy7H5zh1mXcXyfSkxtnAQqBtxrgA9A9gjLj9xoakr", + "receipt": { + "Action": { + "signer_id": "b828e1925025d7e12d1cf1268d6d9316c9972f85913bf302458a33516c3ebaef", + "signer_public_key": "ed25519:DPtAyBmpJsk5SeyEgusWMC8nZ9T2PdGLRdfDLMgeL6zi", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f7f0ae525376a7ba7ee16ae67d1f1732245b651c0ed27bfaa998c26128ac60af", + "receipt_id": "BCFWg1X2HcTdAMaArUyPETpEd9HAjTE5FahgBhnwDjj2", + "receipt": { + "Action": { + "signer_id": "f7f0ae525376a7ba7ee16ae67d1f1732245b651c0ed27bfaa998c26128ac60af", + "signer_public_key": "ed25519:HgrZXWb4vF3KCLUNkcPrmMnA7nhzcBrn1ZF1ybEp9Mze", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "adba8c40365f1eb5485ee9978d04c7e1c1af93f1bdc0fb6cba251d9434e608e2", + "receipt_id": "76ozuT3h4EPqPkHYi1UHJTNfmT4a9sgimFXyvVvVXiKz", + "receipt": { + "Action": { + "signer_id": "adba8c40365f1eb5485ee9978d04c7e1c1af93f1bdc0fb6cba251d9434e608e2", + "signer_public_key": "ed25519:ChAWuR5ChxYJdaxPBw21DnnhWHmDTTt2HusFw8zrxSwT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ae624fb0f178da614a1115aa4bbbf48778c8388fc816ad748ef95d0664373156", + "receipt_id": "DgZbtwwa2AEHuVvPryqB157S7HbYHUymaV33rhkKbX2C", + "receipt": { + "Action": { + "signer_id": "ae624fb0f178da614a1115aa4bbbf48778c8388fc816ad748ef95d0664373156", + "signer_public_key": "ed25519:CjitQub8x382XAaR8PgyXL2AQs8wmZvdcGnV1h2Zkczh", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b505a1d751eb9a6858ed688b7df320fc0ed8908f2b26d575f8f09cd7952cc04e", + "receipt_id": "3fg4c1wzYmqp38jVDPm2mtj8HNFmLGhLVTkMyr3QMEdV", + "receipt": { + "Action": { + "signer_id": "b505a1d751eb9a6858ed688b7df320fc0ed8908f2b26d575f8f09cd7952cc04e", + "signer_public_key": "ed25519:DBdmvCKLReBF3fdiM4a7Xu3VpaT31dXqZsdVfnmycySD", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9478f3b6b893a5cc4dac88d3f4bf7af89f85f1eff3ad64c4b8408de55cb7fdcd", + "receipt_id": "7QUKtfyphbFL7haDjzrrxBKdUbELjCb4xvYUFhp64MTp", + "receipt": { + "Action": { + "signer_id": "9478f3b6b893a5cc4dac88d3f4bf7af89f85f1eff3ad64c4b8408de55cb7fdcd", + "signer_public_key": "ed25519:AzaJyHrW31EvaiGg79k2WFMv78chR9p4fsuhYT3SUmaU", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cb14a54738d1c8baf2f2d04a66d02e1db15b187970df884263e5a2e9625cc6aa", + "receipt_id": "7iLmVgfEi2VA9h4phmBx4YqqccxD9yw7qoZPcxsxLHEa", + "receipt": { + "Action": { + "signer_id": "cb14a54738d1c8baf2f2d04a66d02e1db15b187970df884263e5a2e9625cc6aa", + "signer_public_key": "ed25519:Efk2G7iMWPpm7LiYQ5VBPRo9AGohMPtrk7ysK7kdLHX7", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5328210abf0698282d511648365ad4cae758e1b9a137451c8fbd5ad88847b578", + "receipt_id": "GUo75UtbqYYJnmviQACDsv5vq2a3A2RSm1atVQDAhttm", + "receipt": { + "Action": { + "signer_id": "5328210abf0698282d511648365ad4cae758e1b9a137451c8fbd5ad88847b578", + "signer_public_key": "ed25519:6bcL6f1JPsQt3rpFXfuNA37nmuT9VyBdwuYz2y6UX4gw", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9bdbbf5ef01689923d442a17d28e9e97c89ba8454a666eaddd488fd9c54eedbe", + "receipt_id": "3USKx6XiK6cmaasZGzWiRjkFk1iSLo1qgaGk8HnAuRZ8", + "receipt": { + "Action": { + "signer_id": "9bdbbf5ef01689923d442a17d28e9e97c89ba8454a666eaddd488fd9c54eedbe", + "signer_public_key": "ed25519:BVQYGB6NwHUanz3qQmJt5r3xJjkpS5VgVY7W45BpzLRB", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5ccaef9f129a4804777173e64340f7d44e25de71c31a8fe244d2b533e2714d64", + "receipt_id": "73XSyhuBv2DVJ8jC3ZQyM2cF4UXRNo8JErp7sHv6tDyW", + "receipt": { + "Action": { + "signer_id": "5ccaef9f129a4804777173e64340f7d44e25de71c31a8fe244d2b533e2714d64", + "signer_public_key": "ed25519:7FDzBNAqtEkXT6p3NDLJTLpwF55g68iBxkKXnboz31pX", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cf465e343c378822fce95abd46380b5f5a1992e9e06a1d834e49d58ab300e2b4", + "receipt_id": "9wbP8knAi2SRhfoKBMj1raUB61Bob2Xv4QoKUxU9tLkT", + "receipt": { + "Action": { + "signer_id": "cf465e343c378822fce95abd46380b5f5a1992e9e06a1d834e49d58ab300e2b4", + "signer_public_key": "ed25519:Ex7dP2pkGpzED781G66TqMR9TFXokHcoirbF3eDrY1mM", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0f314cd2020fad3179ba83a28122eda11d088d3ca9e6205e9e8936545b45e872", + "receipt_id": "8F1865aN3941uGQvuJr4aYHnn2gBvWH6RLsJVdrfV6uk", + "receipt": { + "Action": { + "signer_id": "0f314cd2020fad3179ba83a28122eda11d088d3ca9e6205e9e8936545b45e872", + "signer_public_key": "ed25519:22Jia14cj4u9iuqK8ZETdbZgdvB1F2Y9S5BcxnMdQQ1X", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d7220ec21162677c55ed56336a15d0a6c6e2bd14f0bbcdb99cb8e6d1629041f4", + "receipt_id": "CFEGBkTZEMAj7jfn8JUfeMMdHZvgD8kJSYGJfvGPBdJ6", + "receipt": { + "Action": { + "signer_id": "d7220ec21162677c55ed56336a15d0a6c6e2bd14f0bbcdb99cb8e6d1629041f4", + "signer_public_key": "ed25519:FUnmziBVJWWwnVou1U5nQ24GwsPgL22GMTkPwhFezkqH", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d51a71377efe909903134a3f9953291cb3fd68bb267812fe48a3517599d343fb", + "receipt_id": "9Ea9EJ7XgrEgNQRZh6goFQfmdQH9ALmnH1c3Zw2MAEQT", + "receipt": { + "Action": { + "signer_id": "d51a71377efe909903134a3f9953291cb3fd68bb267812fe48a3517599d343fb", + "signer_public_key": "ed25519:FLsE4rxm5cEPT5LK43DW4FoMqN6gKoTRu8unvzqfqHmc", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "82daf2e1fffa0b517473a316aaf011d1ea7513a893d49e5de70070cb5b44af4c", + "receipt_id": "EPHv635byx216STMNHagq9ucRykqTVH5GqLn5GwKCmxz", + "receipt": { + "Action": { + "signer_id": "82daf2e1fffa0b517473a316aaf011d1ea7513a893d49e5de70070cb5b44af4c", + "signer_public_key": "ed25519:9ooe8JoJePvzAqB47RfaJSmhfFuZ37ZLqMzX5RVu9s2B", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ba7befcf795d317f30a2e4c343c9f7fe571ef549b7266fcd61fa7b374d48bfef", + "receipt_id": "5mQuP2pTiGsCPtrS5khypyqCP9PkAaaqFPP2rVVsX8aS", + "receipt": { + "Action": { + "signer_id": "ba7befcf795d317f30a2e4c343c9f7fe571ef549b7266fcd61fa7b374d48bfef", + "signer_public_key": "ed25519:DYxSeAWTA772diav5w7ceskjUhuKy9m6SFBY9YaRPjy8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "45fad66a48dba78d6aa2dc08ebcce6ed87778b5cf51b4d5249ef779235313169", + "receipt_id": "5B4U8FZnqjexyTbc2QEC9pMtaJYQTZJFh3V51uSLNJEy", + "receipt": { + "Action": { + "signer_id": "45fad66a48dba78d6aa2dc08ebcce6ed87778b5cf51b4d5249ef779235313169", + "signer_public_key": "ed25519:5iAySh8T7xuqCfY6PjcJbrdAiAibLewJjkBoAJMpRdZi", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9861cd896b9d56cd3a5b99c7d39446e17a126900fb7dd00de9fc2c1b7b7119b4", + "receipt_id": "CVaYtAqhg44zBdyi8a5u5DXTrpkiGfccBhmrjHfbvMKE", + "receipt": { + "Action": { + "signer_id": "9861cd896b9d56cd3a5b99c7d39446e17a126900fb7dd00de9fc2c1b7b7119b4", + "signer_public_key": "ed25519:BFqU7QRwnKAS6aVVZw69URCu7fMP5xZFoQHv7Jm2aeRR", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "da620418677abef89d7a5aeab0c00ea3de22f3b0698f3353f11b767810ae6718", + "receipt_id": "3T3zWLmdacE5vioEwZSzeWS81sYAeKQhiouaTUHq1M7S", + "receipt": { + "Action": { + "signer_id": "da620418677abef89d7a5aeab0c00ea3de22f3b0698f3353f11b767810ae6718", + "signer_public_key": "ed25519:FhUZi9mAXVC97DwVzD2hyZAuTnR8R6DmUhBahpgShuyh", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "40126a8f80593083ac59fd31f70251907a0c6867027d55d8a2a0f22b1cba4538", + "receipt_id": "7dSneVRswXuTsGAJ9M6wmRGqfWbhc3p5mUBwY7DeG2jm", + "receipt": { + "Action": { + "signer_id": "40126a8f80593083ac59fd31f70251907a0c6867027d55d8a2a0f22b1cba4538", + "signer_public_key": "ed25519:5K7P3brFn77AJk6ZDwxgdrdM31ZRkcg3cjVDfHJq4svP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "3579746fb3d61a6a4e41d0a399cbad55f88b3c5f383604c6dd195736e581dac4", + "receipt_id": "b3QbGFf1GeVn3aQsKoAtfTisMWZat9KETJ8bBhf72W8", + "receipt": { + "Action": { + "signer_id": "3579746fb3d61a6a4e41d0a399cbad55f88b3c5f383604c6dd195736e581dac4", + "signer_public_key": "ed25519:4bk2MD1FTgY16SCWDH7ATvTPaRR5frE6SMBR38ZXb14f", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f6a8a0ba0d93cfc32e8f8ffb2440876622302108181c1e945907100a1659684a", + "receipt_id": "HRBYPHTkbhJvss2FXUpLfXBkYpZrYFUTzLT6wAuL7Nez", + "receipt": { + "Action": { + "signer_id": "f6a8a0ba0d93cfc32e8f8ffb2440876622302108181c1e945907100a1659684a", + "signer_public_key": "ed25519:HbrRt3CDBW3gWuFwG2KaApmtQgrSXixyniRfpr21mGz5", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "3a9898a042aa470c727bc58eb48d519995cf85c5a3b3721885a92b699daedc57", + "receipt_id": "CazaNhsfVHf7y9bSc5qUubEvjaEon2KdSrwrj4c7xAVJ", + "receipt": { + "Action": { + "signer_id": "3a9898a042aa470c727bc58eb48d519995cf85c5a3b3721885a92b699daedc57", + "signer_public_key": "ed25519:4wjbzZm5iPaYybJEHeeXmqUWMuGk8998KmAV6m1CPjbU", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5393bed5a91c753755b82ca3107a921d56538e807503385139055f0551923e5c", + "receipt_id": "2vfXLWcnWq3JRw24D3Rf5ve8zJJiE6g435o5d1gKAW3e", + "receipt": { + "Action": { + "signer_id": "5393bed5a91c753755b82ca3107a921d56538e807503385139055f0551923e5c", + "signer_public_key": "ed25519:6dFWLJNyHaCCW5uYx138FiKJWa3dcHkxk8Pc92Leh4QB", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f748e2a05703f981a2669690ba780dda74c4119793caf89fc2ae6c47d0578a29", + "receipt_id": "7kRdZecobhRiaytFh5cnXYDneZFDxGJgMN1izuUTANxr", + "receipt": { + "Action": { + "signer_id": "f748e2a05703f981a2669690ba780dda74c4119793caf89fc2ae6c47d0578a29", + "signer_public_key": "ed25519:HeJAN5pBtkFsNawXKc3dzG2ZLwMD8TqsQN9NPrrHHDqz", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "804e58971dab4d508490a15dbb2aa8d0dd1eeb58faa1786bc86b142394a10f4e", + "receipt_id": "BM3yVYYYHcVKRFznZsiyPRY6Y3VTPBrQmYNHZPtvoUze", + "receipt": { + "Action": { + "signer_id": "804e58971dab4d508490a15dbb2aa8d0dd1eeb58faa1786bc86b142394a10f4e", + "signer_public_key": "ed25519:9drUYms3qjW8f3Q7NCk4Sy66ULvasqiYEsLbDt6GPEdK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c80af0ef70b7d66b8f2a50a7b80c7c621bb1557e7cdc812393403f99d636f67b", + "receipt_id": "C9vofCL7T4xcurA1KZgh8KJnDXGTLW7B7YN61G6fqot7", + "receipt": { + "Action": { + "signer_id": "c80af0ef70b7d66b8f2a50a7b80c7c621bb1557e7cdc812393403f99d636f67b", + "signer_public_key": "ed25519:ETtDXW9xmzqiWBJLofVW9xcHuSv53grX5MTfAM8RzYSn", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e7c75ed6746951f3b6380f0f985d464d674ce144bbaac051534351da6dceb8c0", + "receipt_id": "CobQAKqz6Lj9QJsHd1VZTnA5b1rMxMNk6LU1boM34FcQ", + "receipt": { + "Action": { + "signer_id": "e7c75ed6746951f3b6380f0f985d464d674ce144bbaac051534351da6dceb8c0", + "signer_public_key": "ed25519:GbmW9AmgkJC1Kkz3zEgLG8YuQScxEWjHRZdHDcqMSgV5", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "046cc192abb561d4c7d1bb4eca257cace26406444b731f263c123b62616bf206", + "receipt_id": "DhrNdiw4GxuDUb7gEoWTBD27Kg4g8qbzdVYcEyJwUENg", + "receipt": { + "Action": { + "signer_id": "046cc192abb561d4c7d1bb4eca257cace26406444b731f263c123b62616bf206", + "signer_public_key": "ed25519:JGpHbCgmoG4bc76v8KQdLvAWKbzeyV5LqMhzFNfg1id", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "50824a4efc7cdcdd6df31f8946aecbb7a0f17e46fc76a7f537c22c9c23a29670", + "receipt_id": "8mUTQz2QNQpxJTcbEDBstYtA88PY9xxCwUBZHUvB5hgP", + "receipt": { + "Action": { + "signer_id": "50824a4efc7cdcdd6df31f8946aecbb7a0f17e46fc76a7f537c22c9c23a29670", + "signer_public_key": "ed25519:6RGr2EXWPnJn4cc2EgGH68TNPAL7YiY79tpTVZZckCm5", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8d0cf384ebf5016c910aadc8f826e28af9811b8441eddbe8d0a0d973c890c724", + "receipt_id": "ACPW9XxHkBjmwu5QCM5ogxvyFuLHrvVLRJjSgPU4uv1Y", + "receipt": { + "Action": { + "signer_id": "8d0cf384ebf5016c910aadc8f826e28af9811b8441eddbe8d0a0d973c890c724", + "signer_public_key": "ed25519:AVbwVb8LnkmD7osi2JoA7XLNXwBGfdCVBUd3aEcK8t1Z", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e5a3c4f7a02f974b47155a10c517a09b0911e1a8d562e1bb09057dcedff0210b", + "receipt_id": "6GTf35qiVU41g3GMZNJXKbmnWVNoaHYxWWQcuQhXe9Df", + "receipt": { + "Action": { + "signer_id": "e5a3c4f7a02f974b47155a10c517a09b0911e1a8d562e1bb09057dcedff0210b", + "signer_public_key": "ed25519:GTRCg6kGCb2AEXsVQL3qsNj9SEPMSsTwcAyBFuaUXuyC", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "3d61d0b2b47077b5c17442e07193578535d8a812108438eec5b171c751a8f857", + "receipt_id": "EJbXFS9G6XP8RT4MAJFLExurhFbyC6B8BhRm11sfPeby", + "receipt": { + "Action": { + "signer_id": "3d61d0b2b47077b5c17442e07193578535d8a812108438eec5b171c751a8f857", + "signer_public_key": "ed25519:58cNv5GbJScdH2VQJscoBG2rv44R2AprpgyrZeDYTkVt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ae65726ae00429f9c2cccd94d9ba17da0a787d3a9be8336ebd213eb49afe1b45", + "receipt_id": "6URLaUoBfrDjB1MZW4uy3pnwb5VwSsmuXQm9LKL8Qad4", + "receipt": { + "Action": { + "signer_id": "ae65726ae00429f9c2cccd94d9ba17da0a787d3a9be8336ebd213eb49afe1b45", + "signer_public_key": "ed25519:CjmfFu9GqmZKXJf9pY6BwLP7MsLL2nyQsWSgrYxLHcTe", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "be178edf36f7b68d0f8d575d920018e4172f26a37314cb68b01536db43c0c225", + "receipt_id": "C7QtUJU73zw9CZgLJPoeZJ2HKc4yQuCudeQuH1vwxoq4", + "receipt": { + "Action": { + "signer_id": "be178edf36f7b68d0f8d575d920018e4172f26a37314cb68b01536db43c0c225", + "signer_public_key": "ed25519:Do3JFhM31AMyjPMg35CLCZAiGR8ndMSmwV2H8rf97RSk", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0601f08a3878d4259e3299c45d55f449f7e53bac8de1ab4f05199505866929cb", + "receipt_id": "3V2fUgd5g2vBLVcVfCRPN8B3T5XJS8BzbzrNDtTDZ9ew", + "receipt": { + "Action": { + "signer_id": "0601f08a3878d4259e3299c45d55f449f7e53bac8de1ab4f05199505866929cb", + "signer_public_key": "ed25519:QTANaVu8EAyj3ANSuodsKRHzTbbspn8rwJrqMq3fjbY", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ab2489c08a9563a26e1b49cfac335fb136d6b94d3ddba14f3d894c47c589cdb3", + "receipt_id": "6Bvp1yAgCNN59D3DXBwUf8oLSTQurU1QgCPAJ14yZdq6", + "receipt": { + "Action": { + "signer_id": "ab2489c08a9563a26e1b49cfac335fb136d6b94d3ddba14f3d894c47c589cdb3", + "signer_public_key": "ed25519:CX52nb4pB7f5nZB1jrpc1hA7c5UbfYv63zpcd9k8PfML", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "74ec2434a1bc9f1425d8d71b9492e762c39cd0e2f105eea11335a0447bebc618", + "receipt_id": "8FjGfomw94f845EgryPYEtcQNmDphuF6v4HH2sRD8B3E", + "receipt": { + "Action": { + "signer_id": "74ec2434a1bc9f1425d8d71b9492e762c39cd0e2f105eea11335a0447bebc618", + "signer_public_key": "ed25519:8sR8ywcVaX8VBfJuHFhc7oU4a8YYj8cjxjAntWnELTN7", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8fbe0803b676e10dc1ee7edf0cfe0ec8769b023fcaab7aa20562528f6bcc3faa", + "receipt_id": "9TXS7G4CwUMFEKtZQTuUgmbQMMCdMyGdn3hKWiNTeSAu", + "receipt": { + "Action": { + "signer_id": "8fbe0803b676e10dc1ee7edf0cfe0ec8769b023fcaab7aa20562528f6bcc3faa", + "signer_public_key": "ed25519:Ag7NCJwDT3iMttD9xTYpe3babKjz8Qwyfmv1gKTSxCth", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e9bfe89b7e2d3567d35e52843e9bdd8205d0eddde0db3fa81c6762ffdb284793", + "receipt_id": "4H7fS4twdfijw4nDnXp2uMY2xe6q1jJRS8ickmvc4mSp", + "receipt": { + "Action": { + "signer_id": "e9bfe89b7e2d3567d35e52843e9bdd8205d0eddde0db3fa81c6762ffdb284793", + "signer_public_key": "ed25519:GjTigAD3vTRwfdmLKvFn1W3KamtwXsDiqQAyeVSRSRWS", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c148c7cb592ab642a93c2e2192f4ac5c328687ad0e6ba9db2cbe72a5faa6d3e1", + "receipt_id": "3ukbzJGXbB64EMcAnTszaHQJsJ9e6CRLasWcmUfSakTT", + "receipt": { + "Action": { + "signer_id": "c148c7cb592ab642a93c2e2192f4ac5c328687ad0e6ba9db2cbe72a5faa6d3e1", + "signer_public_key": "ed25519:E1W45WPndeToURM25Xm6L9AYybzHtjBb8ZwPnQW1zi4g", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d33a6a5d352f66aae8f63722017635d39a00b9b1a8ce685d3fcb41f1b758f524", + "receipt_id": "12yZeoXM5AhqXz3XYREWd7CyRfWW68Hw2fUFctxMgrqW", + "receipt": { + "Action": { + "signer_id": "d33a6a5d352f66aae8f63722017635d39a00b9b1a8ce685d3fcb41f1b758f524", + "signer_public_key": "ed25519:FDYgrfmF5KSLcS8kNnLdPptqoWqzmtbc4agX27neXU6P", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9a72a5a389689f5c4fe8f6f03ecfbefa592cec37d8a068fdba2cbe3ba55e4f7f", + "receipt_id": "WTUYhJapBqgHqRjy9oozgq94zoQhubqT8eUgYreWS1D", + "receipt": { + "Action": { + "signer_id": "9a72a5a389689f5c4fe8f6f03ecfbefa592cec37d8a068fdba2cbe3ba55e4f7f", + "signer_public_key": "ed25519:BPuBS5AYiB6jeMCd3Sr9vDNb6CXSANkhTnmTZgr1UQ8N", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6fe4754749dcabf83bbcc112e7cb94072ede5cdf56ccdcb14d63c7f1d0330908", + "receipt_id": "FdDtuktfX1sn9JCop6dkE36zLwBZeG9Gts6CTdrwcxA1", + "receipt": { + "Action": { + "signer_id": "6fe4754749dcabf83bbcc112e7cb94072ede5cdf56ccdcb14d63c7f1d0330908", + "signer_public_key": "ed25519:8XnJdZDVkRdHVn2dhuEwHyBRCcUrVzw1Wymn5edzBSjZ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "tom.zest.near", + "receipt_id": "9sWSJxAYPxAHdJUSSx53pmBWueXbz4MGQBmsQoq8v8yu", + "receipt": { + "Action": { + "signer_id": "system", + "signer_public_key": "ed25519:11111111111111111111111111111111", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "10000000000000000000000" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "tom.zest.near", + "receipt_id": "McGDd5RDjomVirX8HrNSULc4NrpQUqXJBYmwDEq5ae5", + "receipt": { + "Action": { + "signer_id": "tom.zest.near", + "signer_public_key": "ed25519:BDyia5hPirkaD71vhy3sqzbxrj9cBmvfoAuZFxzn9nWe", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "22561702411076162935108" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e39e344c76fe0db6821d142974c62724d128e7f8599d3675b6085832fc8ff844", + "receipt_id": "9dhgTCN5tTwxUigKoCQfbMoCQ5sbZw5oCoRnE8ZUNJ1Z", + "receipt": { + "Action": { + "signer_id": "e39e344c76fe0db6821d142974c62724d128e7f8599d3675b6085832fc8ff844", + "signer_public_key": "ed25519:GKXTv8WtoVk8QigSK4QWMvnS9Yh5JFfKxQZcUUboroWs", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "41b586a35151989826c1920677029dfe0c9a65a3e44d08437e7391c6d0479bf2", + "receipt_id": "EbAuUSid16kpNCfPLzX8umxgoX6QoJGMa6V4KzDBhXxS", + "receipt": { + "Action": { + "signer_id": "41b586a35151989826c1920677029dfe0c9a65a3e44d08437e7391c6d0479bf2", + "signer_public_key": "ed25519:5RW3V17mRgsQG8at4o4Q4Adv2vvwwbBf7bHxksfLHg17", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "93f20e34b49ebda676fe05e9b2b4bbfa6a52f62fa163b4d27a80209e62bfdd74", + "receipt_id": "52XRr5qbwbZzLqmEN8aRnipLyXfo9985t9GVuxnBgUQC", + "receipt": { + "Action": { + "signer_id": "93f20e34b49ebda676fe05e9b2b4bbfa6a52f62fa163b4d27a80209e62bfdd74", + "signer_public_key": "ed25519:AxX1PTLxrpebmo8Kb2gEc4TyXB5jMTB6wSBddA3FfCom", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "860377af1ab14a4fe7f89055f4ab924965fa6c7dd884393f8cd3db59d9552b01", + "receipt_id": "314mhMT1BTGt3dB65xKoSZGxER4WTbWw7waDkDxnGamD", + "receipt": { + "Action": { + "signer_id": "860377af1ab14a4fe7f89055f4ab924965fa6c7dd884393f8cd3db59d9552b01", + "signer_public_key": "ed25519:A28hVhwKnaExQDGHmL8x6WAvVen75cYYDaQ7x6M1LkHW", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d652ed738b83cc807e5449c16cd88a9264a1aa6ece4d6a39898f7d5b5aba037b", + "receipt_id": "HAeqj3A3ha3XeiZZJkA4iXbX2eKr5vDSZU4TuUepPf4c", + "receipt": { + "Action": { + "signer_id": "d652ed738b83cc807e5449c16cd88a9264a1aa6ece4d6a39898f7d5b5aba037b", + "signer_public_key": "ed25519:FRdb9vwpPQUHbT8bta7F3ctAM3qffk9F8nw9Kb5885LN", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b0eef3081810a6d8d51f17fd62ad12130428fe52d1273237ddcf286282293ef3", + "receipt_id": "7Mb31cziUB5ztHNsqD4bgP2GBRbGgvgHWfnfi598eYww", + "receipt": { + "Action": { + "signer_id": "b0eef3081810a6d8d51f17fd62ad12130428fe52d1273237ddcf286282293ef3", + "signer_public_key": "ed25519:Cug5obKM6mMVLwfdhG77tMEzgNpKnfr6t21iN885z1Ez", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "31b35d3312d35ea9a36dd681f5e6b449a0df50a2ad6dc12c4f590a76e5d348cc", + "receipt_id": "4uP9r1CqzYoLxTUM3tqFk9vcEZE9QWDJ7anKC1pDhPWp", + "receipt": { + "Action": { + "signer_id": "31b35d3312d35ea9a36dd681f5e6b449a0df50a2ad6dc12c4f590a76e5d348cc", + "signer_public_key": "ed25519:4M1cFDdhVNYG9p2zb4i3nYFgVjnvT5qDoacV9q3QYPYf", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "69b87b8918f61518f3995bd74a12af92c59657eda27a5e10907ebcbcf085b1dc", + "receipt_id": "JU3EBuASV8VVXJ6iFsEnuquCwxrjWQc26Tra6Cy4Sk2", + "receipt": { + "Action": { + "signer_id": "69b87b8918f61518f3995bd74a12af92c59657eda27a5e10907ebcbcf085b1dc", + "signer_public_key": "ed25519:87gy1CdDHZZs4VBAUQ35pjVq3zEqnyX52dog2odNKtqq", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ccf03b9d26b4ace6f3091c9e88b6b2095104dd38efbbd1e30735bd98ee8a8ffd", + "receipt_id": "4XFHZ2seb45UCmGX3hw3p5XxsVJewsCbW8d9TtUUughd", + "receipt": { + "Action": { + "signer_id": "ccf03b9d26b4ace6f3091c9e88b6b2095104dd38efbbd1e30735bd98ee8a8ffd", + "signer_public_key": "ed25519:Enzdk86YpYwUDmQSwyM4u7GSVzpudJFnTGxUKEh9TvpL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "786eda2110de51ea96024b0f0dfba7e64368ddeff66d73bd47533f286c7c909d", + "receipt_id": "Sr8zWtU7UQnQjY1R5Psd4jZmZJ49WBv5ur6de3QUkYS", + "receipt": { + "Action": { + "signer_id": "786eda2110de51ea96024b0f0dfba7e64368ddeff66d73bd47533f286c7c909d", + "signer_public_key": "ed25519:977xnhheAz8cRx2dt2M1R61mZKmCKy8dqgot32m7UnDz", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "beae2434ee7a81fa81be5c2a596d9dc44f9e300f92d1195f2dede786f8f95720", + "receipt_id": "GkPadWJVhDMb7duzDEA38DXoJ3TppLVBwQQdwK29VpzY", + "receipt": { + "Action": { + "signer_id": "beae2434ee7a81fa81be5c2a596d9dc44f9e300f92d1195f2dede786f8f95720", + "signer_public_key": "ed25519:DqLUW1VrcDWxaXrzLtfHrBPtwu9VntxJbPuBPgz38rxo", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "233a501077ecff96250b7d1a410fb96ba66b6cd42aff9d7c5f64b22d3a1b5363", + "receipt_id": "BqSQYiYdurdsFmCwmcJDfLKkKrPBYSytHrpBNCyKRA4m", + "receipt": { + "Action": { + "signer_id": "233a501077ecff96250b7d1a410fb96ba66b6cd42aff9d7c5f64b22d3a1b5363", + "signer_public_key": "ed25519:3NWqoraPpacVBqFknzQJe3QeADHE8kwGrGRTpW6E7LTt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "765fa2a0c4590c52eff4c376cbecb2a0f7eac7b40a3904a797f8fbf3cbc3a238", + "receipt_id": "GHijeKKxoCuTaGEVTyhKg4TpidLAsVKBhux88iWzziAq", + "receipt": { + "Action": { + "signer_id": "765fa2a0c4590c52eff4c376cbecb2a0f7eac7b40a3904a797f8fbf3cbc3a238", + "signer_public_key": "ed25519:8y5gwcnosCECbz5UFWCyDwog7Pwirf7DAgdiW6mD5WGX", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "77d6c3ccc71e73cc99498f68c22901cc825334d2826fafb9250982567ef91ba4", + "receipt_id": "Ee6g4WS3mT7hzpJ694HrJbEeim6AyaZYpBzoxAMPA9Xg", + "receipt": { + "Action": { + "signer_id": "77d6c3ccc71e73cc99498f68c22901cc825334d2826fafb9250982567ef91ba4", + "signer_public_key": "ed25519:94oTQ8CBqsXajm8Gu6gymAYcsGexiUk5X9eET6c9wBYf", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8945bf9b7b2b0335bd5555dbb3bd2383590f63c1475c8c0bcb5e31c262ac73c2", + "receipt_id": "8r5aqmWfkH7A6ULD5vRu338abccEf3jYKqsmRzEmfvhm", + "receipt": { + "Action": { + "signer_id": "8945bf9b7b2b0335bd5555dbb3bd2383590f63c1475c8c0bcb5e31c262ac73c2", + "signer_public_key": "ed25519:AErYMDAFwHn5WkTy4nx4Rx2oDK8F4S2xCW781M95z1Gu", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b045b6310ebd62741dbebb67a1b3cbf7c5289413985b7eec0ac8f6d235dc801c", + "receipt_id": "AGLJDGr4SFeFLmHYT637QtyGbn9pbzcvUYiHB9J4gFVT", + "receipt": { + "Action": { + "signer_id": "b045b6310ebd62741dbebb67a1b3cbf7c5289413985b7eec0ac8f6d235dc801c", + "signer_public_key": "ed25519:Cs6Qg6kPKyjAYnKuLN17dTtGeem2AwT9GtgAkDy9z5H5", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ace6c1aee9ef7fb39ab85677d5ad1e28dfb905fb6fcbff1a284df19d5dfd30ac", + "receipt_id": "5fippwgs4EyWn9EzJ29PUpK6JvzPbCuY8CSYVcMmvpM5", + "receipt": { + "Action": { + "signer_id": "ace6c1aee9ef7fb39ab85677d5ad1e28dfb905fb6fcbff1a284df19d5dfd30ac", + "signer_public_key": "ed25519:CdwCxzaUop8XtD6HgsjA3oBc9yZkUvafNRwx2DjtmvBd", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d43b0af353f5dc8e5e3c06916d73049e072dd8003ac4cf4ef46d63eac5fa73c4", + "receipt_id": "7xGnQWDSsxjLYjYSXcTzFoW7RLGmyNvguPozHoyJr5TJ", + "receipt": { + "Action": { + "signer_id": "d43b0af353f5dc8e5e3c06916d73049e072dd8003ac4cf4ef46d63eac5fa73c4", + "signer_public_key": "ed25519:FHTegSY3AyWExDHTx9CPcYwj98vjFX3jhvR1FVXKuDvK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "79ffdf8a5df4e590abcf0aead4747ea52a8df1624d8e3a2d9e8bb7180ee6afa5", + "receipt_id": "EoPfohtgX2avCTWH2fgtTeXT4WKxSrijC2Rd1hwBGhT7", + "receipt": { + "Action": { + "signer_id": "79ffdf8a5df4e590abcf0aead4747ea52a8df1624d8e3a2d9e8bb7180ee6afa5", + "signer_public_key": "ed25519:9DEdNC373Nrci8QEaYLERZyiBTCHy7X8RJY4wW6EVjvk", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "a962e3b8a07b5e21b00cb514635e9ab3e22a863eafe66efe7cd5e555ea038d4d", + "receipt_id": "CLjkYLwa22yrKHRib3p8BvMGRriLMZX7eXs2yTaQtVyU", + "receipt": { + "Action": { + "signer_id": "a962e3b8a07b5e21b00cb514635e9ab3e22a863eafe66efe7cd5e555ea038d4d", + "signer_public_key": "ed25519:CQDMqnJy8BjWEpH43YVSsLeq1Q7qSZFrYXorDMo6uYk4", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cac9b6ac15c8c93dcad942da7efa2aca564c358cfcfcabe65dec5e4dbe61fd99", + "receipt_id": "FHxoYdEkPQJqStr4gJSncJzuk8NCFSxiMtSanzWfZ83D", + "receipt": { + "Action": { + "signer_id": "cac9b6ac15c8c93dcad942da7efa2aca564c358cfcfcabe65dec5e4dbe61fd99", + "signer_public_key": "ed25519:Eebkas5ZGEmvpm1LueZY6StQLD3uzjtB3VBDKL73f81E", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6bda41b72c96860bfe7e419249a5ee6c8e8f91f88015971ec7f7e599772acafc", + "receipt_id": "7Y3La5h22JcfjDdX7XSWWbfStMBHM3NnyqwNMRTkxubQ", + "receipt": { + "Action": { + "signer_id": "6bda41b72c96860bfe7e419249a5ee6c8e8f91f88015971ec7f7e599772acafc", + "signer_public_key": "ed25519:8G1ekwe77ptMhBdVji1h8RXspKvrcvp5v6tiEkoSWyEK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "37c5f722e06f31f49e970f550b9d2f61789e624d3b2259e2fb4b75b01ac87243", + "receipt_id": "AiRRmma5wVV1RfpZHM36iVFrVPXH55miXFdRFzdpZKob", + "receipt": { + "Action": { + "signer_id": "37c5f722e06f31f49e970f550b9d2f61789e624d3b2259e2fb4b75b01ac87243", + "signer_public_key": "ed25519:4kiWHgYND8zu7mZDNeQ8xK6zZk5ZNGpCDAgQtC8JvN6v", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0c88bb18d0f084744126b7743e2e17acfd7d8d7a3f91f62763b1c08bf406534c", + "receipt_id": "5kJFdryqLkKB1XUt9HzWiHrmrj2dbCx3uL14QEoDazs4", + "receipt": { + "Action": { + "signer_id": "0c88bb18d0f084744126b7743e2e17acfd7d8d7a3f91f62763b1c08bf406534c", + "signer_public_key": "ed25519:qvpSB1E5vbsXDpVDBuAd4sDeK6V8J6TMqDUowt6rsgP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "4dad427a64e0dfc03cf06bd51579dfd962dd4c014d4b982984742f7e89f33e57", + "receipt_id": "GQ9NLr63J8z18LZeFpVL5UGNmFj3kAN8UkMPVUCyZzek", + "receipt": { + "Action": { + "signer_id": "4dad427a64e0dfc03cf06bd51579dfd962dd4c014d4b982984742f7e89f33e57", + "signer_public_key": "ed25519:6EDdDi1LV5yKHfsskhwFXCqASJuAEA7x3JD7ahSzBNhL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6aa32e62a51081a7992ec7861998ccaaf3966aed5ff73f3eec0fdcfcf1565e01", + "receipt_id": "EU3sU9p2n82dUXMt3jwjL7ib1mZDW3j1a6b3dXAZkKaN", + "receipt": { + "Action": { + "signer_id": "6aa32e62a51081a7992ec7861998ccaaf3966aed5ff73f3eec0fdcfcf1565e01", + "signer_public_key": "ed25519:8BGXzAzyNWreWJz5JkqxJA6mLqoKrVBx34Z3z1DoQ8aL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "329f8b8c756ba124f52b6e56b72f9820f3d3e7ac886ae71f1b4d2e8536c30833", + "receipt_id": "8gJ15EafieybLWZi77dtFP1YcBWnbYSm9vgpT7aJ5hbK", + "receipt": { + "Action": { + "signer_id": "329f8b8c756ba124f52b6e56b72f9820f3d3e7ac886ae71f1b4d2e8536c30833", + "signer_public_key": "ed25519:4QcVGbQ2UQg6vvRd4Ccqi1SEmdQrKqyNHHDTXTZPV2u8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f2b31b1b70fbdeccc756f36e98fbee14aa1508cf9831f378ab036d4e5d9a3d18", + "receipt_id": "8vtQr7jFj54h9jobW2kEjvA6Lbuxu6dGqjSLHaXYGdQH", + "receipt": { + "Action": { + "signer_id": "f2b31b1b70fbdeccc756f36e98fbee14aa1508cf9831f378ab036d4e5d9a3d18", + "signer_public_key": "ed25519:HLQ4mhq1VdfbN1WCy2K3AQ4aWDzgtFfr9ABLcaYJuZFV", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "3e1c44a0110e2a4cc38441889ac1a4943cef82ed0d6fb7f2304e4454a0a664b2", + "receipt_id": "3DkGoyaAe9VuFhdLVEBBk4kmqp6iNBXu6b7Vs1aJeENW", + "receipt": { + "Action": { + "signer_id": "3e1c44a0110e2a4cc38441889ac1a4943cef82ed0d6fb7f2304e4454a0a664b2", + "signer_public_key": "ed25519:5BTH78MGWDjRvbCBKcngmG4omcwprYe6fU24f8tuZtam", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9510a1908068800991d10d3a0c3d31b86aa8a8f1c07ade3863edae82b5c7925b", + "receipt_id": "5iaJTMfESLGBMSKf1HexRPckfVSCVMJDYvS54ZftzpXB", + "receipt": { + "Action": { + "signer_id": "9510a1908068800991d10d3a0c3d31b86aa8a8f1c07ade3863edae82b5c7925b", + "signer_public_key": "ed25519:B2tTRf6HzjC2SbVPTTDX1SyS5iGsFkc4x9n72SqpDdMt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "cfc5ec4484f862a593ba81b36d008dd16ba41ae4edaa0a6f5c0636c054e40596", + "receipt_id": "25jG2mBrXZRZdrzNa5Ww4W4hgsQEzTTFAN7X8z5LV2S7", + "receipt": { + "Action": { + "signer_id": "cfc5ec4484f862a593ba81b36d008dd16ba41ae4edaa0a6f5c0636c054e40596", + "signer_public_key": "ed25519:Ez4SNeoxnngGyWu2guuUV2cFGBT5ZBioYKAdcbZtQZZF", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "331d760083bde8e16f2b31b685272a6eddbdb5c587b4a2eaa63edcf1b83c6fbf", + "receipt_id": "9idSG8KoC8wyXkj6S8ZJpBXc5eN3i5ELfzidhyA99pRY", + "receipt": { + "Action": { + "signer_id": "331d760083bde8e16f2b31b685272a6eddbdb5c587b4a2eaa63edcf1b83c6fbf", + "signer_public_key": "ed25519:4SXrBf3mN5FXa2qg9wsEWuueDvC9fiXBWE91GwHRbmSN", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "53f9c92c36ec210adc6faf00b49edce491f3b92659e88da9588b356c9e11d42a", + "receipt_id": "BNA7Goz8o7uTLLfyfSeXEnwRHfiiVvoSK5yN8LicRJX6", + "receipt": { + "Action": { + "signer_id": "53f9c92c36ec210adc6faf00b49edce491f3b92659e88da9588b356c9e11d42a", + "signer_public_key": "ed25519:6eokYb6nFPWrVfwyQ2Reg6GB47qESAF75j6kTcMSe513", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "92d9bfda040034a7d455aa2b67dcac8f9361174705da9d526c52cb9c5de37122", + "receipt_id": "FMCBpN4u78v86ajM1NG5nhpyEsypWjpE9uvmyhj7PrZM", + "receipt": { + "Action": { + "signer_id": "92d9bfda040034a7d455aa2b67dcac8f9361174705da9d526c52cb9c5de37122", + "signer_public_key": "ed25519:AtF6x2YejaHQfPZTgker47UwLZ9s2KY2yU3QatEA44wK", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c4e038663d095934d22fbca2344373c722655cc40ac87a5e49f572783be86460", + "receipt_id": "B9ByHspiEhGB18UJouGtr65bM4AzkPCkxWwxaSaJv6Hj", + "receipt": { + "Action": { + "signer_id": "c4e038663d095934d22fbca2344373c722655cc40ac87a5e49f572783be86460", + "signer_public_key": "ed25519:EFXDCasR5exRAxZjLCYJtKG8qm3pzm4qpVdkXvTUAPHH", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "7d5c998cbfdec988c967aae14b58fd20f546cdae1d80c481b308e2e962af415c", + "receipt_id": "HdnrhgCf1aJAizUj2DFyiTQw4Am7mBqN1dpLJt9SuzwH", + "receipt": { + "Action": { + "signer_id": "7d5c998cbfdec988c967aae14b58fd20f546cdae1d80c481b308e2e962af415c", + "signer_public_key": "ed25519:9SMrmAYVfNikbPEEcozHjjwT7Myp5hzpaLLXWmfksDz3", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0332f7e0e5c49417abdcd5bc1ff1b74ff3645ef6197455d15df146907a606269", + "receipt_id": "FYhkP6Z54niHnE1vRre8LiWkKN5y5ZRtnngfv9rftk7M", + "receipt": { + "Action": { + "signer_id": "0332f7e0e5c49417abdcd5bc1ff1b74ff3645ef6197455d15df146907a606269", + "signer_public_key": "ed25519:DVJPAyuLLB4BBLAadwN6tHza2HusH4qNy2j5FsLNdPe", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "1b1bfbe28688ee3197ba97029ed372e976d75f0980a6ecc1b2b68b952f8af5af", + "receipt_id": "GZLdcQZsNDXGvJ8VTJc2NtpSjjZuKiYBBFXckUkyziJq", + "receipt": { + "Action": { + "signer_id": "1b1bfbe28688ee3197ba97029ed372e976d75f0980a6ecc1b2b68b952f8af5af", + "signer_public_key": "ed25519:2ppkuRwPCMjpMeLxTdEe6Y2D9ysoNNU1SJzafyLkTVzv", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0964bc1ea99c4dafbf98666ff089ffcb851deee744bb4d2d01e06f0dddce479c", + "receipt_id": "3KmA8sAK7siZszJhognXo9fwdSkp7gz6Q3K3jFWhVyDT", + "receipt": { + "Action": { + "signer_id": "0964bc1ea99c4dafbf98666ff089ffcb851deee744bb4d2d01e06f0dddce479c", + "signer_public_key": "ed25519:dfm4amWHy3sbFE4p6H1qtYRLDevVyfnBRmD1S5K5YSP", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "2802cc286689adce1c300e24ed346cad4e9ed4878926f73fa093648b02ca17d9", + "receipt_id": "7yFACe9mufL3XwezuGTN5xXpnm1sGc8RsZJNib1yeKLa", + "receipt": { + "Action": { + "signer_id": "2802cc286689adce1c300e24ed346cad4e9ed4878926f73fa093648b02ca17d9", + "signer_public_key": "ed25519:3hBnMjg2RGfngAwBVWJUGmbWHGawdbd2H2CgN2F3gXyz", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "c4fb6092ab14b367d3d196444a042d3ec73cd9ae694213c795276d26e43d2895", + "receipt_id": "FapmJtoYKv2UjrUETq2xNLAXsHWxxUaVL45EwnB5u63J", + "receipt": { + "Action": { + "signer_id": "c4fb6092ab14b367d3d196444a042d3ec73cd9ae694213c795276d26e43d2895", + "signer_public_key": "ed25519:EFwEEDBQqkWLDeQLsAjeg78PVPaikMbJoMd7YwxNJTjJ", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "6950fc50c8fd1c6a11b6a3ecd781429fb60104ffc37b9fedf3328b05bd7286e6", + "receipt_id": "39zszAbJADk5fxhJ4P1cxbs4WiUFj2amWyCBYkArgR8U", + "receipt": { + "Action": { + "signer_id": "6950fc50c8fd1c6a11b6a3ecd781429fb60104ffc37b9fedf3328b05bd7286e6", + "signer_public_key": "ed25519:867S5R57HCKnb5uPwCEhhtj5s7GAkSZWvoiuJhCggJRj", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "968258c0caac15f600a0e443b813a1576dda1e58282d095052008b42e7cdb730", + "receipt_id": "FA4EJ4AL6qvnwKdSR38aNnZhqtrAxigUvFTkbyLgVmB", + "receipt": { + "Action": { + "signer_id": "968258c0caac15f600a0e443b813a1576dda1e58282d095052008b42e7cdb730", + "signer_public_key": "ed25519:B8XSAmjorghb8JLknsiP4dY9RpZZRBofFzrN5HHxvpkX", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "48274640cd365f86b774b7903a410cebdf15430d46e9d9ddf13208717fd16916", + "receipt_id": "C7LejtCNLGFnVygLcimVcPiVHyrmJPmk6N6N1Dj4csVz", + "receipt": { + "Action": { + "signer_id": "48274640cd365f86b774b7903a410cebdf15430d46e9d9ddf13208717fd16916", + "signer_public_key": "ed25519:5rf69XLkoHzreWyCMkwvr1PgL4GwyPV21MtWB8sR3YqB", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "9cc501e5df0403bd5f072c44fbd18187d62e5f2acbd404e9c6dcf7a98f95710e", + "receipt_id": "2N7tEGDfTsU3u7CrtEiLDHmED5TQ9kMX3xnoUdKTKEjV", + "receipt": { + "Action": { + "signer_id": "9cc501e5df0403bd5f072c44fbd18187d62e5f2acbd404e9c6dcf7a98f95710e", + "signer_public_key": "ed25519:BYxqSdkxYBaJe248bPjaQets6tjvsnrrJwqhKL4YXW8d", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "86d567d8c0461961f149a6d553a350dcde8859f4718b2a0dfa68da806a6fd721", + "receipt_id": "HpQXEt7KZrzLPVQtbN8QG81xfdE5skq6EPFVXLVCFxSg", + "receipt": { + "Action": { + "signer_id": "86d567d8c0461961f149a6d553a350dcde8859f4718b2a0dfa68da806a6fd721", + "signer_public_key": "ed25519:A5LNNmWqic3xsa8R3ZKUqPxdbmg4YtHraVU4fQm4X8Jk", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8ffbbc8fb7d4974e428721a4886beec557dd3ed611466ec2d87c9494d29aad13", + "receipt_id": "2wEoQFKo6kqShGvebBTHZVv5RxfSQFMcEg9kFrf6W5CU", + "receipt": { + "Action": { + "signer_id": "8ffbbc8fb7d4974e428721a4886beec557dd3ed611466ec2d87c9494d29aad13", + "signer_public_key": "ed25519:Ah3wQ215sdRcpgED3AQnf8qqpyBuPFRs3T8CLKeLvhuL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b5c0b0d463776a8f4cefb86ab5ab61ebc1aacf5cfd218736835567eae48862ce", + "receipt_id": "9SPFJ7682H1uMTouYw1f5X6XujrVs1iLPCQC2XeVw19L", + "receipt": { + "Action": { + "signer_id": "b5c0b0d463776a8f4cefb86ab5ab61ebc1aacf5cfd218736835567eae48862ce", + "signer_public_key": "ed25519:DEVDBKFnmHSXNZzCGgdsipw3yUcMMbohs3WgWtpHGeow", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "7a69e426f02e62d2194872542588c316b953e50d0986ebc8265affe3bfb0e135", + "receipt_id": "6etnid3DbLRYhxfyrSamv6SkZPXstRLXcJAnimV9nyAP", + "receipt": { + "Action": { + "signer_id": "7a69e426f02e62d2194872542588c316b953e50d0986ebc8265affe3bfb0e135", + "signer_public_key": "ed25519:9ErPcUxGVe2WVCR68ms7MM59koaaLeiHpzMGhGcQH6Xe", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5b44489a4315d4b57b852cd3a62312eebf103ba2e613c3d86e222fe165ef4aec", + "receipt_id": "2RfAcYA4p4jVo3oVanXhNLr4dbHuETte8Sd16bikWXwh", + "receipt": { + "Action": { + "signer_id": "5b44489a4315d4b57b852cd3a62312eebf103ba2e613c3d86e222fe165ef4aec", + "signer_public_key": "ed25519:79GVUG1C9KXPi5hMi7bF6Xcao11kLhhYwZ8eGG1pgQLT", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0a9dbfe3c25c9e2c17fcad7f37923893b550aa3a6c9f949634f182f1d6fc93b3", + "receipt_id": "fmKsZtFVYvHWEHgm9Y4vA6dHM5E3fd35wyBpYyRr1Li", + "receipt": { + "Action": { + "signer_id": "0a9dbfe3c25c9e2c17fcad7f37923893b550aa3a6c9f949634f182f1d6fc93b3", + "signer_public_key": "ed25519:iSbJo1NfUHkp9V3rq7d82duGJKXA3pwt71kzoRukKF8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "547a9e28aecc5120e6847db20c8eaf4c23f511a04880d45faadaad1f16f68609", + "receipt_id": "CkzFqZKbUW2fzcHBUDnv4UeZrk3kYijruUTco14P6dZ", + "receipt": { + "Action": { + "signer_id": "547a9e28aecc5120e6847db20c8eaf4c23f511a04880d45faadaad1f16f68609", + "signer_public_key": "ed25519:6gmh3ar6xEqtedEXqPHUTz3V6VGjHaiqJv5hGy4ZGucL", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5b8f1e852b5345e3aaccf652de5991d01e2ef6a96ba71cd2dc0b796e464a97bc", + "receipt_id": "FSoSNXukUn5g4j4f3dAErHphbNfMRGVBxHwdJnPA5fu8", + "receipt": { + "Action": { + "signer_id": "5b8f1e852b5345e3aaccf652de5991d01e2ef6a96ba71cd2dc0b796e464a97bc", + "signer_public_key": "ed25519:7AQgCbJdH7vRbdhTp5ERo82TN6N1XJubdZt1SrJBs3f9", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0e4a711554e0b460bdc177df274a0e4cbf1341a3b71ed1b76bc25864a2c31b99", + "receipt_id": "GegyPvRwRZxNZppXDjEwMKZteYsocp18Fcht9tJnfLWD", + "receipt": { + "Action": { + "signer_id": "0e4a711554e0b460bdc177df274a0e4cbf1341a3b71ed1b76bc25864a2c31b99", + "signer_public_key": "ed25519:xnYaQdA7CR7Yec6Bnpi54zdSpUYTptDcHjG8Tb9qXr8", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d3471fcd945f9144b00fa700a0836f045e0f3f5f8ed8dfd04dfbedd07fb2a810", + "receipt_id": "76a3iyzxiREYrvaHMGvXM4Kg26wkfh5hTYpjGXUpqgZj", + "receipt": { + "Action": { + "signer_id": "d3471fcd945f9144b00fa700a0836f045e0f3f5f8ed8dfd04dfbedd07fb2a810", + "signer_public_key": "ed25519:FDjvkx5A4WdQ5pG4GV3dHzKb4TvEnUaJ2YiA2aPgZZRq", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "32d881d9d7be14e83940c0ee6f4da0dd993f013dcd9c4df464c741785046e150", + "receipt_id": "EF8BNmuR2egPL3ctdjjg7R61kA7BYe3KkeThYU8fi7oi", + "receipt": { + "Action": { + "signer_id": "32d881d9d7be14e83940c0ee6f4da0dd993f013dcd9c4df464c741785046e150", + "signer_public_key": "ed25519:4RUsAnzUUkogYHcc9CTq4mbgi2GUQCKQ6BMsGKd3UH1y", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "8c2d76d58782dfbb4a3b3379dfa2edc8069009bfa53c2d4792bbfb748cfe511e", + "receipt_id": "D6MMtakqPKQKjjFY8CEP1xpQ1Jg3Z28cmmau5iUZ2hnn", + "receipt": { + "Action": { + "signer_id": "8c2d76d58782dfbb4a3b3379dfa2edc8069009bfa53c2d4792bbfb748cfe511e", + "signer_public_key": "ed25519:ASCHcdApK7wexCAqsEM6vHF3S9ocZ76mTGkyoyNNoLfw", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "5ba05f51ad4e9a5ed44adbd1c76dd97c55b853d2500197457f83392374c962c2", + "receipt_id": "7uAcX4vFfZpzRprPRCCNEZRwLmw1EL3ghB6P2kxAVJqu", + "receipt": { + "Action": { + "signer_id": "5ba05f51ad4e9a5ed44adbd1c76dd97c55b853d2500197457f83392374c962c2", + "signer_public_key": "ed25519:7AfwD214F69opA7knZa67NGdfQKPStJ6DBdhsbnRAGAM", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "260fe9ee8dca70033ac403f4b6008bc1d2870fc261277bfadc8694d6f0821ba6", + "receipt_id": "CRTiQDTXjSN3LAF6c5BhVx7yq5jjUCjxdzGVCBLiPA7Z", + "receipt": { + "Action": { + "signer_id": "260fe9ee8dca70033ac403f4b6008bc1d2870fc261277bfadc8694d6f0821ba6", + "signer_public_key": "ed25519:3ZaZsa6oTqjNUhEDPzvinCJMxgxLiT28AMNkcio2tQDj", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "b7a844992cae2f81a0ed2484d43c212efe52f0b148732afc76377cbbf5d33684", + "receipt_id": "BPy45d7FDPxZuRwt57Ypew2Dkc8KyQzH8ouaNAPXqyqG", + "receipt": { + "Action": { + "signer_id": "b7a844992cae2f81a0ed2484d43c212efe52f0b148732afc76377cbbf5d33684", + "signer_public_key": "ed25519:DMvRh9s9gp2XwjEbSKSQx72QdALcmQPppvsvHXErYgiw", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "d24b559e5878af34f7228bbc282c4f05880b375043861a08291d9eac457c1d03", + "receipt_id": "HWZBSXRA2N2dyaeU99TMC3M9qzVaN7E9gjhPSm38gb6J", + "receipt": { + "Action": { + "signer_id": "d24b559e5878af34f7228bbc282c4f05880b375043861a08291d9eac457c1d03", + "signer_public_key": "ed25519:F9uF5S7Do8Qr3ZcNn4HMUNod4zeg9UZXrepSri8CrA2E", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "535e7f73a679282ba6cd6136c79c52064c43ead255840370fc6959da31b8a035", + "receipt_id": "46MvG5LSHqFEqcBKM61RHsTPAzFPmeQzax7GAKPMvQf1", + "receipt": { + "Action": { + "signer_id": "535e7f73a679282ba6cd6136c79c52064c43ead255840370fc6959da31b8a035", + "signer_public_key": "ed25519:6cSQyLe4EF5RbUwDrDMhZpEu3A6Vimq7MJTkWakyuTrt", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "20fb238ac4436eb65aba3bdac4ebc782aafa5ed776111f40d1403532ebe63302", + "receipt_id": "6bbgZmK7vxWdP97KjxSJJG8ayftK1wS5i3kugVpjVf9N", + "receipt": { + "Action": { + "signer_id": "20fb238ac4436eb65aba3bdac4ebc782aafa5ed776111f40d1403532ebe63302", + "signer_public_key": "ed25519:3Dk9yi2otAziUXQpfjcgCdLcgxVcbkqynJsCdW3GDENV", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0647e1dbe4b766f7be1014176ffaa2211c3ae5ca765f4dbc33eaace1fd8257b1", + "receipt_id": "DyKDpiz8y1ybzMGHsjcpdXbdquLpLNuKVnVRVdpjLzQt", + "receipt": { + "Action": { + "signer_id": "0647e1dbe4b766f7be1014176ffaa2211c3ae5ca765f4dbc33eaace1fd8257b1", + "signer_public_key": "ed25519:RX27fezTgfTjF8bQQj77raXV8s1hygLgDiE2SyZe86C", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "ceba7a6a35a185cdba8e0b605bcd639281c7dd9fd770236a01331f9183cbaead", + "receipt_id": "XgVmEsr572qXot25CLkZg2xyksddKKddf52sz7Xv9zY", + "receipt": { + "Action": { + "signer_id": "ceba7a6a35a185cdba8e0b605bcd639281c7dd9fd770236a01331f9183cbaead", + "signer_public_key": "ed25519:EuyufUcLK6NSbvksoen5wpRkunazScgdLzWaQGovfY1J", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "0ef15125fe98cc744fcd202aa2aed4244dd8f48f9aad427952e773451062ffe8", + "receipt_id": "CYZgYi1dAwZHX417MK1CGiMfKUNViTgeewhcdAjymvSC", + "receipt": { + "Action": { + "signer_id": "0ef15125fe98cc744fcd202aa2aed4244dd8f48f9aad427952e773451062ffe8", + "signer_public_key": "ed25519:21L8XRjrtFmZukGyhx3NtVoXm2xSorcYDRJye5ofreQw", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "226ca713802ebd9bc49fab56ae8942c04d609c4d07d42c4b228c1b517c9f5f27", + "receipt_id": "CeAk8omxCm1GSPmRp4WCEAys7GmzikzcApdxukYTaQQX", + "receipt": { + "Action": { + "signer_id": "226ca713802ebd9bc49fab56ae8942c04d609c4d07d42c4b228c1b517c9f5f27", + "signer_public_key": "ed25519:3KNxNWhfLwKzXVDjjdiBpp9LG9WgaZsh1JSPc4xq2w4S", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "778df90fa5ffb7132c0364b67f7cd6148b74e85502e739b546a7a5f8b15a3d73", + "receipt_id": "5Vefr9LpoMfDS2GwzeJgw84vYpgqD8t7UCAzttMnvJ4r", + "receipt": { + "Action": { + "signer_id": "778df90fa5ffb7132c0364b67f7cd6148b74e85502e739b546a7a5f8b15a3d73", + "signer_public_key": "ed25519:93h5Vz7bNK7pbpyLhfWmFLVTLEgc5Zxhhwvkpg9JGReA", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "f6593f8bf56c5f9f24aaf93f19b1dded7090dc51a04ef540ca248381b0186d0c", + "receipt_id": "7o1JHkAiRu1aSdLqmfqjTY7TCtnpN6NSs61398GjqmTU", + "receipt": { + "Action": { + "signer_id": "f6593f8bf56c5f9f24aaf93f19b1dded7090dc51a04ef540ca248381b0186d0c", + "signer_public_key": "ed25519:HaeE4hCKf4VYDscdVKWEg8MCDi9kn5PeKM3byeGySZ7h", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2283986818853206908920" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "lulukuang.near", + "receipt_id": "CacxqWcmYho7sJxXdbTCkGmGEKDFqPN6Veyz4JN8oeBm", + "receipt": { + "Action": { + "signer_id": "lulukuang.near", + "signer_public_key": "ed25519:D1ChSvJztywJnk3BEfjWHNjwCuKLrsVFSyduZegKhse1", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "963720295159511630376" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "dab3114eafc6352cb93149b838b8cf794e654446cc28a5b58de1e63b772ce026", + "receipt_id": "2qKRaMryYiUcdTiMqiFkscuUZBZb4EDHd5tbJUMMsmsF", + "receipt": { + "Action": { + "signer_id": "dab3114eafc6352cb93149b838b8cf794e654446cc28a5b58de1e63b772ce026", + "signer_public_key": "ed25519:FiiFHvo7yiMQMCK2JNmbw14JkiWrL3NJjADGpwsn6269", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2324385038795796748000" + } + } + ] + } + } + }, + { + "predecessor_id": "system", + "receiver_id": "e9ea8202f8d5a322948b455ab75b1e83ff29390ab61cc7d339c5dabaed5d119b", + "receipt_id": "3nbC8Vec2ZfJ2sscQcZbZ7mMk5KuKE46W4teeXJvz4NB", + "receipt": { + "Action": { + "signer_id": "e9ea8202f8d5a322948b455ab75b1e83ff29390ab61cc7d339c5dabaed5d119b", + "signer_public_key": "ed25519:Gk7PpnpjXJb2BoaiT9sx1ixfAdF5xj8MVav4UpxBqY3C", + "gas_price": "0", + "output_data_receivers": [], + "input_data_ids": [], + "actions": [ + { + "Transfer": { + "deposit": "2324385038795796748000" + } + } + ] + } + } + } + ] +} diff --git a/utils/restored-receipts-verifier/Cargo.toml b/utils/restored-receipts-verifier/Cargo.toml new file mode 100644 index 00000000000..2627ab06288 --- /dev/null +++ b/utils/restored-receipts-verifier/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "restored-receipts-verifier" +version = "0.1.0" +authors = ["Aleksandr Logunov "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = "2.33" +serde_json = "1" + +near-primitives = { path = "../../core/primitives" } +neard = { path = "../../neard" } +near-store = { path = "../../core/store" } +near-chain = { path = "../../chain/chain" } diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs new file mode 100644 index 00000000000..ebe8e3fd7ef --- /dev/null +++ b/utils/restored-receipts-verifier/src/main.rs @@ -0,0 +1,116 @@ +use clap::{App, Arg}; +use near_chain::{ChainStore, ChainStoreAccess, ReceiptResult, RuntimeAdapter}; +use near_primitives::borsh::BorshSerialize; +use near_primitives::hash::CryptoHash; +use near_primitives::receipt::Receipt; +use near_primitives::version::{ProtocolFeature, PROTOCOL_FEATURES_TO_VERSION_MAPPING}; +use near_store::create_store; +use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; +use std::collections::{HashMap, HashSet}; +use std::io::Error; +use std::iter::FromIterator; +use std::path::Path; + +fn main() -> Result<(), Error> { + let default_home = get_default_home(); + let matches = App::new("restored-receipts-verifier") + .arg( + Arg::with_name("home") + .long("home") + .default_value(&default_home) + .help("Directory for config and data (default \"~/.near\")") + .takes_value(true), + ) + .get_matches(); + + println!("Start"); + + let shard_id: u64 = 0; + let home_dir = matches.value_of("home").map(|dir| Path::new(dir)).unwrap(); + let near_config = load_config(&home_dir); + let store = create_store(&get_store_path(&home_dir)); + let mut chain_store = ChainStore::new(store.clone(), near_config.genesis.config.genesis_height); + let runtime = NightshadeRuntime::new( + &home_dir, + store, + &near_config.genesis, + near_config.client_config.tracked_accounts.clone(), + near_config.client_config.tracked_shards.clone(), + ); + + let mut receipts_missing: Vec = vec![]; + let height_first: u64 = 34691244; // First height for which lost receipts were found + let mut height_last: u64 = + chain_store.get_latest_known().expect("Couldn't get upper bound for block height").height; + + for height in height_first..height_last { + let block_hash_result = chain_store.get_block_hash_by_height(height); + if block_hash_result.is_err() { + println!("{} does not exist, skip", height); + continue; + } + let block_hash = block_hash_result.unwrap(); + + let block = chain_store.get_block(&block_hash).unwrap().clone(); + if block.chunks()[shard_id as usize].height_included() == height { + println!("{} included, skip", height); + continue; + } + + if runtime.get_epoch_protocol_version(block.header().epoch_id()) >= ProtocolFeature::FixApplyChunks.protocol_version() { + println!( + "Found block height {} for which apply_chunks was already fixed. Stopping the loop...", + height + ); + break; + } + + let chunk_extra = + chain_store.get_chunk_extra(block.header().prev_hash(), shard_id).unwrap().clone(); + let apply_result = runtime + .apply_transactions( + shard_id, + &chunk_extra.state_root, + block.header().height(), + block.header().raw_timestamp(), + block.header().prev_hash(), + &block.hash(), + &[], + &[], + chunk_extra.validator_proposals(), + block.header().gas_price(), + chunk_extra.gas_limit, + &block.header().challenges_result(), + *block.header().random_value(), + false, + ) + .unwrap(); + + let receipts_missing_after_apply: Vec = + apply_result.receipt_result.values().cloned().into_iter().flatten().collect(); + receipts_missing.extend(receipts_missing_after_apply.into_iter()); + println!("{} applied", height); + } + + // Check that receipts from repo were actually generated + let receipt_result_in_repo_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result_in_repo = serde_json::from_str::(receipt_result_in_repo_json) + .expect("File with receipts restored after apply_chunks fix have to be correct"); + let receipts_in_repo = receipt_result_in_repo.get(&shard_id).unwrap(); + let receipt_hashes_in_repo = + HashSet::<_>::from_iter(receipts_in_repo.into_iter().map(|receipt| receipt.get_hash())); + let receipt_hashes_missing = + HashSet::<_>::from_iter(receipts_missing.into_iter().map(|receipt| receipt.get_hash())); + + let receipt_hashes_not_verified: Vec = + receipt_hashes_in_repo.difference(&receipt_hashes_missing).cloned().collect(); + assert_eq!( + receipt_hashes_not_verified.len(), + 0, + "Some of receipt hashes in repo were not verified successfully: {:?}", + receipt_hashes_not_verified + ); + println!("Receipt hashes in repo were verified successfully!"); + + Ok(()) +} From 4920661d6c02296ee09091d4e1a70c39c0814d7e Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 29 Apr 2021 20:23:45 +0300 Subject: [PATCH 016/109] Fix condition for re-introducing receipts --- chain/chain/src/chain.rs | 14 +++++++------- utils/restored-receipts-verifier/src/main.rs | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 5fbbbd939b2..d7e12924b17 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -23,7 +23,7 @@ use crate::validate::{ validate_transactions_order, }; use crate::{byzantine_assert, create_light_client_block_view, Doomslug}; -use crate::{metrics, DoomslugThresholdMode}; +use crate::{metrics, DoomslugThresholdMode, ReceiptResult}; use near_chain_primitives::error::{Error, ErrorKind, LogTransientStorageError}; use near_primitives::block::{genesis_chunks, Tip}; @@ -2733,19 +2733,19 @@ impl<'a> ChainUpdate<'a> { Some(&block.hash()), )?; self.chain_store_update.save_block_extra(&block.hash(), BlockExtra { challenges_result }); + let prev_protocol_version = + self.runtime_adapter.get_epoch_protocol_version(prev_block.header().epoch_id())?; let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; // Re-introduce receipts missing before apply_chunks fix (see https://github.com/near/nearcore/pull/4228) if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) - && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() + && prev_protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() + && ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() <= protocol_version { - let mut receipt_result = HashMap::default(); - let receipts_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); - let receipts = serde_json::from_str::>(receipts_json) + let receipt_result_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result = serde_json::from_str::(receipt_result_json) .expect("File with receipts restored after apply_chunks fix have to be correct"); - // let rxs_read = >::try_from_slice(bytes).unwrap(); - receipt_result.insert(0, receipts); self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); } diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index ebe8e3fd7ef..62c308858ae 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -57,7 +57,7 @@ fn main() -> Result<(), Error> { continue; } - if runtime.get_epoch_protocol_version(block.header().epoch_id()) >= ProtocolFeature::FixApplyChunks.protocol_version() { + if runtime.get_epoch_protocol_version(block.header().epoch_id()).unwrap() >= ProtocolFeature::FixApplyChunks.protocol_version() { println!( "Found block height {} for which apply_chunks was already fixed. Stopping the loop...", height From 7a244c996c455f8bd8e802d345dc51db7a9d1511 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 29 Apr 2021 20:27:17 +0300 Subject: [PATCH 017/109] Remove condition for saving outcomes --- chain/chain/src/chain.rs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index d7e12924b17..452ccca872e 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2929,18 +2929,7 @@ impl<'a> ChainUpdate<'a> { self.chain_store_update.save_chunk_extra(&block.hash(), shard_id, new_extra); - if !apply_result.outcomes.is_empty() { - // debug_assert!(false); - // Remove in next release - let (_, outcome_paths) = - ApplyTransactionResult::compute_outcomes_proof(&apply_result.outcomes); - self.chain_store_update.save_outcomes_with_proofs( - &block.hash(), - shard_id, - apply_result.outcomes, - outcome_paths, - ); - } + debug_assert!(protocol_version < ProtocolFeature::FixApplyChunks.protocol_version() || apply_result.outcomes.is_empty()); } } } From db2b915dc029aaced7e883fd0483feffdf2a1cd7 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 29 Apr 2021 20:45:06 +0300 Subject: [PATCH 018/109] Fix port from 1.18.3 to master --- chain/chain/src/chain.rs | 1 + utils/restored-receipts-verifier/src/main.rs | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 452ccca872e..c3f5245b928 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2929,6 +2929,7 @@ impl<'a> ChainUpdate<'a> { self.chain_store_update.save_chunk_extra(&block.hash(), shard_id, new_extra); + #[cfg(not(feature = "nightly_protocol"))] debug_assert!(protocol_version < ProtocolFeature::FixApplyChunks.protocol_version() || apply_result.outcomes.is_empty()); } } diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 62c308858ae..2f044eb632d 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -1,12 +1,11 @@ use clap::{App, Arg}; use near_chain::{ChainStore, ChainStoreAccess, ReceiptResult, RuntimeAdapter}; -use near_primitives::borsh::BorshSerialize; use near_primitives::hash::CryptoHash; use near_primitives::receipt::Receipt; -use near_primitives::version::{ProtocolFeature, PROTOCOL_FEATURES_TO_VERSION_MAPPING}; +use near_primitives::version::ProtocolFeature; use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; use std::io::Error; use std::iter::FromIterator; use std::path::Path; @@ -70,7 +69,7 @@ fn main() -> Result<(), Error> { let apply_result = runtime .apply_transactions( shard_id, - &chunk_extra.state_root, + chunk_extra.state_root(), block.header().height(), block.header().raw_timestamp(), block.header().prev_hash(), @@ -79,7 +78,7 @@ fn main() -> Result<(), Error> { &[], chunk_extra.validator_proposals(), block.header().gas_price(), - chunk_extra.gas_limit, + chunk_extra.gas_limit(), &block.header().challenges_result(), *block.header().random_value(), false, From 0e5bce2b64be5aff73cd9f72869ac9cf10df1faf Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 15:19:57 +0300 Subject: [PATCH 019/109] Set exact upper bound on height --- Cargo.toml | 1 + chain/chain/src/chain.rs | 3 --- core/primitives/Cargo.toml | 3 ++- core/primitives/src/version.rs | 6 ++++-- neard/Cargo.toml | 3 ++- utils/restored-receipts-verifier/src/main.rs | 11 +---------- 6 files changed, 10 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 88ab5aac6dd..6aa59faf2ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -116,6 +116,7 @@ protocol_feature_alt_bn128 = ["neard/protocol_feature_alt_bn128", "testlib/proto protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limit", "node-runtime/protocol_feature_tx_size_limit", "neard/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = ["testlib/protocol_feature_allow_create_account_on_delete", "near-primitives/protocol_feature_allow_create_account_on_delete", "node-runtime/protocol_feature_allow_create_account_on_delete", "neard/protocol_feature_allow_create_account_on_delete"] +protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index c3f5245b928..233df3d69a0 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2928,9 +2928,6 @@ impl<'a> ChainUpdate<'a> { *new_extra.state_root_mut() = apply_result.new_root; self.chain_store_update.save_chunk_extra(&block.hash(), shard_id, new_extra); - - #[cfg(not(feature = "nightly_protocol"))] - debug_assert!(protocol_version < ProtocolFeature::FixApplyChunks.protocol_version() || apply_result.outcomes.is_empty()); } } } diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index eb846b51e0d..e39644af8cb 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -48,7 +48,8 @@ protocol_feature_alt_bn128 = ["near-primitives-core/protocol_feature_alt_bn128", protocol_feature_tx_size_limit = ["near-primitives-core/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = [] protocol_feature_fix_storage_usage = [] -nightly_protocol_features = ["nightly_protocol", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "protocol_feature_fix_storage_usage"] +protocol_feature_restore_receipts_after_fix = [] +nightly_protocol_features = ["nightly_protocol", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "protocol_feature_fix_storage_usage", "protocol_feature_restore_receipts_after_fix"] nightly_protocol = [] diff --git a/core/primitives/src/version.rs b/core/primitives/src/version.rs index 47deddb2375..8f0f475bbc2 100644 --- a/core/primitives/src/version.rs +++ b/core/primitives/src/version.rs @@ -107,11 +107,11 @@ pub enum ProtocolFeature { /// Current latest stable version of the protocol. #[cfg(not(feature = "nightly_protocol"))] -pub const PROTOCOL_VERSION: ProtocolVersion = 45; +pub const PROTOCOL_VERSION: ProtocolVersion = 44; /// Current latest nightly version of the protocol. #[cfg(feature = "nightly_protocol")] -pub const PROTOCOL_VERSION: ProtocolVersion = 111; +pub const PROTOCOL_VERSION: ProtocolVersion = 112; impl ProtocolFeature { pub const fn protocol_version(self) -> ProtocolVersion { @@ -139,6 +139,8 @@ impl ProtocolFeature { ProtocolFeature::AllowCreateAccountOnDelete => 110, #[cfg(feature = "protocol_feature_fix_storage_usage")] ProtocolFeature::FixStorageUsage => 111, + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + ProtocolFeature::RestoreReceiptsAfterFix => 112, } } } diff --git a/neard/Cargo.toml b/neard/Cargo.toml index 482fce44f35..4ed79e74d96 100644 --- a/neard/Cargo.toml +++ b/neard/Cargo.toml @@ -72,7 +72,8 @@ protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_a protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limit", "node-runtime/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = ["node-runtime/protocol_feature_allow_create_account_on_delete"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] -nightly_protocol_features = ["nightly_protocol", "near-primitives/nightly_protocol_features", "near-client/nightly_protocol_features", "near-epoch-manager/nightly_protocol_features", "near-store/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "protocol_feature_fix_storage_usage"] +protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix"] +nightly_protocol_features = ["nightly_protocol", "near-primitives/nightly_protocol_features", "near-client/nightly_protocol_features", "near-epoch-manager/nightly_protocol_features", "near-store/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "protocol_feature_fix_storage_usage", "protocol_feature_restore_receipts_after_fix"] nightly_protocol = ["near-primitives/nightly_protocol", "near-jsonrpc/nightly_protocol"] [[bin]] diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 2f044eb632d..463a9e6a9d8 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -39,8 +39,7 @@ fn main() -> Result<(), Error> { let mut receipts_missing: Vec = vec![]; let height_first: u64 = 34691244; // First height for which lost receipts were found - let mut height_last: u64 = - chain_store.get_latest_known().expect("Couldn't get upper bound for block height").height; + let height_last: u64 = 35524259; // Height for which apply_chunks was already fixed for height in height_first..height_last { let block_hash_result = chain_store.get_block_hash_by_height(height); @@ -56,14 +55,6 @@ fn main() -> Result<(), Error> { continue; } - if runtime.get_epoch_protocol_version(block.header().epoch_id()).unwrap() >= ProtocolFeature::FixApplyChunks.protocol_version() { - println!( - "Found block height {} for which apply_chunks was already fixed. Stopping the loop...", - height - ); - break; - } - let chunk_extra = chain_store.get_chunk_extra(block.header().prev_hash(), shard_id).unwrap().clone(); let apply_result = runtime From 033da25e9a192de338077defb59f11d1557e8b7b Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 15:20:17 +0300 Subject: [PATCH 020/109] Minor fixes --- core/primitives/src/version.rs | 2 ++ utils/restored-receipts-verifier/src/main.rs | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/primitives/src/version.rs b/core/primitives/src/version.rs index 8f0f475bbc2..1f791f7fae1 100644 --- a/core/primitives/src/version.rs +++ b/core/primitives/src/version.rs @@ -103,6 +103,8 @@ pub enum ProtocolFeature { AllowCreateAccountOnDelete, #[cfg(feature = "protocol_feature_fix_storage_usage")] FixStorageUsage, + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + RestoreReceiptsAfterFix, } /// Current latest stable version of the protocol. diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 463a9e6a9d8..4c3375c3b17 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -2,7 +2,6 @@ use clap::{App, Arg}; use near_chain::{ChainStore, ChainStoreAccess, ReceiptResult, RuntimeAdapter}; use near_primitives::hash::CryptoHash; use near_primitives::receipt::Receipt; -use near_primitives::version::ProtocolFeature; use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; use std::collections::HashSet; From a66d7d99b7bb7c78fc4d93eff3584c4285d5740a Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 29 Apr 2021 22:16:21 +0300 Subject: [PATCH 021/109] Set test height start --- utils/restored-receipts-verifier/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 4c3375c3b17..10953428588 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -37,20 +37,20 @@ fn main() -> Result<(), Error> { ); let mut receipts_missing: Vec = vec![]; - let height_first: u64 = 34691244; // First height for which lost receipts were found + let height_first: u64 = 30691244; //34691244; // First height for which lost receipts were found let height_last: u64 = 35524259; // Height for which apply_chunks was already fixed for height in height_first..height_last { let block_hash_result = chain_store.get_block_hash_by_height(height); if block_hash_result.is_err() { - println!("{} does not exist, skip", height); + // println!("{} does not exist, skip", height); continue; } let block_hash = block_hash_result.unwrap(); let block = chain_store.get_block(&block_hash).unwrap().clone(); if block.chunks()[shard_id as usize].height_included() == height { - println!("{} included, skip", height); + // println!("{} included, skip", height); continue; } From 81af983af3be476ecfebe5d75cf7eb149f53deff Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 29 Apr 2021 22:17:23 +0300 Subject: [PATCH 022/109] Revert --- utils/restored-receipts-verifier/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 10953428588..4c3375c3b17 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -37,20 +37,20 @@ fn main() -> Result<(), Error> { ); let mut receipts_missing: Vec = vec![]; - let height_first: u64 = 30691244; //34691244; // First height for which lost receipts were found + let height_first: u64 = 34691244; // First height for which lost receipts were found let height_last: u64 = 35524259; // Height for which apply_chunks was already fixed for height in height_first..height_last { let block_hash_result = chain_store.get_block_hash_by_height(height); if block_hash_result.is_err() { - // println!("{} does not exist, skip", height); + println!("{} does not exist, skip", height); continue; } let block_hash = block_hash_result.unwrap(); let block = chain_store.get_block(&block_hash).unwrap().clone(); if block.chunks()[shard_id as usize].height_included() == height { - // println!("{} included, skip", height); + println!("{} included, skip", height); continue; } From ab98d81cd80452603856bc34e96968d44c4a90d3 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 15:21:35 +0300 Subject: [PATCH 023/109] Set feature flag --- Cargo.toml | 2 +- chain/chain/Cargo.toml | 3 ++- chain/chain/src/chain.rs | 4 +++- utils/restored-receipts-verifier/src/main.rs | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6aa59faf2ad..893ca9c100b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -116,7 +116,7 @@ protocol_feature_alt_bn128 = ["neard/protocol_feature_alt_bn128", "testlib/proto protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limit", "node-runtime/protocol_feature_tx_size_limit", "neard/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = ["testlib/protocol_feature_allow_create_account_on_delete", "near-primitives/protocol_feature_allow_create_account_on_delete", "node-runtime/protocol_feature_allow_create_account_on_delete", "neard/protocol_feature_allow_create_account_on_delete"] -protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix"] +protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "near-chain/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] diff --git a/chain/chain/Cargo.toml b/chain/chain/Cargo.toml index ed0124b952c..fa5b1358aff 100644 --- a/chain/chain/Cargo.toml +++ b/chain/chain/Cargo.toml @@ -43,5 +43,6 @@ delay_detector = ["delay-detector"] no_cache = ["near-store/no_cache"] protocol_feature_evm = ["near-primitives/protocol_feature_evm", "near-chain-configs/protocol_feature_evm"] protocol_feature_block_header_v3 = [] -nightly_protocol_features = ["nightly_protocol", "protocol_feature_block_header_v3"] +protocol_feature_restore_receipts_after_fix = [] +nightly_protocol_features = ["nightly_protocol", "protocol_feature_block_header_v3", "protocol_feature_restore_receipts_after_fix"] nightly_protocol = [] diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 233df3d69a0..886ddbc5a2e 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2739,11 +2739,13 @@ impl<'a> ChainUpdate<'a> { self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; // Re-introduce receipts missing before apply_chunks fix (see https://github.com/near/nearcore/pull/4228) + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) && prev_protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() && ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() <= protocol_version { - let receipt_result_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result_json = + include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); let receipt_result = serde_json::from_str::(receipt_result_json) .expect("File with receipts restored after apply_chunks fix have to be correct"); self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 4c3375c3b17..78de7fab1bb 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -82,7 +82,8 @@ fn main() -> Result<(), Error> { } // Check that receipts from repo were actually generated - let receipt_result_in_repo_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result_in_repo_json = + include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); let receipt_result_in_repo = serde_json::from_str::(receipt_result_in_repo_json) .expect("File with receipts restored after apply_chunks fix have to be correct"); let receipts_in_repo = receipt_result_in_repo.get(&shard_id).unwrap(); From 11e83637e9952bbaeaf4947d94bfeb5784cf01e2 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 00:47:51 +0300 Subject: [PATCH 024/109] Take restored receipts from RuntimeConfig instead of raw data --- chain/chain/src/chain.rs | 42 ++++++++++---------- chain/chain/src/lib.rs | 5 +-- chain/chain/src/store.rs | 4 +- chain/chain/src/types.rs | 5 +-- core/chain-configs/src/genesis_config.rs | 5 +++ core/primitives/src/receipt.rs | 6 ++- core/primitives/src/runtime/config.rs | 7 ++++ neard/src/config.rs | 18 ++++++++- neard/src/runtime/mod.rs | 2 +- utils/restored-receipts-verifier/src/main.rs | 14 ++++--- 10 files changed, 69 insertions(+), 39 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 886ddbc5a2e..71f04bb5f6c 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -11,20 +11,8 @@ use rand::seq::SliceRandom; use rand::SeedableRng; use tracing::{debug, error, info, warn}; -use crate::lightclient::get_epoch_block_producers_view; -use crate::missing_chunks::{BlockLike, MissingChunksPool}; -use crate::store::{ChainStore, ChainStoreAccess, ChainStoreUpdate, GCMode}; -use crate::types::{ - AcceptedBlock, ApplyTransactionResult, Block, BlockEconomicsConfig, BlockHeader, - BlockHeaderInfo, BlockStatus, ChainGenesis, Provenance, RuntimeAdapter, -}; -use crate::validate::{ - validate_challenge, validate_chunk_proofs, validate_chunk_with_chunk_extra, - validate_transactions_order, -}; -use crate::{byzantine_assert, create_light_client_block_view, Doomslug}; -use crate::{metrics, DoomslugThresholdMode, ReceiptResult}; - +#[cfg(feature = "delay_detector")] +use delay_detector::DelayDetector; use near_chain_primitives::error::{Error, ErrorKind, LogTransientStorageError}; use near_primitives::block::{genesis_chunks, Tip}; use near_primitives::challenge::{ @@ -36,7 +24,7 @@ use near_primitives::hash::{hash, CryptoHash}; use near_primitives::merkle::{ combine_hash, merklize, verify_path, Direction, MerklePath, MerklePathItem, }; -use near_primitives::receipt::Receipt; +use near_primitives::receipt::{Receipt, ReceiptResult}; use near_primitives::sharding::{ ChunkHash, ChunkHashHeight, ReceiptList, ReceiptProof, ShardChunk, ShardChunkHeader, ShardInfo, ShardProof, StateSyncInfo, @@ -61,8 +49,19 @@ use near_primitives::views::{ }; use near_store::{ColState, ColStateHeaders, ColStateParts, ShardTries, StoreUpdate}; -#[cfg(feature = "delay_detector")] -use delay_detector::DelayDetector; +use crate::lightclient::get_epoch_block_producers_view; +use crate::missing_chunks::{BlockLike, MissingChunksPool}; +use crate::store::{ChainStore, ChainStoreAccess, ChainStoreUpdate, GCMode}; +use crate::types::{ + AcceptedBlock, ApplyTransactionResult, Block, BlockEconomicsConfig, BlockHeader, + BlockHeaderInfo, BlockStatus, ChainGenesis, Provenance, RuntimeAdapter, +}; +use crate::validate::{ + validate_challenge, validate_chunk_proofs, validate_chunk_with_chunk_extra, + validate_transactions_order, +}; +use crate::{byzantine_assert, create_light_client_block_view, Doomslug}; +use crate::{metrics, DoomslugThresholdMode}; /// Maximum number of orphans chain can store. pub const MAX_ORPHAN_SIZE: usize = 1024; @@ -2744,10 +2743,11 @@ impl<'a> ChainUpdate<'a> { && prev_protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() && ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() <= protocol_version { - let receipt_result_json = - include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); - let receipt_result = serde_json::from_str::(receipt_result_json) - .expect("File with receipts restored after apply_chunks fix have to be correct"); + let receipt_result = self + .runtime_adapter + .get_protocol_config(block.header().epoch_id())? + .runtime_config + .receipts_to_restore; self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); } diff --git a/chain/chain/src/lib.rs b/chain/chain/src/lib.rs index 96e8d57a3e1..502af104f31 100644 --- a/chain/chain/src/lib.rs +++ b/chain/chain/src/lib.rs @@ -5,11 +5,10 @@ pub use chain::{collect_receipts, Chain, MAX_ORPHAN_SIZE}; pub use doomslug::{Doomslug, DoomslugBlockProductionReadiness, DoomslugThresholdMode}; pub use lightclient::{create_light_client_block_view, get_epoch_block_producers_view}; pub use near_chain_primitives::{self, Error, ErrorKind}; +pub use near_primitives::receipt::ReceiptResult; pub use store::{ChainStore, ChainStoreAccess, ChainStoreUpdate}; pub use store_validator::{ErrorMessage, StoreValidator}; -pub use types::{ - Block, BlockHeader, BlockStatus, ChainGenesis, Provenance, ReceiptResult, RuntimeAdapter, -}; +pub use types::{Block, BlockHeader, BlockStatus, ChainGenesis, Provenance, RuntimeAdapter}; pub mod chain; mod doomslug; diff --git a/chain/chain/src/store.rs b/chain/chain/src/store.rs index 18cb7ad297a..6543d654747 100644 --- a/chain/chain/src/store.rs +++ b/chain/chain/src/store.rs @@ -13,7 +13,7 @@ use near_primitives::block::{Approval, Tip}; use near_primitives::errors::InvalidTxError; use near_primitives::hash::CryptoHash; use near_primitives::merkle::{MerklePath, PartialMerkleTree}; -use near_primitives::receipt::Receipt; +use near_primitives::receipt::{Receipt, ReceiptResult}; use near_primitives::sharding::{ ChunkHash, EncodedShardChunk, PartialEncodedChunk, ReceiptProof, ShardChunk, ShardChunkHeader, StateSyncInfo, @@ -48,8 +48,8 @@ use near_store::{ TAIL_KEY, }; +use crate::byzantine_assert; use crate::types::{Block, BlockHeader, LatestKnown}; -use crate::{byzantine_assert, ReceiptResult}; /// lru cache size #[cfg(not(feature = "no_cache"))] diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index 48c28d5ab4d..15d0e01d31d 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -18,7 +18,7 @@ use near_primitives::epoch_manager::epoch_info::EpochInfo; use near_primitives::errors::InvalidTxError; use near_primitives::hash::{hash, CryptoHash}; use near_primitives::merkle::{merklize, MerklePath}; -use near_primitives::receipt::Receipt; +use near_primitives::receipt::{Receipt, ReceiptResult}; use near_primitives::sharding::{ChunkHash, ReceiptList, ShardChunkHeader}; use near_primitives::transaction::{ExecutionOutcomeWithId, SignedTransaction}; use near_primitives::types::validator_stake::{ValidatorStake, ValidatorStakeIter}; @@ -76,9 +76,6 @@ pub struct AcceptedBlock { pub provenance: Provenance, } -/// Map of shard to list of receipts to send to it. -pub type ReceiptResult = HashMap>; - pub struct ApplyTransactionResult { pub trie_changes: WrappedTrieChanges, pub new_root: StateRoot, diff --git a/core/chain-configs/src/genesis_config.rs b/core/chain-configs/src/genesis_config.rs index 755dd1f77ff..e1f5af9d0b3 100644 --- a/core/chain-configs/src/genesis_config.rs +++ b/core/chain-configs/src/genesis_config.rs @@ -237,6 +237,11 @@ impl GenesisConfig { }) .collect() } + + /// Returns true iff chain_id is mainnet + pub fn is_mainnet(&self) -> bool { + self.chain_id.as_str() == "mainnet" + } } impl GenesisRecords { diff --git a/core/primitives/src/receipt.rs b/core/primitives/src/receipt.rs index 879a4b394c1..642d846beba 100644 --- a/core/primitives/src/receipt.rs +++ b/core/primitives/src/receipt.rs @@ -6,11 +6,12 @@ use serde::{Deserialize, Serialize}; use near_crypto::{KeyType, PublicKey}; +use crate::borsh::maybestd::collections::HashMap; use crate::hash::CryptoHash; use crate::logging; use crate::serialize::{option_base64_format, u128_dec_format_compatible}; use crate::transaction::{Action, TransferAction}; -use crate::types::{AccountId, Balance}; +use crate::types::{AccountId, Balance, ShardId}; use crate::utils::system_account; /// Receipts are used for a cross-shard communication. @@ -171,3 +172,6 @@ pub struct DelayedReceiptIndices { // Exclusive end index of the queue pub next_available_index: u64, } + +/// Map of shard to list of receipts to send to it. +pub type ReceiptResult = HashMap>; diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index 052650eca3a..8f0effb7910 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -1,8 +1,11 @@ //! Settings of the parameters of the runtime. use serde::{Deserialize, Serialize}; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use std::collections::HashMap; use crate::checked_feature; use crate::config::VMConfig; +use crate::receipt::ReceiptResult; use crate::runtime::fees::RuntimeFeesConfig; use crate::serialize::u128_dec_format; use crate::types::{AccountId, Balance}; @@ -24,6 +27,8 @@ pub struct RuntimeConfig { pub wasm_config: VMConfig, /// Config that defines rules for account creation. pub account_creation_config: AccountCreationConfig, + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + pub receipts_to_restore: ReceiptResult, } impl Default for RuntimeConfig { @@ -34,6 +39,8 @@ impl Default for RuntimeConfig { transaction_costs: RuntimeFeesConfig::default(), wasm_config: VMConfig::default(), account_creation_config: AccountCreationConfig::default(), + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + receipts_to_restore: HashMap::default(), } } } diff --git a/neard/src/config.rs b/neard/src/config.rs index 8e0ea618170..163db7fc350 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -21,7 +21,11 @@ use near_network::types::ROUTED_MESSAGE_TTL; use near_network::utils::blacklist_from_iter; use near_network::NetworkConfig; use near_primitives::account::{AccessKey, Account}; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use near_primitives::receipt::ReceiptResult; use near_primitives::runtime::config::RuntimeConfig; use near_primitives::state_record::StateRecord; use near_primitives::types::{ @@ -779,12 +783,24 @@ pub fn init_configs( config.write_to_file(&dir.join(CONFIG_FILENAME)); // TODO: add download genesis for mainnet - let genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) + let mut genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) .expect("Failed to deserialize MainNet genesis"); if let Some(account_id) = account_id { generate_validator_key(account_id, &dir.join(config.validator_key_file)); } + if checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + PROTOCOL_VERSION + ) { + let receipt_result_json = include_str!("../res/fix_apply_chunks_receipts.json"); + genesis.config.runtime_config.receipts_to_restore = + serde_json::from_str::(receipt_result_json).expect( + "File with receipts restored after apply_chunks fix have to be correct", + ); + }; + let network_signer = InMemorySigner::from_random("".to_string(), KeyType::ED25519); network_signer.write_to_file(&dir.join(config.node_key_file)); diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 9f0f98a9c72..99ff9cd949a 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -1618,11 +1618,11 @@ mod test { use num_rational::Rational; - use near_chain::ReceiptResult; use near_crypto::{InMemorySigner, KeyType, Signer}; use near_logger_utils::init_test_logger; use near_primitives::block::Tip; use near_primitives::challenge::SlashedValidator; + use near_primitives::receipt::ReceiptResult; use near_primitives::runtime::config::RuntimeConfig; use near_primitives::transaction::{Action, DeleteAccountAction, StakeAction}; use near_primitives::types::{BlockHeightDelta, Nonce, ValidatorId, ValidatorKickoutReason}; diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 78de7fab1bb..331edcadf6d 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -1,14 +1,16 @@ -use clap::{App, Arg}; -use near_chain::{ChainStore, ChainStoreAccess, ReceiptResult, RuntimeAdapter}; -use near_primitives::hash::CryptoHash; -use near_primitives::receipt::Receipt; -use near_store::create_store; -use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; use std::collections::HashSet; use std::io::Error; use std::iter::FromIterator; use std::path::Path; +use clap::{App, Arg}; + +use near_chain::{ChainStore, ChainStoreAccess, RuntimeAdapter}; +use near_primitives::hash::CryptoHash; +use near_primitives::receipt::{Receipt, ReceiptResult}; +use near_store::create_store; +use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; + fn main() -> Result<(), Error> { let default_home = get_default_home(); let matches = App::new("restored-receipts-verifier") From 501632ca277bb3a0bdff7e73a9de796a4d7c16cd Mon Sep 17 00:00:00 2001 From: Aleksandr Logunov Date: Sat, 1 May 2021 00:50:35 +0300 Subject: [PATCH 025/109] Update utils/restored-receipts-verifier/src/main.rs Co-authored-by: Aleksey Kladov --- utils/restored-receipts-verifier/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 331edcadf6d..d32c3351c1b 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -11,7 +11,7 @@ use near_primitives::receipt::{Receipt, ReceiptResult}; use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; -fn main() -> Result<(), Error> { +fn main() -> io::Result<()> { let default_home = get_default_home(); let matches = App::new("restored-receipts-verifier") .arg( From 68a04f9cc2ea6da809d38ba4d55b51a99e644dae Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 00:56:08 +0300 Subject: [PATCH 026/109] Refactor condition --- chain/chain/src/chain.rs | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 71f04bb5f6c..4ef8e4d2f26 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2732,23 +2732,32 @@ impl<'a> ChainUpdate<'a> { Some(&block.hash()), )?; self.chain_store_update.save_block_extra(&block.hash(), BlockExtra { challenges_result }); - let prev_protocol_version = - self.runtime_adapter.get_epoch_protocol_version(prev_block.header().epoch_id())?; + let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; // Re-introduce receipts missing before apply_chunks fix (see https://github.com/near/nearcore/pull/4228) - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) - && prev_protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - && ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() <= protocol_version - { - let receipt_result = self - .runtime_adapter - .get_protocol_config(block.header().epoch_id())? - .runtime_config - .receipts_to_restore; - self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); + if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) { + if checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + protocol_version + ) { + let prev_protocol_version = + self.runtime_adapter.get_epoch_protocol_version(prev_block.header().epoch_id())?; + if !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + ) { + let receipt_result = self + .runtime_adapter + .get_protocol_config(block.header().epoch_id())? + .runtime_config + .receipts_to_restore; + self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); + } + } } for (shard_id, (chunk_header, prev_chunk_header)) in From 261de4d50b06efe2dd74c7bf0c3a9bd136ab474d Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:02:35 +0300 Subject: [PATCH 027/109] Fix clap --- utils/restored-receipts-verifier/Cargo.toml | 2 +- utils/restored-receipts-verifier/src/main.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/restored-receipts-verifier/Cargo.toml b/utils/restored-receipts-verifier/Cargo.toml index 2627ab06288..0cf1bb923ec 100644 --- a/utils/restored-receipts-verifier/Cargo.toml +++ b/utils/restored-receipts-verifier/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = "2.33" +clap = { git = "https://github.com/clap-rs/clap/" } serde_json = "1" near-primitives = { path = "../../core/primitives" } diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index d32c3351c1b..2656c960bc1 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -1,5 +1,5 @@ use std::collections::HashSet; -use std::io::Error; +use std::io::Result; use std::iter::FromIterator; use std::path::Path; @@ -11,7 +11,7 @@ use near_primitives::receipt::{Receipt, ReceiptResult}; use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; -fn main() -> io::Result<()> { +fn main() -> Result<()> { let default_home = get_default_home(); let matches = App::new("restored-receipts-verifier") .arg( From 1a9e945001bd514d355dd0485d58e1a44752cde9 Mon Sep 17 00:00:00 2001 From: Aleksandr Logunov Date: Sat, 1 May 2021 01:03:08 +0300 Subject: [PATCH 028/109] Update utils/restored-receipts-verifier/src/main.rs Co-authored-by: Aleksey Kladov --- utils/restored-receipts-verifier/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 2656c960bc1..0d378e332f8 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -25,7 +25,7 @@ fn main() -> Result<()> { println!("Start"); - let shard_id: u64 = 0; + let shard_id = 0u64; let home_dir = matches.value_of("home").map(|dir| Path::new(dir)).unwrap(); let near_config = load_config(&home_dir); let store = create_store(&get_store_path(&home_dir)); From dda95c2cea8f4111864c53b9e59315e76612e024 Mon Sep 17 00:00:00 2001 From: Aleksandr Logunov Date: Sat, 1 May 2021 01:03:29 +0300 Subject: [PATCH 029/109] Update utils/restored-receipts-verifier/src/main.rs Co-authored-by: Aleksey Kladov --- utils/restored-receipts-verifier/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 0d378e332f8..96a145c0341 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -26,7 +26,7 @@ fn main() -> Result<()> { println!("Start"); let shard_id = 0u64; - let home_dir = matches.value_of("home").map(|dir| Path::new(dir)).unwrap(); + let home_dir = matches.value_of("home").map(Path::new).unwrap(); let near_config = load_config(&home_dir); let store = create_store(&get_store_path(&home_dir)); let mut chain_store = ChainStore::new(store.clone(), near_config.genesis.config.genesis_height); From 6cc80fbc1291e42bcd0a1dc25671ea58d7343e68 Mon Sep 17 00:00:00 2001 From: Aleksandr Logunov Date: Sat, 1 May 2021 01:04:11 +0300 Subject: [PATCH 030/109] Update utils/restored-receipts-verifier/src/main.rs Co-authored-by: Aleksey Kladov --- utils/restored-receipts-verifier/src/main.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 96a145c0341..6327ad86abb 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -44,11 +44,13 @@ fn main() -> Result<()> { for height in height_first..height_last { let block_hash_result = chain_store.get_block_hash_by_height(height); - if block_hash_result.is_err() { - println!("{} does not exist, skip", height); - continue; + let block_hash = match block_hash_result { + Ok(it) => it, + Err(it) => { + println!("{} does not exist, skip", height); + continue; + } } - let block_hash = block_hash_result.unwrap(); let block = chain_store.get_block(&block_hash).unwrap().clone(); if block.chunks()[shard_id as usize].height_included() == height { From 4257dea8b3380541933bd3d662b4c43b20204a7a Mon Sep 17 00:00:00 2001 From: Aleksandr Logunov Date: Sat, 1 May 2021 01:04:19 +0300 Subject: [PATCH 031/109] Update utils/restored-receipts-verifier/src/main.rs Co-authored-by: Aleksey Kladov --- utils/restored-receipts-verifier/src/main.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 6327ad86abb..0ee67a0b315 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -98,9 +98,8 @@ fn main() -> Result<()> { let receipt_hashes_not_verified: Vec = receipt_hashes_in_repo.difference(&receipt_hashes_missing).cloned().collect(); - assert_eq!( - receipt_hashes_not_verified.len(), - 0, + assert!( + receipt_hashes_not_verified.is_empty(), "Some of receipt hashes in repo were not verified successfully: {:?}", receipt_hashes_not_verified ); From c4cd340200e3c2c7ad01f7adeeb2662aff5c429c Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:08:42 +0300 Subject: [PATCH 032/109] Apply suggestion --- utils/restored-receipts-verifier/src/main.rs | 22 +++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 0ee67a0b315..8f27c4d4ed4 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -38,7 +38,7 @@ fn main() -> Result<()> { near_config.client_config.tracked_shards.clone(), ); - let mut receipts_missing: Vec = vec![]; + let mut receipts_missing = Vec::::new(); let height_first: u64 = 34691244; // First height for which lost receipts were found let height_last: u64 = 35524259; // Height for which apply_chunks was already fixed @@ -85,17 +85,19 @@ fn main() -> Result<()> { println!("{} applied", height); } - // Check that receipts from repo were actually generated - let receipt_result_in_repo_json = - include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); - let receipt_result_in_repo = serde_json::from_str::(receipt_result_in_repo_json) - .expect("File with receipts restored after apply_chunks fix have to be correct"); - let receipts_in_repo = receipt_result_in_repo.get(&shard_id).unwrap(); - let receipt_hashes_in_repo = - HashSet::<_>::from_iter(receipts_in_repo.into_iter().map(|receipt| receipt.get_hash())); - let receipt_hashes_missing = + let receipt_hashes_missing: HashSet = HashSet::<_>::from_iter(receipts_missing.into_iter().map(|receipt| receipt.get_hash())); + // Check that receipts from repo were actually generated + let receipt_hashes_in_repo: HashSet = { + let receipt_result_json = + include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result = serde_json::from_str::(receipt_result_in_repo_json) + .expect("File with receipts restored after apply_chunks fix have to be correct"); + let receipts = receipt_result_in_repo.get(&shard_id).unwrap(); + HashSet::<_>::from_iter(receipts_in_repo.into_iter().map(|receipt| receipt.get_hash())) + }; + let receipt_hashes_not_verified: Vec = receipt_hashes_in_repo.difference(&receipt_hashes_missing).cloned().collect(); assert!( From f26d30fcc12454ccac6890f482b738a866aee0fc Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:09:29 +0300 Subject: [PATCH 033/109] Minor fix --- utils/restored-receipts-verifier/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 8f27c4d4ed4..778306c6570 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -50,7 +50,7 @@ fn main() -> Result<()> { println!("{} does not exist, skip", height); continue; } - } + }; let block = chain_store.get_block(&block_hash).unwrap().clone(); if block.chunks()[shard_id as usize].height_included() == height { From 904837d97f2f0d94c0801d3ca9037ff36aeb2c5c Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:11:51 +0300 Subject: [PATCH 034/109] Minor fix --- utils/restored-receipts-verifier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/restored-receipts-verifier/Cargo.toml b/utils/restored-receipts-verifier/Cargo.toml index 0cf1bb923ec..2627ab06288 100644 --- a/utils/restored-receipts-verifier/Cargo.toml +++ b/utils/restored-receipts-verifier/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { git = "https://github.com/clap-rs/clap/" } +clap = "2.33" serde_json = "1" near-primitives = { path = "../../core/primitives" } From 122c12eb79eb8297227e14dfb1a286684053a0c8 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:22:10 +0300 Subject: [PATCH 035/109] Compilation fix --- chain/chain/src/chain.rs | 40 +++++++++++--------- core/primitives/src/runtime/config.rs | 1 + neard/src/config.rs | 25 +++++++----- utils/restored-receipts-verifier/src/main.rs | 6 +-- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 4ef8e4d2f26..1e8cab2a408 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -24,7 +24,9 @@ use near_primitives::hash::{hash, CryptoHash}; use near_primitives::merkle::{ combine_hash, merklize, verify_path, Direction, MerklePath, MerklePathItem, }; -use near_primitives::receipt::{Receipt, ReceiptResult}; +use near_primitives::receipt::Receipt; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use near_primitives::receipt::ReceiptResult; use near_primitives::sharding::{ ChunkHash, ChunkHashHeight, ReceiptList, ReceiptProof, ShardChunk, ShardChunkHeader, ShardInfo, ShardProof, StateSyncInfo, @@ -41,6 +43,7 @@ use near_primitives::types::{ ShardId, }; use near_primitives::unwrap_or_return; +#[cfg(any(feature = "protocol_feature_block_header_v3", feature = "protocol_feature_restore_receipts_after_fix"))] use near_primitives::version::ProtocolFeature; use near_primitives::views::{ ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, @@ -2738,26 +2741,27 @@ impl<'a> ChainUpdate<'a> { // Re-introduce receipts missing before apply_chunks fix (see https://github.com/near/nearcore/pull/4228) if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) { - if checked_feature!( + checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, - protocol_version - ) { - let prev_protocol_version = - self.runtime_adapter.get_epoch_protocol_version(prev_block.header().epoch_id())?; - if !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - ) { - let receipt_result = self - .runtime_adapter - .get_protocol_config(block.header().epoch_id())? - .runtime_config - .receipts_to_restore; - self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); + protocol_version, + { + let prev_protocol_version = + self.runtime_adapter.get_epoch_protocol_version(prev_block.header().epoch_id())?; + if !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + ) { + let receipt_result = self + .runtime_adapter + .get_protocol_config(block.header().epoch_id())? + .runtime_config + .receipts_to_restore; + self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); + } } - } + ); } for (shard_id, (chunk_header, prev_chunk_header)) in diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index 8f0effb7910..8f5d1a1ef67 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -5,6 +5,7 @@ use std::collections::HashMap; use crate::checked_feature; use crate::config::VMConfig; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] use crate::receipt::ReceiptResult; use crate::runtime::fees::RuntimeFeesConfig; use crate::serialize::u128_dec_format; diff --git a/neard/src/config.rs b/neard/src/config.rs index 163db7fc350..8f11c825d23 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -21,7 +21,6 @@ use near_network::types::ROUTED_MESSAGE_TTL; use near_network::utils::blacklist_from_iter; use near_network::NetworkConfig; use near_primitives::account::{AccessKey, Account}; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] @@ -783,23 +782,29 @@ pub fn init_configs( config.write_to_file(&dir.join(CONFIG_FILENAME)); // TODO: add download genesis for mainnet + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let mut genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) .expect("Failed to deserialize MainNet genesis"); + + #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] + let genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON).expect("Failed to deserialize MainNet genesis"); + if let Some(account_id) = account_id { generate_validator_key(account_id, &dir.join(config.validator_key_file)); } - if checked_feature!( + checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, - PROTOCOL_VERSION - ) { - let receipt_result_json = include_str!("../res/fix_apply_chunks_receipts.json"); - genesis.config.runtime_config.receipts_to_restore = - serde_json::from_str::(receipt_result_json).expect( - "File with receipts restored after apply_chunks fix have to be correct", - ); - }; + PROTOCOL_VERSION, + { + let receipt_result_json = include_str!("../res/fix_apply_chunks_receipts.json"); + genesis.config.runtime_config.receipts_to_restore = + serde_json::from_str::(receipt_result_json).expect( + "File with receipts restored after apply_chunks fix have to be correct", + ); + } + ); let network_signer = InMemorySigner::from_random("".to_string(), KeyType::ED25519); network_signer.write_to_file(&dir.join(config.node_key_file)); diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 778306c6570..6b43438b82d 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -92,10 +92,10 @@ fn main() -> Result<()> { let receipt_hashes_in_repo: HashSet = { let receipt_result_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); - let receipt_result = serde_json::from_str::(receipt_result_in_repo_json) + let receipt_result = serde_json::from_str::(receipt_result_json) .expect("File with receipts restored after apply_chunks fix have to be correct"); - let receipts = receipt_result_in_repo.get(&shard_id).unwrap(); - HashSet::<_>::from_iter(receipts_in_repo.into_iter().map(|receipt| receipt.get_hash())) + let receipts = receipt_result.get(&shard_id).unwrap(); + HashSet::<_>::from_iter(receipts.into_iter().map(|receipt| receipt.get_hash())) }; let receipt_hashes_not_verified: Vec = From 5d00c98c77d4fa435070149bc60a7e4b69bd55a0 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:23:34 +0300 Subject: [PATCH 036/109] Minor fix --- utils/restored-receipts-verifier/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 6b43438b82d..899b765de5d 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -36,6 +36,7 @@ fn main() -> Result<()> { &near_config.genesis, near_config.client_config.tracked_accounts.clone(), near_config.client_config.tracked_shards.clone(), + None, ); let mut receipts_missing = Vec::::new(); From a95e4d01884f1edc46f87b3330a6919e3b92c809 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 01:25:38 +0300 Subject: [PATCH 037/109] cargo fmt --- chain/chain/src/chain.rs | 16 ++++++++++++---- neard/src/config.rs | 3 ++- utils/restored-receipts-verifier/src/main.rs | 5 ++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 1e8cab2a408..8b813cf0c91 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -43,7 +43,10 @@ use near_primitives::types::{ ShardId, }; use near_primitives::unwrap_or_return; -#[cfg(any(feature = "protocol_feature_block_header_v3", feature = "protocol_feature_restore_receipts_after_fix"))] +#[cfg(any( + feature = "protocol_feature_block_header_v3", + feature = "protocol_feature_restore_receipts_after_fix" +))] use near_primitives::version::ProtocolFeature; use near_primitives::views::{ ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, @@ -2746,8 +2749,9 @@ impl<'a> ChainUpdate<'a> { RestoreReceiptsAfterFix, protocol_version, { - let prev_protocol_version = - self.runtime_adapter.get_epoch_protocol_version(prev_block.header().epoch_id())?; + let prev_protocol_version = self + .runtime_adapter + .get_epoch_protocol_version(prev_block.header().epoch_id())?; if !checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, @@ -2758,7 +2762,11 @@ impl<'a> ChainUpdate<'a> { .get_protocol_config(block.header().epoch_id())? .runtime_config .receipts_to_restore; - self.chain_store_update.save_outgoing_receipt(&block.hash(), 0, receipt_result); + self.chain_store_update.save_outgoing_receipt( + &block.hash(), + 0, + receipt_result, + ); } } ); diff --git a/neard/src/config.rs b/neard/src/config.rs index 8f11c825d23..c4abb6c7120 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -787,7 +787,8 @@ pub fn init_configs( .expect("Failed to deserialize MainNet genesis"); #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] - let genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON).expect("Failed to deserialize MainNet genesis"); + let genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) + .expect("Failed to deserialize MainNet genesis"); if let Some(account_id) = account_id { generate_validator_key(account_id, &dir.join(config.validator_key_file)); diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 899b765de5d..6e324869f14 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -47,7 +47,7 @@ fn main() -> Result<()> { let block_hash_result = chain_store.get_block_hash_by_height(height); let block_hash = match block_hash_result { Ok(it) => it, - Err(it) => { + Err(_) => { println!("{} does not exist, skip", height); continue; } @@ -91,8 +91,7 @@ fn main() -> Result<()> { // Check that receipts from repo were actually generated let receipt_hashes_in_repo: HashSet = { - let receipt_result_json = - include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); let receipt_result = serde_json::from_str::(receipt_result_json) .expect("File with receipts restored after apply_chunks fix have to be correct"); let receipts = receipt_result.get(&shard_id).unwrap(); From 4861cdfcdf328d3d05c5058f8d97d2ae2431a716 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 02:47:23 +0300 Subject: [PATCH 038/109] Add comments --- chain/chain/src/chain.rs | 5 ++++- core/primitives/src/runtime/config.rs | 1 + neard/src/config.rs | 8 +++++--- utils/restored-receipts-verifier/src/main.rs | 5 +++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 8b813cf0c91..7e4a4abbdfb 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2742,7 +2742,10 @@ impl<'a> ChainUpdate<'a> { let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; - // Re-introduce receipts missing before apply_chunks fix (see https://github.com/near/nearcore/pull/4228) + // This part of code re-introduces outgoing receipts lost because of a bug in apply_chunks + // (see https://github.com/near/nearcore/pull/4248/) + // We take the first block in the first epoch in which protocol feature RestoreReceiptsAfterFix + // is enabled, and save the restored receipts there. if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) { checked_feature!( "protocol_feature_restore_receipts_after_fix", diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index 8f5d1a1ef67..ba1647c032c 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -28,6 +28,7 @@ pub struct RuntimeConfig { pub wasm_config: VMConfig, /// Config that defines rules for account creation. pub account_creation_config: AccountCreationConfig, + /// All receipts which were lost because of a bug in apply_chunks (see https://github.com/near/nearcore/pull/4248/) #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] pub receipts_to_restore: ReceiptResult, } diff --git a/neard/src/config.rs b/neard/src/config.rs index c4abb6c7120..7872a15969e 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -747,7 +747,8 @@ fn generate_validator_key(account_id: &str, path: &Path) { } lazy_static_include::lazy_static_include_bytes! { - MAINNET_GENESIS_JSON => "res/mainnet_genesis.json" + MAINNET_GENESIS_JSON => "res/mainnet_genesis.json", + RESTORED_RECEIPTS_JSON => "res/fix_apply_chunks_receipts.json", } /// Initializes genesis and client configs and stores in the given folder @@ -794,14 +795,15 @@ pub fn init_configs( generate_validator_key(account_id, &dir.join(config.validator_key_file)); } + // Put receipts which were lost because of a bug in apply_chunks to the runtime config. + // See https://github.com/near/nearcore/pull/4248/ for more details checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, PROTOCOL_VERSION, { - let receipt_result_json = include_str!("../res/fix_apply_chunks_receipts.json"); genesis.config.runtime_config.receipts_to_restore = - serde_json::from_str::(receipt_result_json).expect( + serde_json::from_slice(*RESTORED_RECEIPTS_JSON).expect( "File with receipts restored after apply_chunks fix have to be correct", ); } diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 6e324869f14..aa16f9092b1 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -12,6 +12,11 @@ use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; fn main() -> Result<()> { + // Script to verify that receipts being restored after apply_chunks fix were actually lost. + // Only receipt hashes are checked, because of their uniqueness. + // See https://github.com/near/nearcore/pull/4248/ for more details. + // Requirement: mainnet archival node dump. + let default_home = get_default_home(); let matches = App::new("restored-receipts-verifier") .arg( From ee3726988ce0080d15352c3f95ebba3d16771c13 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 02:52:11 +0300 Subject: [PATCH 039/109] Fix unused imports --- chain/chain/src/chain.rs | 7 +------ core/primitives/src/runtime/config.rs | 2 ++ neard/src/config.rs | 2 -- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 7e4a4abbdfb..71166a6011c 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -25,8 +25,6 @@ use near_primitives::merkle::{ combine_hash, merklize, verify_path, Direction, MerklePath, MerklePathItem, }; use near_primitives::receipt::Receipt; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use near_primitives::receipt::ReceiptResult; use near_primitives::sharding::{ ChunkHash, ChunkHashHeight, ReceiptList, ReceiptProof, ShardChunk, ShardChunkHeader, ShardInfo, ShardProof, StateSyncInfo, @@ -43,10 +41,7 @@ use near_primitives::types::{ ShardId, }; use near_primitives::unwrap_or_return; -#[cfg(any( - feature = "protocol_feature_block_header_v3", - feature = "protocol_feature_restore_receipts_after_fix" -))] +#[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::version::ProtocolFeature; use near_primitives::views::{ ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index ba1647c032c..cfcaea4d838 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -58,6 +58,8 @@ impl RuntimeConfig { transaction_costs: RuntimeFeesConfig::free(), wasm_config: VMConfig::free(), account_creation_config: AccountCreationConfig::default(), + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + receipts_to_restore: HashMap::default(), } } diff --git a/neard/src/config.rs b/neard/src/config.rs index 7872a15969e..5a62e87708a 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -23,8 +23,6 @@ use near_network::NetworkConfig; use near_primitives::account::{AccessKey, Account}; use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use near_primitives::receipt::ReceiptResult; use near_primitives::runtime::config::RuntimeConfig; use near_primitives::state_record::StateRecord; use near_primitives::types::{ From 8f9197d3f8b63728f4c571f4ccfc7b8190e56c7e Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 03:04:50 +0300 Subject: [PATCH 040/109] Rename json file --- ..._chunks_receipts.json => mainnet_restored_receipts.json} | 0 neard/src/config.rs | 6 ++++-- utils/restored-receipts-verifier/src/main.rs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) rename neard/res/{fix_apply_chunks_receipts.json => mainnet_restored_receipts.json} (100%) diff --git a/neard/res/fix_apply_chunks_receipts.json b/neard/res/mainnet_restored_receipts.json similarity index 100% rename from neard/res/fix_apply_chunks_receipts.json rename to neard/res/mainnet_restored_receipts.json diff --git a/neard/src/config.rs b/neard/src/config.rs index 5a62e87708a..1ad7daf6516 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -746,7 +746,9 @@ fn generate_validator_key(account_id: &str, path: &Path) { lazy_static_include::lazy_static_include_bytes! { MAINNET_GENESIS_JSON => "res/mainnet_genesis.json", - RESTORED_RECEIPTS_JSON => "res/fix_apply_chunks_receipts.json", + // File with receipts which were lost because of a bug in apply_chunks to the runtime config. + // Follows the ReceiptResult format which is HashMap>. + MAINNET_RESTORED_RECEIPTS_JSON => "res/mainnet_restored_receipts.json", } /// Initializes genesis and client configs and stores in the given folder @@ -801,7 +803,7 @@ pub fn init_configs( PROTOCOL_VERSION, { genesis.config.runtime_config.receipts_to_restore = - serde_json::from_slice(*RESTORED_RECEIPTS_JSON).expect( + serde_json::from_slice(*MAINNET_RESTORED_RECEIPTS_JSON).expect( "File with receipts restored after apply_chunks fix have to be correct", ); } diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index aa16f9092b1..50a26a728ba 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -96,7 +96,7 @@ fn main() -> Result<()> { // Check that receipts from repo were actually generated let receipt_hashes_in_repo: HashSet = { - let receipt_result_json = include_str!("../../../neard/res/fix_apply_chunks_receipts.json"); + let receipt_result_json = include_str!("../../../neard/res/mainnet_restored_receipts.json"); let receipt_result = serde_json::from_str::(receipt_result_json) .expect("File with receipts restored after apply_chunks fix have to be correct"); let receipts = receipt_result.get(&shard_id).unwrap(); From 10c6b7ab56254e171ddf3399dcc622b830fe5c22 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 1 May 2021 03:17:59 +0300 Subject: [PATCH 041/109] Output to stderr --- utils/restored-receipts-verifier/src/main.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/utils/restored-receipts-verifier/src/main.rs b/utils/restored-receipts-verifier/src/main.rs index 50a26a728ba..fc0fadd82c5 100644 --- a/utils/restored-receipts-verifier/src/main.rs +++ b/utils/restored-receipts-verifier/src/main.rs @@ -17,6 +17,8 @@ fn main() -> Result<()> { // See https://github.com/near/nearcore/pull/4248/ for more details. // Requirement: mainnet archival node dump. + eprintln!("restored-receipts-verifier started"); + let default_home = get_default_home(); let matches = App::new("restored-receipts-verifier") .arg( @@ -28,8 +30,6 @@ fn main() -> Result<()> { ) .get_matches(); - println!("Start"); - let shard_id = 0u64; let home_dir = matches.value_of("home").map(Path::new).unwrap(); let near_config = load_config(&home_dir); @@ -48,19 +48,20 @@ fn main() -> Result<()> { let height_first: u64 = 34691244; // First height for which lost receipts were found let height_last: u64 = 35524259; // Height for which apply_chunks was already fixed + eprintln!("Collecting missing receipts from blocks..."); for height in height_first..height_last { let block_hash_result = chain_store.get_block_hash_by_height(height); let block_hash = match block_hash_result { Ok(it) => it, Err(_) => { - println!("{} does not exist, skip", height); + eprintln!("{} does not exist, skip", height); continue; } }; let block = chain_store.get_block(&block_hash).unwrap().clone(); if block.chunks()[shard_id as usize].height_included() == height { - println!("{} included, skip", height); + eprintln!("{} included, skip", height); continue; } @@ -88,13 +89,13 @@ fn main() -> Result<()> { let receipts_missing_after_apply: Vec = apply_result.receipt_result.values().cloned().into_iter().flatten().collect(); receipts_missing.extend(receipts_missing_after_apply.into_iter()); - println!("{} applied", height); + eprintln!("{} applied", height); } let receipt_hashes_missing: HashSet = HashSet::<_>::from_iter(receipts_missing.into_iter().map(|receipt| receipt.get_hash())); - // Check that receipts from repo were actually generated + eprintln!("Taking receipt hashes from repo..."); let receipt_hashes_in_repo: HashSet = { let receipt_result_json = include_str!("../../../neard/res/mainnet_restored_receipts.json"); let receipt_result = serde_json::from_str::(receipt_result_json) @@ -103,6 +104,7 @@ fn main() -> Result<()> { HashSet::<_>::from_iter(receipts.into_iter().map(|receipt| receipt.get_hash())) }; + eprintln!("Verifying receipt hashes..."); let receipt_hashes_not_verified: Vec = receipt_hashes_in_repo.difference(&receipt_hashes_missing).cloned().collect(); assert!( @@ -110,7 +112,7 @@ fn main() -> Result<()> { "Some of receipt hashes in repo were not verified successfully: {:?}", receipt_hashes_not_verified ); - println!("Receipt hashes in repo were verified successfully!"); + eprintln!("Receipt hashes in repo were verified successfully!"); Ok(()) } From 5d039f30a1ccaf9d1a50e4b8bc3d7d59d52a95bf Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 4 May 2021 22:25:28 +0300 Subject: [PATCH 042/109] Put receipts directly to apply_transactions --- chain/chain/src/chain.rs | 72 +++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 71166a6011c..ee34661fa4a 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2733,43 +2733,9 @@ impl<'a> ChainUpdate<'a> { Some(&block.hash()), )?; self.chain_store_update.save_block_extra(&block.hash(), BlockExtra { challenges_result }); - let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block.header().epoch_id())?; - // This part of code re-introduces outgoing receipts lost because of a bug in apply_chunks - // (see https://github.com/near/nearcore/pull/4248/) - // We take the first block in the first epoch in which protocol feature RestoreReceiptsAfterFix - // is enabled, and save the restored receipts there. - if self.runtime_adapter.is_next_block_epoch_start(prev_block.hash()).unwrap_or(false) { - checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - protocol_version, - { - let prev_protocol_version = self - .runtime_adapter - .get_epoch_protocol_version(prev_block.header().epoch_id())?; - if !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - ) { - let receipt_result = self - .runtime_adapter - .get_protocol_config(block.header().epoch_id())? - .runtime_config - .receipts_to_restore; - self.chain_store_update.save_outgoing_receipt( - &block.hash(), - 0, - receipt_result, - ); - } - } - ); - } - for (shard_id, (chunk_header, prev_chunk_header)) in (block.chunks().iter().zip(prev_block.chunks().iter())).enumerate() { @@ -2825,7 +2791,6 @@ impl<'a> ChainUpdate<'a> { Err(err) => err, } })?; - let receipt_proof_response: Vec = self.chain_store_update.get_incoming_receipts_for_shard( shard_id, @@ -2834,6 +2799,43 @@ impl<'a> ChainUpdate<'a> { )?; let receipts = collect_receipts_from_response(&receipt_proof_response); + // This part of code re-introduces receipts lost because of a bug in apply_chunks + // (see https://github.com/near/nearcore/pull/4248/) + // We take the first block in the first epoch in which protocol feature RestoreReceiptsAfterFix + // is enabled, and save the restored receipts there. + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + let receipts = if shard_id == 0 + && self + .runtime_adapter + .is_next_block_epoch_start(prev_block.hash()) + .unwrap_or(false) + && checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + protocol_version + ) { + let prev_protocol_version = self + .runtime_adapter + .get_epoch_protocol_version(prev_block.header().epoch_id())?; + let receipts_to_restore = if !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + ) { + self.runtime_adapter + .get_protocol_config(block.header().epoch_id())? + .runtime_config + .receipts_to_restore + .get(&shard_id) + .expect("Receipts to restore must contain an entry for shard 0") + } else { + Vec::::new() + }; + receipts_to_restore.into_iter().chain(receipts.into_iter()).collect() + } else { + receipts + }; + let chunk = self .chain_store_update .get_chunk_clone_from_header(&chunk_header.clone())?; From 36ac694c9c27c9c6d6a8cb9f8dcd9472716cfd74 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 4 May 2021 22:33:33 +0300 Subject: [PATCH 043/109] Minor fix --- chain/chain/src/chain.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index ee34661fa4a..8e61bce4080 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2828,6 +2828,7 @@ impl<'a> ChainUpdate<'a> { .receipts_to_restore .get(&shard_id) .expect("Receipts to restore must contain an entry for shard 0") + .clone() } else { Vec::::new() }; From f20ca3a8f7e9ffdb754b0ffee040924ca4966177 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 15:11:07 +0300 Subject: [PATCH 044/109] Add stub test --- chain/client/tests/process_blocks.rs | 66 +++++++++++++++++++++++++++- neard/src/config.rs | 25 ----------- 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 9cf8d5a1ffd..ed2d9d47920 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -54,7 +54,7 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -use near_primitives::version::PROTOCOL_VERSION; +use near_primitives::version::{PROTOCOL_VERSION, ProtocolFeature}; use near_primitives::views::{ BlockHeaderView, FinalExecutionStatus, QueryRequest, QueryResponseKind, }; @@ -2746,6 +2746,70 @@ fn test_congestion_receipt_execution() { } } +#[test] +fn test_restoring_receipts() { + init_test_logger(); + let epoch_length = 5; + let mut prev_protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; + let mut protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; + let mut genesis = Genesis::test(vec!["test0", "test1"], 1); + genesis.config.epoch_length = epoch_length; + genesis.config.protocol_version = protocol_version; + genesis.config.gas_limit = 10000000000000; + let chain_genesis = ChainGenesis::from(&genesis); + let mut env = + TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); + let genesis_block = env.clients[0].chain.get_block_by_height(0).unwrap().clone(); + let signer = InMemorySigner::from_seed("test0", KeyType::ED25519, "test0"); + let validator_signer = InMemoryValidatorSigner::from_seed("test0", KeyType::ED25519, "test0"); + + for i in 1..=16 { + let head = env.clients[0].chain.head().unwrap(); + let epoch_id = env.clients[0] + .runtime_adapter + .get_epoch_id_from_prev_block(&head.last_block_hash) + .unwrap(); + let block_producer = + env.clients[0].runtime_adapter.get_block_producer(&epoch_id, i).unwrap(); + let index = if block_producer == "test0".to_string() { 0 } else { 1 }; + let mut block = env.clients[index].produce_block(i).unwrap().unwrap(); + // upgrade + // do we need this? + // let validator_signer = InMemoryValidatorSigner::from_seed( + // &format!("test{}", index), + // KeyType::ED25519, + // &format!("test{}", index), + // ); + + block.mut_header().get_mut().inner_rest.latest_protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); + // block.mut_header().resign(&validator_signer); + + for j in 0..1 { + let (_, res) = env.clients[j].process_block(block.clone(), Provenance::NONE); + assert!(res.is_ok()); + env.clients[j].run_catchup(&vec![]).unwrap(); + } + + let last_block = env.clients[0].chain.get_block_by_height(i).unwrap().clone(); + prev_protocol_version = protocol_version; + protocol_version = env.clients[0] + .runtime_adapter + .get_epoch_protocol_version(last_block.header().epoch_id()) + .unwrap(); + println!("pv({}) = {}", i, protocol_version); + + if prev_protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1 && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { + // update + // add two same rxs intentionally + // maybe + } else { + // no update + + } + } + +} + #[cfg(test)] mod access_key_nonce_range_tests { use super::*; diff --git a/neard/src/config.rs b/neard/src/config.rs index 1ad7daf6516..8f0971ed446 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -21,7 +21,6 @@ use near_network::types::ROUTED_MESSAGE_TTL; use near_network::utils::blacklist_from_iter; use near_network::NetworkConfig; use near_primitives::account::{AccessKey, Account}; -use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; use near_primitives::runtime::config::RuntimeConfig; use near_primitives::state_record::StateRecord; @@ -783,32 +782,8 @@ pub fn init_configs( config.write_to_file(&dir.join(CONFIG_FILENAME)); // TODO: add download genesis for mainnet - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let mut genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) - .expect("Failed to deserialize MainNet genesis"); - - #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) .expect("Failed to deserialize MainNet genesis"); - - if let Some(account_id) = account_id { - generate_validator_key(account_id, &dir.join(config.validator_key_file)); - } - - // Put receipts which were lost because of a bug in apply_chunks to the runtime config. - // See https://github.com/near/nearcore/pull/4248/ for more details - checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - PROTOCOL_VERSION, - { - genesis.config.runtime_config.receipts_to_restore = - serde_json::from_slice(*MAINNET_RESTORED_RECEIPTS_JSON).expect( - "File with receipts restored after apply_chunks fix have to be correct", - ); - } - ); - let network_signer = InMemorySigner::from_random("".to_string(), KeyType::ED25519); network_signer.write_to_file(&dir.join(config.node_key_file)); From fdcff6f11903a28f87116c0e564618f4b86c9e86 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 15:09:20 +0200 Subject: [PATCH 045/109] Display is needed after all --- core/primitives/src/types.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index 36bdd78a5cd..1f1fae14c1e 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -164,7 +164,7 @@ pub enum MigrationId { StorageUsageFix, } -impl fmt::Debug for MigrationId { +impl fmt::Display for MigrationId { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { Self::StorageUsageFix => write!(f, "Storage usage fix"), @@ -172,6 +172,12 @@ impl fmt::Debug for MigrationId { } } +impl fmt::Debug for MigrationId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + /// This represents the committed changes in the Trie with a change cause. #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] pub struct RawStateChange { From 4a7309b9147b7536efe4065fc22341f63b8fb152 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 16:35:00 +0300 Subject: [PATCH 046/109] Add restored receipts to migration data --- core/primitives/src/runtime/migration_data.rs | 6 ++++++ neard/src/config.rs | 5 +---- neard/src/migrations.rs | 16 +++++++++++++++- .../resored-receipts-verifier}/Cargo.toml | 0 .../resored-receipts-verifier}/src/main.rs | 0 5 files changed, 22 insertions(+), 5 deletions(-) rename {utils/restored-receipts-verifier => tools/resored-receipts-verifier}/Cargo.toml (100%) rename {utils/restored-receipts-verifier => tools/resored-receipts-verifier}/src/main.rs (100%) diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index 2474e39882e..3d60abe5557 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -3,17 +3,23 @@ use crate::types::AccountId; use std::fmt; use std::fmt::{Debug, Formatter}; use std::sync::Arc; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use crate::receipt::ReceiptResult; #[derive(Default)] pub struct MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] pub storage_usage_delta: Vec<(AccountId, u64)>, + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + pub restored_receipts: ReceiptResult, } impl MigrationData { pub const EMPTY: MigrationData = MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] storage_usage_delta: Vec::new(), + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + restored_receipts: ReceiptResult::default(), }; } diff --git a/neard/src/config.rs b/neard/src/config.rs index 8f0971ed446..3f8de343848 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -744,10 +744,7 @@ fn generate_validator_key(account_id: &str, path: &Path) { } lazy_static_include::lazy_static_include_bytes! { - MAINNET_GENESIS_JSON => "res/mainnet_genesis.json", - // File with receipts which were lost because of a bug in apply_chunks to the runtime config. - // Follows the ReceiptResult format which is HashMap>. - MAINNET_RESTORED_RECEIPTS_JSON => "res/mainnet_restored_receipts.json", + MAINNET_GENESIS_JSON => "res/mainnet_genesis.json" } /// Initializes genesis and client configs and stores in the given folder diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 069505ec936..94c90cc7bc9 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -5,6 +5,8 @@ use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo}; use near_chain::{ChainStore, ChainStoreAccess, ChainStoreUpdate, RuntimeAdapter}; use near_epoch_manager::{EpochManager, RewardCalculator}; use near_primitives::epoch_manager::EpochConfig; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use near_primitives::receipt::ReceiptResult; use near_primitives::runtime::migration_data::MigrationData; use near_primitives::sharding::{ChunkHash, ShardChunkHeader, ShardChunkV1}; use near_primitives::transaction::ExecutionOutcomeWithIdAndProof; @@ -268,10 +270,14 @@ lazy_static_include::lazy_static_include_bytes! { /// see https://github.com/near/nearcore/issues/3824 /// This file was generated using tools/storage-usage-delta-calculator MAINNET_STORAGE_USAGE_DELTA => "res/storage_usage_delta.json", + /// File with receipts which were lost because of a bug in apply_chunks to the runtime config. + /// Follows the ReceiptResult format which is HashMap>. + /// See https://github.com/near/nearcore/pull/4248/ for more details. + MAINNET_RESTORED_RECEIPTS => "res/mainnet_restored_receipts.json", } pub fn load_migration_data(chain_id: &String) -> MigrationData { - #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] + #[cfg(not(any(feature = "protocol_feature_fix_storage_usage", feature = "protocol_feature_restore_receipts_after_fix")))] let _ = chain_id; MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] @@ -280,6 +286,14 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { } else { Vec::new() }, + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + restored_receipts: if chain_id == "mainnet" { + serde_json::from_slice(&MAINNET_RESTORED_RECEIPTS).expect( + "File with receipts restored after apply_chunks fix have to be correct", + ) + } else { + ReceiptResult::default() + }, } } diff --git a/utils/restored-receipts-verifier/Cargo.toml b/tools/resored-receipts-verifier/Cargo.toml similarity index 100% rename from utils/restored-receipts-verifier/Cargo.toml rename to tools/resored-receipts-verifier/Cargo.toml diff --git a/utils/restored-receipts-verifier/src/main.rs b/tools/resored-receipts-verifier/src/main.rs similarity index 100% rename from utils/restored-receipts-verifier/src/main.rs rename to tools/resored-receipts-verifier/src/main.rs From d4c0dc42d5d0d9bb3fef0686f1b098fdd1efe6e4 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 16:36:52 +0300 Subject: [PATCH 047/109] minor fix --- Cargo.toml | 2 +- .../Cargo.toml | 0 .../src/main.rs | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename tools/{resored-receipts-verifier => restored-receipts-verifier}/Cargo.toml (100%) rename tools/{resored-receipts-verifier => restored-receipts-verifier}/src/main.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index 893ca9c100b..bc25634cc2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,7 @@ members = [ "tools/indexer/example", "tools/delay_detector", "tools/storage-usage-delta-calculator", - "utils/restored-receipts-verifier" + "tools/restored-receipts-verifier" ] [dev-dependencies] diff --git a/tools/resored-receipts-verifier/Cargo.toml b/tools/restored-receipts-verifier/Cargo.toml similarity index 100% rename from tools/resored-receipts-verifier/Cargo.toml rename to tools/restored-receipts-verifier/Cargo.toml diff --git a/tools/resored-receipts-verifier/src/main.rs b/tools/restored-receipts-verifier/src/main.rs similarity index 100% rename from tools/resored-receipts-verifier/src/main.rs rename to tools/restored-receipts-verifier/src/main.rs From 3a2b50e1f9f66efe00e3a003981aa1589497b8f0 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 5 May 2021 15:46:38 +0200 Subject: [PATCH 048/109] Getting read of EMPTY --- core/primitives/src/runtime/migration_data.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index 2474e39882e..ca92003dead 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -10,13 +10,6 @@ pub struct MigrationData { pub storage_usage_delta: Vec<(AccountId, u64)>, } -impl MigrationData { - pub const EMPTY: MigrationData = MigrationData { - #[cfg(feature = "protocol_feature_fix_storage_usage")] - storage_usage_delta: Vec::new(), - }; -} - #[derive(Default)] pub struct MigrationContext { pub is_first_block_with_current_version: bool, From dc414bf982e927433de6a4e28f15b404c501745b Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 5 May 2021 17:17:46 +0300 Subject: [PATCH 049/109] take restored receipts from migration data --- chain/chain/src/chain.rs | 5 ++--- chain/chain/src/test_utils.rs | 5 +++++ chain/chain/src/types.rs | 3 +++ chain/client/tests/process_blocks.rs | 13 +++++++------ core/primitives/src/runtime/migration_data.rs | 15 ++++----------- neard/src/migrations.rs | 15 ++++++++++----- neard/src/runtime/mod.rs | 4 ++++ 7 files changed, 35 insertions(+), 25 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 8e61bce4080..a717c775bc2 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2823,9 +2823,8 @@ impl<'a> ChainUpdate<'a> { prev_protocol_version ) { self.runtime_adapter - .get_protocol_config(block.header().epoch_id())? - .runtime_config - .receipts_to_restore + .get_migration_data() + .restored_receipts .get(&shard_id) .expect("Receipts to restore must contain an entry for shard 0") .clone() diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 0e9b35a83f5..702f03c9c8d 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -53,6 +53,7 @@ use crate::{BlockHeader, DoomslugThresholdMode, RuntimeAdapter}; use near_chain_configs::ProtocolConfig; #[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::block_header::{Approval, ApprovalInner}; +use near_primitives::runtime::migration_data::MigrationData; #[derive( BorshSerialize, BorshDeserialize, Serialize, Hash, PartialEq, Eq, Ord, PartialOrd, Clone, Debug, @@ -1098,6 +1099,10 @@ impl RuntimeAdapter for KeyValueRuntime { fn get_protocol_config(&self, _epoch_id: &EpochId) -> Result { unreachable!("get_protocol_config should not be called in KeyValueRuntime"); } + + fn get_migration_data(&self) -> Arc { + Arc::new(MigrationData::default()) + } } pub fn setup() -> (Chain, Arc, Arc) { diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index 15d0e01d31d..46f59250b14 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -35,6 +35,7 @@ use near_store::{PartialStorage, ShardTries, Store, StoreUpdate, Trie, WrappedTr #[cfg(feature = "protocol_feature_block_header_v3")] use crate::DoomslugThresholdMode; +use near_primitives::runtime::migration_data::MigrationData; #[derive(Eq, PartialEq, Debug, Clone)] pub enum BlockStatus { @@ -649,6 +650,8 @@ pub trait RuntimeAdapter: Send + Sync { fn get_protocol_config(&self, epoch_id: &EpochId) -> Result; + fn get_migration_data(&self) -> Arc; + /// Build receipts hashes. // Due to borsh serialization constraints, we have to use `&Vec` instead of `&[Receipt]` // here. diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index ed2d9d47920..95494f9139a 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -54,7 +54,7 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -use near_primitives::version::{PROTOCOL_VERSION, ProtocolFeature}; +use near_primitives::version::{ProtocolFeature, PROTOCOL_VERSION}; use near_primitives::views::{ BlockHeaderView, FinalExecutionStatus, QueryRequest, QueryResponseKind, }; @@ -2781,7 +2781,8 @@ fn test_restoring_receipts() { // &format!("test{}", index), // ); - block.mut_header().get_mut().inner_rest.latest_protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); + block.mut_header().get_mut().inner_rest.latest_protocol_version = + ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); // block.mut_header().resign(&validator_signer); for j in 0..1 { @@ -2798,16 +2799,16 @@ fn test_restoring_receipts() { .unwrap(); println!("pv({}) = {}", i, protocol_version); - if prev_protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1 && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { + if prev_protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1 + && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() + { // update // add two same rxs intentionally - // maybe + // maybe } else { // no update - } } - } #[cfg(test)] diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index 3d60abe5557..16dc49c4b98 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -1,10 +1,12 @@ +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use crate::receipt::ReceiptResult; #[cfg(feature = "protocol_feature_fix_storage_usage")] use crate::types::AccountId; use std::fmt; use std::fmt::{Debug, Formatter}; use std::sync::Arc; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use crate::receipt::ReceiptResult; +// #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +// use crate::borsh::maybestd::collections::HashMap; #[derive(Default)] pub struct MigrationData { @@ -14,15 +16,6 @@ pub struct MigrationData { pub restored_receipts: ReceiptResult, } -impl MigrationData { - pub const EMPTY: MigrationData = MigrationData { - #[cfg(feature = "protocol_feature_fix_storage_usage")] - storage_usage_delta: Vec::new(), - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - restored_receipts: ReceiptResult::default(), - }; -} - #[derive(Default)] pub struct MigrationContext { pub is_first_block_with_current_version: bool, diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 94c90cc7bc9..28f8bd24aaf 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -263,7 +263,10 @@ pub fn migrate_19_to_20(path: &String, near_config: &NearConfig) { set_store_version(&store, 20); } -#[cfg(feature = "protocol_feature_fix_storage_usage")] +#[cfg(any( + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" +))] lazy_static_include::lazy_static_include_bytes! { /// File with account ids and deltas that need to be applied in order to fix storage usage /// difference between actual and stored usage, introduced due to bug in access key deletion, @@ -277,7 +280,10 @@ lazy_static_include::lazy_static_include_bytes! { } pub fn load_migration_data(chain_id: &String) -> MigrationData { - #[cfg(not(any(feature = "protocol_feature_fix_storage_usage", feature = "protocol_feature_restore_receipts_after_fix")))] + #[cfg(not(any( + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" + )))] let _ = chain_id; MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] @@ -288,9 +294,8 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { }, #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] restored_receipts: if chain_id == "mainnet" { - serde_json::from_slice(&MAINNET_RESTORED_RECEIPTS).expect( - "File with receipts restored after apply_chunks fix have to be correct", - ) + serde_json::from_slice(&MAINNET_RESTORED_RECEIPTS) + .expect("File with receipts restored after apply_chunks fix have to be correct") } else { ReceiptResult::default() }, diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 99ff9cd949a..42cf9da7ab1 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -1512,6 +1512,10 @@ impl RuntimeAdapter for NightshadeRuntime { config.runtime_config = (*runtime_config).clone(); Ok(config) } + + fn get_migration_data(&self) -> Arc { + self.migration_data.clone() + } } impl node_runtime::adapter::ViewRuntimeAdapter for NightshadeRuntime { From ea5b0d0d4d317cfc0152be829cb5a819e95286ac Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 6 May 2021 12:13:19 +0200 Subject: [PATCH 050/109] Addressing comments --- core/primitives/src/runtime/apply_state.rs | 4 +- core/primitives/src/runtime/migration_data.rs | 13 +----- core/primitives/src/types.rs | 1 + neard/src/runtime/mod.rs | 10 ++--- .../runtime-params-estimator/src/testbed.rs | 2 +- runtime/runtime/src/lib.rs | 45 ++++++++++--------- runtime/runtime/src/state_viewer/mod.rs | 2 +- .../runtime/tests/runtime_group_tools/mod.rs | 2 +- test-utils/testlib/src/user/runtime_user.rs | 2 +- 9 files changed, 38 insertions(+), 43 deletions(-) diff --git a/core/primitives/src/runtime/apply_state.rs b/core/primitives/src/runtime/apply_state.rs index 93f6dd73d31..516ca60c996 100644 --- a/core/primitives/src/runtime/apply_state.rs +++ b/core/primitives/src/runtime/apply_state.rs @@ -1,4 +1,4 @@ -use crate::runtime::migration_data::MigrationContext; +use crate::runtime::migration_data::MigrationData; use crate::{ hash::CryptoHash, runtime::config::RuntimeConfig, @@ -44,5 +44,5 @@ pub struct ApplyState { pub profile: crate::profile::ProfileData, /// Data for migrations that may need to be applied at the start of an epoch when protocol /// version changes - pub migration_context: MigrationContext, + pub migration_data: Option>, } diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index ca92003dead..d5897c50c05 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -2,7 +2,6 @@ use crate::types::AccountId; use std::fmt; use std::fmt::{Debug, Formatter}; -use std::sync::Arc; #[derive(Default)] pub struct MigrationData { @@ -10,16 +9,8 @@ pub struct MigrationData { pub storage_usage_delta: Vec<(AccountId, u64)>, } -#[derive(Default)] -pub struct MigrationContext { - pub is_first_block_with_current_version: bool, - pub migration_data: Arc, -} - -impl Debug for MigrationContext { +impl Debug for MigrationData { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - f.debug_struct("MigrationContext") - .field("is_first_block_with_current_version", &self.is_first_block_with_current_version) - .finish() + f.debug_struct("MigrationData").finish() } } diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index 1f1fae14c1e..4af87620050 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -161,6 +161,7 @@ pub enum StateChangeCause { #[derive(Serialize, Deserialize, Clone, BorshSerialize, BorshDeserialize)] pub enum MigrationId { + /// See https://github.com/near/nearcore/issues/3824 StorageUsageFix, } diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 9f0f98a9c72..9b1d0197273 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -60,7 +60,7 @@ use near_primitives::runtime::config::RuntimeConfig; use crate::migrations::load_migration_data; use errors::FromStateViewerErrors; -use near_primitives::runtime::migration_data::{MigrationContext, MigrationData}; +use near_primitives::runtime::migration_data::MigrationData; pub mod errors; @@ -428,10 +428,10 @@ impl NightshadeRuntime { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: self.evm_chain_id(), profile: Default::default(), - migration_context: MigrationContext { - is_first_block_with_current_version: current_protocol_version - != prev_block_protocol_version, - migration_data: Arc::clone(&self.migration_data), + migration_data: if current_protocol_version != prev_block_protocol_version { + Some(Arc::clone(&self.migration_data)) + } else { + None }, }; diff --git a/runtime/runtime-params-estimator/src/testbed.rs b/runtime/runtime-params-estimator/src/testbed.rs index 37ead67726e..96c4db225f5 100644 --- a/runtime/runtime-params-estimator/src/testbed.rs +++ b/runtime/runtime-params-estimator/src/testbed.rs @@ -95,7 +95,7 @@ impl RuntimeTestbed { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: Default::default(), - migration_context: Default::default(), + migration_data: None, }; Self { workdir, diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index c0f40476adb..0e86aa35f2d 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1090,20 +1090,23 @@ impl Runtime { if ProtocolFeature::FixStorageUsage.protocol_version() == apply_state.current_protocol_version { - for (account_id, delta) in - &apply_state.migration_context.migration_data.storage_usage_delta - { - match get_account(state_update, account_id)? { - Some(mut account) => { - // Storage usage is saved in state, hence it is nowhere close to max value - // of u64, and maximal delta is 4196, se we can add here without checking - // for overflow - account.set_storage_usage(account.storage_usage() + delta); - set_account(state_update, account_id.clone(), &account); + match &apply_state.migration_data { + Some(migration_data) => { + for (account_id, delta) in &migration_data.storage_usage_delta { + match get_account(state_update, account_id)? { + Some(mut account) => { + // Storage usage is saved in state, hence it is nowhere close to max value + // of u64, and maximal delta is 4196, se we can add here without checking + // for overflow + account.set_storage_usage(account.storage_usage() + delta); + set_account(state_update, account_id.clone(), &account); + } + // Account could have been deleted in the meantime + None => {} + } } - // Account could have been deleted in the meantime - None => {} } + None => unreachable!(), } gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; state_update @@ -1146,6 +1149,14 @@ impl Runtime { &mut stats, )?; } + + let gas_used_for_migrations = match apply_state.migration_data { + Some(_) => self + .apply_migrations(&mut state_update, apply_state) + .map_err(|e| RuntimeError::StorageError(e))?, + None => 0 as Gas, + }; + if !apply_state.is_new_chunk && apply_state.current_protocol_version >= ProtocolFeature::FixApplyChunks.protocol_version() @@ -1164,14 +1175,6 @@ impl Runtime { }); } - let gas_used_for_migrations = - if apply_state.migration_context.is_first_block_with_current_version { - self.apply_migrations(&mut state_update, apply_state) - .map_err(|e| RuntimeError::StorageError(e))? - } else { - 0 as Gas - }; - let mut outgoing_receipts = Vec::new(); let mut validator_proposals = vec![]; let mut local_receipts = vec![]; @@ -1609,7 +1612,7 @@ mod tests { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: ProfileData::new_enabled(), - migration_context: Default::default(), + migration_data: None, }; (runtime, tries, root, apply_state, signer, MockEpochInfoProvider::default()) diff --git a/runtime/runtime/src/state_viewer/mod.rs b/runtime/runtime/src/state_viewer/mod.rs index 33c7fa5184d..1811ee58057 100644 --- a/runtime/runtime/src/state_viewer/mod.rs +++ b/runtime/runtime/src/state_viewer/mod.rs @@ -225,7 +225,7 @@ impl TrieViewer { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: view_state.evm_chain_id, profile: Default::default(), - migration_context: Default::default(), + migration_data: None, }; let action_receipt = ActionReceipt { signer_id: originator_id.clone(), diff --git a/runtime/runtime/tests/runtime_group_tools/mod.rs b/runtime/runtime/tests/runtime_group_tools/mod.rs index 329c48080b8..e68d69abe97 100644 --- a/runtime/runtime/tests/runtime_group_tools/mod.rs +++ b/runtime/runtime/tests/runtime_group_tools/mod.rs @@ -73,7 +73,7 @@ impl StandaloneRuntime { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: Default::default(), - migration_context: Default::default(), + migration_data: None, }; Self { diff --git a/test-utils/testlib/src/user/runtime_user.rs b/test-utils/testlib/src/user/runtime_user.rs index 848cd0257ca..56aa08b299d 100644 --- a/test-utils/testlib/src/user/runtime_user.rs +++ b/test-utils/testlib/src/user/runtime_user.rs @@ -143,7 +143,7 @@ impl RuntimeUser { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: TESTNET_EVM_CHAIN_ID, profile: Default::default(), - migration_context: Default::default(), + migration_data: None, } } From d99d161bf99c78dab3a9f2513121c42c066d2d48 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 6 May 2021 18:33:09 +0200 Subject: [PATCH 051/109] Integration test --- chain/client/Cargo.toml | 5 +- chain/client/tests/process_blocks.rs | 137 ++++++++++++++++++++++++++- 2 files changed, 139 insertions(+), 3 deletions(-) diff --git a/chain/client/Cargo.toml b/chain/client/Cargo.toml index b2b62b41538..e25af162675 100644 --- a/chain/client/Cargo.toml +++ b/chain/client/Cargo.toml @@ -55,7 +55,8 @@ expensive_tests = [] adversarial = ["near-network/adversarial", "near-chain/adversarial"] metric_recorder = ["near-client-primitives/metric_recorder"] delay_detector = ["near-chain/delay_detector", "near-network/delay_detector", "delay-detector"] -protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3"] +protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "near-store/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] +protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage"] nightly_protocol = [] -nightly_protocol_features = ["nightly_protocol", "near-chain/nightly_protocol_features", "protocol_feature_block_header_v3", "protocol_feature_add_account_versions"] +nightly_protocol_features = ["nightly_protocol", "near-chain/nightly_protocol_features", "protocol_feature_block_header_v3", "protocol_feature_add_account_versions", "protocol_feature_fix_storage_usage"] diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 9cf8d5a1ffd..6532ee248e5 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -43,6 +43,8 @@ use near_primitives::sharding::{EncodedShardChunk, ReedSolomonWrapper, ShardChun #[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::sharding::{ShardChunkHeaderInner, ShardChunkHeaderV3}; +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use near_primitives::borsh::BorshDeserialize; use near_primitives::receipt::DelayedReceiptIndices; use near_primitives::syncing::{get_num_state_parts, ShardStateSyncResponseHeader}; use near_primitives::transaction::{ @@ -54,14 +56,18 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -use near_primitives::version::PROTOCOL_VERSION; +use near_primitives::version::{ProtocolFeature, PROTOCOL_VERSION}; use near_primitives::views::{ BlockHeaderView, FinalExecutionStatus, QueryRequest, QueryResponseKind, }; use near_store::get; use near_store::test_utils::create_test_store; +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use near_store::TrieUpdate; use neard::config::{GenesisExt, TESTING_INIT_BALANCE, TESTING_INIT_STAKE}; use neard::NEAR_BASE; +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use std::rc::Rc; pub fn create_nightshade_runtimes(genesis: &Genesis, n: usize) -> Vec> { (0..n) @@ -2267,6 +2273,135 @@ fn test_epoch_protocol_version_change() { assert_eq!(protocol_version, PROTOCOL_VERSION + 1); } +#[test] +#[cfg(feature = "protocol_feature_fix_storage_usage")] +fn test_fix_storage_usage_migration() { + init_test_logger(); + let epoch_length = 5; + { + let mut genesis = Genesis::test(vec!["test0", "near"], 1); + genesis.config.chain_id = "mainnet".to_string(); + genesis.config.epoch_length = epoch_length; + genesis.config.protocol_version = ProtocolFeature::FixStorageUsage.protocol_version() - 1; + let genesis_height = genesis.config.genesis_height; + let chain_genesis = ChainGenesis::from(&genesis); + let mut env = + TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); + for i in 1..=16 { + let (encoded_chunk, merkle_paths, receipts) = + create_chunk_on_height(&mut env.clients[0], i); + + let mut chain_store = + ChainStore::new(env.clients[0].chain.store().owned_store(), genesis_height); + env.clients[0] + .shards_mgr + .distribute_encoded_chunk( + encoded_chunk.clone(), + merkle_paths.clone(), + receipts.clone(), + &mut chain_store, + ) + .unwrap(); + + let mut block = env.clients[0].produce_block(i).unwrap().unwrap(); + + let validator_signer = InMemoryValidatorSigner::from_seed( + &"test0".to_string(), + KeyType::ED25519, + &"test0".to_string(), + ); + + block.mut_header().get_mut().inner_rest.latest_protocol_version = + ProtocolFeature::FixStorageUsage.protocol_version(); + block.mut_header().resign(&validator_signer); + let (_, res) = env.clients[0].process_block(block.clone(), Provenance::NONE); + assert!(res.is_ok()); + env.clients[0].run_catchup(&vec![]).unwrap(); + + let root = + env.clients[0].chain.get_chunk_extra(block.hash(), 0).unwrap().state_root().clone(); + let trie = Rc::new(env.clients[0].runtime_adapter.get_trie_for_shard(0)); + let state_update = TrieUpdate::new(trie.clone(), root); + use near_primitives::account::Account; + let mut account_near_raw = state_update + .get(&TrieKey::Account { account_id: "near".to_string() }) + .unwrap() + .unwrap() + .clone(); + let account_near = Account::try_from_slice(&mut account_near_raw).unwrap(); + let mut account_test0_raw = state_update + .get(&TrieKey::Account { account_id: "test0".to_string() }) + .unwrap() + .unwrap() + .clone(); + let account_test0 = Account::try_from_slice(&mut account_test0_raw).unwrap(); + assert_eq!(account_near.storage_usage(), if i >= 11 { 4560 } else { 364 }); + assert_eq!(account_test0.storage_usage(), 182); + } + } + { + let mut genesis = Genesis::test(vec!["test0", "near"], 1); + genesis.config.chain_id = "testnet".to_string(); + genesis.config.epoch_length = epoch_length; + genesis.config.protocol_version = ProtocolFeature::FixStorageUsage.protocol_version() - 1; + let genesis_height = genesis.config.genesis_height; + let chain_genesis = ChainGenesis::from(&genesis); + let mut env = + TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); + for i in 1..=16 { + let (encoded_chunk, merkle_paths, receipts) = + create_chunk_on_height(&mut env.clients[0], i); + + let mut chain_store = + ChainStore::new(env.clients[0].chain.store().owned_store(), genesis_height); + env.clients[0] + .shards_mgr + .distribute_encoded_chunk( + encoded_chunk.clone(), + merkle_paths.clone(), + receipts.clone(), + &mut chain_store, + ) + .unwrap(); + + let mut block = env.clients[0].produce_block(i).unwrap().unwrap(); + + let validator_signer = InMemoryValidatorSigner::from_seed( + &"test0".to_string(), + KeyType::ED25519, + &"test0".to_string(), + ); + + block.mut_header().get_mut().inner_rest.latest_protocol_version = + ProtocolFeature::FixStorageUsage.protocol_version(); + block.mut_header().resign(&validator_signer); + let (_, res) = env.clients[0].process_block(block.clone(), Provenance::NONE); + assert!(res.is_ok()); + env.clients[0].run_catchup(&vec![]).unwrap(); + + let root = + env.clients[0].chain.get_chunk_extra(block.hash(), 0).unwrap().state_root().clone(); + let trie = Rc::new(env.clients[0].runtime_adapter.get_trie_for_shard(0)); + let state_update = TrieUpdate::new(trie.clone(), root); + use near_primitives::account::Account; + let mut account_near_raw = state_update + .get(&TrieKey::Account { account_id: "near".to_string() }) + .unwrap() + .unwrap() + .clone(); + let account_near = Account::try_from_slice(&mut account_near_raw).unwrap(); + let mut account_test0_raw = state_update + .get(&TrieKey::Account { account_id: "test0".to_string() }) + .unwrap() + .unwrap() + .clone(); + let account_test0 = Account::try_from_slice(&mut account_test0_raw).unwrap(); + assert_eq!(account_near.storage_usage(), 364); + assert_eq!(account_test0.storage_usage(), 182); + } + } +} + /// Final state should be consistent when a node switches between forks in the following scenario /// /-----------h+2 /// h-2 ---- h-1 ------ h From 0de9c82c1f2b911c0855fe50d477d452860abafc Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 6 May 2021 18:57:35 +0200 Subject: [PATCH 052/109] Unused imports --- chain/client/tests/process_blocks.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 6532ee248e5..12e19eb00fd 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -56,7 +56,9 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -use near_primitives::version::{ProtocolFeature, PROTOCOL_VERSION}; +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use near_primitives::version::ProtocolFeature; +use near_primitives::version::PROTOCOL_VERSION; use near_primitives::views::{ BlockHeaderView, FinalExecutionStatus, QueryRequest, QueryResponseKind, }; From 39bcd10e37b5bd7f5c640dfee03c5a7ec52837af Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 6 May 2021 19:13:26 +0200 Subject: [PATCH 053/109] Fix dependencies --- chain/client/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/client/Cargo.toml b/chain/client/Cargo.toml index e25af162675..f6415785002 100644 --- a/chain/client/Cargo.toml +++ b/chain/client/Cargo.toml @@ -55,8 +55,8 @@ expensive_tests = [] adversarial = ["near-network/adversarial", "near-chain/adversarial"] metric_recorder = ["near-client-primitives/metric_recorder"] delay_detector = ["near-chain/delay_detector", "near-network/delay_detector", "delay-detector"] -protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "near-store/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] +protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "near-store/protocol_feature_block_header_v3"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] -protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage"] +protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage"] nightly_protocol = [] nightly_protocol_features = ["nightly_protocol", "near-chain/nightly_protocol_features", "protocol_feature_block_header_v3", "protocol_feature_add_account_versions", "protocol_feature_fix_storage_usage"] From ae0b5e9beb276cf77c805038be053fc1c0c32493 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 6 May 2021 21:01:20 +0300 Subject: [PATCH 054/109] implement test_restoring_receipts_mainnet --- Cargo.toml | 2 +- chain/chain/src/chain.rs | 4 -- chain/client/tests/process_blocks.rs | 80 ++++++++++++---------------- 3 files changed, 34 insertions(+), 52 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bc25634cc2d..a004d489781 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -110,7 +110,7 @@ metric_recorder = ["neard/metric_recorder"] delay_detector = ["neard/delay_detector"] rosetta_rpc = ["neard/rosetta_rpc"] nightly_protocol = ["near-primitives/nightly_protocol", "near-jsonrpc/nightly_protocol", "testlib/nightly_protocol", "neard/nightly_protocol"] -nightly_protocol_features = ["nightly_protocol", "neard/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "testlib/nightly_protocol_features", "protocol_feature_fix_storage_usage"] +nightly_protocol_features = ["nightly_protocol", "neard/nightly_protocol_features", "protocol_feature_evm", "protocol_feature_block_header_v3", "protocol_feature_alt_bn128", "protocol_feature_add_account_versions", "protocol_feature_tx_size_limit", "protocol_feature_allow_create_account_on_delete", "testlib/nightly_protocol_features", "protocol_feature_fix_storage_usage", "protocol_feature_restore_receipts_after_fix"] protocol_feature_evm = ["neard/protocol_feature_evm", "testlib/protocol_feature_evm", "runtime-params-estimator/protocol_feature_evm"] protocol_feature_alt_bn128 = ["neard/protocol_feature_alt_bn128", "testlib/protocol_feature_alt_bn128", "runtime-params-estimator/protocol_feature_alt_bn128"] protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index a717c775bc2..892b79f53c5 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2805,10 +2805,6 @@ impl<'a> ChainUpdate<'a> { // is enabled, and save the restored receipts there. #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let receipts = if shard_id == 0 - && self - .runtime_adapter - .is_next_block_epoch_start(prev_block.hash()) - .unwrap_or(false) && checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 95494f9139a..4884ebd700a 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2747,68 +2747,54 @@ fn test_congestion_receipt_execution() { } #[test] -fn test_restoring_receipts() { +fn test_restoring_receipts_mainnet() { init_test_logger(); let epoch_length = 5; - let mut prev_protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; - let mut protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; + let height_timeout = 10; + let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; let mut genesis = Genesis::test(vec!["test0", "test1"], 1); + genesis.config.chain_id = String::from("mainnet"); genesis.config.epoch_length = epoch_length; genesis.config.protocol_version = protocol_version; genesis.config.gas_limit = 10000000000000; let chain_genesis = ChainGenesis::from(&genesis); let mut env = - TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); - let genesis_block = env.clients[0].chain.get_block_by_height(0).unwrap().clone(); - let signer = InMemorySigner::from_seed("test0", KeyType::ED25519, "test0"); - let validator_signer = InMemoryValidatorSigner::from_seed("test0", KeyType::ED25519, "test0"); - - for i in 1..=16 { - let head = env.clients[0].chain.head().unwrap(); - let epoch_id = env.clients[0] - .runtime_adapter - .get_epoch_id_from_prev_block(&head.last_block_hash) - .unwrap(); - let block_producer = - env.clients[0].runtime_adapter.get_block_producer(&epoch_id, i).unwrap(); - let index = if block_producer == "test0".to_string() { 0 } else { 1 }; - let mut block = env.clients[index].produce_block(i).unwrap().unwrap(); - // upgrade - // do we need this? - // let validator_signer = InMemoryValidatorSigner::from_seed( - // &format!("test{}", index), - // KeyType::ED25519, - // &format!("test{}", index), - // ); - + TestEnv::new_with_runtime(chain_genesis.clone(), 1, 1, create_nightshade_runtimes(&genesis, 1)); + + let mut receipt_hashes_to_restore: HashSet = HashSet::from_iter( + env.clients[0].runtime_adapter.get_migration_data().restored_receipts.get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0").clone().iter() + .map(|receipt| receipt.receipt_id)); + let mut execution_is_too_slow= false; + let mut height: BlockHeight = 1; + let mut last_update_height: BlockHeight = 0; + + while !receipt_hashes_to_restore.is_empty() && !execution_is_too_slow { + let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); block.mut_header().get_mut().inner_rest.latest_protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); - // block.mut_header().resign(&validator_signer); + env.process_block(0, block, Provenance::PRODUCED); - for j in 0..1 { - let (_, res) = env.clients[j].process_block(block.clone(), Provenance::NONE); - assert!(res.is_ok()); - env.clients[j].run_catchup(&vec![]).unwrap(); + let last_block = env.clients[0].chain.get_block_by_height(height).unwrap().clone(); + let protocol_version = env.clients[0].runtime_adapter.get_epoch_protocol_version(last_block.header().epoch_id()).unwrap(); + + for receipt_id in receipt_hashes_to_restore.clone().iter() { + if env.clients[0].chain.get_execution_outcome(receipt_id).is_ok() { + assert!(protocol_version >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(), "Restored receipt {} was executed before protocol upgrade", receipt_id); + receipt_hashes_to_restore.remove(receipt_id); + last_update_height = height; + }; } - let last_block = env.clients[0].chain.get_block_by_height(i).unwrap().clone(); - prev_protocol_version = protocol_version; - protocol_version = env.clients[0] - .runtime_adapter - .get_epoch_protocol_version(last_block.header().epoch_id()) - .unwrap(); - println!("pv({}) = {}", i, protocol_version); + // If some receipts are still not applied, upgrade already happened, and no new receipt was + // applied in some last blocks, consider the process stuck to avoid any possibility of infinite loop + execution_is_too_slow |= protocol_version >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() && height - last_update_height >= height_timeout; - if prev_protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1 - && protocol_version == ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - { - // update - // add two same rxs intentionally - // maybe - } else { - // no update - } + height += 1; } + + assert!(receipt_hashes_to_restore.is_empty(), "Some of receipts were not executed, hashes: {:?}", receipt_hashes_to_restore); + println!("{}", height); } #[cfg(test)] From 84ffc12ab994b2e1ff83a753d5b72784624e064d Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 6 May 2021 23:45:46 +0300 Subject: [PATCH 055/109] solve case when first block may not contain a chunk --- chain/chain/src/chain.rs | 20 +++- chain/client/tests/process_blocks.rs | 155 +++++++++++++++++---------- neard/src/migrations.rs | 13 +++ 3 files changed, 128 insertions(+), 60 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 892b79f53c5..33796bf0ef6 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2801,7 +2801,7 @@ impl<'a> ChainUpdate<'a> { // This part of code re-introduces receipts lost because of a bug in apply_chunks // (see https://github.com/near/nearcore/pull/4248/) - // We take the first block in the first epoch in which protocol feature RestoreReceiptsAfterFix + // We take the first block with new chunk in which protocol feature RestoreReceiptsAfterFix // is enabled, and save the restored receipts there. #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let receipts = if shard_id == 0 @@ -2810,9 +2810,21 @@ impl<'a> ChainUpdate<'a> { RestoreReceiptsAfterFix, protocol_version ) { - let prev_protocol_version = self - .runtime_adapter - .get_epoch_protocol_version(prev_block.header().epoch_id())?; + let prev_protocol_version = { + let block_with_new_chunk_hash = self + .chain_store_update + .get_last_block_with_new_chunk(0) + .unwrap() + .unwrap() + .clone(); + let block_header = self + .chain_store_update + .get_block_header(&block_with_new_chunk_hash) + .unwrap(); + let epoch_id = block_header.epoch_id(); + self.runtime_adapter.get_epoch_protocol_version(epoch_id)? + }; + let receipts_to_restore = if !checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 01148254dd4..ad4b4989792 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -56,7 +56,10 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -#[cfg(any(feature = "protocol_feature_fix_storage_usage", feature = "protocol_feature_restore_receipts_after_fix"))] +#[cfg(any( + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" +))] use near_primitives::version::ProtocolFeature; use near_primitives::version::PROTOCOL_VERSION; use near_primitives::views::{ @@ -2763,6 +2766,23 @@ fn test_block_ordinal() { assert_eq!(next_block.header().block_ordinal(), ordinal); } +fn set_no_chunk_in_block(block: &mut Block, prev_block: &Block) { + let chunk_headers = vec![prev_block.chunks()[0].clone()]; + block.set_chunks(chunk_headers.clone()); + block.mut_header().get_mut().inner_rest.chunk_headers_root = + Block::compute_chunk_headers_root(&chunk_headers).0; + block.mut_header().get_mut().inner_rest.chunk_tx_root = + Block::compute_chunk_tx_root(&chunk_headers); + block.mut_header().get_mut().inner_rest.chunk_receipts_root = + Block::compute_chunk_receipts_root(&chunk_headers); + block.mut_header().get_mut().inner_lite.prev_state_root = + Block::compute_state_root(&chunk_headers); + block.mut_header().get_mut().inner_rest.chunk_mask = vec![false]; + block.mut_header().get_mut().inner_rest.gas_price = prev_block.header().gas_price(); + let validator_signer = InMemoryValidatorSigner::from_seed("test0", KeyType::ED25519, "test0"); + block.mut_header().resign(&validator_signer); +} + #[test] fn test_congestion_receipt_execution() { init_test_logger(); @@ -2775,7 +2795,6 @@ fn test_congestion_receipt_execution() { TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); let genesis_block = env.clients[0].chain.get_block_by_height(0).unwrap().clone(); let signer = InMemorySigner::from_seed("test0", KeyType::ED25519, "test0"); - let validator_signer = InMemoryValidatorSigner::from_seed("test0", KeyType::ED25519, "test0"); // step 0: deploy contract to test0 let tx = SignedTransaction::from_actions( @@ -2841,19 +2860,7 @@ fn test_congestion_receipt_execution() { .unwrap(); assert!(delayed_indices.next_available_index > 0); let mut block = env.clients[0].produce_block(height + 1).unwrap().unwrap(); - let chunk_headers = vec![prev_block.chunks()[0].clone()]; - block.set_chunks(chunk_headers.clone()); - block.mut_header().get_mut().inner_rest.chunk_headers_root = - Block::compute_chunk_headers_root(&chunk_headers).0; - block.mut_header().get_mut().inner_rest.chunk_tx_root = - Block::compute_chunk_tx_root(&chunk_headers); - block.mut_header().get_mut().inner_rest.chunk_receipts_root = - Block::compute_chunk_receipts_root(&chunk_headers); - block.mut_header().get_mut().inner_lite.prev_state_root = - Block::compute_state_root(&chunk_headers); - block.mut_header().get_mut().inner_rest.chunk_mask = vec![false]; - block.mut_header().get_mut().inner_rest.gas_price = prev_block.header().gas_price(); - block.mut_header().resign(&validator_signer); + set_no_chunk_in_block(&mut block, &prev_block); env.process_block(0, block.clone(), Provenance::NONE); // let all receipts finish @@ -2885,53 +2892,89 @@ fn test_congestion_receipt_execution() { #[test] fn test_restoring_receipts_mainnet() { - init_test_logger(); - let epoch_length = 5; - let height_timeout = 10; - let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; - let mut genesis = Genesis::test(vec!["test0", "test1"], 1); - genesis.config.chain_id = String::from("mainnet"); - genesis.config.epoch_length = epoch_length; - genesis.config.protocol_version = protocol_version; - genesis.config.gas_limit = 10000000000000; - let chain_genesis = ChainGenesis::from(&genesis); - let mut env = - TestEnv::new_with_runtime(chain_genesis.clone(), 1, 1, create_nightshade_runtimes(&genesis, 1)); - - let mut receipt_hashes_to_restore: HashSet = HashSet::from_iter( - env.clients[0].runtime_adapter.get_migration_data().restored_receipts.get(&0u64) - .expect("Receipts to restore must contain an entry for shard 0").clone().iter() - .map(|receipt| receipt.receipt_id)); - let mut execution_is_too_slow= false; - let mut height: BlockHeight = 1; - let mut last_update_height: BlockHeight = 0; - - while !receipt_hashes_to_restore.is_empty() && !execution_is_too_slow { - let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); - block.mut_header().get_mut().inner_rest.latest_protocol_version = - ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); - env.process_block(0, block, Provenance::PRODUCED); + let mut run_test = |test_with_block_with_no_chunk: bool| { + // init_test_logger(); + let epoch_length = 5; + let height_timeout = 10; + let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; + let mut genesis = Genesis::test(vec!["test0", "test1"], 1); + genesis.config.chain_id = String::from("mainnet"); + genesis.config.epoch_length = epoch_length; + genesis.config.protocol_version = protocol_version; + genesis.config.gas_limit = 10000000000000; + let chain_genesis = ChainGenesis::from(&genesis); + let mut env = TestEnv::new_with_runtime( + chain_genesis.clone(), + 1, + 1, + create_nightshade_runtimes(&genesis, 1), + ); + + let mut receipt_hashes_to_restore: HashSet = HashSet::from_iter( + env.clients[0] + .runtime_adapter + .get_migration_data() + .restored_receipts + .get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0") + .clone() + .iter() + .map(|receipt| receipt.receipt_id), + ); + let mut height: BlockHeight = 1; + let mut last_update_height: BlockHeight = 0; - let last_block = env.clients[0].chain.get_block_by_height(height).unwrap().clone(); - let protocol_version = env.clients[0].runtime_adapter.get_epoch_protocol_version(last_block.header().epoch_id()).unwrap(); + // If some receipts are still not applied, upgrade already happened, and no new receipt was + // applied in some last blocks, consider the process stuck to avoid any possibility of infinite loop. + while !receipt_hashes_to_restore.is_empty() && height - last_update_height < height_timeout + { + let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); + block.mut_header().get_mut().inner_rest.latest_protocol_version = + ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); + if test_with_block_with_no_chunk && (height >= 8 && height <= 11) { + let prev_block = + env.clients[0].chain.get_block_by_height(height - 1).unwrap().clone(); + set_no_chunk_in_block(&mut block, &prev_block); + } + env.process_block(0, block, Provenance::PRODUCED); + + let last_block = env.clients[0].chain.get_block_by_height(height).unwrap().clone(); + let protocol_version = env.clients[0] + .runtime_adapter + .get_epoch_protocol_version(last_block.header().epoch_id()) + .unwrap(); + println!("{} {}", height, protocol_version); + + for receipt_id in receipt_hashes_to_restore.clone().iter() { + if env.clients[0].chain.get_execution_outcome(receipt_id).is_ok() { + assert!( + protocol_version + >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(), + "Restored receipt {} was executed before protocol upgrade", + receipt_id + ); + receipt_hashes_to_restore.remove(receipt_id); + last_update_height = height; + }; + } - for receipt_id in receipt_hashes_to_restore.clone().iter() { - if env.clients[0].chain.get_execution_outcome(receipt_id).is_ok() { - assert!(protocol_version >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(), "Restored receipt {} was executed before protocol upgrade", receipt_id); - receipt_hashes_to_restore.remove(receipt_id); + // Update last updated height anyway if upgrade did not happen + if protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { last_update_height = height; - }; + } + height += 1; } - // If some receipts are still not applied, upgrade already happened, and no new receipt was - // applied in some last blocks, consider the process stuck to avoid any possibility of infinite loop - execution_is_too_slow |= protocol_version >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() && height - last_update_height >= height_timeout; - - height += 1; - } + assert!( + receipt_hashes_to_restore.is_empty(), + "Some of receipts were not executed, hashes: {:?}", + receipt_hashes_to_restore + ); + println!("{}", height); + }; - assert!(receipt_hashes_to_restore.is_empty(), "Some of receipts were not executed, hashes: {:?}", receipt_hashes_to_restore); - println!("{}", height); + run_test(true); + run_test(false); } #[cfg(test)] diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 28f8bd24aaf..e808fae4a5a 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -323,4 +323,17 @@ mod tests { let testnet_migration_data = load_migration_data(&"testnet".to_string()); assert_eq!(testnet_migration_data.storage_usage_delta.len(), 0); } + + #[test] + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn test_restored_receipts_data() { + assert_eq!( + to_base(&hash(&MAINNET_RESTORED_RECEIPTS)), + "6CFkdSZZVj4v83cMPD3z6Y8XSQhDh3EQjFh3PRAqFEAx" + ); + let mainnet_migration_data = load_migration_data(&"mainnet".to_string()); + assert_eq!(mainnet_migration_data.restored_receipts.len(), 383); + let testnet_migration_data = load_migration_data(&"testnet".to_string()); + assert_eq!(testnet_migration_data.restored_receipts.len(), 0); + } } From 9cc6ca76d7a6747e4c0ca581ee12c0324a141458 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Fri, 7 May 2021 09:12:19 +0200 Subject: [PATCH 056/109] Renamed argument for clarity --- neard/src/runtime/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 9b1d0197273..73b6f1bc940 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -197,9 +197,9 @@ impl NightshadeRuntime { epoch_manager.get_epoch_info(&epoch_id).map(|info| info.epoch_height()).map_err(Error::from) } - fn get_epoch_id(&self, parent_hash: &CryptoHash) -> Result { + fn get_epoch_id(&self, hash: &CryptoHash) -> Result { let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); - epoch_manager.get_epoch_id(parent_hash).map_err(Error::from) + epoch_manager.get_epoch_id(hash).map_err(Error::from) } fn genesis_state_from_dump(store: Arc, home_dir: &Path) -> Vec { From 2b98daabc6d532016d44b1e067ec31e759b71dae Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Fri, 7 May 2021 13:19:37 +0200 Subject: [PATCH 057/109] Refactoring apply_migrations --- runtime/runtime/src/lib.rs | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 0e86aa35f2d..bff5c8278d6 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -51,6 +51,7 @@ use crate::verifier::validate_receipt; pub use crate::verifier::{validate_transaction, verify_and_charge_transaction}; pub use near_primitives::runtime::apply_state::ApplyState; use near_primitives::runtime::fees::RuntimeFeesConfig; +use near_primitives::runtime::migration_data::MigrationData; #[cfg(feature = "protocol_feature_fix_storage_usage")] use near_primitives::types::MigrationId; use near_primitives::version::{ @@ -58,6 +59,7 @@ use near_primitives::version::{ }; use std::borrow::Borrow; use std::rc::Rc; +use std::sync::Arc; mod actions; pub mod adapter; @@ -1080,40 +1082,34 @@ impl Runtime { pub fn apply_migrations( &self, state_update: &mut TrieUpdate, - apply_state: &ApplyState, + migration_data: &Arc, + protocol_version: ProtocolVersion, ) -> Result { #[cfg(feature = "protocol_feature_fix_storage_usage")] let mut gas_used: Gas = 0; #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] let gas_used: Gas = 0; #[cfg(feature = "protocol_feature_fix_storage_usage")] - if ProtocolFeature::FixStorageUsage.protocol_version() - == apply_state.current_protocol_version - { - match &apply_state.migration_data { - Some(migration_data) => { - for (account_id, delta) in &migration_data.storage_usage_delta { - match get_account(state_update, account_id)? { - Some(mut account) => { - // Storage usage is saved in state, hence it is nowhere close to max value - // of u64, and maximal delta is 4196, se we can add here without checking - // for overflow - account.set_storage_usage(account.storage_usage() + delta); - set_account(state_update, account_id.clone(), &account); - } - // Account could have been deleted in the meantime - None => {} - } + if ProtocolFeature::FixStorageUsage.protocol_version() == protocol_version { + for (account_id, delta) in &migration_data.storage_usage_delta { + match get_account(state_update, account_id)? { + Some(mut account) => { + // Storage usage is saved in state, hence it is nowhere close to max value + // of u64, and maximal delta is 4196, se we can add here without checking + // for overflow + account.set_storage_usage(account.storage_usage() + delta); + set_account(state_update, account_id.clone(), &account); } + // Account could have been deleted in the meantime + None => {} } - None => unreachable!(), } gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; state_update .commit(StateChangeCause::Migration { migration_id: MigrationId::StorageUsageFix }); } #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] - (state_update, apply_state); + (state_update, migration_data, protocol_version); Ok(gas_used) } @@ -1150,9 +1146,13 @@ impl Runtime { )?; } - let gas_used_for_migrations = match apply_state.migration_data { - Some(_) => self - .apply_migrations(&mut state_update, apply_state) + let gas_used_for_migrations = match &apply_state.migration_data { + Some(migration_data) => self + .apply_migrations( + &mut state_update, + migration_data, + apply_state.current_protocol_version, + ) .map_err(|e| RuntimeError::StorageError(e))?, None => 0 as Gas, }; From 13b64716287d9b6c5d4c826234d470a6a1c7777d Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 00:48:54 +0300 Subject: [PATCH 058/109] introduce filtering by the first epoch only --- chain/chain/src/chain.rs | 46 ------------------ chain/client/Cargo.toml | 3 +- chain/client/tests/process_blocks.rs | 59 +++++++++++++++-------- neard/src/runtime/mod.rs | 72 +++++++++++++++++++++++++++- 4 files changed, 110 insertions(+), 70 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 33796bf0ef6..45c911d13c1 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2798,52 +2798,6 @@ impl<'a> ChainUpdate<'a> { prev_chunk_header.height_included(), )?; let receipts = collect_receipts_from_response(&receipt_proof_response); - - // This part of code re-introduces receipts lost because of a bug in apply_chunks - // (see https://github.com/near/nearcore/pull/4248/) - // We take the first block with new chunk in which protocol feature RestoreReceiptsAfterFix - // is enabled, and save the restored receipts there. - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let receipts = if shard_id == 0 - && checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - protocol_version - ) { - let prev_protocol_version = { - let block_with_new_chunk_hash = self - .chain_store_update - .get_last_block_with_new_chunk(0) - .unwrap() - .unwrap() - .clone(); - let block_header = self - .chain_store_update - .get_block_header(&block_with_new_chunk_hash) - .unwrap(); - let epoch_id = block_header.epoch_id(); - self.runtime_adapter.get_epoch_protocol_version(epoch_id)? - }; - - let receipts_to_restore = if !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - ) { - self.runtime_adapter - .get_migration_data() - .restored_receipts - .get(&shard_id) - .expect("Receipts to restore must contain an entry for shard 0") - .clone() - } else { - Vec::::new() - }; - receipts_to_restore.into_iter().chain(receipts.into_iter()).collect() - } else { - receipts - }; - let chunk = self .chain_store_update .get_chunk_clone_from_header(&chunk_header.clone())?; diff --git a/chain/client/Cargo.toml b/chain/client/Cargo.toml index f6415785002..e18d6072ab3 100644 --- a/chain/client/Cargo.toml +++ b/chain/client/Cargo.toml @@ -58,5 +58,6 @@ delay_detector = ["near-chain/delay_detector", "near-network/delay_detector", "d protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "near-store/protocol_feature_block_header_v3"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage"] +protocol_feature_restore_receipts_after_fix = [] nightly_protocol = [] -nightly_protocol_features = ["nightly_protocol", "near-chain/nightly_protocol_features", "protocol_feature_block_header_v3", "protocol_feature_add_account_versions", "protocol_feature_fix_storage_usage"] +nightly_protocol_features = ["nightly_protocol", "near-chain/nightly_protocol_features", "protocol_feature_block_header_v3", "protocol_feature_add_account_versions", "protocol_feature_fix_storage_usage", "protocol_feature_restore_receipts_after_fix"] diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index ad4b4989792..42c805d967a 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2890,11 +2890,15 @@ fn test_congestion_receipt_execution() { } } +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] #[test] fn test_restoring_receipts_mainnet() { - let mut run_test = |test_with_block_with_no_chunk: bool| { + let epoch_length = 5; + + let run_test = |low_height_with_no_chunk: BlockHeight, + high_height_with_no_chunk: BlockHeight, + result: bool| { // init_test_logger(); - let epoch_length = 5; let height_timeout = 10; let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; let mut genesis = Genesis::test(vec!["test0", "test1"], 1); @@ -2910,17 +2914,21 @@ fn test_restoring_receipts_mainnet() { create_nightshade_runtimes(&genesis, 1), ); - let mut receipt_hashes_to_restore: HashSet = HashSet::from_iter( - env.clients[0] - .runtime_adapter - .get_migration_data() - .restored_receipts - .get(&0u64) - .expect("Receipts to restore must contain an entry for shard 0") - .clone() - .iter() - .map(|receipt| receipt.receipt_id), - ); + let get_restored_receipt_hashes = |env: &mut TestEnv| -> HashSet { + HashSet::from_iter( + env.clients[0] + .runtime_adapter + .get_migration_data() + .restored_receipts + .get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0") + .clone() + .iter() + .map(|receipt| receipt.receipt_id), + ) + }; + + let mut receipt_hashes_to_restore = get_restored_receipt_hashes(&mut env); let mut height: BlockHeight = 1; let mut last_update_height: BlockHeight = 0; @@ -2931,7 +2939,7 @@ fn test_restoring_receipts_mainnet() { let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); block.mut_header().get_mut().inner_rest.latest_protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); - if test_with_block_with_no_chunk && (height >= 8 && height <= 11) { + if low_height_with_no_chunk <= height && height < high_height_with_no_chunk { let prev_block = env.clients[0].chain.get_block_by_height(height - 1).unwrap().clone(); set_no_chunk_in_block(&mut block, &prev_block); @@ -2965,16 +2973,25 @@ fn test_restoring_receipts_mainnet() { height += 1; } - assert!( - receipt_hashes_to_restore.is_empty(), - "Some of receipts were not executed, hashes: {:?}", - receipt_hashes_to_restore - ); + if result { + assert!( + receipt_hashes_to_restore.is_empty(), + "Some of receipts were not executed, hashes: {:?}", + receipt_hashes_to_restore + ); + } else { + assert_eq!( + receipt_hashes_to_restore, + get_restored_receipt_hashes(&mut env), + "If accidentally there are no chunks in first epoch with new protocol version, receipts should not be introduced" + ); + } println!("{}", height); }; - run_test(true); - run_test(false); + run_test(1, 0, true); + run_test(8, 12, true); + run_test(11, 11 + epoch_length, false); } #[cfg(test)] diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 3ab74dc1a50..7d30193c0c8 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -10,7 +10,6 @@ use tracing::{debug, error, info, warn}; use near_chain::chain::NUM_EPOCHS_TO_KEEP_STORE_DATA; use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo, ValidatorInfoIdentifier}; - use near_chain::{BlockHeader, Error, ErrorKind, RuntimeAdapter}; #[cfg(feature = "protocol_feature_block_header_v3")] use near_chain::{Doomslug, DoomslugThresholdMode}; @@ -23,6 +22,8 @@ use near_pool::types::PoolIterator; use near_primitives::account::{AccessKey, Account}; use near_primitives::block::{Approval, ApprovalInner}; use near_primitives::challenge::ChallengesResult; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use near_primitives::checked_feature; use near_primitives::contract::ContractCode; use near_primitives::epoch_manager::block_info::BlockInfo; use near_primitives::epoch_manager::epoch_info::EpochInfo; @@ -202,6 +203,18 @@ impl NightshadeRuntime { epoch_manager.get_epoch_id(hash).map_err(Error::from) } + fn get_prev_epoch_id_from_prev_block( + &self, + parent_hash: &CryptoHash, + ) -> Result { + let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); + if epoch_manager.is_next_block_epoch_start(parent_hash)? { + epoch_manager.get_epoch_id(parent_hash).map_err(Error::from) + } else { + epoch_manager.get_prev_epoch_id(parent_hash).map_err(Error::from) + } + } + fn genesis_state_from_dump(store: Arc, home_dir: &Path) -> Vec { error!(target: "near", "Loading genesis from a state dump file. Do not use this outside of genesis-tools"); let mut state_file = home_dir.to_path_buf(); @@ -405,8 +418,10 @@ impl NightshadeRuntime { let epoch_height = self.get_epoch_height_from_prev_block(prev_block_hash)?; let epoch_id = self.get_epoch_id_from_prev_block(prev_block_hash)?; let prev_block_epoch_id = self.get_epoch_id(prev_block_hash)?; + let prev_epoch_id = self.get_prev_epoch_id_from_prev_block(prev_block_hash)?; let current_protocol_version = self.get_epoch_protocol_version(&epoch_id)?; let prev_block_protocol_version = self.get_epoch_protocol_version(&prev_block_epoch_id)?; + let prev_epoch_protocol_version = self.get_epoch_protocol_version(&prev_epoch_id)?; let apply_state = ApplyState { block_index: block_height, @@ -435,6 +450,59 @@ impl NightshadeRuntime { }, }; + // This part of code re-introduces receipts lost because of a bug in apply_chunks + // (see https://github.com/near/nearcore/pull/4248/) + // We take the first block with new chunk in which protocol feature RestoreReceiptsAfterFix + // is enabled, and save the restored receipts there. + #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] + let incoming_receipts = receipts.to_vec(); + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + let incoming_receipts = if shard_id == 0 + && checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + current_protocol_version + ) + && !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_epoch_protocol_version + ) { + let prev_protocol_version = { + let mut epoch_manager = + self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); + let mut prev_block_with_chunk_hash = prev_block_hash.clone(); + loop { + let prev_block_info = + epoch_manager.get_block_info(&prev_block_with_chunk_hash).unwrap().clone(); + if prev_block_info.chunk_mask()[0] { + break epoch_manager + .get_epoch_info(prev_block_info.epoch_id())? + .protocol_version(); + } + prev_block_with_chunk_hash = prev_block_info.prev_hash().clone(); + } + }; + + let mut receipts_to_restore = if !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + ) { + self.migration_data + .restored_receipts + .get(&shard_id) + .expect("Receipts to restore must contain an entry for shard 0") + .clone() + } else { + Vec::::new() + }; + receipts_to_restore.extend_from_slice(receipts); + receipts_to_restore + } else { + receipts.to_vec() + }; + let apply_result = self .runtime .apply( @@ -442,7 +510,7 @@ impl NightshadeRuntime { state_root, &validator_accounts_update, &apply_state, - &receipts, + &incoming_receipts, &transactions, &self.epoch_manager, ) From e90faf71f6fd664ff9a55c73a814f8c4e38d8304 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 01:03:01 +0300 Subject: [PATCH 059/109] move getting protocol version to separate method --- neard/src/runtime/mod.rs | 44 ++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 7d30193c0c8..9dda99b47d3 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -205,13 +205,29 @@ impl NightshadeRuntime { fn get_prev_epoch_id_from_prev_block( &self, - parent_hash: &CryptoHash, + prev_block_hash: &CryptoHash, ) -> Result { let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); - if epoch_manager.is_next_block_epoch_start(parent_hash)? { - epoch_manager.get_epoch_id(parent_hash).map_err(Error::from) + if epoch_manager.is_next_block_epoch_start(prev_block_hash)? { + epoch_manager.get_epoch_id(prev_block_hash).map_err(Error::from) } else { - epoch_manager.get_prev_epoch_id(parent_hash).map_err(Error::from) + epoch_manager.get_prev_epoch_id(prev_block_hash).map_err(Error::from) + } + } + + fn get_protocol_version_of_last_block_with_chunk( + &self, + hash: &CryptoHash, + shard_id: ShardId, + ) -> Result { + let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); + let mut candidate_hash = hash.clone(); + loop { + let block_info = epoch_manager.get_block_info(&candidate_hash).unwrap().clone(); + if block_info.chunk_mask()[shard_id as usize] { + break Ok(epoch_manager.get_epoch_info(block_info.epoch_id())?.protocol_version()); + } + candidate_hash = block_info.prev_hash().clone(); } } @@ -457,7 +473,8 @@ impl NightshadeRuntime { #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let incoming_receipts = receipts.to_vec(); #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let incoming_receipts = if shard_id == 0 + let incoming_receipts = if is_new_chunk + && shard_id == 0 && checked_feature!( "protocol_feature_restore_receipts_after_fix", RestoreReceiptsAfterFix, @@ -468,21 +485,8 @@ impl NightshadeRuntime { RestoreReceiptsAfterFix, prev_epoch_protocol_version ) { - let prev_protocol_version = { - let mut epoch_manager = - self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); - let mut prev_block_with_chunk_hash = prev_block_hash.clone(); - loop { - let prev_block_info = - epoch_manager.get_block_info(&prev_block_with_chunk_hash).unwrap().clone(); - if prev_block_info.chunk_mask()[0] { - break epoch_manager - .get_epoch_info(prev_block_info.epoch_id())? - .protocol_version(); - } - prev_block_with_chunk_hash = prev_block_info.prev_hash().clone(); - } - }; + let prev_protocol_version = + self.get_protocol_version_of_last_block_with_chunk(prev_block_hash, shard_id).unwrap(); let mut receipts_to_restore = if !checked_feature!( "protocol_feature_restore_receipts_after_fix", From 496c9cb5b46a8a6adffca6e2cfac6d5b16878371 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 01:07:00 +0300 Subject: [PATCH 060/109] fix comment --- neard/src/runtime/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 9dda99b47d3..2f75c495447 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -466,10 +466,10 @@ impl NightshadeRuntime { }, }; - // This part of code re-introduces receipts lost because of a bug in apply_chunks + // This code block re-introduces receipts lost because of a bug in apply_chunks // (see https://github.com/near/nearcore/pull/4248/) - // We take the first block with new chunk in which protocol feature RestoreReceiptsAfterFix - // is enabled, and save the restored receipts there. + // We take the first block with existing chunk in the first epoch in which protocol feature + // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let incoming_receipts = receipts.to_vec(); #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] From 7479882810efdb192e209d77ff4cbe90ca24c1ad Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 01:22:06 +0300 Subject: [PATCH 061/109] update clap version --- Cargo.lock | 2 +- chain/client/tests/process_blocks.rs | 18 ++++++++++-------- core/primitives/src/version.rs | 2 +- neard/src/runtime/mod.rs | 5 +++-- tools/restored-receipts-verifier/Cargo.toml | 2 +- tools/restored-receipts-verifier/src/main.rs | 9 ++++----- 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6bd6e82c6be..0ddf140ee3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4773,7 +4773,7 @@ dependencies = [ name = "restored-receipts-verifier" version = "0.1.0" dependencies = [ - "clap 2.33.3", + "clap 3.0.0-beta.2", "near-chain", "near-primitives", "near-store", diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 42c805d967a..bb630262332 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2895,9 +2895,9 @@ fn test_congestion_receipt_execution() { fn test_restoring_receipts_mainnet() { let epoch_length = 5; - let run_test = |low_height_with_no_chunk: BlockHeight, - high_height_with_no_chunk: BlockHeight, - result: bool| { + let run = |low_height_with_no_chunk: BlockHeight, + high_height_with_no_chunk: BlockHeight, + result: bool| { // init_test_logger(); let height_timeout = 10; let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; @@ -2951,7 +2951,6 @@ fn test_restoring_receipts_mainnet() { .runtime_adapter .get_epoch_protocol_version(last_block.header().epoch_id()) .unwrap(); - println!("{} {}", height, protocol_version); for receipt_id in receipt_hashes_to_restore.clone().iter() { if env.clients[0].chain.get_execution_outcome(receipt_id).is_ok() { @@ -2986,12 +2985,15 @@ fn test_restoring_receipts_mainnet() { "If accidentally there are no chunks in first epoch with new protocol version, receipts should not be introduced" ); } - println!("{}", height); }; - run_test(1, 0, true); - run_test(8, 12, true); - run_test(11, 11 + epoch_length, false); + // If there are no chunks missing, all receipts should be applied + run(1, 0, true); + // If the first chunk in the first epoch with needed protocol version is missing, + // all receipts should still be applied + run(8, 12, true); + // If all chunks are missing in the first epoch, no receipts should be applied + run(11, 11 + epoch_length, false); } #[cfg(test)] diff --git a/core/primitives/src/version.rs b/core/primitives/src/version.rs index 1f791f7fae1..a71e50d1cd3 100644 --- a/core/primitives/src/version.rs +++ b/core/primitives/src/version.rs @@ -109,7 +109,7 @@ pub enum ProtocolFeature { /// Current latest stable version of the protocol. #[cfg(not(feature = "nightly_protocol"))] -pub const PROTOCOL_VERSION: ProtocolVersion = 44; +pub const PROTOCOL_VERSION: ProtocolVersion = 45; /// Current latest nightly version of the protocol. #[cfg(feature = "nightly_protocol")] diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 2f75c495447..d7aa7dcdf32 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -485,8 +485,9 @@ impl NightshadeRuntime { RestoreReceiptsAfterFix, prev_epoch_protocol_version ) { - let prev_protocol_version = - self.get_protocol_version_of_last_block_with_chunk(prev_block_hash, shard_id).unwrap(); + let prev_protocol_version = self + .get_protocol_version_of_last_block_with_chunk(prev_block_hash, shard_id) + .unwrap(); let mut receipts_to_restore = if !checked_feature!( "protocol_feature_restore_receipts_after_fix", diff --git a/tools/restored-receipts-verifier/Cargo.toml b/tools/restored-receipts-verifier/Cargo.toml index 2627ab06288..19914a7ffd0 100644 --- a/tools/restored-receipts-verifier/Cargo.toml +++ b/tools/restored-receipts-verifier/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = "2.33" +clap = "3.0.0-beta.1" serde_json = "1" near-primitives = { path = "../../core/primitives" } diff --git a/tools/restored-receipts-verifier/src/main.rs b/tools/restored-receipts-verifier/src/main.rs index fc0fadd82c5..c262aa1a7be 100644 --- a/tools/restored-receipts-verifier/src/main.rs +++ b/tools/restored-receipts-verifier/src/main.rs @@ -12,8 +12,8 @@ use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; fn main() -> Result<()> { - // Script to verify that receipts being restored after apply_chunks fix were actually lost. - // Only receipt hashes are checked, because of their uniqueness. + // Script to verify that receipts being restored after apply_chunks fix were actually created. + // Because receipt hashes are unique, we only check for their presence. // See https://github.com/near/nearcore/pull/4248/ for more details. // Requirement: mainnet archival node dump. @@ -22,10 +22,9 @@ fn main() -> Result<()> { let default_home = get_default_home(); let matches = App::new("restored-receipts-verifier") .arg( - Arg::with_name("home") - .long("home") + Arg::new("home") .default_value(&default_home) - .help("Directory for config and data (default \"~/.near\")") + .about("Directory for config and data (default \"~/.near\")") .takes_value(true), ) .get_matches(); From 518e5f82fd84335492d27af810d8c0078a35357e Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 02:26:41 +0300 Subject: [PATCH 062/109] test restored-receipts-verifier --- Cargo.lock | 1 + chain/client/tests/process_blocks.rs | 2 +- neard/src/lib.rs | 2 +- neard/src/migrations.rs | 21 ++++-- neard/src/runtime/mod.rs | 4 ++ tools/restored-receipts-verifier/Cargo.toml | 5 ++ tools/restored-receipts-verifier/src/main.rs | 75 ++++++++++++++++---- 7 files changed, 88 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ddf140ee3b..7a48c817631 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4775,6 +4775,7 @@ version = "0.1.0" dependencies = [ "clap 3.0.0-beta.2", "near-chain", + "near-jsonrpc", "near-primitives", "near-store", "neard", diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index bb630262332..2ed900c3a93 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2898,7 +2898,7 @@ fn test_restoring_receipts_mainnet() { let run = |low_height_with_no_chunk: BlockHeight, high_height_with_no_chunk: BlockHeight, result: bool| { - // init_test_logger(); + init_test_logger(); let height_timeout = 10; let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; let mut genesis = Genesis::test(vec!["test0", "test1"], 1); diff --git a/neard/src/lib.rs b/neard/src/lib.rs index 2327507c778..9fdd2772111 100644 --- a/neard/src/lib.rs +++ b/neard/src/lib.rs @@ -35,7 +35,7 @@ use near_store::migrations::migrate_20_to_21; pub mod config; pub mod genesis_validate; -mod migrations; +pub mod migrations; mod runtime; mod shard_tracker; diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index e808fae4a5a..7f1279df781 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -304,11 +304,20 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { #[cfg(test)] mod tests { - #[cfg(feature = "protocol_feature_fix_storage_usage")] + #[cfg(any( + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" + ))] use super::*; - #[cfg(feature = "protocol_feature_fix_storage_usage")] + #[cfg(any( + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" + ))] use near_primitives::hash::hash; - #[cfg(feature = "protocol_feature_fix_storage_usage")] + #[cfg(any( + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" + ))] use near_primitives::serialize::to_base; #[test] @@ -329,11 +338,11 @@ mod tests { fn test_restored_receipts_data() { assert_eq!( to_base(&hash(&MAINNET_RESTORED_RECEIPTS)), - "6CFkdSZZVj4v83cMPD3z6Y8XSQhDh3EQjFh3PRAqFEAx" + "3ZHK51a2zVnLnG8Pq1y7fLaEhP9SGU1CGCmspcBUi5vT" ); let mainnet_migration_data = load_migration_data(&"mainnet".to_string()); - assert_eq!(mainnet_migration_data.restored_receipts.len(), 383); + assert_eq!(mainnet_migration_data.restored_receipts.get(&0u64).unwrap().len(), 383); let testnet_migration_data = load_migration_data(&"testnet".to_string()); - assert_eq!(testnet_migration_data.restored_receipts.len(), 0); + assert!(testnet_migration_data.restored_receipts.is_empty()); } } diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index b248e421e31..22baef3651e 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -203,6 +203,7 @@ impl NightshadeRuntime { epoch_manager.get_epoch_id(hash).map_err(Error::from) } + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] fn get_prev_epoch_id_from_prev_block( &self, prev_block_hash: &CryptoHash, @@ -215,6 +216,7 @@ impl NightshadeRuntime { } } + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] fn get_protocol_version_of_last_block_with_chunk( &self, hash: &CryptoHash, @@ -432,9 +434,11 @@ impl NightshadeRuntime { let epoch_height = self.get_epoch_height_from_prev_block(prev_block_hash)?; let epoch_id = self.get_epoch_id_from_prev_block(prev_block_hash)?; let prev_block_epoch_id = self.get_epoch_id(prev_block_hash)?; + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let prev_epoch_id = self.get_prev_epoch_id_from_prev_block(prev_block_hash)?; let current_protocol_version = self.get_epoch_protocol_version(&epoch_id)?; let prev_block_protocol_version = self.get_epoch_protocol_version(&prev_block_epoch_id)?; + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let prev_epoch_protocol_version = self.get_epoch_protocol_version(&prev_epoch_id)?; let apply_state = ApplyState { diff --git a/tools/restored-receipts-verifier/Cargo.toml b/tools/restored-receipts-verifier/Cargo.toml index 19914a7ffd0..5f17cedc656 100644 --- a/tools/restored-receipts-verifier/Cargo.toml +++ b/tools/restored-receipts-verifier/Cargo.toml @@ -14,3 +14,8 @@ near-primitives = { path = "../../core/primitives" } neard = { path = "../../neard" } near-store = { path = "../../core/store" } near-chain = { path = "../../chain/chain" } +near-jsonrpc = { path = "../../chain/jsonrpc" } + +[features] +protocol_feature_restore_receipts_after_fix = ["neard/protocol_feature_restore_receipts_after_fix"] +nightly_protocol = ["neard/nightly_protocol"] diff --git a/tools/restored-receipts-verifier/src/main.rs b/tools/restored-receipts-verifier/src/main.rs index c262aa1a7be..0ca8f2fe87d 100644 --- a/tools/restored-receipts-verifier/src/main.rs +++ b/tools/restored-receipts-verifier/src/main.rs @@ -7,9 +7,32 @@ use clap::{App, Arg}; use near_chain::{ChainStore, ChainStoreAccess, RuntimeAdapter}; use near_primitives::hash::CryptoHash; -use near_primitives::receipt::{Receipt, ReceiptResult}; +use near_primitives::receipt::Receipt; +#[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] +use near_primitives::receipt::ReceiptResult; use near_store::create_store; use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use neard::migrations::load_migration_data; + +fn get_receipt_hashes_in_repo() -> Vec { + #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] + let receipt_result = ReceiptResult::default(); + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + let receipt_result = load_migration_data(&"mainnet".to_string()).restored_receipts; + let receipts = receipt_result.get(&0u64).unwrap(); + receipts.into_iter().map(|receipt| receipt.get_hash()).collect() +} + +fn get_differences_with_hashes_from_repo(receipt_hashes_missing: Vec) -> (Vec, Vec) { + let missing_hashes = HashSet::::from_iter(receipt_hashes_missing.into_iter()); + let existing_hashes = HashSet::from_iter(get_receipt_hashes_in_repo().into_iter()); + let not_verified_hashes: Vec = + existing_hashes.difference(&missing_hashes).cloned().collect(); + let still_missing_hashes: Vec = + missing_hashes.difference(&existing_hashes).cloned().collect(); + (not_verified_hashes, still_missing_hashes) +} fn main() -> Result<()> { // Script to verify that receipts being restored after apply_chunks fix were actually created. @@ -91,27 +114,51 @@ fn main() -> Result<()> { eprintln!("{} applied", height); } - let receipt_hashes_missing: HashSet = - HashSet::<_>::from_iter(receipts_missing.into_iter().map(|receipt| receipt.get_hash())); - - eprintln!("Taking receipt hashes from repo..."); - let receipt_hashes_in_repo: HashSet = { - let receipt_result_json = include_str!("../../../neard/res/mainnet_restored_receipts.json"); - let receipt_result = serde_json::from_str::(receipt_result_json) - .expect("File with receipts restored after apply_chunks fix have to be correct"); - let receipts = receipt_result.get(&shard_id).unwrap(); - HashSet::<_>::from_iter(receipts.into_iter().map(|receipt| receipt.get_hash())) - }; + let receipt_hashes_missing = receipts_missing.into_iter().map(|receipt| receipt.get_hash()).collect(); eprintln!("Verifying receipt hashes..."); - let receipt_hashes_not_verified: Vec = - receipt_hashes_in_repo.difference(&receipt_hashes_missing).cloned().collect(); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); assert!( receipt_hashes_not_verified.is_empty(), "Some of receipt hashes in repo were not verified successfully: {:?}", receipt_hashes_not_verified ); + assert!( + receipt_hashes_still_missing.is_empty(), + "Some of receipt hashes in repo are probably still not applied: {:?}", + receipt_hashes_still_missing + ); + eprintln!("Receipt hashes in repo were verified successfully!"); Ok(()) } + +#[cfg(test)] +mod tests { + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + use super::*; + + #[test] + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn test_checking_differences() { + let receipt_hashes_in_repo = get_receipt_hashes_in_repo(); + + let receipt_hashes_missing = receipt_hashes_in_repo.clone(); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + assert!(receipt_hashes_not_verified.is_empty()); + assert!(receipt_hashes_still_missing.is_empty()); + + let mut receipt_hashes_missing = receipt_hashes_in_repo.clone(); + let extra_hash = receipt_hashes_missing.pop().unwrap(); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + assert_eq!(receipt_hashes_not_verified, vec![extra_hash]); + assert!(receipt_hashes_still_missing.is_empty()); + + let mut receipt_hashes_missing = receipt_hashes_in_repo.clone(); + receipt_hashes_missing.push(CryptoHash::default()); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + assert!(receipt_hashes_not_verified.is_empty()); + assert_eq!(receipt_hashes_still_missing, vec![CryptoHash::default()]); + } +} From 39d215af96743c8c1bb08213410cec3839333255 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 02:40:29 +0300 Subject: [PATCH 063/109] cargo fmt --- neard/src/migrations.rs | 12 +++++------ tools/restored-receipts-verifier/src/main.rs | 21 +++++++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 7f1279df781..3518b3fdf2a 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -305,18 +305,18 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { #[cfg(test)] mod tests { #[cfg(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" ))] use super::*; #[cfg(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" ))] use near_primitives::hash::hash; #[cfg(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" ))] use near_primitives::serialize::to_base; diff --git a/tools/restored-receipts-verifier/src/main.rs b/tools/restored-receipts-verifier/src/main.rs index 0ca8f2fe87d..a946a2137a7 100644 --- a/tools/restored-receipts-verifier/src/main.rs +++ b/tools/restored-receipts-verifier/src/main.rs @@ -11,9 +11,9 @@ use near_primitives::receipt::Receipt; #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] use near_primitives::receipt::ReceiptResult; use near_store::create_store; -use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] use neard::migrations::load_migration_data; +use neard::{get_default_home, get_store_path, load_config, NightshadeRuntime}; fn get_receipt_hashes_in_repo() -> Vec { #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] @@ -24,7 +24,9 @@ fn get_receipt_hashes_in_repo() -> Vec { receipts.into_iter().map(|receipt| receipt.get_hash()).collect() } -fn get_differences_with_hashes_from_repo(receipt_hashes_missing: Vec) -> (Vec, Vec) { +fn get_differences_with_hashes_from_repo( + receipt_hashes_missing: Vec, +) -> (Vec, Vec) { let missing_hashes = HashSet::::from_iter(receipt_hashes_missing.into_iter()); let existing_hashes = HashSet::from_iter(get_receipt_hashes_in_repo().into_iter()); let not_verified_hashes: Vec = @@ -114,10 +116,12 @@ fn main() -> Result<()> { eprintln!("{} applied", height); } - let receipt_hashes_missing = receipts_missing.into_iter().map(|receipt| receipt.get_hash()).collect(); + let receipt_hashes_missing = + receipts_missing.into_iter().map(|receipt| receipt.get_hash()).collect(); eprintln!("Verifying receipt hashes..."); - let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = + get_differences_with_hashes_from_repo(receipt_hashes_missing); assert!( receipt_hashes_not_verified.is_empty(), "Some of receipt hashes in repo were not verified successfully: {:?}", @@ -145,19 +149,22 @@ mod tests { let receipt_hashes_in_repo = get_receipt_hashes_in_repo(); let receipt_hashes_missing = receipt_hashes_in_repo.clone(); - let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = + get_differences_with_hashes_from_repo(receipt_hashes_missing); assert!(receipt_hashes_not_verified.is_empty()); assert!(receipt_hashes_still_missing.is_empty()); let mut receipt_hashes_missing = receipt_hashes_in_repo.clone(); let extra_hash = receipt_hashes_missing.pop().unwrap(); - let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = + get_differences_with_hashes_from_repo(receipt_hashes_missing); assert_eq!(receipt_hashes_not_verified, vec![extra_hash]); assert!(receipt_hashes_still_missing.is_empty()); let mut receipt_hashes_missing = receipt_hashes_in_repo.clone(); receipt_hashes_missing.push(CryptoHash::default()); - let (receipt_hashes_not_verified, receipt_hashes_still_missing) = get_differences_with_hashes_from_repo(receipt_hashes_missing); + let (receipt_hashes_not_verified, receipt_hashes_still_missing) = + get_differences_with_hashes_from_repo(receipt_hashes_missing); assert!(receipt_hashes_not_verified.is_empty()); assert_eq!(receipt_hashes_still_missing, vec![CryptoHash::default()]); } From f3c8f91cfa9a222ccc0eb840f9dbc09113028f9b Mon Sep 17 00:00:00 2001 From: Longarithm Date: Sat, 8 May 2021 02:42:46 +0300 Subject: [PATCH 064/109] rename --- chain/client/tests/process_blocks.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 2ed900c3a93..b8fcbc33415 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2897,7 +2897,7 @@ fn test_restoring_receipts_mainnet() { let run = |low_height_with_no_chunk: BlockHeight, high_height_with_no_chunk: BlockHeight, - result: bool| { + should_pass: bool| { init_test_logger(); let height_timeout = 10; let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; @@ -2972,7 +2972,7 @@ fn test_restoring_receipts_mainnet() { height += 1; } - if result { + if should_pass { assert!( receipt_hashes_to_restore.is_empty(), "Some of receipts were not executed, hashes: {:?}", From 3ebed4bd78937d90e37d2931d3b29eeff5f907eb Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 11:32:54 +0200 Subject: [PATCH 065/109] Gas should not be spent for transition for non-mainnet --- core/primitives/src/runtime/migration_data.rs | 4 ++++ neard/src/migrations.rs | 18 +++++++++++++++--- runtime/runtime/src/lib.rs | 9 ++------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index d5897c50c05..dd63198355d 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -1,5 +1,7 @@ #[cfg(feature = "protocol_feature_fix_storage_usage")] use crate::types::AccountId; +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use crate::types::Gas; use std::fmt; use std::fmt::{Debug, Formatter}; @@ -7,6 +9,8 @@ use std::fmt::{Debug, Formatter}; pub struct MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] pub storage_usage_delta: Vec<(AccountId, u64)>, + #[cfg(feature = "protocol_feature_fix_storage_usage")] + pub storage_usage_fix_gas: Gas, } impl Debug for MigrationData { diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 069505ec936..cb6ffcea5f6 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -8,6 +8,8 @@ use near_primitives::epoch_manager::EpochConfig; use near_primitives::runtime::migration_data::MigrationData; use near_primitives::sharding::{ChunkHash, ShardChunkHeader, ShardChunkV1}; use near_primitives::transaction::ExecutionOutcomeWithIdAndProof; +#[cfg(feature = "protocol_feature_fix_storage_usage")] +use near_primitives::types::Gas; use near_primitives::types::{BlockHeight, ShardId}; use near_store::migrations::set_store_version; use near_store::{create_store, DBCol, StoreUpdate}; @@ -270,16 +272,26 @@ lazy_static_include::lazy_static_include_bytes! { MAINNET_STORAGE_USAGE_DELTA => "res/storage_usage_delta.json", } +// In test runs reads and writes here used 442 TGas. Added 10% to account for possible bigger +// state +#[cfg(feature = "protocol_feature_fix_storage_usage")] +const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 490_000_000_000_000; + pub fn load_migration_data(chain_id: &String) -> MigrationData { - #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] - let _ = chain_id; + let is_mainnet = chain_id == "mainnet"; MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] - storage_usage_delta: if chain_id == "mainnet" { + storage_usage_delta: if is_mainnet { serde_json::from_slice(&MAINNET_STORAGE_USAGE_DELTA).unwrap() } else { Vec::new() }, + #[cfg(feature = "protocol_feature_fix_storage_usage")] + storage_usage_fix_gas: if is_mainnet { + GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION + } else { + 0 + }, } } diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index bff5c8278d6..5f6db230b05 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1074,11 +1074,6 @@ impl Runtime { Ok(()) } - // In test runs reads and writes here used 442 TGas. Added 10% to account for possible bigger - // state - #[cfg(feature = "protocol_feature_fix_storage_usage")] - const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 490_000_000_000_000; - pub fn apply_migrations( &self, state_update: &mut TrieUpdate, @@ -1104,7 +1099,7 @@ impl Runtime { None => {} } } - gas_used += Runtime::GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION; + gas_used += migration_data.storage_usage_fix_gas; state_update .commit(StateChangeCause::Migration { migration_id: MigrationId::StorageUsageFix }); } @@ -1149,7 +1144,7 @@ impl Runtime { let gas_used_for_migrations = match &apply_state.migration_data { Some(migration_data) => self .apply_migrations( - &mut state_update, + &mut state_updabkte, migration_data, apply_state.current_protocol_version, ) From 11b6b02fa57a29849924d90d191a59cb61af3b8b Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 11:40:16 +0200 Subject: [PATCH 066/109] Compilation fix --- runtime/runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 825c19d3961..2e2ff29eba9 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1144,7 +1144,7 @@ impl Runtime { let gas_used_for_migrations = match &apply_state.migration_data { Some(migration_data) => self .apply_migrations( - &mut state_updabkte, + &mut state_update, migration_data, apply_state.current_protocol_version, ) From 921d96ed45032e38651849604dc76137a2224461 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 11:44:03 +0200 Subject: [PATCH 067/109] Compilation fix --- neard/src/migrations.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index cb6ffcea5f6..0ff30ba21d3 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -278,9 +278,11 @@ lazy_static_include::lazy_static_include_bytes! { const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 490_000_000_000_000; pub fn load_migration_data(chain_id: &String) -> MigrationData { + #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] + let _ = chain_id; + #[cfg(feature = "protocol_feature_fix_storage_usage")] let is_mainnet = chain_id == "mainnet"; MigrationData { - #[cfg(feature = "protocol_feature_fix_storage_usage")] storage_usage_delta: if is_mainnet { serde_json::from_slice(&MAINNET_STORAGE_USAGE_DELTA).unwrap() } else { From ec1f41cb8b4ab055f6d56b93cefcc9fe5e85cd45 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 11:52:42 +0200 Subject: [PATCH 068/109] Compilation fix --- neard/src/migrations.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 0ff30ba21d3..c8ca9bd0340 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -283,6 +283,7 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { #[cfg(feature = "protocol_feature_fix_storage_usage")] let is_mainnet = chain_id == "mainnet"; MigrationData { + #[cfg(feature = "protocol_feature_fix_storage_usage")] storage_usage_delta: if is_mainnet { serde_json::from_slice(&MAINNET_STORAGE_USAGE_DELTA).unwrap() } else { From 4c7e883e446b649476cf6578f5d1ff0b3570f34f Mon Sep 17 00:00:00 2001 From: EgorKulikov Date: Mon, 10 May 2021 17:10:17 +0200 Subject: [PATCH 069/109] Update chain/rosetta-rpc/src/adapters/mod.rs Co-authored-by: Vlad Frolov --- chain/rosetta-rpc/src/adapters/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/rosetta-rpc/src/adapters/mod.rs b/chain/rosetta-rpc/src/adapters/mod.rs index 31f9cd2bdfa..47d4c23ce07 100644 --- a/chain/rosetta-rpc/src/adapters/mod.rs +++ b/chain/rosetta-rpc/src/adapters/mod.rs @@ -187,7 +187,7 @@ fn convert_block_changes_to_transactions( )); } StateChangeCauseView::Migration { migration_id } => { - format!("migration due to {}", migration_id) + format!("migration:{}", block_hash) } }; From 43511a2fe3b9796aca3af62b6f7d6993a13ac548 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 18:00:32 +0200 Subject: [PATCH 070/109] MigrationId no longer used --- chain/rosetta-rpc/src/adapters/mod.rs | 2 +- core/primitives/src/types.rs | 8 +------- core/primitives/src/views.rs | 4 ++-- runtime/runtime/src/lib.rs | 3 +-- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/chain/rosetta-rpc/src/adapters/mod.rs b/chain/rosetta-rpc/src/adapters/mod.rs index 47d4c23ce07..3e66440062b 100644 --- a/chain/rosetta-rpc/src/adapters/mod.rs +++ b/chain/rosetta-rpc/src/adapters/mod.rs @@ -186,7 +186,7 @@ fn convert_block_changes_to_transactions( "State Change 'NotWritableToDisk' should never be observed".to_string(), )); } - StateChangeCauseView::Migration { migration_id } => { + StateChangeCauseView::Migration => { format!("migration:{}", block_hash) } }; diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index 4af87620050..a940f6e6547 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -156,13 +156,7 @@ pub enum StateChangeCause { ValidatorAccountsUpdate, /// State change that is happens due to migration that happens in first block of an epoch /// after protocol upgrade - Migration { migration_id: MigrationId }, -} - -#[derive(Serialize, Deserialize, Clone, BorshSerialize, BorshDeserialize)] -pub enum MigrationId { - /// See https://github.com/near/nearcore/issues/3824 - StorageUsageFix, + Migration, } impl fmt::Display for MigrationId { diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index 5c5cca6138d..0f21c68239d 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -1481,7 +1481,7 @@ pub enum StateChangeCauseView { PostponedReceipt { receipt_hash: CryptoHash }, UpdatedDelayedReceipts, ValidatorAccountsUpdate, - Migration { migration_id: MigrationId }, + Migration, } impl From for StateChangeCauseView { @@ -1506,7 +1506,7 @@ impl From for StateChangeCauseView { } StateChangeCause::UpdatedDelayedReceipts => Self::UpdatedDelayedReceipts, StateChangeCause::ValidatorAccountsUpdate => Self::ValidatorAccountsUpdate, - StateChangeCause::Migration { migration_id } => Self::Migration { migration_id }, + StateChangeCause::Migration => Self::Migration, } } } diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 2e2ff29eba9..de4e273fe2d 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1100,8 +1100,7 @@ impl Runtime { } } gas_used += migration_data.storage_usage_fix_gas; - state_update - .commit(StateChangeCause::Migration { migration_id: MigrationId::StorageUsageFix }); + state_update.commit(StateChangeCause::Migration); } #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] (state_update, migration_data, protocol_version); From 571c0828d25714e03a43bcc72c1c152cebf007e5 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 18:57:17 +0200 Subject: [PATCH 071/109] MigrationId no longer used --- core/primitives/src/types.rs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index a940f6e6547..f1d6c421a4c 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -159,20 +159,6 @@ pub enum StateChangeCause { Migration, } -impl fmt::Display for MigrationId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - Self::StorageUsageFix => write!(f, "Storage usage fix"), - } - } -} - -impl fmt::Debug for MigrationId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - fmt::Display::fmt(self, f) - } -} - /// This represents the committed changes in the Trie with a change cause. #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] pub struct RawStateChange { From 23e13192199cefeb418e841f30c182d697470da1 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 19:54:53 +0200 Subject: [PATCH 072/109] Compilation fix --- core/primitives/src/types.rs | 2 -- core/primitives/src/views.rs | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/core/primitives/src/types.rs b/core/primitives/src/types.rs index f1d6c421a4c..7da4e91d8cb 100644 --- a/core/primitives/src/types.rs +++ b/core/primitives/src/types.rs @@ -13,8 +13,6 @@ use crate::trie_key::TrieKey; /// Reexport primitive types pub use near_primitives_core::types::*; -use std::fmt; -use std::fmt::Formatter; /// Hash used by to store state root. pub type StateRoot = CryptoHash; diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index 0f21c68239d..cd2a4a36095 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -44,9 +44,9 @@ use crate::transaction::{ }; use crate::types::{ AccountId, AccountWithPublicKey, Balance, BlockHeight, CompiledContractCache, EpochHeight, - EpochId, FunctionArgs, Gas, MigrationId, Nonce, NumBlocks, ShardId, StateChangeCause, - StateChangeKind, StateChangeValue, StateChangeWithCause, StateChangesRequest, StateRoot, - StorageUsage, StoreKey, StoreValue, ValidatorKickoutReason, + EpochId, FunctionArgs, Gas, Nonce, NumBlocks, ShardId, StateChangeCause, StateChangeKind, + StateChangeValue, StateChangeWithCause, StateChangesRequest, StateRoot, StorageUsage, StoreKey, + StoreValue, ValidatorKickoutReason, }; use crate::version::{ProtocolVersion, Version}; use validator_stake_view::ValidatorStakeView; From f54b1f8c7382cb0f79aff4bbd2d565c23c960834 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 10 May 2021 20:22:06 +0200 Subject: [PATCH 073/109] Compilation fix --- runtime/runtime/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index de4e273fe2d..ecc1a12bd42 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -52,8 +52,6 @@ pub use crate::verifier::{validate_transaction, verify_and_charge_transaction}; pub use near_primitives::runtime::apply_state::ApplyState; use near_primitives::runtime::fees::RuntimeFeesConfig; use near_primitives::runtime::migration_data::MigrationData; -#[cfg(feature = "protocol_feature_fix_storage_usage")] -use near_primitives::types::MigrationId; use near_primitives::version::{ is_implicit_account_creation_enabled, ProtocolFeature, ProtocolVersion, }; From 57cd4f31e445a9aff61d726de8bf840efc5d9990 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 11 May 2021 16:37:56 +0300 Subject: [PATCH 074/109] remove unnecessary code --- chain/client/tests/process_blocks.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index b8fcbc33415..a8d618cefbe 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2905,7 +2905,6 @@ fn test_restoring_receipts_mainnet() { genesis.config.chain_id = String::from("mainnet"); genesis.config.epoch_length = epoch_length; genesis.config.protocol_version = protocol_version; - genesis.config.gas_limit = 10000000000000; let chain_genesis = ChainGenesis::from(&genesis); let mut env = TestEnv::new_with_runtime( chain_genesis.clone(), @@ -2937,8 +2936,6 @@ fn test_restoring_receipts_mainnet() { while !receipt_hashes_to_restore.is_empty() && height - last_update_height < height_timeout { let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); - block.mut_header().get_mut().inner_rest.latest_protocol_version = - ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(); if low_height_with_no_chunk <= height && height < high_height_with_no_chunk { let prev_block = env.clients[0].chain.get_block_by_height(height - 1).unwrap().clone(); From d22380228741954dcce2b05545ec2ddd5fda8c0e Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 12 May 2021 01:25:18 +0300 Subject: [PATCH 075/109] separate tests --- chain/client/tests/process_blocks.rs | 224 ++++++++++++++------------- 1 file changed, 117 insertions(+), 107 deletions(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index a8d618cefbe..246808026c0 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -56,10 +56,9 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -#[cfg(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" -))] +#[cfg( + feature = "protocol_feature_fix_storage_usage" +)] use near_primitives::version::ProtocolFeature; use near_primitives::version::PROTOCOL_VERSION; use near_primitives::views::{ @@ -2890,109 +2889,6 @@ fn test_congestion_receipt_execution() { } } -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -#[test] -fn test_restoring_receipts_mainnet() { - let epoch_length = 5; - - let run = |low_height_with_no_chunk: BlockHeight, - high_height_with_no_chunk: BlockHeight, - should_pass: bool| { - init_test_logger(); - let height_timeout = 10; - let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; - let mut genesis = Genesis::test(vec!["test0", "test1"], 1); - genesis.config.chain_id = String::from("mainnet"); - genesis.config.epoch_length = epoch_length; - genesis.config.protocol_version = protocol_version; - let chain_genesis = ChainGenesis::from(&genesis); - let mut env = TestEnv::new_with_runtime( - chain_genesis.clone(), - 1, - 1, - create_nightshade_runtimes(&genesis, 1), - ); - - let get_restored_receipt_hashes = |env: &mut TestEnv| -> HashSet { - HashSet::from_iter( - env.clients[0] - .runtime_adapter - .get_migration_data() - .restored_receipts - .get(&0u64) - .expect("Receipts to restore must contain an entry for shard 0") - .clone() - .iter() - .map(|receipt| receipt.receipt_id), - ) - }; - - let mut receipt_hashes_to_restore = get_restored_receipt_hashes(&mut env); - let mut height: BlockHeight = 1; - let mut last_update_height: BlockHeight = 0; - - // If some receipts are still not applied, upgrade already happened, and no new receipt was - // applied in some last blocks, consider the process stuck to avoid any possibility of infinite loop. - while !receipt_hashes_to_restore.is_empty() && height - last_update_height < height_timeout - { - let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); - if low_height_with_no_chunk <= height && height < high_height_with_no_chunk { - let prev_block = - env.clients[0].chain.get_block_by_height(height - 1).unwrap().clone(); - set_no_chunk_in_block(&mut block, &prev_block); - } - env.process_block(0, block, Provenance::PRODUCED); - - let last_block = env.clients[0].chain.get_block_by_height(height).unwrap().clone(); - let protocol_version = env.clients[0] - .runtime_adapter - .get_epoch_protocol_version(last_block.header().epoch_id()) - .unwrap(); - - for receipt_id in receipt_hashes_to_restore.clone().iter() { - if env.clients[0].chain.get_execution_outcome(receipt_id).is_ok() { - assert!( - protocol_version - >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(), - "Restored receipt {} was executed before protocol upgrade", - receipt_id - ); - receipt_hashes_to_restore.remove(receipt_id); - last_update_height = height; - }; - } - - // Update last updated height anyway if upgrade did not happen - if protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { - last_update_height = height; - } - height += 1; - } - - if should_pass { - assert!( - receipt_hashes_to_restore.is_empty(), - "Some of receipts were not executed, hashes: {:?}", - receipt_hashes_to_restore - ); - } else { - assert_eq!( - receipt_hashes_to_restore, - get_restored_receipt_hashes(&mut env), - "If accidentally there are no chunks in first epoch with new protocol version, receipts should not be introduced" - ); - } - }; - - // If there are no chunks missing, all receipts should be applied - run(1, 0, true); - // If the first chunk in the first epoch with needed protocol version is missing, - // all receipts should still be applied - run(8, 12, true); - // If all chunks are missing in the first epoch, no receipts should be applied - run(11, 11 + epoch_length, false); -} - #[cfg(test)] mod access_key_nonce_range_tests { use super::*; @@ -3126,3 +3022,117 @@ mod access_key_nonce_range_tests { )); } } + +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +#[cfg(test)] +mod protocol_feature_restore_receipts_after_fix_tests { + use super::*; + use near_primitives::version::ProtocolFeature; + const EPOCH_LENGTH: u64 = 5; + + fn run_test(low_height_with_no_chunk: BlockHeight, high_height_with_no_chunk: BlockHeight, should_pass: bool) { + // init_test_logger(); + let height_timeout = 10; + let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; + let mut genesis = Genesis::test(vec!["test0", "test1"], 1); + genesis.config.chain_id = String::from("mainnet"); + genesis.config.epoch_length = EPOCH_LENGTH; + genesis.config.protocol_version = protocol_version; + let chain_genesis = ChainGenesis::from(&genesis); + let mut env = TestEnv::new_with_runtime( + chain_genesis.clone(), + 1, + 1, + create_nightshade_runtimes(&genesis, 1), + ); + + let get_restored_receipt_hashes = |env: &mut TestEnv| -> HashSet { + HashSet::from_iter( + env.clients[0] + .runtime_adapter + .get_migration_data() + .restored_receipts + .get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0") + .clone() + .iter() + .map(|receipt| receipt.receipt_id), + ) + }; + + let mut receipt_hashes_to_restore = get_restored_receipt_hashes(&mut env); + let mut height: BlockHeight = 1; + let mut last_update_height: BlockHeight = 0; + + // If some receipts are still not applied, upgrade already happened, and no new receipt was + // applied in some last blocks, consider the process stuck to avoid any possibility of infinite loop. + while !receipt_hashes_to_restore.is_empty() && height - last_update_height < height_timeout + { + let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); + if low_height_with_no_chunk <= height && height < high_height_with_no_chunk { + let prev_block = + env.clients[0].chain.get_block_by_height(height - 1).unwrap().clone(); + set_no_chunk_in_block(&mut block, &prev_block); + } + env.process_block(0, block, Provenance::PRODUCED); + + let last_block = env.clients[0].chain.get_block_by_height(height).unwrap().clone(); + let protocol_version = env.clients[0] + .runtime_adapter + .get_epoch_protocol_version(last_block.header().epoch_id()) + .unwrap(); + + for receipt_id in receipt_hashes_to_restore.clone().iter() { + if env.clients[0].chain.get_execution_outcome(receipt_id).is_ok() { + assert!( + protocol_version + >= ProtocolFeature::RestoreReceiptsAfterFix.protocol_version(), + "Restored receipt {} was executed before protocol upgrade", + receipt_id + ); + receipt_hashes_to_restore.remove(receipt_id); + last_update_height = height; + }; + } + + // Update last updated height anyway if upgrade did not happen + if protocol_version < ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() { + last_update_height = height; + } + height += 1; + } + + if should_pass { + assert!( + receipt_hashes_to_restore.is_empty(), + "Some of receipts were not executed, hashes: {:?}", + receipt_hashes_to_restore + ); + } else { + assert_eq!( + receipt_hashes_to_restore, + get_restored_receipt_hashes(&mut env), + "If accidentally there are no chunks in first epoch with new protocol version, receipts should not be introduced" + ); + } + } + + #[test] + fn test_no_chunks_missing() { + // If there are no chunks missing, all receipts should be applied + run_test(1, 0, true); + } + + #[test] + fn test_first_chunk_in_epoch_missing() { + // If the first chunk in the first epoch with needed protocol version is missing, + // all receipts should still be applied + run_test(8, 12, true); + } + + #[test] + fn test_all_chunks_in_epoch_missing() { + // If all chunks are missing in the first epoch, no receipts should be applied + run_test(11, 11 + EPOCH_LENGTH, false); + } +} From b85762787f337b2e28c6d12d3569235ccb15af30 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 12 May 2021 03:46:37 +0300 Subject: [PATCH 076/109] introduce is_valid_block_for_migration --- chain/chain/src/chain.rs | 75 ++++++++++++++++++++++++++ chain/chain/src/test_utils.rs | 2 + chain/chain/src/types.rs | 4 ++ chain/chain/src/validate.rs | 1 + chain/client/tests/process_blocks.rs | 10 ++-- neard/src/migrations.rs | 2 + neard/src/runtime/mod.rs | 79 +++++----------------------- 7 files changed, 104 insertions(+), 69 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 45c911d13c1..21c2b60621d 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -43,6 +43,8 @@ use near_primitives::types::{ use near_primitives::unwrap_or_return; #[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::version::ProtocolFeature; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +use near_primitives::version::ProtocolVersion; use near_primitives::views::{ ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, FinalExecutionOutcomeWithReceiptView, FinalExecutionStatus, LightClientBlockView, @@ -2657,6 +2659,39 @@ impl<'a> ChainUpdate<'a> { Ok(()) } + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn get_prev_epoch_id_from_prev_block(&mut self, block_hash: &CryptoHash) -> Result { + let epoch_start_header = { + let height = self.runtime_adapter.get_epoch_start_height(block_hash)?; + let hash = self.chain_store_update.get_block_hash_by_height(height)?; + self.chain_store_update.get_block_header(&hash)?.clone() + }; + if self.runtime_adapter.is_next_block_epoch_start(block_hash).unwrap() { + self.runtime_adapter.get_epoch_id_from_prev_block(epoch_start_header.prev_hash()) + } else { + let prev_epoch_last_block = self.get_previous_header(&epoch_start_header)?.prev_hash().clone(); + self.runtime_adapter.get_epoch_id_from_prev_block(&prev_epoch_last_block) + } + } + + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn get_protocol_version_of_last_block_with_chunk( + &mut self, + hash: &CryptoHash, + shard_id: ShardId, + ) -> Result { + let mut candidate_hash = hash.clone(); + loop { + let block_header = self.chain_store_update.get_block_header(&candidate_hash)?.clone(); + if block_header.chunk_mask()[shard_id as usize] { + break Ok(self + .runtime_adapter + .get_epoch_protocol_version(block_header.epoch_id())?); + } + candidate_hash = block_header.prev_hash().clone(); + } + } + pub fn create_chunk_state_challenge( &mut self, prev_block: &Block, @@ -2687,6 +2722,8 @@ impl<'a> ChainUpdate<'a> { Some(&block.hash()), )?; let prev_chunk_inner = prev_chunk.cloned_header().take_inner(); + let is_valid_block_for_migration = self.check_if_block_is_valid_for_migration(&block.hash(), &prev_block.hash(), chunk_shard_id)?; + let apply_result = self .runtime_adapter .apply_transactions_with_optional_storage_proof( @@ -2705,6 +2742,7 @@ impl<'a> ChainUpdate<'a> { *block.header().random_value(), true, true, + is_valid_block_for_migration, ) .unwrap(); let partial_state = apply_result.proof.unwrap().nodes; @@ -2719,6 +2757,37 @@ impl<'a> ChainUpdate<'a> { }) } + fn check_if_block_is_valid_for_migration( + &mut self, + block_hash: &CryptoHash, + prev_block_hash: &CryptoHash, + shard_id: ShardId, + ) -> Result { + let block_header = self.chain_store_update.get_block_header(block_hash)?.clone(); + let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block_header.epoch_id())?; + let prev_protocol_version = + self.get_protocol_version_of_last_block_with_chunk(prev_block_hash, shard_id)?; + let prev_epoch_id = self.get_prev_epoch_id_from_prev_block(prev_block_hash)?.clone(); + let prev_epoch_protocol_version = self.runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; + println!("{} {} {} {:?}", block_header.height(), protocol_version, prev_protocol_version, prev_epoch_id); + Ok(shard_id == 0 + && checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + protocol_version + ) + && !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_epoch_protocol_version + ) + && !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + )) + } + fn apply_chunks( &mut self, me: &Option, @@ -2832,6 +2901,7 @@ impl<'a> ChainUpdate<'a> { let chunk_inner = chunk.cloned_header().take_inner(); let gas_limit = chunk_inner.gas_limit(); + let is_valid_block_for_migration = self.check_if_block_is_valid_for_migration(&block.hash(), &prev_block.hash(), shard_id)?; // Apply transactions and receipts. let apply_result = self @@ -2851,6 +2921,7 @@ impl<'a> ChainUpdate<'a> { &block.header().challenges_result(), *block.header().random_value(), true, + is_valid_block_for_migration, ) .map_err(|e| ErrorKind::Other(e.to_string()))?; @@ -2906,6 +2977,7 @@ impl<'a> ChainUpdate<'a> { &block.header().challenges_result(), *block.header().random_value(), false, + false, ) .map_err(|e| ErrorKind::Other(e.to_string()))?; @@ -3586,6 +3658,7 @@ impl<'a> ChainUpdate<'a> { let chunk_header = chunk.cloned_header(); let gas_limit = chunk_header.gas_limit(); + let is_valid_block_for_migration = self.check_if_block_is_valid_for_migration(block_header.hash(), &chunk_header.prev_block_hash(), shard_id)?; let apply_result = self.runtime_adapter.apply_transactions( shard_id, &chunk_header.prev_state_root(), @@ -3601,6 +3674,7 @@ impl<'a> ChainUpdate<'a> { &block_header.challenges_result(), *block_header.random_value(), true, + is_valid_block_for_migration, )?; let (outcome_root, outcome_proofs) = @@ -3680,6 +3754,7 @@ impl<'a> ChainUpdate<'a> { &block_header.challenges_result(), *block_header.random_value(), false, + false, )?; self.chain_store_update.save_trie_changes(apply_result.trie_changes); diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 702f03c9c8d..efae4cedcf4 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -605,6 +605,7 @@ impl RuntimeAdapter for KeyValueRuntime { _random_seed: CryptoHash, generate_storage_proof: bool, _is_new_chunk: bool, + _is_valid_block_for_migration: bool, ) -> Result { assert!(!generate_storage_proof); let mut tx_results = vec![]; @@ -784,6 +785,7 @@ impl RuntimeAdapter for KeyValueRuntime { _challenges: &ChallengesResult, _random_value: CryptoHash, _is_new_chunk: bool, + _is_valid_block_for_migration: bool, ) -> Result { unimplemented!(); } diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index 46f59250b14..366e96b59c0 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -512,6 +512,7 @@ pub trait RuntimeAdapter: Send + Sync { challenges_result: &ChallengesResult, random_seed: CryptoHash, is_new_chunk: bool, + is_valid_block_for_migration: bool, ) -> Result { self.apply_transactions_with_optional_storage_proof( shard_id, @@ -529,6 +530,7 @@ pub trait RuntimeAdapter: Send + Sync { random_seed, false, is_new_chunk, + is_valid_block_for_migration, ) } @@ -549,6 +551,7 @@ pub trait RuntimeAdapter: Send + Sync { random_seed: CryptoHash, generate_storage_proof: bool, is_new_chunk: bool, + is_valid_block_for_migration: bool, ) -> Result; fn check_state_transition( @@ -568,6 +571,7 @@ pub trait RuntimeAdapter: Send + Sync { challenges_result: &ChallengesResult, random_value: CryptoHash, is_new_chunk: bool, + is_valid_block_for_migration: bool, ) -> Result; /// Query runtime with given `path` and `data`. diff --git a/chain/chain/src/validate.rs b/chain/chain/src/validate.rs index 0369edd411b..7b5b8fadc8d 100644 --- a/chain/chain/src/validate.rs +++ b/chain/chain/src/validate.rs @@ -342,6 +342,7 @@ fn validate_chunk_state_challenge( *block_header.random_value(), // TODO: set it properly when challenges are enabled true, + false, // ?? ) .map_err(|_| Error::from(ErrorKind::MaliciousChallenge))?; let outcome_root = ApplyTransactionResult::compute_outcomes_proof(&result.outcomes).0; diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 246808026c0..91b35dca7f6 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -56,9 +56,7 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -#[cfg( - feature = "protocol_feature_fix_storage_usage" -)] +#[cfg(feature = "protocol_feature_fix_storage_usage")] use near_primitives::version::ProtocolFeature; use near_primitives::version::PROTOCOL_VERSION; use near_primitives::views::{ @@ -3030,7 +3028,11 @@ mod protocol_feature_restore_receipts_after_fix_tests { use near_primitives::version::ProtocolFeature; const EPOCH_LENGTH: u64 = 5; - fn run_test(low_height_with_no_chunk: BlockHeight, high_height_with_no_chunk: BlockHeight, should_pass: bool) { + fn run_test( + low_height_with_no_chunk: BlockHeight, + high_height_with_no_chunk: BlockHeight, + should_pass: bool, + ) { // init_test_logger(); let height_timeout = 10; let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index b906e130168..89fc6944916 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -68,6 +68,7 @@ fn apply_block_at_height( &block.header().challenges_result(), *block.header().random_value(), true, + false, // ??? ) .unwrap(); let (_, outcome_paths) = ApplyTransactionResult::compute_outcomes_proof(&apply_result.outcomes); @@ -244,6 +245,7 @@ pub fn migrate_19_to_20(path: &String, near_config: &NearConfig) { *block.header().random_value(), // doesn't really matter here since the old blocks are on the old version false, + false, // ?? ) .unwrap(); if !apply_result.outcomes.is_empty() { diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 22baef3651e..de063241fa3 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -203,36 +203,6 @@ impl NightshadeRuntime { epoch_manager.get_epoch_id(hash).map_err(Error::from) } - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - fn get_prev_epoch_id_from_prev_block( - &self, - prev_block_hash: &CryptoHash, - ) -> Result { - let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); - if epoch_manager.is_next_block_epoch_start(prev_block_hash)? { - epoch_manager.get_epoch_id(prev_block_hash).map_err(Error::from) - } else { - epoch_manager.get_prev_epoch_id(prev_block_hash).map_err(Error::from) - } - } - - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - fn get_protocol_version_of_last_block_with_chunk( - &self, - hash: &CryptoHash, - shard_id: ShardId, - ) -> Result { - let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); - let mut candidate_hash = hash.clone(); - loop { - let block_info = epoch_manager.get_block_info(&candidate_hash).unwrap().clone(); - if block_info.chunk_mask()[shard_id as usize] { - break Ok(epoch_manager.get_epoch_info(block_info.epoch_id())?.protocol_version()); - } - candidate_hash = block_info.prev_hash().clone(); - } - } - fn genesis_state_from_dump(store: Arc, home_dir: &Path) -> Vec { error!(target: "near", "Loading genesis from a state dump file. Do not use this outside of genesis-tools"); let mut state_file = home_dir.to_path_buf(); @@ -364,6 +334,7 @@ impl NightshadeRuntime { challenges_result: &ChallengesResult, random_seed: CryptoHash, is_new_chunk: bool, + is_valid_block_for_migration: bool, ) -> Result { let validator_accounts_update = { let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); @@ -434,12 +405,8 @@ impl NightshadeRuntime { let epoch_height = self.get_epoch_height_from_prev_block(prev_block_hash)?; let epoch_id = self.get_epoch_id_from_prev_block(prev_block_hash)?; let prev_block_epoch_id = self.get_epoch_id(prev_block_hash)?; - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let prev_epoch_id = self.get_prev_epoch_id_from_prev_block(prev_block_hash)?; let current_protocol_version = self.get_epoch_protocol_version(&epoch_id)?; let prev_block_protocol_version = self.get_epoch_protocol_version(&prev_block_epoch_id)?; - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let prev_epoch_protocol_version = self.get_epoch_protocol_version(&prev_epoch_id)?; let apply_state = ApplyState { block_index: block_height, @@ -475,37 +442,15 @@ impl NightshadeRuntime { #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let incoming_receipts = receipts.to_vec(); #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let incoming_receipts = if is_new_chunk - && shard_id == 0 - && checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - current_protocol_version - ) - && !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_epoch_protocol_version - ) { - let prev_protocol_version = self - .get_protocol_version_of_last_block_with_chunk(prev_block_hash, shard_id) - .unwrap(); - - let mut receipts_to_restore = if !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - ) { - self.migration_data - .restored_receipts - .get(&shard_id) - .expect("Receipts to restore must contain an entry for shard 0") - .clone() - } else { - Vec::::new() - }; - receipts_to_restore.extend_from_slice(receipts); - receipts_to_restore + let incoming_receipts = if is_valid_block_for_migration { + let mut x = self + .migration_data + .restored_receipts + .get(&shard_id) + .expect("Receipts to restore must contain an entry for shard 0") + .clone(); + x.extend_from_slice(receipts); + x } else { receipts.to_vec() }; @@ -1215,6 +1160,7 @@ impl RuntimeAdapter for NightshadeRuntime { random_seed: CryptoHash, generate_storage_proof: bool, is_new_chunk: bool, + is_valid_block_for_migration: bool, ) -> Result { let trie = self.get_trie_for_shard(shard_id); let trie = if generate_storage_proof { trie.recording_reads() } else { trie }; @@ -1234,6 +1180,7 @@ impl RuntimeAdapter for NightshadeRuntime { challenges, random_seed, is_new_chunk, + is_valid_block_for_migration, ) { Ok(result) => Ok(result), Err(e) => match e.kind() { @@ -1262,6 +1209,7 @@ impl RuntimeAdapter for NightshadeRuntime { challenges: &ChallengesResult, random_value: CryptoHash, is_new_chunk: bool, + is_valid_block_for_migration: bool, ) -> Result { let trie = Trie::from_recorded_storage(partial_storage); self.process_state_update( @@ -1280,6 +1228,7 @@ impl RuntimeAdapter for NightshadeRuntime { challenges, random_value, is_new_chunk, + is_valid_block_for_migration, ) } From edbb26485b88b0d550fb4fe2509ae2b02fcf9580 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 12 May 2021 16:24:02 +0300 Subject: [PATCH 077/109] add migration argument to all apply_transaction calls --- chain/chain/src/chain.rs | 91 +++++++++-------------------------- chain/chain/src/lib.rs | 1 + chain/chain/src/migrations.rs | 79 ++++++++++++++++++++++++++++++ neard/src/migrations.rs | 13 +++-- 4 files changed, 113 insertions(+), 71 deletions(-) create mode 100644 chain/chain/src/migrations.rs diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 21c2b60621d..a044436b938 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -53,6 +53,7 @@ use near_primitives::views::{ use near_store::{ColState, ColStateHeaders, ColStateParts, ShardTries, StoreUpdate}; use crate::lightclient::get_epoch_block_producers_view; +use crate::migrations::check_if_block_is_valid_for_migration; use crate::missing_chunks::{BlockLike, MissingChunksPool}; use crate::store::{ChainStore, ChainStoreAccess, ChainStoreUpdate, GCMode}; use crate::types::{ @@ -2659,39 +2660,6 @@ impl<'a> ChainUpdate<'a> { Ok(()) } - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - fn get_prev_epoch_id_from_prev_block(&mut self, block_hash: &CryptoHash) -> Result { - let epoch_start_header = { - let height = self.runtime_adapter.get_epoch_start_height(block_hash)?; - let hash = self.chain_store_update.get_block_hash_by_height(height)?; - self.chain_store_update.get_block_header(&hash)?.clone() - }; - if self.runtime_adapter.is_next_block_epoch_start(block_hash).unwrap() { - self.runtime_adapter.get_epoch_id_from_prev_block(epoch_start_header.prev_hash()) - } else { - let prev_epoch_last_block = self.get_previous_header(&epoch_start_header)?.prev_hash().clone(); - self.runtime_adapter.get_epoch_id_from_prev_block(&prev_epoch_last_block) - } - } - - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - fn get_protocol_version_of_last_block_with_chunk( - &mut self, - hash: &CryptoHash, - shard_id: ShardId, - ) -> Result { - let mut candidate_hash = hash.clone(); - loop { - let block_header = self.chain_store_update.get_block_header(&candidate_hash)?.clone(); - if block_header.chunk_mask()[shard_id as usize] { - break Ok(self - .runtime_adapter - .get_epoch_protocol_version(block_header.epoch_id())?); - } - candidate_hash = block_header.prev_hash().clone(); - } - } - pub fn create_chunk_state_challenge( &mut self, prev_block: &Block, @@ -2722,8 +2690,13 @@ impl<'a> ChainUpdate<'a> { Some(&block.hash()), )?; let prev_chunk_inner = prev_chunk.cloned_header().take_inner(); - let is_valid_block_for_migration = self.check_if_block_is_valid_for_migration(&block.hash(), &prev_block.hash(), chunk_shard_id)?; - + let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + &mut self.chain_store_update, + self.runtime_adapter.as_ref(), + &block.hash(), + &prev_block.hash(), + chunk_shard_id, + )?; let apply_result = self .runtime_adapter .apply_transactions_with_optional_storage_proof( @@ -2757,37 +2730,6 @@ impl<'a> ChainUpdate<'a> { }) } - fn check_if_block_is_valid_for_migration( - &mut self, - block_hash: &CryptoHash, - prev_block_hash: &CryptoHash, - shard_id: ShardId, - ) -> Result { - let block_header = self.chain_store_update.get_block_header(block_hash)?.clone(); - let protocol_version = self.runtime_adapter.get_epoch_protocol_version(block_header.epoch_id())?; - let prev_protocol_version = - self.get_protocol_version_of_last_block_with_chunk(prev_block_hash, shard_id)?; - let prev_epoch_id = self.get_prev_epoch_id_from_prev_block(prev_block_hash)?.clone(); - let prev_epoch_protocol_version = self.runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; - println!("{} {} {} {:?}", block_header.height(), protocol_version, prev_protocol_version, prev_epoch_id); - Ok(shard_id == 0 - && checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - protocol_version - ) - && !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_epoch_protocol_version - ) - && !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - )) - } - fn apply_chunks( &mut self, me: &Option, @@ -2901,7 +2843,13 @@ impl<'a> ChainUpdate<'a> { let chunk_inner = chunk.cloned_header().take_inner(); let gas_limit = chunk_inner.gas_limit(); - let is_valid_block_for_migration = self.check_if_block_is_valid_for_migration(&block.hash(), &prev_block.hash(), shard_id)?; + let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + &mut self.chain_store_update, + self.runtime_adapter.as_ref(), + &block.hash(), + &prev_block.hash(), + shard_id, + )?; // Apply transactions and receipts. let apply_result = self @@ -3658,7 +3606,14 @@ impl<'a> ChainUpdate<'a> { let chunk_header = chunk.cloned_header(); let gas_limit = chunk_header.gas_limit(); - let is_valid_block_for_migration = self.check_if_block_is_valid_for_migration(block_header.hash(), &chunk_header.prev_block_hash(), shard_id)?; + let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + &mut self.chain_store_update, + self.runtime_adapter.as_ref(), + block_header.hash(), + &chunk_header.prev_block_hash(), + shard_id, + )?; + let apply_result = self.runtime_adapter.apply_transactions( shard_id, &chunk_header.prev_state_root(), diff --git a/chain/chain/src/lib.rs b/chain/chain/src/lib.rs index 502af104f31..1042e2481bc 100644 --- a/chain/chain/src/lib.rs +++ b/chain/chain/src/lib.rs @@ -14,6 +14,7 @@ pub mod chain; mod doomslug; mod lightclient; mod metrics; +pub mod migrations; pub mod missing_chunks; mod store; pub mod store_validator; diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs new file mode 100644 index 00000000000..c9c9706003e --- /dev/null +++ b/chain/chain/src/migrations.rs @@ -0,0 +1,79 @@ +use crate::store::ChainStoreAccess; +use crate::types::RuntimeAdapter; +use near_chain_primitives::error::Error; +use near_primitives::checked_feature; +use near_primitives::hash::CryptoHash; +use near_primitives::types::EpochId; +use near_primitives::types::ShardId; +use near_primitives::version::ProtocolVersion; + +fn get_epoch_id_of_last_block_with_chunk( + chain_store: &mut dyn ChainStoreAccess, + hash: &CryptoHash, + shard_id: ShardId, +) -> Result { + let mut candidate_hash = hash.clone(); + loop { + let block_header = chain_store.get_block_header(&candidate_hash)?.clone(); + if block_header.chunk_mask()[shard_id as usize] { + break Ok(block_header.epoch_id().clone()); + } + candidate_hash = block_header.prev_hash().clone(); + } +} + +fn get_prev_epoch_id_from_prev_block( + chain_store: &mut dyn ChainStoreAccess, + runtime_adapter: &dyn RuntimeAdapter, + block_hash: &CryptoHash, +) -> Result { + let epoch_start_header = { + let height = runtime_adapter.get_epoch_start_height(block_hash)?; + let hash = chain_store.get_block_hash_by_height(height)?; + chain_store.get_block_header(&hash)?.clone() + }; + if runtime_adapter.is_next_block_epoch_start(block_hash).unwrap() { + runtime_adapter.get_epoch_id_from_prev_block(epoch_start_header.prev_hash()) + } else { + let prev_epoch_last_block = + chain_store.get_previous_header(&epoch_start_header)?.prev_hash().clone(); + runtime_adapter.get_epoch_id_from_prev_block(&prev_epoch_last_block) + } +} + +pub fn check_if_block_is_valid_for_migration( + chain_store: &mut dyn ChainStoreAccess, + runtime_adapter: &dyn RuntimeAdapter, + block_hash: &CryptoHash, + prev_block_hash: &CryptoHash, + shard_id: ShardId, +) -> Result { + let block_header = chain_store.get_block_header(block_hash)?.clone(); + let protocol_version = runtime_adapter.get_epoch_protocol_version(block_header.epoch_id())?; + let prev_epoch_id = + get_prev_epoch_id_from_prev_block(chain_store, runtime_adapter, prev_block_hash)?.clone(); + let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; + // At first, check that block belongs to the first epoch where the protocol feature was enabled + // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case + if checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + protocol_version + ) && !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_epoch_protocol_version + ) { + Ok(false) + } + + let prev_protocol_version = runtime_adapter.get_epoch_protocol_version( + &get_epoch_id_of_last_block_with_chunk(chain_store, prev_block_hash, shard_id)?, + )?; + Ok(shard_id == 0 + && !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + )) +} diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 89fc6944916..7ecc67665c6 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -1,6 +1,7 @@ use crate::{NearConfig, NightshadeRuntime}; use borsh::BorshDeserialize; use near_chain::chain::collect_receipts_from_response; +use near_chain::migrations::check_if_block_is_valid_for_migration; use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo}; use near_chain::{ChainStore, ChainStoreAccess, ChainStoreUpdate, RuntimeAdapter}; use near_epoch_manager::{EpochManager, RewardCalculator}; @@ -47,11 +48,17 @@ fn apply_block_at_height( block_hash, prev_block.chunks()[shard_id as usize].height_included(), )?; + let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + &mut chain_store_update, + runtime_adapter, + block.hash(), + prev_block.hash(), + shard_id, + )?; let receipts = collect_receipts_from_response(&receipt_proof_response); let chunk_hash = block.chunks()[shard_id as usize].chunk_hash(); let chunk = get_chunk(&chain_store, chunk_hash); let chunk_header = ShardChunkHeader::V1(chunk.header); - let apply_result = runtime_adapter .apply_transactions( shard_id, @@ -68,7 +75,7 @@ fn apply_block_at_height( &block.header().challenges_result(), *block.header().random_value(), true, - false, // ??? + is_valid_block_for_migration, ) .unwrap(); let (_, outcome_paths) = ApplyTransactionResult::compute_outcomes_proof(&apply_result.outcomes); @@ -245,7 +252,7 @@ pub fn migrate_19_to_20(path: &String, near_config: &NearConfig) { *block.header().random_value(), // doesn't really matter here since the old blocks are on the old version false, - false, // ?? + false, ) .unwrap(); if !apply_result.outcomes.is_empty() { From 55d85f050d86ac2880f65d4bbed6fe6ceb99d3be Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 12 May 2021 17:13:21 +0300 Subject: [PATCH 078/109] remove get_migration_data --- chain/chain/src/chain.rs | 2 -- chain/chain/src/migrations.rs | 24 ++++++++++----------- chain/chain/src/test_utils.rs | 5 ----- chain/chain/src/types.rs | 3 --- chain/chain/src/validate.rs | 2 +- chain/client/tests/process_blocks.rs | 31 +++++++++++++++++++--------- neard/src/runtime/mod.rs | 11 +++++----- 7 files changed, 38 insertions(+), 40 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index a044436b938..e0a6e5a20de 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -43,8 +43,6 @@ use near_primitives::types::{ use near_primitives::unwrap_or_return; #[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::version::ProtocolFeature; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use near_primitives::version::ProtocolVersion; use near_primitives::views::{ ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, FinalExecutionOutcomeWithReceiptView, FinalExecutionStatus, LightClientBlockView, diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index c9c9706003e..533f51dbfeb 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -3,9 +3,7 @@ use crate::types::RuntimeAdapter; use near_chain_primitives::error::Error; use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; -use near_primitives::types::EpochId; -use near_primitives::types::ShardId; -use near_primitives::version::ProtocolVersion; +use near_primitives::types::{EpochId, ShardId}; fn get_epoch_id_of_last_block_with_chunk( chain_store: &mut dyn ChainStoreAccess, @@ -64,16 +62,16 @@ pub fn check_if_block_is_valid_for_migration( RestoreReceiptsAfterFix, prev_epoch_protocol_version ) { + let prev_protocol_version = runtime_adapter.get_epoch_protocol_version( + &get_epoch_id_of_last_block_with_chunk(chain_store, prev_block_hash, shard_id)?, + )?; + Ok(shard_id == 0 + && !checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + )) + } else { Ok(false) } - - let prev_protocol_version = runtime_adapter.get_epoch_protocol_version( - &get_epoch_id_of_last_block_with_chunk(chain_store, prev_block_hash, shard_id)?, - )?; - Ok(shard_id == 0 - && !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - )) } diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index efae4cedcf4..edf1b4f3a88 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -53,7 +53,6 @@ use crate::{BlockHeader, DoomslugThresholdMode, RuntimeAdapter}; use near_chain_configs::ProtocolConfig; #[cfg(feature = "protocol_feature_block_header_v3")] use near_primitives::block_header::{Approval, ApprovalInner}; -use near_primitives::runtime::migration_data::MigrationData; #[derive( BorshSerialize, BorshDeserialize, Serialize, Hash, PartialEq, Eq, Ord, PartialOrd, Clone, Debug, @@ -1101,10 +1100,6 @@ impl RuntimeAdapter for KeyValueRuntime { fn get_protocol_config(&self, _epoch_id: &EpochId) -> Result { unreachable!("get_protocol_config should not be called in KeyValueRuntime"); } - - fn get_migration_data(&self) -> Arc { - Arc::new(MigrationData::default()) - } } pub fn setup() -> (Chain, Arc, Arc) { diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index 366e96b59c0..e91fe31b005 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -35,7 +35,6 @@ use near_store::{PartialStorage, ShardTries, Store, StoreUpdate, Trie, WrappedTr #[cfg(feature = "protocol_feature_block_header_v3")] use crate::DoomslugThresholdMode; -use near_primitives::runtime::migration_data::MigrationData; #[derive(Eq, PartialEq, Debug, Clone)] pub enum BlockStatus { @@ -654,8 +653,6 @@ pub trait RuntimeAdapter: Send + Sync { fn get_protocol_config(&self, epoch_id: &EpochId) -> Result; - fn get_migration_data(&self) -> Arc; - /// Build receipts hashes. // Due to borsh serialization constraints, we have to use `&Vec` instead of `&[Receipt]` // here. diff --git a/chain/chain/src/validate.rs b/chain/chain/src/validate.rs index 7b5b8fadc8d..907dbf7453a 100644 --- a/chain/chain/src/validate.rs +++ b/chain/chain/src/validate.rs @@ -342,7 +342,7 @@ fn validate_chunk_state_challenge( *block_header.random_value(), // TODO: set it properly when challenges are enabled true, - false, // ?? + false, ) .map_err(|_| Error::from(ErrorKind::MaliciousChallenge))?; let outcome_root = ApplyTransactionResult::compute_outcomes_proof(&result.outcomes).0; diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 91b35dca7f6..69949f424fe 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -3025,34 +3025,45 @@ mod access_key_nonce_range_tests { #[cfg(test)] mod protocol_feature_restore_receipts_after_fix_tests { use super::*; + use near_primitives::runtime::migration_data::MigrationData; use near_primitives::version::ProtocolFeature; + const EPOCH_LENGTH: u64 = 5; + const HEIGHT_TIMEOUT: u64 = 10; fn run_test( low_height_with_no_chunk: BlockHeight, high_height_with_no_chunk: BlockHeight, should_pass: bool, ) { - // init_test_logger(); - let height_timeout = 10; + init_test_logger(); + let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; let mut genesis = Genesis::test(vec!["test0", "test1"], 1); genesis.config.chain_id = String::from("mainnet"); genesis.config.epoch_length = EPOCH_LENGTH; genesis.config.protocol_version = protocol_version; let chain_genesis = ChainGenesis::from(&genesis); + let runtime = neard::NightshadeRuntime::new( + Path::new("."), + create_test_store(), + &genesis, + vec![], + vec![], + None, + ); + let migration_data = runtime.migration_data(); + let mut env = TestEnv::new_with_runtime( chain_genesis.clone(), 1, 1, - create_nightshade_runtimes(&genesis, 1), + vec![Arc::new(runtime) as Arc], ); - let get_restored_receipt_hashes = |env: &mut TestEnv| -> HashSet { + let get_restored_receipt_hashes = |migration_data: &MigrationData| -> HashSet { HashSet::from_iter( - env.clients[0] - .runtime_adapter - .get_migration_data() + migration_data .restored_receipts .get(&0u64) .expect("Receipts to restore must contain an entry for shard 0") @@ -3062,13 +3073,13 @@ mod protocol_feature_restore_receipts_after_fix_tests { ) }; - let mut receipt_hashes_to_restore = get_restored_receipt_hashes(&mut env); + let mut receipt_hashes_to_restore = get_restored_receipt_hashes(migration_data.as_ref()); let mut height: BlockHeight = 1; let mut last_update_height: BlockHeight = 0; // If some receipts are still not applied, upgrade already happened, and no new receipt was // applied in some last blocks, consider the process stuck to avoid any possibility of infinite loop. - while !receipt_hashes_to_restore.is_empty() && height - last_update_height < height_timeout + while !receipt_hashes_to_restore.is_empty() && height - last_update_height < HEIGHT_TIMEOUT { let mut block = env.clients[0].produce_block(height).unwrap().unwrap(); if low_height_with_no_chunk <= height && height < high_height_with_no_chunk { @@ -3113,7 +3124,7 @@ mod protocol_feature_restore_receipts_after_fix_tests { } else { assert_eq!( receipt_hashes_to_restore, - get_restored_receipt_hashes(&mut env), + get_restored_receipt_hashes(migration_data.as_ref()), "If accidentally there are no chunks in first epoch with new protocol version, receipts should not be introduced" ); } diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index de063241fa3..beaf89dcd30 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -22,8 +22,6 @@ use near_pool::types::PoolIterator; use near_primitives::account::{AccessKey, Account}; use near_primitives::block::{Approval, ApprovalInner}; use near_primitives::challenge::ChallengesResult; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use near_primitives::checked_feature; use near_primitives::contract::ContractCode; use near_primitives::epoch_manager::block_info::BlockInfo; use near_primitives::epoch_manager::epoch_info::EpochInfo; @@ -316,6 +314,10 @@ impl NightshadeRuntime { } } + pub fn migration_data(&self) -> Arc { + Arc::clone(&self.migration_data) + } + /// Processes state update. fn process_state_update( &self, @@ -454,6 +456,7 @@ impl NightshadeRuntime { } else { receipts.to_vec() }; + println!("{}", is_valid_block_for_migration); let apply_result = self .runtime @@ -1527,10 +1530,6 @@ impl RuntimeAdapter for NightshadeRuntime { config.runtime_config = (*runtime_config).clone(); Ok(config) } - - fn get_migration_data(&self) -> Arc { - self.migration_data.clone() - } } impl node_runtime::adapter::ViewRuntimeAdapter for NightshadeRuntime { From 0edc887a6964fafaf447740135094d6f82915098 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 12 May 2021 17:21:54 +0300 Subject: [PATCH 079/109] add more comments --- chain/chain/src/chain.rs | 3 +++ chain/chain/src/migrations.rs | 5 +++++ neard/src/runtime/mod.rs | 9 +++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index e0a6e5a20de..a9c538c7fb3 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2841,6 +2841,9 @@ impl<'a> ChainUpdate<'a> { let chunk_inner = chunk.cloned_header().take_inner(); let gas_limit = chunk_inner.gas_limit(); + + // This variable is responsible for checking to which block we can apply receipts previously lost in apply_chunks + // (see https://github.com/near/nearcore/pull/4248/). let is_valid_block_for_migration = check_if_block_is_valid_for_migration( &mut self.chain_store_update, self.runtime_adapter.as_ref(), diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 533f51dbfeb..879dbe97dfd 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -5,6 +5,7 @@ use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; use near_primitives::types::{EpochId, ShardId}; +/// Get epoch id of the last block in which chunk for the given shard was presented. fn get_epoch_id_of_last_block_with_chunk( chain_store: &mut dyn ChainStoreAccess, hash: &CryptoHash, @@ -20,6 +21,7 @@ fn get_epoch_id_of_last_block_with_chunk( } } +/// Get epoch id by hash of previous block. fn get_prev_epoch_id_from_prev_block( chain_store: &mut dyn ChainStoreAccess, runtime_adapter: &dyn RuntimeAdapter, @@ -39,6 +41,9 @@ fn get_prev_epoch_id_from_prev_block( } } +/// We take the first block with existing chunk in the first epoch in which protocol feature +/// RestoreReceiptsAfterFix was enabled, and put the restored receipts there. +/// Needed to re-introduce receipts previously lost in apply_chunks (see https://github.com/near/nearcore/pull/4248/). pub fn check_if_block_is_valid_for_migration( chain_store: &mut dyn ChainStoreAccess, runtime_adapter: &dyn RuntimeAdapter, diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index beaf89dcd30..447de958fa7 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -439,24 +439,21 @@ impl NightshadeRuntime { // This code block re-introduces receipts lost because of a bug in apply_chunks // (see https://github.com/near/nearcore/pull/4248/) - // We take the first block with existing chunk in the first epoch in which protocol feature - // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let incoming_receipts = receipts.to_vec(); #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let incoming_receipts = if is_valid_block_for_migration { - let mut x = self + let mut restored_receipts = self .migration_data .restored_receipts .get(&shard_id) .expect("Receipts to restore must contain an entry for shard 0") .clone(); - x.extend_from_slice(receipts); - x + restored_receipts.extend_from_slice(receipts); + restored_receipts } else { receipts.to_vec() }; - println!("{}", is_valid_block_for_migration); let apply_result = self .runtime From d9877bf80987d0fc1a676514bf8220ddb3835ebc Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 13 May 2021 16:14:51 +0300 Subject: [PATCH 080/109] temporary change --- chain/chain/src/chain.rs | 4 +++- chain/chain/src/store.rs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index a9c538c7fb3..97b5a82d683 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -2843,7 +2843,9 @@ impl<'a> ChainUpdate<'a> { let gas_limit = chunk_inner.gas_limit(); // This variable is responsible for checking to which block we can apply receipts previously lost in apply_chunks - // (see https://github.com/near/nearcore/pull/4248/). + // (see https://github.com/near/nearcore/pull/4248/) + // We take the first block with existing chunk in the first epoch in which protocol feature + // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. let is_valid_block_for_migration = check_if_block_is_valid_for_migration( &mut self.chain_store_update, self.runtime_adapter.as_ref(), diff --git a/chain/chain/src/store.rs b/chain/chain/src/store.rs index 6543d654747..ecda349a46d 100644 --- a/chain/chain/src/store.rs +++ b/chain/chain/src/store.rs @@ -278,6 +278,22 @@ pub trait ChainStoreAccess { Ok(self.get_block_header(hash)?.height()) } } + + fn get_epoch_id_of_last_block_with_chunk( + &mut self, + hash: &CryptoHash, + shard_id: ShardId, + ) -> Result { + let mut candidate_hash = hash.clone(); + loop { + // let block_header = chain_store.get_block_header(&candidate_hash)?.clone(); + let block_header = self.get_block_header(&candidate_hash)?; + if block_header.chunk_mask()[shard_id as usize] { + break Ok(block_header.epoch_id().clone()); + } + candidate_hash = block_header.prev_hash().clone(); + } + } } /// All chain-related database operations. From 851d1f4dd1767ae2c735509de20f62e487f73b8d Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 13 May 2021 22:22:22 +0300 Subject: [PATCH 081/109] implement get_prev_epoch_id_from_prev_block --- chain/chain/src/migrations.rs | 50 +++++++---------------------------- chain/chain/src/test_utils.rs | 8 ++++++ chain/chain/src/types.rs | 7 +++++ neard/src/runtime/mod.rs | 13 +++++++++ 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 879dbe97dfd..6501b71abd1 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -3,43 +3,7 @@ use crate::types::RuntimeAdapter; use near_chain_primitives::error::Error; use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; -use near_primitives::types::{EpochId, ShardId}; - -/// Get epoch id of the last block in which chunk for the given shard was presented. -fn get_epoch_id_of_last_block_with_chunk( - chain_store: &mut dyn ChainStoreAccess, - hash: &CryptoHash, - shard_id: ShardId, -) -> Result { - let mut candidate_hash = hash.clone(); - loop { - let block_header = chain_store.get_block_header(&candidate_hash)?.clone(); - if block_header.chunk_mask()[shard_id as usize] { - break Ok(block_header.epoch_id().clone()); - } - candidate_hash = block_header.prev_hash().clone(); - } -} - -/// Get epoch id by hash of previous block. -fn get_prev_epoch_id_from_prev_block( - chain_store: &mut dyn ChainStoreAccess, - runtime_adapter: &dyn RuntimeAdapter, - block_hash: &CryptoHash, -) -> Result { - let epoch_start_header = { - let height = runtime_adapter.get_epoch_start_height(block_hash)?; - let hash = chain_store.get_block_hash_by_height(height)?; - chain_store.get_block_header(&hash)?.clone() - }; - if runtime_adapter.is_next_block_epoch_start(block_hash).unwrap() { - runtime_adapter.get_epoch_id_from_prev_block(epoch_start_header.prev_hash()) - } else { - let prev_epoch_last_block = - chain_store.get_previous_header(&epoch_start_header)?.prev_hash().clone(); - runtime_adapter.get_epoch_id_from_prev_block(&prev_epoch_last_block) - } -} +use near_primitives::types::ShardId; /// We take the first block with existing chunk in the first epoch in which protocol feature /// RestoreReceiptsAfterFix was enabled, and put the restored receipts there. @@ -51,12 +15,16 @@ pub fn check_if_block_is_valid_for_migration( prev_block_hash: &CryptoHash, shard_id: ShardId, ) -> Result { + // At first, check the shard id + if shard_id != 0 { + Ok(false) + } + let block_header = chain_store.get_block_header(block_hash)?.clone(); let protocol_version = runtime_adapter.get_epoch_protocol_version(block_header.epoch_id())?; - let prev_epoch_id = - get_prev_epoch_id_from_prev_block(chain_store, runtime_adapter, prev_block_hash)?.clone(); + let prev_epoch_id = runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash)?; let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; - // At first, check that block belongs to the first epoch where the protocol feature was enabled + // Check that block belongs to the first epoch where the protocol feature was enabled // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case if checked_feature!( "protocol_feature_restore_receipts_after_fix", @@ -68,7 +36,7 @@ pub fn check_if_block_is_valid_for_migration( prev_epoch_protocol_version ) { let prev_protocol_version = runtime_adapter.get_epoch_protocol_version( - &get_epoch_id_of_last_block_with_chunk(chain_store, prev_block_hash, shard_id)?, + &chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)?, )?; Ok(shard_id == 0 && !checked_feature!( diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index edf1b4f3a88..8159a294ff9 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -1100,6 +1100,14 @@ impl RuntimeAdapter for KeyValueRuntime { fn get_protocol_config(&self, _epoch_id: &EpochId) -> Result { unreachable!("get_protocol_config should not be called in KeyValueRuntime"); } + + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn get_prev_epoch_id_from_prev_block( + &self, + _prev_block_hash: &CryptoHash, + ) -> Result { + unreachable!("get_prev_epoch_id_from_prev_block should not be called in KeyValueRuntime"); + } } pub fn setup() -> (Chain, Arc, Arc) { diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index e91fe31b005..1ed7e46b881 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -653,6 +653,13 @@ pub trait RuntimeAdapter: Send + Sync { fn get_protocol_config(&self, epoch_id: &EpochId) -> Result; + /// Get previous epoch id by hash of previous block. + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn get_prev_epoch_id_from_prev_block( + &self, + prev_block_hash: &CryptoHash, + ) -> Result; + /// Build receipts hashes. // Due to borsh serialization constraints, we have to use `&Vec` instead of `&[Receipt]` // here. diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 447de958fa7..e05cab2a481 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -1527,6 +1527,19 @@ impl RuntimeAdapter for NightshadeRuntime { config.runtime_config = (*runtime_config).clone(); Ok(config) } + + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + fn get_prev_epoch_id_from_prev_block( + &self, + prev_block_hash: &CryptoHash, + ) -> Result { + let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); + if epoch_manager.is_next_block_epoch_start(prev_block_hash)? { + epoch_manager.get_epoch_id(prev_block_hash).map_err(Error::from) + } else { + epoch_manager.get_prev_epoch_id(prev_block_hash).map_err(Error::from) + } + } } impl node_runtime::adapter::ViewRuntimeAdapter for NightshadeRuntime { From a1fef60733ad2bb72427b101fc1ae60236e2fe0b Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 13 May 2021 22:35:04 +0300 Subject: [PATCH 082/109] finish merge --- core/primitives/src/version.rs | 10 ---------- neard/src/runtime/mod.rs | 3 --- 2 files changed, 13 deletions(-) diff --git a/core/primitives/src/version.rs b/core/primitives/src/version.rs index bf6bf35a2dc..a8e8d65c394 100644 --- a/core/primitives/src/version.rs +++ b/core/primitives/src/version.rs @@ -103,11 +103,8 @@ pub enum ProtocolFeature { AllowCreateAccountOnDelete, #[cfg(feature = "protocol_feature_fix_storage_usage")] FixStorageUsage, -<<<<<<< HEAD #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] RestoreReceiptsAfterFix, -======= ->>>>>>> master } /// Current latest stable version of the protocol. @@ -118,11 +115,7 @@ pub const PROTOCOL_VERSION: ProtocolVersion = 45; /// Current latest nightly version of the protocol. #[cfg(feature = "nightly_protocol")] -<<<<<<< HEAD pub const PROTOCOL_VERSION: ProtocolVersion = 112; -======= -pub const PROTOCOL_VERSION: ProtocolVersion = 111; ->>>>>>> master impl ProtocolFeature { pub const fn protocol_version(self) -> ProtocolVersion { @@ -150,11 +143,8 @@ impl ProtocolFeature { ProtocolFeature::AllowCreateAccountOnDelete => 110, #[cfg(feature = "protocol_feature_fix_storage_usage")] ProtocolFeature::FixStorageUsage => 111, -<<<<<<< HEAD #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] ProtocolFeature::RestoreReceiptsAfterFix => 112, -======= ->>>>>>> master } } } diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 0afa3296718..e05cab2a481 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -435,7 +435,6 @@ impl NightshadeRuntime { } else { None }, -<<<<<<< HEAD }; // This code block re-introduces receipts lost because of a bug in apply_chunks @@ -454,8 +453,6 @@ impl NightshadeRuntime { restored_receipts } else { receipts.to_vec() -======= ->>>>>>> master }; let apply_result = self From 32a4a3aac65c203655ebff2c440fa86f538e79e3 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Thu, 13 May 2021 22:42:38 +0300 Subject: [PATCH 083/109] fix merge --- chain/chain/src/migrations.rs | 4 +- chain/client/tests/process_blocks.rs | 129 --------------------------- 2 files changed, 2 insertions(+), 131 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 6501b71abd1..0086f7f9cd5 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -15,9 +15,9 @@ pub fn check_if_block_is_valid_for_migration( prev_block_hash: &CryptoHash, shard_id: ShardId, ) -> Result { - // At first, check the shard id + // At first, check that shard id = 0 and don't do unnecessary computation otherwise if shard_id != 0 { - Ok(false) + return Ok(false); } let block_header = chain_store.get_block_header(block_hash)?.clone(); diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 6b475043d40..4f65e110d3b 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2272,135 +2272,6 @@ fn test_epoch_protocol_version_change() { assert_eq!(protocol_version, PROTOCOL_VERSION + 1); } -#[test] -#[cfg(feature = "protocol_feature_fix_storage_usage")] -fn test_fix_storage_usage_migration() { - init_test_logger(); - let epoch_length = 5; - { - let mut genesis = Genesis::test(vec!["test0", "near"], 1); - genesis.config.chain_id = "mainnet".to_string(); - genesis.config.epoch_length = epoch_length; - genesis.config.protocol_version = ProtocolFeature::FixStorageUsage.protocol_version() - 1; - let genesis_height = genesis.config.genesis_height; - let chain_genesis = ChainGenesis::from(&genesis); - let mut env = - TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); - for i in 1..=16 { - let (encoded_chunk, merkle_paths, receipts) = - create_chunk_on_height(&mut env.clients[0], i); - - let mut chain_store = - ChainStore::new(env.clients[0].chain.store().owned_store(), genesis_height); - env.clients[0] - .shards_mgr - .distribute_encoded_chunk( - encoded_chunk.clone(), - merkle_paths.clone(), - receipts.clone(), - &mut chain_store, - ) - .unwrap(); - - let mut block = env.clients[0].produce_block(i).unwrap().unwrap(); - - let validator_signer = InMemoryValidatorSigner::from_seed( - &"test0".to_string(), - KeyType::ED25519, - &"test0".to_string(), - ); - - block.mut_header().get_mut().inner_rest.latest_protocol_version = - ProtocolFeature::FixStorageUsage.protocol_version(); - block.mut_header().resign(&validator_signer); - let (_, res) = env.clients[0].process_block(block.clone(), Provenance::NONE); - assert!(res.is_ok()); - env.clients[0].run_catchup(&vec![]).unwrap(); - - let root = - env.clients[0].chain.get_chunk_extra(block.hash(), 0).unwrap().state_root().clone(); - let trie = Rc::new(env.clients[0].runtime_adapter.get_trie_for_shard(0)); - let state_update = TrieUpdate::new(trie.clone(), root); - use near_primitives::account::Account; - let mut account_near_raw = state_update - .get(&TrieKey::Account { account_id: "near".to_string() }) - .unwrap() - .unwrap() - .clone(); - let account_near = Account::try_from_slice(&mut account_near_raw).unwrap(); - let mut account_test0_raw = state_update - .get(&TrieKey::Account { account_id: "test0".to_string() }) - .unwrap() - .unwrap() - .clone(); - let account_test0 = Account::try_from_slice(&mut account_test0_raw).unwrap(); - assert_eq!(account_near.storage_usage(), if i >= 11 { 4560 } else { 364 }); - assert_eq!(account_test0.storage_usage(), 182); - } - } - { - let mut genesis = Genesis::test(vec!["test0", "near"], 1); - genesis.config.chain_id = "testnet".to_string(); - genesis.config.epoch_length = epoch_length; - genesis.config.protocol_version = ProtocolFeature::FixStorageUsage.protocol_version() - 1; - let genesis_height = genesis.config.genesis_height; - let chain_genesis = ChainGenesis::from(&genesis); - let mut env = - TestEnv::new_with_runtime(chain_genesis, 1, 1, create_nightshade_runtimes(&genesis, 1)); - for i in 1..=16 { - let (encoded_chunk, merkle_paths, receipts) = - create_chunk_on_height(&mut env.clients[0], i); - - let mut chain_store = - ChainStore::new(env.clients[0].chain.store().owned_store(), genesis_height); - env.clients[0] - .shards_mgr - .distribute_encoded_chunk( - encoded_chunk.clone(), - merkle_paths.clone(), - receipts.clone(), - &mut chain_store, - ) - .unwrap(); - - let mut block = env.clients[0].produce_block(i).unwrap().unwrap(); - - let validator_signer = InMemoryValidatorSigner::from_seed( - &"test0".to_string(), - KeyType::ED25519, - &"test0".to_string(), - ); - - block.mut_header().get_mut().inner_rest.latest_protocol_version = - ProtocolFeature::FixStorageUsage.protocol_version(); - block.mut_header().resign(&validator_signer); - let (_, res) = env.clients[0].process_block(block.clone(), Provenance::NONE); - assert!(res.is_ok()); - env.clients[0].run_catchup(&vec![]).unwrap(); - - let root = - env.clients[0].chain.get_chunk_extra(block.hash(), 0).unwrap().state_root().clone(); - let trie = Rc::new(env.clients[0].runtime_adapter.get_trie_for_shard(0)); - let state_update = TrieUpdate::new(trie.clone(), root); - use near_primitives::account::Account; - let mut account_near_raw = state_update - .get(&TrieKey::Account { account_id: "near".to_string() }) - .unwrap() - .unwrap() - .clone(); - let account_near = Account::try_from_slice(&mut account_near_raw).unwrap(); - let mut account_test0_raw = state_update - .get(&TrieKey::Account { account_id: "test0".to_string() }) - .unwrap() - .unwrap() - .clone(); - let account_test0 = Account::try_from_slice(&mut account_test0_raw).unwrap(); - assert_eq!(account_near.storage_usage(), 364); - assert_eq!(account_test0.storage_usage(), 182); - } - } -} - /// Final state should be consistent when a node switches between forks in the following scenario /// /-----------h+2 /// h-2 ---- h-1 ------ h From 1ccf96c4d05f9234b83ab6192959df08b24c48ce Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 01:21:19 +0300 Subject: [PATCH 084/109] fix tests --- chain/chain/src/migrations.rs | 11 +++++------ chain/client/tests/process_blocks.rs | 6 ------ neard/src/migrations.rs | 8 ++++---- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 0086f7f9cd5..8b5105dc7cd 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -38,12 +38,11 @@ pub fn check_if_block_is_valid_for_migration( let prev_protocol_version = runtime_adapter.get_epoch_protocol_version( &chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)?, )?; - Ok(shard_id == 0 - && !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - )) + Ok(!checked_feature!( + "protocol_feature_restore_receipts_after_fix", + RestoreReceiptsAfterFix, + prev_protocol_version + )) } else { Ok(false) } diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 4f65e110d3b..20d21d59536 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -53,20 +53,14 @@ use near_primitives::types::validator_stake::ValidatorStake; use near_primitives::types::{AccountId, BlockHeight, EpochId, NumBlocks}; use near_primitives::utils::to_timestamp; use near_primitives::validator_signer::{InMemoryValidatorSigner, ValidatorSigner}; -#[cfg(feature = "protocol_feature_fix_storage_usage")] -use near_primitives::version::ProtocolFeature; use near_primitives::version::PROTOCOL_VERSION; use near_primitives::views::{ BlockHeaderView, FinalExecutionStatus, QueryRequest, QueryResponseKind, }; use near_store::get; use near_store::test_utils::create_test_store; -#[cfg(feature = "protocol_feature_fix_storage_usage")] -use near_store::TrieUpdate; use neard::config::{GenesisExt, TESTING_INIT_BALANCE, TESTING_INIT_STAKE}; use neard::NEAR_BASE; -#[cfg(feature = "protocol_feature_fix_storage_usage")] -use std::rc::Rc; pub fn create_nightshade_runtimes(genesis: &Genesis, n: usize) -> Vec> { (0..n) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index f47f2d05316..071e81b6792 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -297,13 +297,13 @@ const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 1_000_000_000_000_000; pub fn load_migration_data(chain_id: &String) -> MigrationData { #[cfg(not(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" )))] let _ = chain_id; #[cfg(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" + feature = "protocol_feature_fix_storage_usage", + feature = "protocol_feature_restore_receipts_after_fix" ))] let is_mainnet = chain_id == "mainnet"; MigrationData { From 0c2d79e4778f957897a5dc79a842ae6fb1e0fba5 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 01:24:14 +0300 Subject: [PATCH 085/109] minor fix --- chain/chain/src/store.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/chain/chain/src/store.rs b/chain/chain/src/store.rs index ecda349a46d..901d7a2b59e 100644 --- a/chain/chain/src/store.rs +++ b/chain/chain/src/store.rs @@ -286,7 +286,6 @@ pub trait ChainStoreAccess { ) -> Result { let mut candidate_hash = hash.clone(); loop { - // let block_header = chain_store.get_block_header(&candidate_hash)?.clone(); let block_header = self.get_block_header(&candidate_hash)?; if block_header.chunk_mask()[shard_id as usize] { break Ok(block_header.epoch_id().clone()); From 2d06f3e17e4ce1b5c94e01f64817f12854565bc9 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 01:32:31 +0300 Subject: [PATCH 086/109] remove old changes --- chain/chain/src/store.rs | 1 + core/chain-configs/src/genesis_config.rs | 5 ----- core/primitives/src/runtime/config.rs | 7 ------- neard/src/config.rs | 4 ++++ 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/chain/chain/src/store.rs b/chain/chain/src/store.rs index 901d7a2b59e..a447d495164 100644 --- a/chain/chain/src/store.rs +++ b/chain/chain/src/store.rs @@ -279,6 +279,7 @@ pub trait ChainStoreAccess { } } + /// Get epoch id of the last block with existing chunk for the given shard id. fn get_epoch_id_of_last_block_with_chunk( &mut self, hash: &CryptoHash, diff --git a/core/chain-configs/src/genesis_config.rs b/core/chain-configs/src/genesis_config.rs index 4d8f83cb4bb..acabcfb5b8a 100644 --- a/core/chain-configs/src/genesis_config.rs +++ b/core/chain-configs/src/genesis_config.rs @@ -245,11 +245,6 @@ impl GenesisConfig { }) .collect() } - - /// Returns true iff chain_id is mainnet - pub fn is_mainnet(&self) -> bool { - self.chain_id.as_str() == "mainnet" - } } impl GenesisRecords { diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index cfcaea4d838..4c9183dfc0a 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -28,9 +28,6 @@ pub struct RuntimeConfig { pub wasm_config: VMConfig, /// Config that defines rules for account creation. pub account_creation_config: AccountCreationConfig, - /// All receipts which were lost because of a bug in apply_chunks (see https://github.com/near/nearcore/pull/4248/) - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - pub receipts_to_restore: ReceiptResult, } impl Default for RuntimeConfig { @@ -41,8 +38,6 @@ impl Default for RuntimeConfig { transaction_costs: RuntimeFeesConfig::default(), wasm_config: VMConfig::default(), account_creation_config: AccountCreationConfig::default(), - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - receipts_to_restore: HashMap::default(), } } } @@ -58,8 +53,6 @@ impl RuntimeConfig { transaction_costs: RuntimeFeesConfig::free(), wasm_config: VMConfig::free(), account_creation_config: AccountCreationConfig::default(), - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - receipts_to_restore: HashMap::default(), } } diff --git a/neard/src/config.rs b/neard/src/config.rs index d38f19b0e7a..987ee8f30b8 100644 --- a/neard/src/config.rs +++ b/neard/src/config.rs @@ -780,6 +780,10 @@ pub fn init_configs( // TODO: add download genesis for mainnet let genesis: Genesis = serde_json::from_slice(*MAINNET_GENESIS_JSON) .expect("Failed to deserialize MainNet genesis"); + if let Some(account_id) = account_id { + generate_validator_key(account_id, &dir.join(config.validator_key_file)); + } + let network_signer = InMemorySigner::from_random("".to_string(), KeyType::ED25519); network_signer.write_to_file(&dir.join(config.node_key_file)); From 481933b9f395f112b9afa6f21b50b6eecb115fac Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 01:48:46 +0300 Subject: [PATCH 087/109] add is_valid_block arg to state-viewer --- chain/chain/src/test_utils.rs | 1 - chain/chain/src/types.rs | 1 - core/primitives/src/runtime/config.rs | 7 +------ neard/src/runtime/mod.rs | 1 - test-utils/state-viewer/src/main.rs | 11 +++++++++++ tools/restored-receipts-verifier/src/main.rs | 1 + 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 8159a294ff9..30f96f178c5 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -1101,7 +1101,6 @@ impl RuntimeAdapter for KeyValueRuntime { unreachable!("get_protocol_config should not be called in KeyValueRuntime"); } - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] fn get_prev_epoch_id_from_prev_block( &self, _prev_block_hash: &CryptoHash, diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index 1ed7e46b881..f405ee25149 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -654,7 +654,6 @@ pub trait RuntimeAdapter: Send + Sync { fn get_protocol_config(&self, epoch_id: &EpochId) -> Result; /// Get previous epoch id by hash of previous block. - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] fn get_prev_epoch_id_from_prev_block( &self, prev_block_hash: &CryptoHash, diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index 4c9183dfc0a..a0d803711d8 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -1,16 +1,11 @@ //! Settings of the parameters of the runtime. -use serde::{Deserialize, Serialize}; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use std::collections::HashMap; - use crate::checked_feature; use crate::config::VMConfig; -#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] -use crate::receipt::ReceiptResult; use crate::runtime::fees::RuntimeFeesConfig; use crate::serialize::u128_dec_format; use crate::types::{AccountId, Balance}; use crate::version::ProtocolVersion; +use serde::{Deserialize, Serialize}; use std::sync::{Arc, Mutex}; /// The structure that holds the parameters of the runtime, mostly economics. diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index e05cab2a481..b8dee2b5e15 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -1528,7 +1528,6 @@ impl RuntimeAdapter for NightshadeRuntime { Ok(config) } - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] fn get_prev_epoch_id_from_prev_block( &self, prev_block_hash: &CryptoHash, diff --git a/test-utils/state-viewer/src/main.rs b/test-utils/state-viewer/src/main.rs index 4814313501d..923a9c70f58 100644 --- a/test-utils/state-viewer/src/main.rs +++ b/test-utils/state-viewer/src/main.rs @@ -10,6 +10,7 @@ use clap::{App, Arg, SubCommand}; use borsh::BorshSerialize; use near_chain::chain::collect_receipts_from_response; +use near_chain::migrations::check_if_block_is_valid_for_migration; use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo}; use near_chain::{ChainStore, ChainStoreAccess, ChainStoreUpdate, RuntimeAdapter}; use near_logger_utils::init_integration_logger; @@ -222,6 +223,7 @@ fn apply_block_at_height( near_config.client_config.tracked_shards.clone(), None, ); + let runtime_adapter = Arc::new(runtime); let block_hash = chain_store.get_block_hash_by_height(height).unwrap(); let block = chain_store.get_block(&block_hash).unwrap().clone(); let apply_result = if block.chunks()[shard_id as usize].height_included() == height { @@ -239,6 +241,13 @@ fn apply_block_at_height( let receipts = collect_receipts_from_response(&receipt_proof_response); let chunk_inner = chunk.cloned_header().take_inner(); + let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + &mut chain_store, + runtime_adapter.as_ref(), + &block_hash, + block.header().prev_hash(), + shard_id, + )?; runtime .apply_transactions( shard_id, @@ -255,6 +264,7 @@ fn apply_block_at_height( &block.header().challenges_result(), *block.header().random_value(), true, + is_valid_block_for_migration, ) .unwrap() } else { @@ -277,6 +287,7 @@ fn apply_block_at_height( &block.header().challenges_result(), *block.header().random_value(), false, + false, ) .unwrap() }; diff --git a/tools/restored-receipts-verifier/src/main.rs b/tools/restored-receipts-verifier/src/main.rs index a946a2137a7..1d220c085be 100644 --- a/tools/restored-receipts-verifier/src/main.rs +++ b/tools/restored-receipts-verifier/src/main.rs @@ -107,6 +107,7 @@ fn main() -> Result<()> { &block.header().challenges_result(), *block.header().random_value(), false, + false, // because fix was not applied in for the blocks analyzed here ) .unwrap(); From d8c1e8372dab6ea67e755a7dfdf4bbe47e3d757c Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 02:05:09 +0300 Subject: [PATCH 088/109] fix unused variable warning --- neard/src/runtime/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index b8dee2b5e15..40bad69a553 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -440,6 +440,8 @@ impl NightshadeRuntime { // This code block re-introduces receipts lost because of a bug in apply_chunks // (see https://github.com/near/nearcore/pull/4248/) #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] + let _ = is_valid_block_for_migration; // Workaround unused variable warning + #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let incoming_receipts = receipts.to_vec(); #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let incoming_receipts = if is_valid_block_for_migration { @@ -447,7 +449,7 @@ impl NightshadeRuntime { .migration_data .restored_receipts .get(&shard_id) - .expect("Receipts to restore must contain an entry for shard 0") + .expect("Receipts to restore must contain an entry for this shard") .clone(); restored_receipts.extend_from_slice(receipts); restored_receipts From 109b9a9a7d3d3848db9c055a947961ca319f8cb0 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 02:18:31 +0300 Subject: [PATCH 089/109] compilation fix --- test-utils/state-viewer/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-utils/state-viewer/src/main.rs b/test-utils/state-viewer/src/main.rs index 923a9c70f58..189a8ba4262 100644 --- a/test-utils/state-viewer/src/main.rs +++ b/test-utils/state-viewer/src/main.rs @@ -247,7 +247,7 @@ fn apply_block_at_height( &block_hash, block.header().prev_hash(), shard_id, - )?; + ).unwrap(); runtime .apply_transactions( shard_id, From 921dd044ddbbedbfe5901f30c91b9c13be290274 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 02:45:55 +0300 Subject: [PATCH 090/109] compilation fix --- neard/src/migrations.rs | 9 +++++---- test-utils/state-viewer/src/main.rs | 9 ++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 071e81b6792..a8be9029f8a 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -274,16 +274,17 @@ pub fn migrate_19_to_20(path: &String, near_config: &NearConfig) { set_store_version(&store, 20); } -#[cfg(any( - feature = "protocol_feature_fix_storage_usage", - feature = "protocol_feature_restore_receipts_after_fix" -))] +#[cfg(feature = "protocol_feature_fix_storage_usage")] lazy_static_include::lazy_static_include_bytes! { /// File with account ids and deltas that need to be applied in order to fix storage usage /// difference between actual and stored usage, introduced due to bug in access key deletion, /// see https://github.com/near/nearcore/issues/3824 /// This file was generated using tools/storage-usage-delta-calculator MAINNET_STORAGE_USAGE_DELTA => "res/storage_usage_delta.json", +} + +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] +lazy_static_include::lazy_static_include_bytes! { /// File with receipts which were lost because of a bug in apply_chunks to the runtime config. /// Follows the ReceiptResult format which is HashMap>. /// See https://github.com/near/nearcore/pull/4248/ for more details. diff --git a/test-utils/state-viewer/src/main.rs b/test-utils/state-viewer/src/main.rs index 189a8ba4262..7a5ee3a853b 100644 --- a/test-utils/state-viewer/src/main.rs +++ b/test-utils/state-viewer/src/main.rs @@ -215,15 +215,14 @@ fn apply_block_at_height( shard_id: ShardId, ) { let mut chain_store = ChainStore::new(store.clone(), near_config.genesis.config.genesis_height); - let runtime = NightshadeRuntime::new( + let runtime_adapter: Arc = Arc::new(NightshadeRuntime::new( &home_dir, store, &near_config.genesis, near_config.client_config.tracked_accounts.clone(), near_config.client_config.tracked_shards.clone(), None, - ); - let runtime_adapter = Arc::new(runtime); + )); let block_hash = chain_store.get_block_hash_by_height(height).unwrap(); let block = chain_store.get_block(&block_hash).unwrap().clone(); let apply_result = if block.chunks()[shard_id as usize].height_included() == height { @@ -248,7 +247,7 @@ fn apply_block_at_height( block.header().prev_hash(), shard_id, ).unwrap(); - runtime + runtime_adapter .apply_transactions( shard_id, chunk_inner.prev_state_root(), @@ -271,7 +270,7 @@ fn apply_block_at_height( let chunk_extra = chain_store.get_chunk_extra(block.header().prev_hash(), shard_id).unwrap().clone(); - runtime + runtime_adapter .apply_transactions( shard_id, chunk_extra.state_root(), From a9254071a11128d8a327d79b653686e0bec45498 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 02:48:19 +0300 Subject: [PATCH 091/109] minor fix --- neard/src/migrations.rs | 2 +- test-utils/state-viewer/src/main.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index a8be9029f8a..799d0b2c010 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -321,7 +321,7 @@ pub fn load_migration_data(chain_id: &String) -> MigrationData { 0 }, #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - restored_receipts: if chain_id == "mainnet" { + restored_receipts: if is_mainnet { serde_json::from_slice(&MAINNET_RESTORED_RECEIPTS) .expect("File with receipts restored after apply_chunks fix have to be correct") } else { diff --git a/test-utils/state-viewer/src/main.rs b/test-utils/state-viewer/src/main.rs index 7a5ee3a853b..2a59fbd5d44 100644 --- a/test-utils/state-viewer/src/main.rs +++ b/test-utils/state-viewer/src/main.rs @@ -246,7 +246,8 @@ fn apply_block_at_height( &block_hash, block.header().prev_hash(), shard_id, - ).unwrap(); + ) + .unwrap(); runtime_adapter .apply_transactions( shard_id, From 32b01166284b2d518b6141715fc2b217ec07f9a6 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 02:59:59 +0300 Subject: [PATCH 092/109] compilation fix --- neard/src/runtime/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 40bad69a553..259e38a3d40 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -1717,6 +1717,7 @@ mod test { challenges, CryptoHash::default(), true, + false, ) .unwrap(); let mut store_update = self.store.store_update(); From 82e1e189ca354d162f964a8468b7f5e63795b5bc Mon Sep 17 00:00:00 2001 From: Longarithm Date: Fri, 14 May 2021 14:35:15 +0300 Subject: [PATCH 093/109] implement getting prev epoch id for KeyValueRuntime --- chain/chain/src/migrations.rs | 7 ++++++- chain/chain/src/test_utils.rs | 13 +++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 8b5105dc7cd..beccbaf8e8f 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -22,7 +22,12 @@ pub fn check_if_block_is_valid_for_migration( let block_header = chain_store.get_block_header(block_hash)?.clone(); let protocol_version = runtime_adapter.get_epoch_protocol_version(block_header.epoch_id())?; - let prev_epoch_id = runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash)?; + let prev_epoch_id = match runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash) { + Ok(epoch_id) => epoch_id, + _ => { + return Ok(false); + } + }; let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; // Check that block belongs to the first epoch where the protocol feature was enabled // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 30f96f178c5..0adc3eac2b3 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -1103,9 +1103,18 @@ impl RuntimeAdapter for KeyValueRuntime { fn get_prev_epoch_id_from_prev_block( &self, - _prev_block_hash: &CryptoHash, + prev_block_hash: &CryptoHash, ) -> Result { - unreachable!("get_prev_epoch_id_from_prev_block should not be called in KeyValueRuntime"); + let mut candidate_hash = prev_block_hash.clone(); + loop { + let header = self + .get_block_header(&candidate_hash)? + .ok_or_else(|| ErrorKind::DBNotFoundErr(to_base(&candidate_hash)))?; + if self.is_next_block_epoch_start(&candidate_hash)? { + break Ok(self.get_epoch_and_valset(*header.prev_hash())?.0); + } + candidate_hash = header.prev_hash().clone(); + } } } From f7b6e1575bff71350cfabaf0d387fb3babf8ffaf Mon Sep 17 00:00:00 2001 From: Longarithm Date: Mon, 17 May 2021 16:38:45 +0300 Subject: [PATCH 094/109] set struct for flags needed for migration --- Cargo.toml | 2 +- chain/chain/src/chain.rs | 28 +++++----- chain/chain/src/migrations.rs | 36 ++++--------- chain/chain/src/test_utils.rs | 4 +- chain/chain/src/types.rs | 8 +-- core/primitives/src/runtime/apply_state.rs | 6 ++- core/primitives/src/runtime/migration_data.rs | 9 ++++ neard/src/migrations.rs | 7 ++- neard/src/runtime/mod.rs | 43 +++++---------- .../runtime-params-estimator/src/testbed.rs | 4 +- runtime/runtime/Cargo.toml | 1 + runtime/runtime/src/lib.rs | 54 +++++++++++++------ runtime/runtime/src/state_viewer/mod.rs | 12 +++-- .../runtime/tests/runtime_group_tools/mod.rs | 4 +- test-utils/state-viewer/src/main.rs | 7 ++- test-utils/testlib/src/user/runtime_user.rs | 4 +- 16 files changed, 118 insertions(+), 111 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f9ea8e586f9..9ae20ef3b0b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -120,9 +120,9 @@ protocol_feature_alt_bn128 = ["neard/protocol_feature_alt_bn128", "testlib/proto protocol_feature_block_header_v3 = ["near-primitives/protocol_feature_block_header_v3", "near-chain/protocol_feature_block_header_v3", "neard/protocol_feature_block_header_v3"] protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limit", "node-runtime/protocol_feature_tx_size_limit", "neard/protocol_feature_tx_size_limit"] protocol_feature_allow_create_account_on_delete = ["testlib/protocol_feature_allow_create_account_on_delete", "near-primitives/protocol_feature_allow_create_account_on_delete", "node-runtime/protocol_feature_allow_create_account_on_delete", "neard/protocol_feature_allow_create_account_on_delete"] -protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "near-chain/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] +protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "near-chain/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix", "node-runtime/protocol_feature_restore_receipts_after_fix"] # enable this to build neard with wasmer 1.0 runner # now if none of wasmer0_default, wasmer1_default or wasmtime_default is enabled, wasmer0 would be default diff --git a/chain/chain/src/chain.rs b/chain/chain/src/chain.rs index 97b5a82d683..f66847abac5 100644 --- a/chain/chain/src/chain.rs +++ b/chain/chain/src/chain.rs @@ -51,7 +51,7 @@ use near_primitives::views::{ use near_store::{ColState, ColStateHeaders, ColStateParts, ShardTries, StoreUpdate}; use crate::lightclient::get_epoch_block_producers_view; -use crate::migrations::check_if_block_is_valid_for_migration; +use crate::migrations::check_if_block_is_first_with_chunk_of_version; use crate::missing_chunks::{BlockLike, MissingChunksPool}; use crate::store::{ChainStore, ChainStoreAccess, ChainStoreUpdate, GCMode}; use crate::types::{ @@ -2688,10 +2688,9 @@ impl<'a> ChainUpdate<'a> { Some(&block.hash()), )?; let prev_chunk_inner = prev_chunk.cloned_header().take_inner(); - let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + let is_first_block_with_chunk_of_version = check_if_block_is_first_with_chunk_of_version( &mut self.chain_store_update, self.runtime_adapter.as_ref(), - &block.hash(), &prev_block.hash(), chunk_shard_id, )?; @@ -2713,7 +2712,7 @@ impl<'a> ChainUpdate<'a> { *block.header().random_value(), true, true, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) .unwrap(); let partial_state = apply_result.proof.unwrap().nodes; @@ -2846,13 +2845,13 @@ impl<'a> ChainUpdate<'a> { // (see https://github.com/near/nearcore/pull/4248/) // We take the first block with existing chunk in the first epoch in which protocol feature // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. - let is_valid_block_for_migration = check_if_block_is_valid_for_migration( - &mut self.chain_store_update, - self.runtime_adapter.as_ref(), - &block.hash(), - &prev_block.hash(), - shard_id, - )?; + let is_first_block_with_chunk_of_version = + check_if_block_is_first_with_chunk_of_version( + &mut self.chain_store_update, + self.runtime_adapter.as_ref(), + &prev_block.hash(), + shard_id, + )?; // Apply transactions and receipts. let apply_result = self @@ -2872,7 +2871,7 @@ impl<'a> ChainUpdate<'a> { &block.header().challenges_result(), *block.header().random_value(), true, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) .map_err(|e| ErrorKind::Other(e.to_string()))?; @@ -3609,10 +3608,9 @@ impl<'a> ChainUpdate<'a> { let chunk_header = chunk.cloned_header(); let gas_limit = chunk_header.gas_limit(); - let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + let is_first_block_with_chunk_of_version = check_if_block_is_first_with_chunk_of_version( &mut self.chain_store_update, self.runtime_adapter.as_ref(), - block_header.hash(), &chunk_header.prev_block_hash(), shard_id, )?; @@ -3632,7 +3630,7 @@ impl<'a> ChainUpdate<'a> { &block_header.challenges_result(), *block_header.random_value(), true, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, )?; let (outcome_root, outcome_proofs) = diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index beccbaf8e8f..7aa1179fb86 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -1,17 +1,14 @@ use crate::store::ChainStoreAccess; use crate::types::RuntimeAdapter; use near_chain_primitives::error::Error; -use near_primitives::checked_feature; use near_primitives::hash::CryptoHash; use near_primitives::types::ShardId; -/// We take the first block with existing chunk in the first epoch in which protocol feature -/// RestoreReceiptsAfterFix was enabled, and put the restored receipts there. -/// Needed to re-introduce receipts previously lost in apply_chunks (see https://github.com/near/nearcore/pull/4248/). -pub fn check_if_block_is_valid_for_migration( +/// Check that block is the first one with existing chunk for the given shard in the chain with its protocol version. +/// We assume that current block contain the chunk for shard with the given id. +pub fn check_if_block_is_first_with_chunk_of_version( chain_store: &mut dyn ChainStoreAccess, runtime_adapter: &dyn RuntimeAdapter, - block_hash: &CryptoHash, prev_block_hash: &CryptoHash, shard_id: ShardId, ) -> Result { @@ -20,8 +17,8 @@ pub fn check_if_block_is_valid_for_migration( return Ok(false); } - let block_header = chain_store.get_block_header(block_hash)?.clone(); - let protocol_version = runtime_adapter.get_epoch_protocol_version(block_header.epoch_id())?; + let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; + let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; let prev_epoch_id = match runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash) { Ok(epoch_id) => epoch_id, _ => { @@ -29,25 +26,12 @@ pub fn check_if_block_is_valid_for_migration( } }; let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; - // Check that block belongs to the first epoch where the protocol feature was enabled + // Check that block belongs to the first epoch with current protocol version // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case - if checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - protocol_version - ) && !checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_epoch_protocol_version - ) { - let prev_protocol_version = runtime_adapter.get_epoch_protocol_version( - &chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)?, - )?; - Ok(!checked_feature!( - "protocol_feature_restore_receipts_after_fix", - RestoreReceiptsAfterFix, - prev_protocol_version - )) + if protocol_version != prev_epoch_protocol_version { + // Compare only epochs because we already know that current epoch is the first one with current protocol version + Ok(chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)? + != epoch_id) } else { Ok(false) } diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 0adc3eac2b3..16cc404ed2c 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -604,7 +604,7 @@ impl RuntimeAdapter for KeyValueRuntime { _random_seed: CryptoHash, generate_storage_proof: bool, _is_new_chunk: bool, - _is_valid_block_for_migration: bool, + _is_first_block_with_chunk_of_version: bool, ) -> Result { assert!(!generate_storage_proof); let mut tx_results = vec![]; @@ -784,7 +784,7 @@ impl RuntimeAdapter for KeyValueRuntime { _challenges: &ChallengesResult, _random_value: CryptoHash, _is_new_chunk: bool, - _is_valid_block_for_migration: bool, + _is_first_block_with_chunk_of_version: bool, ) -> Result { unimplemented!(); } diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index f405ee25149..ebfd9445b24 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -511,7 +511,7 @@ pub trait RuntimeAdapter: Send + Sync { challenges_result: &ChallengesResult, random_seed: CryptoHash, is_new_chunk: bool, - is_valid_block_for_migration: bool, + is_first_block_with_chunk_of_version: bool, ) -> Result { self.apply_transactions_with_optional_storage_proof( shard_id, @@ -529,7 +529,7 @@ pub trait RuntimeAdapter: Send + Sync { random_seed, false, is_new_chunk, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) } @@ -550,7 +550,7 @@ pub trait RuntimeAdapter: Send + Sync { random_seed: CryptoHash, generate_storage_proof: bool, is_new_chunk: bool, - is_valid_block_for_migration: bool, + is_first_block_with_chunk_of_version: bool, ) -> Result; fn check_state_transition( @@ -570,7 +570,7 @@ pub trait RuntimeAdapter: Send + Sync { challenges_result: &ChallengesResult, random_value: CryptoHash, is_new_chunk: bool, - is_valid_block_for_migration: bool, + is_first_block_with_chunk_of_version: bool, ) -> Result; /// Query runtime with given `path` and `data`. diff --git a/core/primitives/src/runtime/apply_state.rs b/core/primitives/src/runtime/apply_state.rs index 516ca60c996..e4c95561f5e 100644 --- a/core/primitives/src/runtime/apply_state.rs +++ b/core/primitives/src/runtime/apply_state.rs @@ -1,4 +1,4 @@ -use crate::runtime::migration_data::MigrationData; +use crate::runtime::migration_data::{MigrationData, MigrationFlags}; use crate::{ hash::CryptoHash, runtime::config::RuntimeConfig, @@ -44,5 +44,7 @@ pub struct ApplyState { pub profile: crate::profile::ProfileData, /// Data for migrations that may need to be applied at the start of an epoch when protocol /// version changes - pub migration_data: Option>, + pub migration_data: Arc, + /// Flags for migrations indicating whether they can be applied at this block + pub migration_flags: MigrationFlags, } diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index f470ec5e9c7..aca11605743 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -22,3 +22,12 @@ impl Debug for MigrationData { f.debug_struct("MigrationData").finish() } } + +#[derive(Debug, Default)] +pub struct MigrationFlags { + // True iff the current block is the first one in the chain with the current version + pub is_first_block_of_version: bool, + // True iff the current block containing chunk for some specific shard is the first one in the + // chain with the current version + pub is_first_block_with_chunk_of_version: bool, +} diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index 799d0b2c010..b7358638f57 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -1,7 +1,7 @@ use crate::{NearConfig, NightshadeRuntime}; use borsh::BorshDeserialize; use near_chain::chain::collect_receipts_from_response; -use near_chain::migrations::check_if_block_is_valid_for_migration; +use near_chain::migrations::check_if_block_is_first_with_chunk_of_version; use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo}; use near_chain::{ChainStore, ChainStoreAccess, ChainStoreUpdate, RuntimeAdapter}; use near_epoch_manager::{EpochManager, RewardCalculator}; @@ -48,10 +48,9 @@ fn apply_block_at_height( block_hash, prev_block.chunks()[shard_id as usize].height_included(), )?; - let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + let is_first_block_with_chunk_of_version = check_if_block_is_first_with_chunk_of_version( &mut chain_store_update, runtime_adapter, - block.hash(), prev_block.hash(), shard_id, )?; @@ -75,7 +74,7 @@ fn apply_block_at_height( &block.header().challenges_result(), *block.header().random_value(), true, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) .unwrap(); let (_, outcome_paths) = ApplyTransactionResult::compute_outcomes_proof(&apply_result.outcomes); diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 259e38a3d40..91dd3a01aac 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -59,7 +59,7 @@ use near_primitives::runtime::config::RuntimeConfig; use crate::migrations::load_migration_data; use errors::FromStateViewerErrors; -use near_primitives::runtime::migration_data::MigrationData; +use near_primitives::runtime::migration_data::{MigrationData, MigrationFlags}; pub mod errors; @@ -336,7 +336,7 @@ impl NightshadeRuntime { challenges_result: &ChallengesResult, random_seed: CryptoHash, is_new_chunk: bool, - is_valid_block_for_migration: bool, + is_first_block_with_chunk_of_version: bool, ) -> Result { let validator_accounts_update = { let mut epoch_manager = self.epoch_manager.as_ref().write().expect(POISONED_LOCK_ERR); @@ -409,6 +409,7 @@ impl NightshadeRuntime { let prev_block_epoch_id = self.get_epoch_id(prev_block_hash)?; let current_protocol_version = self.get_epoch_protocol_version(&epoch_id)?; let prev_block_protocol_version = self.get_epoch_protocol_version(&prev_block_epoch_id)?; + let is_first_block_of_version = current_protocol_version != prev_block_protocol_version; let apply_state = ApplyState { block_index: block_height, @@ -430,33 +431,13 @@ impl NightshadeRuntime { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: self.evm_chain_id(), profile: Default::default(), - migration_data: if current_protocol_version != prev_block_protocol_version { - Some(Arc::clone(&self.migration_data)) - } else { - None + migration_data: Arc::clone(&self.migration_data), + migration_flags: MigrationFlags { + is_first_block_of_version, + is_first_block_with_chunk_of_version, }, }; - // This code block re-introduces receipts lost because of a bug in apply_chunks - // (see https://github.com/near/nearcore/pull/4248/) - #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] - let _ = is_valid_block_for_migration; // Workaround unused variable warning - #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] - let incoming_receipts = receipts.to_vec(); - #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let incoming_receipts = if is_valid_block_for_migration { - let mut restored_receipts = self - .migration_data - .restored_receipts - .get(&shard_id) - .expect("Receipts to restore must contain an entry for this shard") - .clone(); - restored_receipts.extend_from_slice(receipts); - restored_receipts - } else { - receipts.to_vec() - }; - let apply_result = self .runtime .apply( @@ -464,7 +445,7 @@ impl NightshadeRuntime { state_root, &validator_accounts_update, &apply_state, - &incoming_receipts, + &receipts, &transactions, &self.epoch_manager, ) @@ -1162,7 +1143,7 @@ impl RuntimeAdapter for NightshadeRuntime { random_seed: CryptoHash, generate_storage_proof: bool, is_new_chunk: bool, - is_valid_block_for_migration: bool, + is_first_block_with_chunk_of_version: bool, ) -> Result { let trie = self.get_trie_for_shard(shard_id); let trie = if generate_storage_proof { trie.recording_reads() } else { trie }; @@ -1182,7 +1163,7 @@ impl RuntimeAdapter for NightshadeRuntime { challenges, random_seed, is_new_chunk, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) { Ok(result) => Ok(result), Err(e) => match e.kind() { @@ -1211,7 +1192,7 @@ impl RuntimeAdapter for NightshadeRuntime { challenges: &ChallengesResult, random_value: CryptoHash, is_new_chunk: bool, - is_valid_block_for_migration: bool, + is_first_block_with_chunk_of_version: bool, ) -> Result { let trie = Trie::from_recorded_storage(partial_storage); self.process_state_update( @@ -1230,7 +1211,7 @@ impl RuntimeAdapter for NightshadeRuntime { challenges, random_value, is_new_chunk, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) } diff --git a/runtime/runtime-params-estimator/src/testbed.rs b/runtime/runtime-params-estimator/src/testbed.rs index 96c4db225f5..e595b11a8e9 100644 --- a/runtime/runtime-params-estimator/src/testbed.rs +++ b/runtime/runtime-params-estimator/src/testbed.rs @@ -7,6 +7,7 @@ use borsh::BorshDeserialize; use near_chain_configs::Genesis; use near_primitives::receipt::Receipt; use near_primitives::runtime::config::RuntimeConfig; +use near_primitives::runtime::migration_data::{MigrationData, MigrationFlags}; use near_primitives::test_utils::MockEpochInfoProvider; use near_primitives::transaction::{ExecutionStatus, SignedTransaction}; use near_primitives::types::{Gas, MerkleHash, StateRoot}; @@ -95,7 +96,8 @@ impl RuntimeTestbed { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: Default::default(), - migration_data: None, + migration_data: Arc::new(MigrationData::default()), + migration_flags: MigrationFlags::default(), }; Self { workdir, diff --git a/runtime/runtime/Cargo.toml b/runtime/runtime/Cargo.toml index 1a82754f753..27c04d8532e 100644 --- a/runtime/runtime/Cargo.toml +++ b/runtime/runtime/Cargo.toml @@ -55,6 +55,7 @@ protocol_feature_alt_bn128 = [ protocol_feature_tx_size_limit = [] protocol_feature_allow_create_account_on_delete = ["near-primitives/protocol_feature_allow_create_account_on_delete", "near-vm-logic/protocol_feature_allow_create_account_on_delete"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage"] +protocol_feature_restore_receipts_after_fix = [] [dev-dependencies] tempfile = "3" diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 02bb827184e..229958bb42b 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -51,7 +51,7 @@ use crate::verifier::validate_receipt; pub use crate::verifier::{validate_transaction, verify_and_charge_transaction}; pub use near_primitives::runtime::apply_state::ApplyState; use near_primitives::runtime::fees::RuntimeFeesConfig; -use near_primitives::runtime::migration_data::MigrationData; +use near_primitives::runtime::migration_data::{MigrationData, MigrationFlags}; use near_primitives::version::{ is_implicit_account_creation_enabled, ProtocolFeature, ProtocolVersion, }; @@ -1075,7 +1075,9 @@ impl Runtime { pub fn apply_migrations( &self, state_update: &mut TrieUpdate, + incoming_receipts: &mut Vec, migration_data: &Arc, + migration_flags: &MigrationFlags, protocol_version: ProtocolVersion, ) -> Result { #[cfg(feature = "protocol_feature_fix_storage_usage")] @@ -1084,7 +1086,9 @@ impl Runtime { #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] let gas_used: Gas = 0; #[cfg(feature = "protocol_feature_fix_storage_usage")] - if ProtocolFeature::FixStorageUsage.protocol_version() == protocol_version { + if ProtocolFeature::FixStorageUsage.protocol_version() == protocol_version + && migration_flags.is_first_block_of_version + { for (account_id, delta) in &migration_data.storage_usage_delta { match get_account(state_update, account_id)? { Some(mut account) => { @@ -1101,8 +1105,27 @@ impl Runtime { gas_used += migration_data.storage_usage_fix_gas; state_update.commit(StateChangeCause::Migration); } + + // Re-introduce receipts lost because of a bug in apply_chunks. + // We take the first block with existing chunk in the first epoch in which protocol feature + // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. + // See https://github.com/near/nearcore/pull/4248/ for more details. + #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] + let _ = incoming_receipts; + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] + if ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() == protocol_version + && migration_flags.is_first_block_with_chunk_of_version + { + let restored_receipts = migration_data + .restored_receipts + .get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0") + .clone(); + incoming_receipts.extend_from_slice(&restored_receipts); + } + #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] - (state_update, migration_data, protocol_version); + (state_update, migration_data, migration_flags, protocol_version); Ok(gas_used) } @@ -1139,16 +1162,16 @@ impl Runtime { )?; } - let gas_used_for_migrations = match &apply_state.migration_data { - Some(migration_data) => self - .apply_migrations( - &mut state_update, - migration_data, - apply_state.current_protocol_version, - ) - .map_err(|e| RuntimeError::StorageError(e))?, - None => 0 as Gas, - }; + let mut incoming_receipts = incoming_receipts.to_vec(); + let gas_used_for_migrations = self + .apply_migrations( + &mut state_update, + &mut incoming_receipts, + &apply_state.migration_data, + &apply_state.migration_flags, + apply_state.current_protocol_version, + ) + .map_err(|e| RuntimeError::StorageError(e))?; if !apply_state.is_new_chunk && apply_state.current_protocol_version @@ -1285,7 +1308,7 @@ impl Runtime { &initial_state, &state_update, validator_accounts_update, - incoming_receipts, + &incoming_receipts, transactions, &outgoing_receipts, &stats, @@ -1475,7 +1498,8 @@ mod tests { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: ProfileData::new(), - migration_data: None, + migration_data: Arc::new(MigrationData::default()), + migration_flags: MigrationFlags::default(), }; (runtime, tries, root, apply_state, signer, MockEpochInfoProvider::default()) diff --git a/runtime/runtime/src/state_viewer/mod.rs b/runtime/runtime/src/state_viewer/mod.rs index 1811ee58057..3d4163ff427 100644 --- a/runtime/runtime/src/state_viewer/mod.rs +++ b/runtime/runtime/src/state_viewer/mod.rs @@ -1,3 +1,4 @@ +use crate::{actions::execute_function_call, ext::RuntimeExt}; use log::debug; use near_crypto::{KeyType, PublicKey}; use near_primitives::{ @@ -6,7 +7,11 @@ use near_primitives::{ contract::ContractCode, hash::CryptoHash, receipt::ActionReceipt, - runtime::{apply_state::ApplyState, config::RuntimeConfig}, + runtime::{ + apply_state::ApplyState, + config::RuntimeConfig, + migration_data::{MigrationData, MigrationFlags}, + }, serialize::to_base64, transaction::FunctionCallAction, trie_key::trie_key_parsers, @@ -18,8 +23,6 @@ use near_store::{get_access_key, get_account, get_code, TrieUpdate}; use near_vm_logic::ReturnData; use std::{str, sync::Arc, time::Instant}; -use crate::{actions::execute_function_call, ext::RuntimeExt}; - pub mod errors; pub struct TrieViewer { @@ -225,7 +228,8 @@ impl TrieViewer { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: view_state.evm_chain_id, profile: Default::default(), - migration_data: None, + migration_data: Arc::new(MigrationData::default()), + migration_flags: MigrationFlags::default(), }; let action_receipt = ActionReceipt { signer_id: originator_id.clone(), diff --git a/runtime/runtime/tests/runtime_group_tools/mod.rs b/runtime/runtime/tests/runtime_group_tools/mod.rs index 4fec0d16d18..48c72ac5213 100644 --- a/runtime/runtime/tests/runtime_group_tools/mod.rs +++ b/runtime/runtime/tests/runtime_group_tools/mod.rs @@ -3,6 +3,7 @@ use near_crypto::{InMemorySigner, KeyType}; use near_primitives::account::{AccessKey, Account}; use near_primitives::hash::{hash, CryptoHash}; use near_primitives::receipt::Receipt; +use near_primitives::runtime::migration_data::{MigrationData, MigrationFlags}; use near_primitives::state_record::{state_record_to_account_id, StateRecord}; use near_primitives::test_utils::MockEpochInfoProvider; use near_primitives::transaction::{ExecutionOutcomeWithId, SignedTransaction}; @@ -85,7 +86,8 @@ impl StandaloneRuntime { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: near_chain_configs::TESTNET_EVM_CHAIN_ID, profile: Default::default(), - migration_data: None, + migration_data: Arc::new(MigrationData::default()), + migration_flags: MigrationFlags::default(), }; Self { diff --git a/test-utils/state-viewer/src/main.rs b/test-utils/state-viewer/src/main.rs index 2a59fbd5d44..2a739a8c69b 100644 --- a/test-utils/state-viewer/src/main.rs +++ b/test-utils/state-viewer/src/main.rs @@ -10,7 +10,7 @@ use clap::{App, Arg, SubCommand}; use borsh::BorshSerialize; use near_chain::chain::collect_receipts_from_response; -use near_chain::migrations::check_if_block_is_valid_for_migration; +use near_chain::migrations::check_if_block_is_first_with_chunk_of_version; use near_chain::types::{ApplyTransactionResult, BlockHeaderInfo}; use near_chain::{ChainStore, ChainStoreAccess, ChainStoreUpdate, RuntimeAdapter}; use near_logger_utils::init_integration_logger; @@ -240,10 +240,9 @@ fn apply_block_at_height( let receipts = collect_receipts_from_response(&receipt_proof_response); let chunk_inner = chunk.cloned_header().take_inner(); - let is_valid_block_for_migration = check_if_block_is_valid_for_migration( + let is_first_block_with_chunk_of_version = check_if_block_is_first_with_chunk_of_version( &mut chain_store, runtime_adapter.as_ref(), - &block_hash, block.header().prev_hash(), shard_id, ) @@ -264,7 +263,7 @@ fn apply_block_at_height( &block.header().challenges_result(), *block.header().random_value(), true, - is_valid_block_for_migration, + is_first_block_with_chunk_of_version, ) .unwrap() } else { diff --git a/test-utils/testlib/src/user/runtime_user.rs b/test-utils/testlib/src/user/runtime_user.rs index 56aa08b299d..ab6a7c6d5ca 100644 --- a/test-utils/testlib/src/user/runtime_user.rs +++ b/test-utils/testlib/src/user/runtime_user.rs @@ -8,6 +8,7 @@ use near_primitives::errors::{RuntimeError, TxExecutionError}; use near_primitives::hash::CryptoHash; use near_primitives::receipt::Receipt; use near_primitives::runtime::config::RuntimeConfig; +use near_primitives::runtime::migration_data::{MigrationData, MigrationFlags}; use near_primitives::test_utils::MockEpochInfoProvider; use near_primitives::transaction::SignedTransaction; use near_primitives::types::{AccountId, BlockHeightDelta, MerkleHash}; @@ -143,7 +144,8 @@ impl RuntimeUser { #[cfg(feature = "protocol_feature_evm")] evm_chain_id: TESTNET_EVM_CHAIN_ID, profile: Default::default(), - migration_data: None, + migration_data: Arc::new(MigrationData::default()), + migration_flags: MigrationFlags::default(), } } From 1a984857d347add94522c88c7eb83426aee905cd Mon Sep 17 00:00:00 2001 From: Longarithm Date: Mon, 17 May 2021 22:25:15 +0300 Subject: [PATCH 095/109] fix toml files --- Cargo.lock | 1 + Cargo.toml | 3 ++- tools/restored-receipts-verifier/Cargo.toml | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 952b862ad33..16d0b1ae8bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3685,6 +3685,7 @@ dependencies = [ "neard", "node-runtime", "rand 0.7.3", + "restored-receipts-verifier", "runtime-params-estimator", "testlib", ] diff --git a/Cargo.toml b/Cargo.toml index 9ae20ef3b0b..3c978c3ec9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ near-crypto = { path = "./core/crypto" } near-primitives = { path = "./core/primitives" } near-store = { path = "./core/store" } runtime-params-estimator = { path = "./runtime/runtime-params-estimator", default_features = false } +restored-receipts-verifier = { path = "./tools/restored-receipts-verifier"} near-chain = { path = "./chain/chain" } node-runtime = { path = "./runtime/runtime" } @@ -122,7 +123,7 @@ protocol_feature_tx_size_limit = ["near-primitives/protocol_feature_tx_size_limi protocol_feature_allow_create_account_on_delete = ["testlib/protocol_feature_allow_create_account_on_delete", "near-primitives/protocol_feature_allow_create_account_on_delete", "node-runtime/protocol_feature_allow_create_account_on_delete", "neard/protocol_feature_allow_create_account_on_delete"] protocol_feature_add_account_versions = ["near-primitives/protocol_feature_add_account_versions"] protocol_feature_fix_storage_usage = ["near-primitives/protocol_feature_fix_storage_usage", "neard/protocol_feature_fix_storage_usage", "node-runtime/protocol_feature_fix_storage_usage"] -protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "near-chain/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix", "node-runtime/protocol_feature_restore_receipts_after_fix"] +protocol_feature_restore_receipts_after_fix = ["near-primitives/protocol_feature_restore_receipts_after_fix", "near-chain/protocol_feature_restore_receipts_after_fix", "neard/protocol_feature_restore_receipts_after_fix", "node-runtime/protocol_feature_restore_receipts_after_fix", "restored-receipts-verifier/protocol_feature_restore_receipts_after_fix"] # enable this to build neard with wasmer 1.0 runner # now if none of wasmer0_default, wasmer1_default or wasmtime_default is enabled, wasmer0 would be default diff --git a/tools/restored-receipts-verifier/Cargo.toml b/tools/restored-receipts-verifier/Cargo.toml index 5f17cedc656..263bb8d0a1a 100644 --- a/tools/restored-receipts-verifier/Cargo.toml +++ b/tools/restored-receipts-verifier/Cargo.toml @@ -17,5 +17,7 @@ near-chain = { path = "../../chain/chain" } near-jsonrpc = { path = "../../chain/jsonrpc" } [features] -protocol_feature_restore_receipts_after_fix = ["neard/protocol_feature_restore_receipts_after_fix"] -nightly_protocol = ["neard/nightly_protocol"] +protocol_feature_restore_receipts_after_fix = [] +nightly_protocol_features = ["nightly_protocol", "protocol_feature_restore_receipts_after_fix"] +nightly_protocol = [] + From 8bb156b76ed1c265e91cf8c537190c1d8b079d96 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 13:46:48 +0300 Subject: [PATCH 096/109] extend vector outside of apply_migrations --- runtime/runtime/src/lib.rs | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 229958bb42b..dfa6fb7af4c 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1075,11 +1075,10 @@ impl Runtime { pub fn apply_migrations( &self, state_update: &mut TrieUpdate, - incoming_receipts: &mut Vec, migration_data: &Arc, migration_flags: &MigrationFlags, protocol_version: ProtocolVersion, - ) -> Result { + ) -> Result<(Gas, Option>), StorageError> { #[cfg(feature = "protocol_feature_fix_storage_usage")] let mut gas_used: Gas = 0; @@ -1111,22 +1110,23 @@ impl Runtime { // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. // See https://github.com/near/nearcore/pull/4248/ for more details. #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] - let _ = incoming_receipts; + let receipts_to_restore = None; #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - if ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() == protocol_version + let receipts_to_restore = if ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() == protocol_version && migration_flags.is_first_block_with_chunk_of_version { - let restored_receipts = migration_data + Some(migration_data .restored_receipts .get(&0u64) .expect("Receipts to restore must contain an entry for shard 0") - .clone(); - incoming_receipts.extend_from_slice(&restored_receipts); - } + .clone()) + } else { + None + }; #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] (state_update, migration_data, migration_flags, protocol_version); - Ok(gas_used) + Ok((gas_used, receipts_to_restore)) } /// Applies new singed transactions and incoming receipts for some chunk/shard on top of @@ -1162,16 +1162,23 @@ impl Runtime { )?; } - let mut incoming_receipts = incoming_receipts.to_vec(); - let gas_used_for_migrations = self + let (gas_used_for_migrations, receipts_to_restore) = self .apply_migrations( &mut state_update, - &mut incoming_receipts, &apply_state.migration_data, &apply_state.migration_flags, apply_state.current_protocol_version, ) .map_err(|e| RuntimeError::StorageError(e))?; + let mut all_receipts = Vec::::new(); + let incoming_receipts = match receipts_to_restore { + Some(new_receipts) => { + all_receipts.extend(new_receipts.into_iter()); + all_receipts.extend_from_slice(incoming_receipts); + all_receipts.as_slice() + }, + None => incoming_receipts, + }; if !apply_state.is_new_chunk && apply_state.current_protocol_version @@ -1308,7 +1315,7 @@ impl Runtime { &initial_state, &state_update, validator_accounts_update, - &incoming_receipts, + incoming_receipts, transactions, &outgoing_receipts, &stats, From 24a620947050dba6679c6874ced9e6d2d07d934b Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 14:37:45 +0300 Subject: [PATCH 097/109] make call of get_prev_epoch_id_from_prev_block more clear --- chain/chain/src/migrations.rs | 30 +++++++++++++++++++----------- runtime/runtime/src/lib.rs | 25 ++++++++++++++----------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 7aa1179fb86..76b4bab9e2f 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -4,6 +4,23 @@ use near_chain_primitives::error::Error; use near_primitives::hash::CryptoHash; use near_primitives::types::ShardId; +/// Check that epoch of block with given prev_block_hash is the first one with current protocol version. +fn is_first_epoch_with_protocol_version( + runtime_adapter: &dyn RuntimeAdapter, + prev_block_hash: &CryptoHash, +) -> Result { + let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; + let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; + match runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash) { + Ok(prev_epoch_id) => { + let prev_epoch_protocol_version = + runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; + Ok(protocol_version != prev_epoch_protocol_version) + } + Err(_) => Ok(true), + } +} + /// Check that block is the first one with existing chunk for the given shard in the chain with its protocol version. /// We assume that current block contain the chunk for shard with the given id. pub fn check_if_block_is_first_with_chunk_of_version( @@ -17,21 +34,12 @@ pub fn check_if_block_is_first_with_chunk_of_version( return Ok(false); } - let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; - let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; - let prev_epoch_id = match runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash) { - Ok(epoch_id) => epoch_id, - _ => { - return Ok(false); - } - }; - let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; // Check that block belongs to the first epoch with current protocol version // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case - if protocol_version != prev_epoch_protocol_version { + if is_first_epoch_with_protocol_version(runtime_adapter, prev_block_hash)? { // Compare only epochs because we already know that current epoch is the first one with current protocol version Ok(chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)? - != epoch_id) + != runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?) } else { Ok(false) } diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index dfa6fb7af4c..201bae54bff 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1112,14 +1112,17 @@ impl Runtime { #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] let receipts_to_restore = None; #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] - let receipts_to_restore = if ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() == protocol_version + let receipts_to_restore = if ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() + == protocol_version && migration_flags.is_first_block_with_chunk_of_version { - Some(migration_data - .restored_receipts - .get(&0u64) - .expect("Receipts to restore must contain an entry for shard 0") - .clone()) + Some( + migration_data + .restored_receipts + .get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0") + .clone(), + ) } else { None }; @@ -1170,13 +1173,13 @@ impl Runtime { apply_state.current_protocol_version, ) .map_err(|e| RuntimeError::StorageError(e))?; - let mut all_receipts = Vec::::new(); + let all_receipts; let incoming_receipts = match receipts_to_restore { - Some(new_receipts) => { - all_receipts.extend(new_receipts.into_iter()); - all_receipts.extend_from_slice(incoming_receipts); + Some(mut new_receipts) => { + new_receipts.extend_from_slice(incoming_receipts); + all_receipts = new_receipts; all_receipts.as_slice() - }, + } None => incoming_receipts, }; From ed93b0d21184d3d855c783d428c5724834585dec Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 14:41:11 +0300 Subject: [PATCH 098/109] minor fix --- chain/chain/src/migrations.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 76b4bab9e2f..439710d589c 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -9,10 +9,10 @@ fn is_first_epoch_with_protocol_version( runtime_adapter: &dyn RuntimeAdapter, prev_block_hash: &CryptoHash, ) -> Result { - let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; - let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; match runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash) { Ok(prev_epoch_id) => { + let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; + let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; Ok(protocol_version != prev_epoch_protocol_version) From 6a595bf477c44bf0268ab9e20585519f5428417c Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 14:43:38 +0300 Subject: [PATCH 099/109] minor fix --- Cargo.lock | 1 - chain/chain/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16d0b1ae8bf..6d2928683a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3024,7 +3024,6 @@ dependencies = [ "num-rational", "rand 0.7.3", "serde", - "serde_json", "strum", "thiserror", "tracing", diff --git a/chain/chain/Cargo.toml b/chain/chain/Cargo.toml index fa5b1358aff..671c318d875 100644 --- a/chain/chain/Cargo.toml +++ b/chain/chain/Cargo.toml @@ -17,7 +17,6 @@ num-rational = "0.3" tracing = "0.1.13" thiserror = "1.0" strum = "0.20" -serde_json = "1" borsh = "0.8.1" From 306268223cb6b094d5ac80c1a0a9c7f46f239385 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 14:52:27 +0300 Subject: [PATCH 100/109] minor fix --- runtime/runtime/src/lib.rs | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index 201bae54bff..b2862e7d4d2 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1078,7 +1078,7 @@ impl Runtime { migration_data: &Arc, migration_flags: &MigrationFlags, protocol_version: ProtocolVersion, - ) -> Result<(Gas, Option>), StorageError> { + ) -> Result<(Gas, Vec), StorageError> { #[cfg(feature = "protocol_feature_fix_storage_usage")] let mut gas_used: Gas = 0; @@ -1110,21 +1110,19 @@ impl Runtime { // RestoreReceiptsAfterFix was enabled, and put the restored receipts there. // See https://github.com/near/nearcore/pull/4248/ for more details. #[cfg(not(feature = "protocol_feature_restore_receipts_after_fix"))] - let receipts_to_restore = None; + let receipts_to_restore = vec![]; #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] let receipts_to_restore = if ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() == protocol_version && migration_flags.is_first_block_with_chunk_of_version { - Some( - migration_data + migration_data .restored_receipts .get(&0u64) .expect("Receipts to restore must contain an entry for shard 0") - .clone(), - ) + .clone() } else { - None + vec![] }; #[cfg(not(feature = "protocol_feature_fix_storage_usage"))] @@ -1165,7 +1163,7 @@ impl Runtime { )?; } - let (gas_used_for_migrations, receipts_to_restore) = self + let (gas_used_for_migrations, mut receipts_to_restore) = self .apply_migrations( &mut state_update, &apply_state.migration_data, @@ -1173,14 +1171,12 @@ impl Runtime { apply_state.current_protocol_version, ) .map_err(|e| RuntimeError::StorageError(e))?; - let all_receipts; - let incoming_receipts = match receipts_to_restore { - Some(mut new_receipts) => { - new_receipts.extend_from_slice(incoming_receipts); - all_receipts = new_receipts; - all_receipts.as_slice() - } - None => incoming_receipts, + // If we have receipts that need to be restored, prepend them to the list of incoming receipts + let incoming_receipts = if receipts_to_restore.is_empty() { + incoming_receipts + } else { + receipts_to_restore.extend_from_slice(incoming_receipts); + receipts_to_restore.as_slice() }; if !apply_state.is_new_chunk From faa5065732fe7cf1e7206fa3e60fbe27a061d805 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 14:53:32 +0300 Subject: [PATCH 101/109] cargo fmt --- runtime/runtime/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/runtime/src/lib.rs b/runtime/runtime/src/lib.rs index b2862e7d4d2..74a860ab0e5 100644 --- a/runtime/runtime/src/lib.rs +++ b/runtime/runtime/src/lib.rs @@ -1117,10 +1117,10 @@ impl Runtime { && migration_flags.is_first_block_with_chunk_of_version { migration_data - .restored_receipts - .get(&0u64) - .expect("Receipts to restore must contain an entry for shard 0") - .clone() + .restored_receipts + .get(&0u64) + .expect("Receipts to restore must contain an entry for shard 0") + .clone() } else { vec![] }; From a60a69e4daed7a4888bafe108b37720b087cacf7 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 16:48:20 +0300 Subject: [PATCH 102/109] address new comments --- chain/chain/src/store.rs | 4 ++-- chain/client/tests/process_blocks.rs | 2 +- core/primitives/src/runtime/config.rs | 3 ++- core/primitives/src/runtime/migration_data.rs | 7 ++++--- neard/src/migrations.rs | 10 +++++----- neard/src/runtime/mod.rs | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/chain/chain/src/store.rs b/chain/chain/src/store.rs index a447d495164..728b0a8a940 100644 --- a/chain/chain/src/store.rs +++ b/chain/chain/src/store.rs @@ -285,13 +285,13 @@ pub trait ChainStoreAccess { hash: &CryptoHash, shard_id: ShardId, ) -> Result { - let mut candidate_hash = hash.clone(); + let mut candidate_hash = *hash; loop { let block_header = self.get_block_header(&candidate_hash)?; if block_header.chunk_mask()[shard_id as usize] { break Ok(block_header.epoch_id().clone()); } - candidate_hash = block_header.prev_hash().clone(); + candidate_hash = *block_header.prev_hash(); } } } diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 20d21d59536..acca6155115 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2914,7 +2914,7 @@ mod protocol_feature_restore_receipts_after_fix_tests { vec![], None, ); - let migration_data = runtime.migration_data(); + let migration_data = runtime.get_migration_data(); let mut env = TestEnv::new_with_runtime( chain_genesis.clone(), diff --git a/core/primitives/src/runtime/config.rs b/core/primitives/src/runtime/config.rs index a0d803711d8..052650eca3a 100644 --- a/core/primitives/src/runtime/config.rs +++ b/core/primitives/src/runtime/config.rs @@ -1,11 +1,12 @@ //! Settings of the parameters of the runtime. +use serde::{Deserialize, Serialize}; + use crate::checked_feature; use crate::config::VMConfig; use crate::runtime::fees::RuntimeFeesConfig; use crate::serialize::u128_dec_format; use crate::types::{AccountId, Balance}; use crate::version::ProtocolVersion; -use serde::{Deserialize, Serialize}; use std::sync::{Arc, Mutex}; /// The structure that holds the parameters of the runtime, mostly economics. diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index aca11605743..bf7352731ee 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -25,9 +25,10 @@ impl Debug for MigrationData { #[derive(Debug, Default)] pub struct MigrationFlags { - // True iff the current block is the first one in the chain with the current version + // True iff the current block is the first one in the chain with current protocol version pub is_first_block_of_version: bool, - // True iff the current block containing chunk for some specific shard is the first one in the - // chain with the current version + // True iff, among all blocks containing chunk for some specific shard, the current block is the + // first one in the chain with the current protocol version, and also belongs to the first epoch + // with current protocol version pub is_first_block_with_chunk_of_version: bool, } diff --git a/neard/src/migrations.rs b/neard/src/migrations.rs index b7358638f57..ee7682fda4d 100644 --- a/neard/src/migrations.rs +++ b/neard/src/migrations.rs @@ -282,6 +282,11 @@ lazy_static_include::lazy_static_include_bytes! { MAINNET_STORAGE_USAGE_DELTA => "res/storage_usage_delta.json", } +/// In test runs reads and writes here used 442 TGas, but in test on live net migration take +/// between 4 and 4.5s. We do not want to process any receipts in this block +#[cfg(feature = "protocol_feature_fix_storage_usage")] +const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 1_000_000_000_000_000; + #[cfg(feature = "protocol_feature_restore_receipts_after_fix")] lazy_static_include::lazy_static_include_bytes! { /// File with receipts which were lost because of a bug in apply_chunks to the runtime config. @@ -290,11 +295,6 @@ lazy_static_include::lazy_static_include_bytes! { MAINNET_RESTORED_RECEIPTS => "res/mainnet_restored_receipts.json", } -/// In test runs reads and writes here used 442 TGas, but in test on live net migration take -/// between 4 and 4.5s. We do not want to process any receipts in this block -#[cfg(feature = "protocol_feature_fix_storage_usage")] -const GAS_USED_FOR_STORAGE_USAGE_DELTA_MIGRATION: Gas = 1_000_000_000_000_000; - pub fn load_migration_data(chain_id: &String) -> MigrationData { #[cfg(not(any( feature = "protocol_feature_fix_storage_usage", diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index 91dd3a01aac..bc70fcd9d35 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -314,7 +314,7 @@ impl NightshadeRuntime { } } - pub fn migration_data(&self) -> Arc { + pub fn get_migration_data(&self) -> Arc { Arc::clone(&self.migration_data) } From 1f576405043706bc8af6a9f83918ed64d29ff40c Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 16:53:08 +0300 Subject: [PATCH 103/109] minor fix --- core/primitives/src/runtime/migration_data.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/primitives/src/runtime/migration_data.rs b/core/primitives/src/runtime/migration_data.rs index bf7352731ee..6002b004280 100644 --- a/core/primitives/src/runtime/migration_data.rs +++ b/core/primitives/src/runtime/migration_data.rs @@ -28,7 +28,6 @@ pub struct MigrationFlags { // True iff the current block is the first one in the chain with current protocol version pub is_first_block_of_version: bool, // True iff, among all blocks containing chunk for some specific shard, the current block is the - // first one in the chain with the current protocol version, and also belongs to the first epoch - // with current protocol version + // first one in the first epoch with the current protocol version pub is_first_block_with_chunk_of_version: bool, } From 64841fff3a917753283f275185f2aa78b24a90dc Mon Sep 17 00:00:00 2001 From: Longarithm Date: Tue, 18 May 2021 17:55:55 +0300 Subject: [PATCH 104/109] remove shard_id = 0 optimization --- chain/chain/src/migrations.rs | 5 ----- chain/client/tests/process_blocks.rs | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 439710d589c..4fed4977037 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -29,11 +29,6 @@ pub fn check_if_block_is_first_with_chunk_of_version( prev_block_hash: &CryptoHash, shard_id: ShardId, ) -> Result { - // At first, check that shard id = 0 and don't do unnecessary computation otherwise - if shard_id != 0 { - return Ok(false); - } - // Check that block belongs to the first epoch with current protocol version // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case if is_first_epoch_with_protocol_version(runtime_adapter, prev_block_hash)? { diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index acca6155115..adeb4df4139 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2898,7 +2898,7 @@ mod protocol_feature_restore_receipts_after_fix_tests { high_height_with_no_chunk: BlockHeight, should_pass: bool, ) { - init_test_logger(); + // init_test_logger(); let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; let mut genesis = Genesis::test(vec!["test0", "test1"], 1); From 4ff65a09ec9edc42031d443fb676f5e6314001e4 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 19 May 2021 02:24:58 +0300 Subject: [PATCH 105/109] process error from get_prev_epoch_id correctly --- chain/chain/src/migrations.rs | 21 +++++++++------------ chain/chain/src/test_utils.rs | 4 ++-- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/chain/chain/src/migrations.rs b/chain/chain/src/migrations.rs index 4fed4977037..321f98a4b11 100644 --- a/chain/chain/src/migrations.rs +++ b/chain/chain/src/migrations.rs @@ -9,16 +9,11 @@ fn is_first_epoch_with_protocol_version( runtime_adapter: &dyn RuntimeAdapter, prev_block_hash: &CryptoHash, ) -> Result { - match runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash) { - Ok(prev_epoch_id) => { - let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; - let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; - let prev_epoch_protocol_version = - runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; - Ok(protocol_version != prev_epoch_protocol_version) - } - Err(_) => Ok(true), - } + let prev_epoch_id = runtime_adapter.get_prev_epoch_id_from_prev_block(prev_block_hash)?; + let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; + let protocol_version = runtime_adapter.get_epoch_protocol_version(&epoch_id)?; + let prev_epoch_protocol_version = runtime_adapter.get_epoch_protocol_version(&prev_epoch_id)?; + Ok(protocol_version != prev_epoch_protocol_version) } /// Check that block is the first one with existing chunk for the given shard in the chain with its protocol version. @@ -33,8 +28,10 @@ pub fn check_if_block_is_first_with_chunk_of_version( // to avoid get_epoch_id_of_last_block_with_chunk call in the opposite case if is_first_epoch_with_protocol_version(runtime_adapter, prev_block_hash)? { // Compare only epochs because we already know that current epoch is the first one with current protocol version - Ok(chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)? - != runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?) + let prev_epoch_id = + chain_store.get_epoch_id_of_last_block_with_chunk(prev_block_hash, shard_id)?; + let epoch_id = runtime_adapter.get_epoch_id_from_prev_block(prev_block_hash)?; + Ok(prev_epoch_id != epoch_id) } else { Ok(false) } diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 16cc404ed2c..34d89adc77b 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -1110,10 +1110,10 @@ impl RuntimeAdapter for KeyValueRuntime { let header = self .get_block_header(&candidate_hash)? .ok_or_else(|| ErrorKind::DBNotFoundErr(to_base(&candidate_hash)))?; + candidate_hash = header.prev_hash().clone(); if self.is_next_block_epoch_start(&candidate_hash)? { - break Ok(self.get_epoch_and_valset(*header.prev_hash())?.0); + Ok(self.get_epoch_and_valset(candidate_hash)?.0) } - candidate_hash = header.prev_hash().clone(); } } } From 3d530bd075f029a662cd80f5830f3eab627b5511 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 19 May 2021 02:46:02 +0300 Subject: [PATCH 106/109] minor fix --- chain/chain/src/test_utils.rs | 2 +- chain/client/tests/process_blocks.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index 34d89adc77b..c2e7fc1ba4f 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -1112,7 +1112,7 @@ impl RuntimeAdapter for KeyValueRuntime { .ok_or_else(|| ErrorKind::DBNotFoundErr(to_base(&candidate_hash)))?; candidate_hash = header.prev_hash().clone(); if self.is_next_block_epoch_start(&candidate_hash)? { - Ok(self.get_epoch_and_valset(candidate_hash)?.0) + break Ok(self.get_epoch_and_valset(candidate_hash)?.0); } } } diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index adeb4df4139..acca6155115 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -2898,7 +2898,7 @@ mod protocol_feature_restore_receipts_after_fix_tests { high_height_with_no_chunk: BlockHeight, should_pass: bool, ) { - // init_test_logger(); + init_test_logger(); let protocol_version = ProtocolFeature::RestoreReceiptsAfterFix.protocol_version() - 1; let mut genesis = Genesis::test(vec!["test0", "test1"], 1); From eaf5575f45033987bc50602f21d5bfada8b67f37 Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 19 May 2021 16:02:11 +0300 Subject: [PATCH 107/109] get rid of test method --- chain/client/tests/process_blocks.rs | 8 +++++--- neard/src/runtime/mod.rs | 4 ---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index acca6155115..21ebc584751 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -61,6 +61,7 @@ use near_store::get; use near_store::test_utils::create_test_store; use neard::config::{GenesisExt, TESTING_INIT_BALANCE, TESTING_INIT_STAKE}; use neard::NEAR_BASE; +use neard::migrations::load_migration_data; pub fn create_nightshade_runtimes(genesis: &Genesis, n: usize) -> Vec> { (0..n) @@ -2914,7 +2915,8 @@ mod protocol_feature_restore_receipts_after_fix_tests { vec![], None, ); - let migration_data = runtime.get_migration_data(); + // TODO #4305: get directly from NightshadeRuntime + let migration_data = load_migration_data(&genesis.config.chain_id); let mut env = TestEnv::new_with_runtime( chain_genesis.clone(), @@ -2935,7 +2937,7 @@ mod protocol_feature_restore_receipts_after_fix_tests { ) }; - let mut receipt_hashes_to_restore = get_restored_receipt_hashes(migration_data.as_ref()); + let mut receipt_hashes_to_restore = get_restored_receipt_hashes(&migration_data); let mut height: BlockHeight = 1; let mut last_update_height: BlockHeight = 0; @@ -2986,7 +2988,7 @@ mod protocol_feature_restore_receipts_after_fix_tests { } else { assert_eq!( receipt_hashes_to_restore, - get_restored_receipt_hashes(migration_data.as_ref()), + get_restored_receipt_hashes(&migration_data), "If accidentally there are no chunks in first epoch with new protocol version, receipts should not be introduced" ); } diff --git a/neard/src/runtime/mod.rs b/neard/src/runtime/mod.rs index bc70fcd9d35..d37b9fd77f3 100644 --- a/neard/src/runtime/mod.rs +++ b/neard/src/runtime/mod.rs @@ -314,10 +314,6 @@ impl NightshadeRuntime { } } - pub fn get_migration_data(&self) -> Arc { - Arc::clone(&self.migration_data) - } - /// Processes state update. fn process_state_update( &self, From 0011ad20b88b29ed569d28d367110e17aa7a685f Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 19 May 2021 16:03:40 +0300 Subject: [PATCH 108/109] minor fix --- chain/client/tests/process_blocks.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index 21ebc584751..c821efbfc45 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -60,8 +60,8 @@ use near_primitives::views::{ use near_store::get; use near_store::test_utils::create_test_store; use neard::config::{GenesisExt, TESTING_INIT_BALANCE, TESTING_INIT_STAKE}; -use neard::NEAR_BASE; use neard::migrations::load_migration_data; +use neard::NEAR_BASE; pub fn create_nightshade_runtimes(genesis: &Genesis, n: usize) -> Vec> { (0..n) From faf5519acfbc3ebfe76e37346735f0be9c0dac4b Mon Sep 17 00:00:00 2001 From: Longarithm Date: Wed, 19 May 2021 16:42:33 +0300 Subject: [PATCH 109/109] minor fix --- chain/client/tests/process_blocks.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/client/tests/process_blocks.rs b/chain/client/tests/process_blocks.rs index c821efbfc45..19a03bcca1c 100644 --- a/chain/client/tests/process_blocks.rs +++ b/chain/client/tests/process_blocks.rs @@ -60,6 +60,7 @@ use near_primitives::views::{ use near_store::get; use near_store::test_utils::create_test_store; use neard::config::{GenesisExt, TESTING_INIT_BALANCE, TESTING_INIT_STAKE}; +#[cfg(feature = "protocol_feature_restore_receipts_after_fix")] use neard::migrations::load_migration_data; use neard::NEAR_BASE;